Врезка 14
FUNCTION bus_reg2 (clk, oe) RETURNS (io); SUBDESIGN bidir1 ( clk, oe : INPUT; io[3..0] : BIDIR; ) BEGIN io0 = bus_reg2 )clk, oe); io1 = bus_reg2 )clk, oe); io2 = bus_reg2 )clk, oe); io3 = bus_reg2 )clk, oe); END; |
В следующем номере мы продолжим знакомство с языком описания аппаратуры AHDL на примере построения последовательностных схем и цифровых автоматов.
Последовательностная логика в AHDL
Логическая схема называется последовательностной, если выходы в заданный момент времени являются функцией входов не только в тот же момент, но и во все предыдущие моменты времени. Таким образом, в по-следовательностную схему должны входить некоторые элементы памяти (триггеры). В языке AHDL последовательностная логика реализована цифровыми автоматами с памятью (state machines), регистрами и триггерами. При этом средства описания цифровых автоматов занимают особое место. Кроме того, к последовательностным логическим схемам относятся различные счётчики и контроллеры.
Объявление регистров
Регистры используются для хранения значений данных и промежуточных результатов счётчика, тактирование осуществляется синхросигналом. Регистр создаётся его объявлением в секции VARIABLE.
Для подсоединения примера примитива, макрофункции или цифрового автомата к другой логике в TDF-файле можно использовать порты. Порт примера описывается в следующем формате: “<имя примера>.<имя порта>”.
Имя порта — это вход или выход примитива, макрофункции или цифрового автомата, что является синонимом имени вывода в файлах проектов (GDF-файл), “*.WDF” и других.
На врезке 1 приводится файл bur_reg.tdf, содержащий байтовый регистр, который фиксирует значения на входах d по выходам q на фронте синхроимпульса, когда уровень загрузки высокий.
Врезка 1
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;
|
Как видно из файла, регистр объявлен в секции VARIABLE как D-триггер с разрешением (DFFE). В первом булевом уравнении в логической секции происходит соединение входа тактового сигнала подпроекта к портам тактового сигнала триггеров ff[7..0]. Во втором уравнении отпирающий тактовый сигнал соединяется с загрузкой. В третьем уравнении входы данных подпроекта соединяются с портами данных триггеров ff[7..0]. В четвёртом уравнении выходы подпроекта соединяются с выходами триггеров. Все четыре уравнения оцениваются одновременно.
Можно также в секции VARIABLE объявить T-, JK- и SR-триггеры и затем использовать их в логической секции. При использовании T-триггеров придётся в третьем уравнении изменить порт d на t. При использовании JK- и SR-триггеров вместо третьего уравнения придётся записать два уравнения, в которых происходит соединение портов j и k или s и r с сигналами. При загрузке регистра по заданному фронту глобального тактового сигнала фирма Altera рекомендует использовать вход разрешения одного из регистров: DFFE, TFFE, JKFFE или SRFFE, чтобы контролировать загрузку регистра.
Можно объявить регистровые выходы, если объявить выходы подпроекта как D-триггеры в секции VARIABLE.
Приведённый на врезке 2 файл reg_out.tdf обеспечивает те же функции, что и предыдущий (bur_reg.tdf), но имеет регистровые выходы.
