考虑以下代码:
architecture synth of my_entity is
signal a : std_logic;
begin
a <= c and d;
b <= a and c;
end synth;
第二行是考虑到a
在其他进程中发生了变化,还是只在架构的末尾分配了所有信号?
注意你的术语。当你说a
在另一个"进程"中改变时,这在VHDL中具有特定的含义(进程是VHDL中的关键字),并且你的代码没有任何进程。
合成器将把你的代码视为:
a <= c and d;
b <= (c and d) and c;
模拟器通常会在第一次传递中分配a,然后在第二次传递中分配b。delta是在与初始分配相同的模拟时间发生的无限小的时间延迟。
请注意,这是对实际情况的粗略概括……如果您需要完整的细节,请阅读随工具链提供的文档。第二行会尊重a在另一行中的变化吗进程还是所有的信号都只在体系结构的末端分配?
当你这样说的时候,听起来你是在考虑单个进程中的信号行为。在这种情况下,直到进程结束才更新信号,因此b
更新将使用a
然而,不在process
语句内的信号赋值是连续执行的,没有什么可以"触发"架构"运行"。或者,它们都是单独的隐含过程(正如你所评论的),"右侧"的所有内容都隐含了一个敏感性列表。
在您的特殊情况下,b
赋值将使用a
的新值,并且赋值将在a
赋值后的一个增量循环中进行。
有关VHDL中仿真时间如何工作的可读描述,请参阅Jan Decaluwe的页面:
http://www.sigasi.com/content/vhdls-crown-jewel这个帖子也可能很有启发性:
https://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/e47295730b0c3de4/d5bd4532349aadf0?hl=en& ie = UTF-8& q =硬件描述语言(vhdl) +并发+作业# d5bd4532349aadf0