我了解到遇到表达式时信号不会立即更改,但是当进程结束时。在这个例子中:
...
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
,其值会根据{更新的新值}更改{1}}。这个例子应该可以正常工作。
可能性编号2)x
中的值已更改,因此x具有其新值。第二个信号x
已更新。鉴于已为z
分配了z
的旧值,这是x
将保留的值,z
的旧值已更新,但此更新未被考虑
你能告诉我哪一个是正确的方法吗?
答案 0 :(得分:11)
变量在分配时会更新。信号在下一个增量周期(最早)得到更新。
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
答案 1 :(得分:6)
它的工作方式:
Y
更改并开始流程。
X
将被分配到Y's value
当前的内容,但直到流程结束
Z
将被分配到not X's old value
,但不会分配到流程结束
流程结束,现在X
和Z
将会更新
答案 2 :(得分:0)
我不同意阿什拉夫的帖子。我自己制作了vhdl代码,其中变量是连线,信号是锁存器。例子:
信号x,y,clk; 过程(CLK) 开始 x&lt; = y 结束过程
这会创建一个同步锁存器,一个触发器。
任何不将其值分配给信号但仅分配给其他变量的变量都是完全可以接受的“电线”。
我对整个主题的理解是:
进程内的信号分配将忽略在同一进程“实例化”中进行的其他信号分配。此外,对于相同的信号,仅考虑最后一次分配。
关于“好结束过程:它发生了什么?????”:
我认为信号分配将在流程的硬件利用允许的最快时间进行。 EXCEPTION:if(rising_edge(clk))内的变化将在下一个时钟周期开始时发生。