Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебники / Язык AHDL.DOC
Скачиваний:
56
Добавлен:
13.06.2014
Размер:
995.84 Кб
Скачать
        1. Объявление регистровых выходов

Вы можете объявить регистровые выходы TDF файла путем объявления выходных портов как триггеров в разделе Variable. Файл reg_out.tdf, приведенный ниже, имеет туже самую функциональность, что и файл bur_reg.tdf, но обладает регистровыми выходами.

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;

q[] = d[];

END;

Когда Вы присваиваете значение регистровым выходам в разделе Logic, то значение с d входов направляется в регистр. Выходы регистра не изменяются до тех пор, пока не появится возрастающий фронт сигнала Clock. Для определения тактового входа регистра используйте конструкцию <имя регистра>.clk в разделеLogic. Вы можете реализовать глобальный тактовый сигнал Clock, используя примитивGLOBALс помощью логической опцииGlobal Signalв диалоговом окнеIndividual Logic Options, которое Вы можете открыть из окнаLogic Options( меню Assign), или с помощью опцииAutomatic Global Clockиз диалогового окнаGlobal Project Logic Synthesis( меню Assign).

В файле, приведенном ниже, каждый DFFE триггер, объявленный в разделе Variable, запитывает выход с тем же именем, поэтому Вы можете обратиться к выходам q триггеров без использования порта q.

В TDF файле высокого уровня выходные порты синхронизируются с выходными выводами. Когда Вы объявляете одинаковое имя для выходного порта и регистра, присваивания опций probe и logic применяются к выводу, а не регистру (за исключением логической опции Fast I/O). Поэтому, если Вы хотите протестировать регистр или использовать специфические для регистра логические опции, Вы должны по разному назвать регистры и порты.

        1. Создание счетчиков

Счетчики можно определить с помощью Dтриггеров (DFF и DFFE) и операторовIf Thenили с помощью функции lpm_counter.

Файл ahdlcnt.tdf, приведенный ниже, реализует 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[].clrn = !clr;

IF load THEN

count[].d = d[];

ELSIF ena THEN

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

ELSE

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

END IF;

q[] = count[];

END;

В этом файле в разделе Variableобъявляется 16 триггеров с имена count0 по count15. ОператорIf Thenопределяет значение, которое загружается в триггеры на возрастающем фронте Clock.

Файл lpm_cnt.tdf, приведенный ниже, использует функцию lpm_counter для реализации той же функциональности, что и файл ahdlcnt.tdf.

INCLUDE "lpm_counter.inc";

SUBDESIGN lpm_cnt

(

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

q[15..0] : OUTPUT;

)

VARIABLE

my_cntr: lpm_counter WITH (LPM_WIDTH=16);

BEGIN

my_cntr.clock = clk;

my_cntr.aload = load;

my_cntr.cnt_en = ena;

my_cntr.aclr = clr;

my_cntr.data[] = d[];

q[] = my_cntr.q[];

END;