Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等到<;信号>=在VHDL模拟中,1从不为真_Vhdl_Fpga_Modelsim - Fatal编程技术网

等到<;信号>=在VHDL模拟中,1从不为真

等到<;信号>=在VHDL模拟中,1从不为真,vhdl,fpga,modelsim,Vhdl,Fpga,Modelsim,下面是我正在运行的代码。我的问题是,为什么第三个不等到modelsim中的触发?控制台输出仅在此处获得。它永远不会到达到达这里的第2行。我认为让相同的连续等待两次,直到=1就可以了,因为这两次条件都是真的。我没有在其中添加“事件”,因此我认为模拟器不需要看到边缘。有人能解释这种行为吗 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity example_wait_failure is end ex

下面是我正在运行的代码。我的问题是,为什么第三个
不等到modelsim中的
触发?控制台输出仅在此处获得
。它永远不会到达到达这里的第2行。我认为让相同的
连续等待两次,直到=1
就可以了,因为这两次条件都是真的。我没有在其中添加“事件”,因此我认为模拟器不需要看到边缘。有人能解释这种行为吗

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity example_wait_failure is
end example_wait_failure;

architecture behave of example_wait_failure is

  signal r_CLK_TB : std_logic := '0';

begin

  r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;


  p_TEST : process
  begin

    wait until r_CLK_TB = '1';
    report "GOT HERE" severity note;

    wait until r_CLK_TB = '1';
    wait until r_CLK_TB = '1';
    report "GOT HERE 2 " severity note;

  end process p_TEST;

end behave;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体示例\u等待\u失败为
结束示例\u等待\u失败;
示例_wait _failure的架构行为是
信号r_CLK_TB:std_逻辑:='0';
开始
r_CLK_TB家庭作业?考试

你需要研究等待如何工作的细节。等待始终暂停至少一个增量周期。只有当条件中的信号发生变化且表达式为真时,等待才会恢复。那么,您需要多少次到“1”的转换才能转到第二个报表语句

您有多少次到“1”的转换:

signal r_CLK_TB : std_logic := '0';
...
r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns; 
信号r_CLK_TB:std_逻辑:='0';
...

r_CLK_TB行为在wait语句的细节中(wait语句的细节) 吉姆·刘易斯(Jim Lewis)提到。原因是
wait
语句有三个 部分:

相关代码中的
等待
只有
直到
部分,因此 灵敏度列表是根据VHDL标准创建的:“如果没有灵敏度 子句时,灵敏度集的构造如下所示 (递归)规则:…”。在这种情况下,将生成灵敏度列表 包含
r\u CLK\u TB

VHDL标准有一个与代码精确匹配的示例 声明:

wait until r_CLK_TB = '1';
与以下内容相同:

loop
  wait on r_CLK_TB;
  exit when r_CLK_TB = '1';
end loop;
因此,即使
wait
没有显式包含
wait-till
r_CLK_TB'event
(如注释中所述),执行结果是等待
r\u CLK\u TB
上的事件,以便通过
等待r\u CLK\u TB
中的第一个
等待。
这是直觉吗。。。自己判断;-)

因此,原始代码可能需要更改,以便:

wait until r_CLK_TB = '1';
替换为:

if r_CLK_TB /= '1' then
  wait until r_CLK_TB = '1';
end if;
在这种情况下,“GOT HERE”和“GOT HERE 2”都显示为20纳秒,因为
这三种结构的情况在这里都是正确的。

我还想讨论同一个问题。
我可能的解决方法是将全局时钟添加到灵敏度列表中:

nClk <= NOT nClk AFTER 10 ns;

WAIT ON nClk UNTIL signalToCheck = '1';

nClk不是作业或考试。。。在实际工作中发现了这个问题!为什么等待条件下的信号必须改变?如果条件等到r_CLK_TB='1'为真,然后再进入wait语句,那么它将直接执行,不是吗?我认为,等到r_CLK_TB’事件发生时,会出现一些过渡。恐怕我还是不太明白……我也可以接受“这就是Modelsim的行为方式”,但我觉得这不对不仅仅是ModelSim,所有VHDL模拟器都会这样做,因为这种行为是一种语言要求。另一种思考方式是,条件中的信号形成一个隐式敏感性列表。我理解你的想法,因为很多人错误地认为这是一个水平检查,但这是一个边缘检查。该语言的设计目的是简化对从不挂起的进程(错误的无限循环)的检查——如果该进程包含等待语句或进程敏感度列表,那么它将挂起。对于测试台,您必须了解等待工作的细节。谢谢您的解释。我感兴趣的是,等待r_CLK_TB是等待r_CLK_TB='1'检查的一部分。让我问最后一个问题,然后我将勾选该框:)当寻找正时钟边缘时,您有两个选择。假设在正常RTL代码中不使用wait-until-rising_-edge(r_-CLK_-TB),则使用wait-until-CLK_-TB'event和r_-CLK_-TB='1'。你是在告诉我,在这里等到r\u CLK\u TB'事件是完全没有用的吗?在
等到r\u CLK\u TB'事件和r\u CLK\u TB='1'
中,一旦
r\u CLK\u TB'事件和r\u CLK\u TB='1'
被计算,那么
r\u CLK\u TB'事件将是微不足道的,因为正如你所暗示的,正是这个事件触发了计算,因此,表达式可以简化为
r\u CLK\u TB='1'
.NEAT。我要开始这样写我所有的代码,只是为了搞乱人们:)
if r_CLK_TB /= '1' then
  wait until r_CLK_TB = '1';
end if;
nClk <= NOT nClk AFTER 10 ns;

WAIT ON nClk UNTIL signalToCheck = '1';