问题 信号分配如何在一个过程中工作?


我了解到遇到表达式时信号不会立即更改,但是当进程结束时。在这个例子中:

...
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)中的值 x 被更改,因此x具有其新值。第二个信号 z 更新,第一个信号 x 更新了,鉴于此 z 依赖于取决于 x,其值根据NEW UPDATED值更改 x。这个例子应该可以正常工作。

可能性数字2)中的值 x 被更改,因此x具有其新值。第二个信号 z 已更新。鉴于 z 被分配了旧值 x那就是价值 z 将持有,旧的价值 x 已更新,但未考虑此更新。

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


10892
2018-02-20 22:48


起源

2)............. - Jan Decaluwe


答案:


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

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


9
2018-02-21 08:04



感谢philippe,它现在好一点,但我仍然不明白为什么这个例子不起作用。我的意思是,第一个语句试图分配给y的x te值。好的,这个分配是在过程结束时进行的,所以当我再次使用信号x来更新另一个信号时,我没有该信号的值。我想所有信号处理表达式都保存在队列中,以便在进程结束时处理它们。在过程结束时,会考虑信号分配队列并更新x,在此之后,z也会更新....我出错了什么? - Andry
@Andry信号的预定值可以通过后续过程中的顺序信号分配来覆盖。 - Jan Decaluwe
@Jan我很抱歉Jan,但我一直不理解。也许这个论点难以理解我或......我不知道。我只是想了解为什么这个例子不起作用,请看我的编辑。 - Andry


它的工作方式:

Y 变化和过程开始。

X 将被分配到什么 Y's value 目前是,但直到过程结束

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

这个过程现在结束了 X 和 Z 将会被更新


5
2018-02-20 22:59



但是......在架构的begin子句之后的序列语句中不是那样的吗?相反,一个过程就是我们用来创建顺序语句的方式......我是否正确? - Andry
进程本身可以是其他顺序语句列表中的1个顺序语句。过程中的事情不是。 - WuHoUnited
不正确。进程语句本身是并发语句。它包含的内容是顺序语句,例如变量赋值和顺序信号赋值。 - Jan Decaluwe
请做出决定因为我不太了解这一点。我从一开始就知道,流程语句中的所有内容都是按顺序执行的,这对我来说很多次,这就是为什么我认为这是我知识的支柱之一。请不要破坏我的这个支柱:) - Andry
@Andry我建议你自己决定谁在这里有意义。选择一个好的教程,或LRM。提示:“顺序”和“变量语义”之间存在差异。 - Jan Decaluwe


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

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

这产生了一个同步锁存器,一个触发器。

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

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

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

关于“好结束过程:它发生了什么?????”:

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


0
2017-09-29 05:05



例外:不正确。内在的变化 if rising_edge(clk) 在clk边缘之后及时发生NEXT DELTA CYCLE。然而,它们仅在下一个时钟周期由时钟进程查看。 - Brian Drummond