Реализация двунаправленных выводов
MAX+PLUS II позволяет конфигурировать выводы I/O как двунаправленные. Двунаправленные выводы можно определить с помощью порта BIDIR, который соединяется с выходом примитива TRI. Сигнал между выводом и примитивом TRI является двунаправленным и может использоваться для управления другой логикой проекта.
Файлы bus_reg2.tdf и bus_reg3.tdf, приведенные ниже, оба реализуют регистр, который фиксирует значение, обнаруженное на тристабильной шине. Также они могут выдавать запомненное значение обратно на шину. Один файл реализует DFF и TRI функции с помощью ссылок на логические функции. Другой файл использует объявления Register
и Instance, соответственно, в разделе Variable.
SUBDESIGN bus_reg2 SUBDESIGN bus_reg3
( (
clk : INPUT; clk : INPUT;
oe : INPUT; oe : INPUT;
io : BIDIR; io : BIDIR;
) )
VARIABLE VARIABLE
dff_out : NODE; my_dff : DFF;
my_tri : TRI;
BEGIN BEGIN
dff_out = DFF(io, clk, ,); my_dff.d = io;
io = TRI(dff_out, oe); my_dff.clk = clk;
my_tri.in = my_dff.q;
END; my_tri.oe = oe;
io = my_tri.out;
END;
Двунаправленный сигнал io, управляемый примитивом TRI, используется в качестве входа d триггера D (DFF).
Также Вы можете присоединить двунаправленный вывод из TDF файла нижнего уровня к выводу верхнего уровня. Двунаправленный выходной порт подпроекта должен соединяться с двунаправленным выводом с верхнего уровня иерархии. Прототип Function для TDF файла нижнего уровня должен включать двунаправленный вывод в предложении RETURNS. Файл bidir1.tdf, приведенный ниже, включает четыре экземпляра функции bus_reg2, упомянутой выше.
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;