2016-12-12 11 views
2

Я хотел бы поместить задержку на сигнал в своем тестовом стенде. Проблема в том, что мне нужны сотни тактовых циклов, и поэтому я не хочу использовать сотни промежуточных сигналов.Задержка сигнала в VHDL Testbench

Поскольку это просто для использования в симуляции, есть ли способ добавить задержку с несинтетизируемым кодом (возможно, с WAIT или AFTER)?

ответ

3

Похоже, вы хотите использовать задержку transport. По умолчанию, если вы сделаете отсроченное назначение, это будет использовать «инерционный» модель задержки:

my_sig_delayed <= my_sig after 100 ns; 

Однако, в этом примере, если ваш сигнал переключает более чем один раз в 100 нс, ваш my_sig_delayed сигнал не будет следовать как и следовало ожидать. Используя задержку transport, вы повторяете «линию задержки».

my_sig_delayed <= transport my_sig after 100 ns; 

Для более подробного объяснения, попробуйте это http://www.gmvhdl.com/delay.htm


В качестве альтернативы можно использовать регистр сдвига с длиной от любой задержки вам нужно:

signal delay_line : std_logic_vector(255 downto 0) := (others => '0'); 

.. .

process (clk) 
begin 
    if (rising_edge(clk)) then 
    delay_line <= delay_line(delay_line'left-1 downto 0) & my_sig; 
    end if; 
end process; 

my_sig_delayed <= delay_line(delay_line'left); 
+0

благодарит за r объяснения. Действительно, я пробовал первый способ, который был более очевидным для меня, но поскольку мой период сигнала меньше задержки, он не мог работать. Если нет другого способа, я воспользуюсь вторым вариантом. –

+1

@ A.Kieffer он должен работать, если вы используете ключевое слово 'transport' для второй строки кода выше. –

+0

Извините, я не понял, на первый взгляд. Я попробовал «транспорт», и он работает хорошо. Спасибо @scarry_jeff! –