在 VHDL Testbench 中延迟信号
Delay a signal in VHDL Testbench
我想在我的测试台上延迟一个信号。问题是我需要数百个时钟周期,因此我不想使用数百个中间信号。
由于这只是为了模拟使用,是否有任何方法可以使用不可合成的代码添加延迟(可能使用 WAIT 或 AFTER)?
听起来您想使用 transport
延迟。默认情况下,如果您进行延迟分配,这将使用 'inertial' 延迟模型:
my_sig_delayed <= my_sig after 100 ns;
但是,在这个例子中,如果您的信号在 100 纳秒内切换不止一次,您的 my_sig_delayed
信号将不会像您预期的那样跟随它。通过使用 transport
延迟,您可以复制 'delay line'.
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);
我想在我的测试台上延迟一个信号。问题是我需要数百个时钟周期,因此我不想使用数百个中间信号。
由于这只是为了模拟使用,是否有任何方法可以使用不可合成的代码添加延迟(可能使用 WAIT 或 AFTER)?
听起来您想使用 transport
延迟。默认情况下,如果您进行延迟分配,这将使用 'inertial' 延迟模型:
my_sig_delayed <= my_sig after 100 ns;
但是,在这个例子中,如果您的信号在 100 纳秒内切换不止一次,您的 my_sig_delayed
信号将不会像您预期的那样跟随它。通过使用 transport
延迟,您可以复制 'delay line'.
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);