【问题标题】:Is it possible to receive and count time in Modelsim?是否可以在 Modelsim 中接收和计算时间?
【发布时间】:2020-05-03 20:26:20
【问题描述】:

在Modelsim中可以接收和计算时间吗?

例如,我想重置传感器。传感器复位需要 60 µs 内的逻辑“1”,所以我的代码发送它。我需要在测试台文件中捕获信号。我可以写这样的东西吗?

if signal = '1' for 60 us then...

这就像一个命令等待:wait for 100 us;,反之亦然。

我试图通过创建一个额外的时钟信号并计算上升沿来做到这一点。不过,我希望有一个更简单的决定。

更新。 所以,就我而言,我没有正确的代码,但我会尝试详细解释。

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 就像我的程序一样,它为 60 us 发送 reset_signal。 SENSOR_PROCESS 应该接收到 reset_signal。 我可以在 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;

不幸的是,代码不起作用..

【问题讨论】:

  • 也许我已经找到了答案。如果在 t 个时间单位内信号 S 上没有出现偶数,则预定义属性 S'STABLE(t) 为真。所以,我会试试的。
  • 如果你想制作硬件,进行综合,那么你将不得不产生一个额外的时钟信号并计算上升沿。 S'stable 不可合成。
  • @MatthewTaylor OP 想要这个作为测试平台,大概不需要综合。
  • 您可能想提供一个minimal reproducible example

标签: vhdl fpga hdl modelsim test-bench


【解决方案1】:

如果您想检查 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;

【讨论】:

    【解决方案2】:

    我找到了适合我要求的解决方案:

    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 语句类似于时钟信号,但是如果在进程周期之间发生了什么事情,代码会识别它。

    谢谢)

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2013-02-18
      相关资源
      最近更新 更多