Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_Alaluev_Gotovye.doc
Скачиваний:
157
Добавлен:
10.05.2015
Размер:
3.54 Mб
Скачать

3.2 Язык описания аппаратуры ahdl

(Бродин Б.В., Калинин А.В. Системы на микроконтроллерах и СБИС программируемой логики. М.: Изд. ЭКОМ, 2002г., 2000с.)

В России широкое распространение получили программируемые логические схемы

3.2.1.

Оператор оценивает значение выражения и по нему выбирает режим работы схемы в соответствии со списком.

Рассмотрим реализацию логики оператора if на AHDL. В качестве примера возьмем кодировщик приоритета, который преобразует уровень самого приоритетного активного входа в его значение.

SUBDESIGN priority

{low, middle, high: INPUT;

highest_level [1..0]: OUTPUT;

}

BEGIN

If high then

highest_level [ ]=3;

ELSIF middle THEN

highest_level [ ]=2;

ELSIF low THEN

highest_level [ ]=1;

ELSE

highest_level [ ]=0;

END IF

END.

На выходе схемы получается код, соответствующий приоритету того входа, на который подана логическая единица. Если ни один вход не равен 1, то схема выдает 0.

Логическая операция CASE.

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

SUBDESIGN decoder

{code[1..0]: INPUT;

out[3..0] :OUTPUT;

}

BEGIN

CASE 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.

С помощью операторов IF и CASE можно проектировать дешифраторы. Однако схема сгенерирования компилятором устройства получается весьма сложной. Поэтому в AHDL введены специальные функции, описывающие дешифратор. Для описания дешифраторов используется объявление таблиц истинности TABLE.

Рассмотрим пример, реализующий дешифратор двоичного кода в сигнал семисегментного индикатора.

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.

В этом примере в таблице перечислены все возможные шестнадцатеричные цифры и соответствующие им состояния выводов. Если необходимо реализовать дешифратор, учитывающий «не все» состояния входов т.е. с повторяющимися (несущественными) состояниями, то такие состояния обозначают символом Х. например рассмотрим дешифратор, реализующий определение области памяти, к которой обращается микропроцессор. Т.е. всю память разделим на несколько участков:

  1. ПЗУ (имеющие адреса, начинающиеся с 00)

  2. ФЗУ (имеющие адреса, начинающиеся с 100)

А так же 3 устройства, имеющие конкретные адреса.

SUBDESIGN decode3

{ Addr [15..0], m.io: INPUT;

ROM, RAM, PRINT, SP [2..1]: OUTPUT

}

BEGIN

TABLE

m_io, addr [15..0] => ROM, RAM, PRINT, SP [];

1, B “00xxxxxxxxxxxxx” => 1, 0, 0, B “00”;

1, B “100xxxxxxxxxxxx” => 0, 1, 0, B “00”;

0, B “0000010101100000” => 0, 0, 1, B “00”;

0, B “0001010110101100” => 0, 0, 0, B “10”;

0, B “0000110111010011” => 0, 0, 0, B “01”;

END TABLE;

END.

m_io предназначен для выбора к чему обращается микропроцессор. Если m_io = 1, то микропроцессор обращается к памяти. Если m_io = 0, то микропроцессор обращается к устройству ввода и вывода.

Использование для переданных значений по умолчанию на языке 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.

Реализация двунаправленных выводов.

Порты программируемых микросхем в устройствах могут быть заданы как двунаправленные (BIDIR). Порты микросхемы (ножки микросхемы) так и обозначаются BIDIR, а подключение к ним осуществляется с помощью устройств, построенных на примитиве TRI (тристабильный вывод).

Рассмотрим триггер, который делает выборку значения, найденного на шине с тремя состояниями, а так же может передать обратно на шину хранимое значение.

SUBDESIGN BUS_REG

{ CLIK, OF: INPUT;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]