【问题标题】:How does signal assignment work in a process?信号分配如何在流程中工作?
【发布时间】:2011-06-30 22:40:46
【问题描述】:

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

...
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 &lt;= y 之后的所有内容都不会看到更改,并且会看到 x 具有其旧值。这是正确的吗?
  3. 第二条语句试图更改信号z 的值。这里也一样,z 不会改变它的值,但它取决于另一个进程的值。 z 上的更改将被放入队列中以在流程结束时执行。这是正确的吗?

流程结束时会发生什么?

可能性编号 1) x 中的值已更改,因此 x 具有其新值。第二个信号z 被更新,第一个信号x 被更新,并且鉴于z 依赖于x,它的值根据x 的新更新值进行更改。该示例应该可以正常工作。

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

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

【问题讨论】:

    标签: vhdl modelsim


    【解决方案1】:

    它的工作方式:

    Y 发生变化,流程开始。

    X 将分配给当前的 Y's value,但直到进程结束时才分配

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

    流程结束,所以现在 XZ 将被更新

    【讨论】:

    • 但是……这不是在架构的开始子句之后的顺序语句中吗??????相反,过程只是我们用来创建顺序语句的方式……我说的对吗???
    • 进程本身可以是其他顺序语句列表中的1个顺序语句。进程里面的东西不是。
    • 不正确。流程语句本身就是并发语句。它包含的是顺序语句,例如变量赋值和顺序信号赋值。
    • 请做出决定,因为我不太了解这一点。我从一开始就知道流程语句中的所有内容都是按顺序执行的,这已多次向我展示,这就是为什么我认为这是我知识的支柱之一。请不要破坏我的这根支柱:)
    • @Andry 我建议自己决定谁在这里有意义。选择一个好的教程,或者 LRM。提示:“顺序”和“变量语义”是有区别的。
    【解决方案2】:

    变量会随着您的分配而更新。信号在下一个增量周期(最早)中得到更新。

    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

    【讨论】:

    • 谢谢philippe,现在好多了,但我还是不明白为什么这个例子不起作用。我的意思是,第一条语句试图分配给 y 的 x te 值。好的,这个分配是在过程结束时进行的,所以当我再次使用信号 x 更新另一个信号时,我没有那个信号的值。我想所有信号处理表达式都保存在一个队列中,以便在流程结束时处理它们。在该过程结束时,考虑信号分配队列并更新 x ,然后更新 z ......我错了什么?
    • @Andry 信号的预定值可以被后续过程中的顺序信号分配覆盖。
    • @Jan 我很抱歉 Jan 但我一直不理解。也许这个论点对我来说很难理解,或者……我不知道。我只是想了解为什么该示例不起作用,请查看我的编辑。
    • @Andry:你没有得到什么?它是您在上面的可能性 (2) 中概述的内容。 z 根据 x 的旧值获取其值,因为它没有看到新值
    【解决方案3】:

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

    信号 x,y,clk; 进程(时钟) 开始 x

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

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

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

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

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

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

    【讨论】:

    • 异常:不正确。 if rising_edge(clk) 内的更改及时发生在 clk 边缘之后的 NEXT DELTA CYCLE 之前。然而,它们只能在下一个时钟周期被时钟进程看到。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2017-02-09
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多