
Врезка 7
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, 0, 0, 0, 0, 0; H"2" => 1, 1, 0, 1, 1, 0, 0; 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; |
В этом примере показаны все возможные шестнадцатиричные цифры (i[3..0]) и соответствующие состояния светодиодов (a, b, c, d, e, f, g), которые обеспечивают “начертание” цифры на дисплее. Изображение светодиодов на дисплее дано в виде комментария перед файлом.
На врезке 8 приведён файл дешифратора адреса decode3.tdf для шестнадцатиразрядной микропроцессорной системы.
Врезка 8
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"00XXXXXXXXXXXXXX" => 1, 0, 0, B"00"; 1, B"100XXXXXXXXXXXXX" => 0, 1, 0, B"00"; 0, B"0000001010101110" => 0, 0, 1, B"00"; 0, B"0000001011011110" => 0, 0, 0, B"01"; 0, B"0000001101110000" => 0, 0, 0, B"10"; END TABLE; END; |
В данном примере существуют тысячи возможных вариантов входа (адреса), поэтому было бы непрактично сводить их все в таблицу. Вместо этого, можно пометить символом “Х” несущественные, не влияющие на выход, разряды. Например, выходной сигнал rom (ПЗУ) будет высоким для всех 16384 вариантов адреса addr[15..0], которые начинаются с 00. Поэтому вам нужно только указать общую для всех вариантов часть кода, то есть 00, а в остальных разрядах кода поставить “Х”. Такой приём позволит использовать в данном проекте меньше устройств и ресурсов.
Приведённый на врезке 9 пример decode4.tdf показывает использование стандартной параметризируемой функции lpm_decode в задаче разработки дешифратора, аналогичной примеру decode1.tdf.
Врезка 9
INCLUDE "lpm_decode.inc";
SUBDESIGN decode4 ( address[15..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_eneble = lpm_decode(.data[]=address[]) WITH (LPM_WIDTH=16, LPM_DECODES=2^10) RETURNS (.eq[H"0370"]); END; |
Иногда для переменных удобно использовать значения по умолчанию. Можно определить значения по умолчанию для узла или группы, которые будут автоматически использоваться, если в файле их значения не будут заданы. Язык AHDL позволяет присваивать значение узлу или группе в файле неодно-кратно. Если при этом произойдет конфликт, система автоматически будет использовать значения по умолчанию. Если они не были заданы, используется значение GND.
Объявление значений по умолчанию DEFAULTS можно использовать для задания переменных в таблице истинности, операторах IF и CASE.
На врезке 10 приводится файл default1.tdf, в котором происходит оценка входов и выбор соответствующего ASCII-кода.