Дешифратор для семисегментного индикатора 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Дешифратор для семисегментного индикатора



SUBDESIGN 7segment

(

i [3..0]          :INPUT;

a, b, c, d, e, f, g: OUTPUT;

)

BEGIN

TABLE

i [3..0] => a, b, c, d, e, f, g;

H "0" => 1, 1, 1, 1, 1, 1, 0;

H "1" => 0, 1, 1, 0, 0, 0, 0;

H "2" => 1, 1, 0, 1, 1, 0, 1;

H "3" => 1, 1, 1, 1, 0, 0, 1;

H "4" => 0, 1, 1, 0, 0, 1, 1;

H "5" => 1, 0, 1, 1, 0, 1, 1;

H "6" => 1, 0, 1, 1, 1, 1, 1;

H "7" => 1, 1, 1, 0, 0, 0, 0;

H "8" => 1, 1, 1, 1, 1, 1, 1;

H "9" => 1, 1, 1, 1, 0, 1, 1;

H "A" => 1, 1, 1, 0, 1, 1, 1;

H "B" => 0, 0, 1, 1, 1, 1, 1;

H "C" => 1, 0, 0, 1, 1, 1, 0;

H "D" => 0, 1, 1, 1, 1, 0, 1;

H "E" => 1, 0, 0, 1, 1, 1, 1;

H "F" => 1, 0, 0, 0, 1, 1, 1;

 END TABLE;

END;

 

Это дешифратор для семисегментного индикатора.

 

Использование для переданных значений по умолчанию на языке AHDL.

Можно определить значение по умолчанию для узла или группы, которые будут автоматически использоваться для них, если в файле их значения не будут заданы. Язык AHDL позволяет присваивать значения узлу или группе неоднократно и, если произойдет конфликт, система автоматически будет использовать значение по умолчанию. Если значения по умолчанию не были заданы, то узлам и группам автоматически присваивается значение GND или все 0. Значение по умолчанию можно использовать и в условных операторах IF и CASE.

Рассмотрим пример:

Пусть на вход системы подается шестнадцатеричный одноразрядный код. На выходе системы должен появиться соответствующий ASCII код. А если одновременно поданы сигналы на несколько входов, то устройство должно выдавать «?».

SUBDESIGN Default 1

{ i [3..0]: INPUT;

ASCII_CODE OUTPUT;}

BEGIN

DEFAULTS

ASCII_CODE [] = b “01111111”; % “?”

END DEFAULTS

TABLE

I [3..0] => ASCII_CODE;

B “1000” => B “01100001”; % “a”

B “0100” => B “01100010”; % “b”

B “0010” => B “01100011”; % “c”

B “0001” => B “01100100”; % “d”

END TABLE;

END.

 

 

Реализация условной логики. Условная логика реализуется с помо­щью операторов IF Then и Саsе.

Оператор Case определяет список альтернативных вариантов, один из которых выполняется, если значение селектора (переменной, группы или выражения), стоящего за ключевым словом САSЕ, соответствует значению, стоящему за ключевым словом WHEN этого варианта. Оператор имеет следующие правила синтаксиса и семантики.

• Вначале идет ключевое слово САSЕ, да которым следует селектор, да­лее ключевое слово IS.

• Оператор завершается ключевым словосочетанием END САSЕ, за ко­торым стоит символ (;).

•    Тело оператора представляет собой список альтернативных вариантов, каждый из которых начинается ключевым словом ШНЕМ. Каждый ва­риант представляет собой набор констант, разделенных запятыми, за которым следует символ =>. За этим символом следует список опера­торов, разделенных символом (;). Последний вариант может начинаться ключевым словосочетанием WHEN ОТНЕRS.

• Если значение селектора равно одному из значений констант варианта, выполняются все операторы этого варианта. Если значение селектора не равно ни одной из констант, выполняются операторы за словосочетанием WHEN ОТНЕRS (если оно есть).

• Если оператор САSЕ используется для описания конечного автомата, словосочетание WHEN ОТНЕRS не может использоваться для выхода из неразрешенных состояний.

 

SUBDESIGN decoder

(

code [1..0]               :INPUT;

out [3..0]                 :OUTPUT;

)

BEGIN

САSЕ code [ ] is

WHEN 0 => out [ ] = B "0001";

WHEN 1 => out [ ] = B "0010";

WHEN 2 => out [ ] = B "0100";

WHEN 3 => out [ ] = B "1000";

END CASE;

END;

 

Это описание дешифратора 2 4, который преобразует двухразрядный двоичный код в код «one hot» (четыре значения содержат каждое по од­ной единице). В зависимости от кода на входе активизируется одна из вет­вей оператора САSЕ.

Оператор If Then   определяет списки операторов, выполняемых в за­висимости от значения булева выражения. Оператор имеет следующие правила синтаксиса и семантики.

• Вначале идет ключевое слово IF, за которым следует булево выраже­ние, далее ключевое слово ТНЕМ и список операторов, разделенных символом (;).

• Далее между ключевыми словами ELSEIF и ТНЕМ может следовать дополнительное булево выражение, а за ТHEM - список операторов, выполняемых или нет в зависимости от значения этого выражения. Эта необязательная конструкция может повторяться многократно. Операторы за словом ТНЕМ выполняются, если булево выражение истинно, при этом последующая конструкция ELSEIF ТНЕМ игнори­руется.

За конструкцией ELSEIF ТНЕМ может следовать ключевое слово ELSE, а за ним список операторов, которые выполняются, если ни од­но из булевых выражений ни приняло истинного значения. Значения булевых выражений за ключевыми словами IF и ELSEIF вычисляются последовательно. Оператор завершается словосочетанием END IF и символом (;).

 

SUBDESIGN priority

(

low, middle, high:INPUT;

highest_level [1..0]:OUTPUT;

)

BEGIN

IF higtTHEN

highest_ level [ ] =3;

ELSIF middle THEN

highest_ level [ ] =2;

ELSIF low THEN

highest_ level [ ] =1;

 

ELSE

highest_ level [ ] =0;

END IF;

END;

 

Это шифратор приоритетов. На выходах устанавливается код, соот­ветствующий приоритету входа, на котором имеется значение VСС. А это просто пример выбора вариантов действий:

 

IF a[ ] = = b [ ] THEN

c [8..1] = H "77";

addr [3..1] = f [3..1].q;

f [ ].d = addr [ ] +1;

ELSIF g3 $ g4 THEN;

f [ ].d = addr [ ];

ELSE

D=VCC;

END IF;

 

 

Последовательностная логика

Последовательностная логика (конечные автоматы с памятью) описы­вается в языке АНDL с помощью триггеров, регистров, машин состояний и библиотеки параметрических модулей (LMP).

 

Регистры. Регистр создается объявлением его в разделе VARIABLE или ссылкой в строке в разделе LOGIC. После определения регистра его можно подключить к другой логике при помощи его портов. Обращение к портам регистра производится по имени регистра и имени порта:

<имя регистра>.<имя порта>

В следующем примере сформирован восьмиразрядный регистр из триггеров D-типа, который защелкивает данные с входов d по положи­тельному фронту синхросигнала при положительном активном значении на входе разрешения.

 

SUBDESIGN bur_reg

(

clk, load, d [7..0]:INPUT;

q [7..0]      :OUTPUT;

 

)

VARIABLE

ff [7..0]     :DFFE;

 

BEGIN

ff [ ].clk = clk;

ff [ ].ena = load;

ff [ ].d = d [ ];

q [ ] =ff [ ].q;      

END;         

 

Первое уравнение логической секции соединяет вход тактового сигна­ла проекта с тактовыми входами триггеров. Во втором уравнении подклю­чается разрешающий сигнал, в третьем уравнении подключаются входы, а в четвертом выходы. Altera рекомендует использовать в качестве такти­рующего глобальный синхросигнал.

Можно объявить выходы проекта как D-триггеры в разделе VARIABLE. Это дает экономию за счет использования триггеров на выводах микросхемы.

 

SUBDESIGN reg_out

(

clk, load, d [7..0]:INPUT;

q [7..0]      :OUTPUT;

)

VARIABLE

q [7..0]     :DFFE; % выходы объявлены как регистры %

 

BEGIN

q [ ].clk = clk;

q [ ].ena = load;

ff [ ].d = d [ ];

q [ ] =d [ ]; 

END;         

 

Счетчики. Счетчики обычно реализуются на D-триггерах с использо­ванием оператора IF. В следующем примере реализован 16-разрядный за­гружаемый счетчик со сбросом.

 

SUBDESIGN ahdlcnt

(

clk, load, ena, clr, d[15..0]: INPUT;

q [15..0]                     :OUTPUT;

)

VARIABLE

count[15..0]               : DFF;

BEGIN

count [ ].clk = clk;

count [ ].clm =!clr;

IF load THEN

count [ ].d = count [ ].q+1;

ELSE

count [ ].d = count [ ].q;

count Q.d = count)].q;

END IF;

q [ ] = count [ ];

END;

 



Поделиться:


Последнее изменение этой страницы: 2021-09-26; просмотров: 159; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.31.209 (0.014 с.)