15

我了解到信号不是在遇到表达式时立即更改,而是在过程结束时更改。在此示例中:

...
signal x,y,z : bit;
...
process (y)
begin
  x<=y;
  z<=not x;
end process;

该示例说明了这一点:

如果信号 y 发生变化,那么将在 x 上安排一个事件以使其与 y 相同。此外,在 z 上安排了一个事件,使其与 x 相反。问题是,z 的值会与 y 相反吗?当然,答案是否定的,因为在执行第二条语句时,x 上的事件还没有被处理,而 z 上调度的事件将与进程开始前 x 的值相反。

好吧,我需要了解一些事情:

  1. 据我所知,信号值仅在流程结束时更新。它是否正确?
  2. 信号x被更新为第一条语句。这仍然没有改变 的值x,这个改变被放入队列中,在流程结束后执行。因此,此语句之后的所有内容x <= y都不会看到更改,并且会看到x其旧值。它是否正确?
  3. 第二条语句是试图改变信号的值z。这里也一样,z 不会改变它的值,但它取决于另一个进程的值。更改z将被放入队列中以在流程结束时执行。它是否正确?

过程结束时会发生什么?

可能性编号 1) in 中的值x已更改,因此 x 具有其新值。第二个信号z被更新,第一个信号x被更新,并且,给定z取决于x,它的值根据 的 NEW UPDATED 值改变x。该示例应该可以正常工作。

可能性编号 2) in 的值x已更改,因此 x 具有其新值。第二个信号z被更新。鉴于它z被分配了一个旧值x,这就是z将保持的值,它的旧值x已更新,但不考虑此更新。

你能告诉我哪一个是正确的方法吗?

4

3 回答 3

12

变量在您分配它们时得到更新。信号在下一个增量周期(最早)中得到更新。

a := '1'; -- variable
assert a = 1;
b <= '1'; -- signal
computationUsing(b); --reads old value of b
-- new value will be visible after this process ends or some time passes

Jan Decaluwe 在这里更详细地解释了这些东西:http ://www.sigasi.com/content/vhdls-crown-jewel

于 2011-02-21T08:04:34.837 回答
7

它的工作方式:

Y变化和过程开始。

X将被分配到Y's value当前的状态,但直到过程结束

Z将分配给not X's old value但直到流程结束

该过程现在结束XZ并将更新

于 2011-02-20T22:59:40.280 回答
0

我不同意阿什拉夫的帖子。我自己编写了 vhdl 代码,其中变量是电线,信号是锁存器。例子:

信号 x,y,clk; 进程(clk)开始 x <= y 结束进程

这将创建一个同步锁存器,即触发器。

任何不将其值分配给信号而仅分配给其他变量的变量都是完全可以接受的“线”。

我对整个主题的理解是这样的:

进程内的信号分配将忽略在同一进程“实例化”中进行的其他信号分配。此外,对于相同的信号,只考虑最后的分配。

关于“好的过程结束:会发生什么??????”:

我认为信号分配将在进程的硬件利用率允许的最快时间内进行。例外: if(rising_edge(clk)) 中的更改将在下一个时钟周期开始时发生。

于 2013-09-29T05:05:56.690 回答