是否可以在Modelsim中接收和计算时间?
例如,我想复位一个传感器。传感器复位需要在60 µs内的逻辑 "1",所以我的代码发送了它。我需要在testbench文件中捕获信号。我可以写这样的东西吗?
if signal = '1' for 60 us then...
这就像一个命令等待,但反之亦然。wait for 100 us;
,但反之亦然。
我曾试过通过创建一个额外的时钟信号并计算上升沿来实现。但是,我希望有一个更简单的决定。
update.so,在我的情况下,我没有一个正确的代码,但我会尝试详细解释。
entity testbench is
end entity testbench;
architecture tb of testbench is
signal reset_signal : std_logic;
signal flag_success : std_logic;
begin
RESET_PROCESS : process -- example process
begin
reset_signal <= '1';
wait for 100 us;
reset_signal <= '0';
report "End simulation" severity failure;
end process RESET_PROCESS;
SENSOR_PROCESS : process
begin
-- i don't now how to write it correctly
-- pseudocode
if reset_signal = '1' within 60 us then
flag_success <= '1';
else
flag_success <= '0';
end if;
end process;
end architecture tb;
RESET_PROCESS就像我的程序一样,它发送复位信号60us。我可以在SENSOR_PROCESS中增加一个clk,并且可以计算上升沿。但是,这是modelsim,它知道所有的时序特性,所以我认为可以不加clk。
我找到了属性,写了一段代码。
if reset_signal = '0' then
if reset_signal'quiet(60 us) then
flag_success <= '1';
else
flag_success <= '0';
end if;
end if;
-- or
if reset_signal = '0' then
wait for 60 us;
if reset_signal'stable(60 us) then
flag_success <= '1';
else
flag_success <= '0';
end if;
end if;
不幸的是,这段代码不能用...
如果你想检查60us后的数据仍然是'1',那么你可以通过以下方式进行检查。
...
wait for 60 us;
if (reset == '1') then
wait for 1 ns;
if (reset == '0') then
flag_success <= '1';
else
flag_success <= '1';
end if
else
flag_success <= '0';
end if;
如果你想检查所有60us的数据,也许你可以做这样的事情。
...
for i in loop 0 to 60
if (reset == '1') then
...
else
wait for 1 us;
end if;
我找到了一个符合我要求的解决方案。
SENSOR_PROCESS : process
begin
if reset_signal'stable(60 us) and (reset_signal = '0') then
flag_success <= '1';
else
flag_success <= '0';
end if;
wait for 1 us;
end process;
最后的WAIT语句就像时钟信号一样,但是如果在两个周期之间发生了什么事情,代码就会识别出来。
谢谢)。)