我了解到信号在遇到表达式时不会立即改变,而是在进程结束时立即改变。在此示例中:
...
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的值相反。
嗯,我需要明白一些事情:
- 据我所知,信号值仅更新在过程结束时。它是否正确?
- 信号
x
已更新为第一个声明。这仍然不会改变的值x
,此更改被放入队列中,以便在进程结束后执行。所以此声明之后的所有内容x <= y
不会看到变化并且会看到x
具有其旧的价值。它是否正确?
- 第二个语句是尝试改变信号的值
z
。同样,z 不会改变它的值,但它取决于另一个进程的值。变化于z
将被放入队列中,在进程结束时执行。它是否正确?
该过程结束时会发生什么?
可能性编号 1) 中的值x
改变了,所以 x 有了新的值。第二个信号z
已更新,第一个信号x
已更新,鉴于z
依赖于取决于x
,其值根据新更新的值进行更改x
。这个例子应该可以正常工作。
可能性编号 2) 中的值x
改变了,所以 x 有了新的值。第二个信号z
已更新。鉴于z
被分配了一个旧值x
,这就是值z
将保持,旧值x
已更新,但不考虑此更新。
您能告诉我哪一种是正确的方法吗?
变量会在您分配时更新。信号在下一个增量周期(最早)得到更新。
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 http://www.sigasi.com/content/vhdls-crown-jewel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)