[an error occurred while processing this directive]
|
Сначала просто по языку.
Tristate IO port без триггеров. Это две строки. Сигнал на выход, другая - сигнал на вход.
PAD_sig <= my_output_sig when my_tri_enab_sig = '1' else 'Z';
my_input_signal <= PAD_sig;
Здесь совершенно однозначно будет IO порт без триггеров. Без вариантов.
Ставим триггера куда надо. Просто присвоение нужному сигналу делается под rising_edge (или falling_edge).
Триггер на входной сигнал:
process(Clk, Reset)
begin
If Reset ...
...
elsif rising_edge(Clk) then
...
my_input_signal <= PAD_sig;
...
end process...
Аналогично триггера на выходной и управляющий сигналы:
process(Clk, Reset)
...
elsif rising_edge(Clk) then
...
my_output_sig <= откуда он там приходит? ;
my_tri_enab_sig <= управляло ;
...
end process...
Здесь совершенно однозначно станут триггера и на входной сигнал и на выходной и на управляющий. Без вариантов. Никакой логики между триггерами и Z-буфером не будет.
Теперь как это запихнуть в IOB.
Я слыхал что Альтера не всегда (или не на всех устройствах) позволяет поместить все триггера в один IO block.
Вполне допускаю. Эта фишка technology specific. В заказных мелкосхемах есть именно блоки чтоб и IO и триггера и всё в одной куче? Никто так не заморачивается. В кучу собирают другими средствами. К языку это не относится. Это относится к implementation средсвам. (Галочка и стоит в разделе Хилинх...) Для конкретной технологии указывается необходимый атрибут. Сам исходный код не надо менять.
В технологии где нет IO блоков с триггерами можно(нужно) задавать временные ограничения. Для Хилнха это будет offset in... offset out.
И сохранится универсальный код для любой технологии и рядом к нему будет "заточка".
E-mail: info@telesys.ru