据我所知,PROCESS中的所有语句都是按顺序执行的。那么并发信号分配会发生什么(< =)?它是否与顺序赋值(:=)的工作方式相同,还是在增量延迟后执行?
如果在delta延迟之后执行,那么PROCESS中的所有语句如何被称为顺序?
如果它立即执行,那么在一个过程中,= =和< =之间是否有任何区别?
答案 0 :(得分:7)
在完成处理中的所有顺序代码之后执行信号分配(< =)。这是当该时间步的所有活动进程完成时。
作为一个例子,为什么:
假设您有一个触发2个进程的事件。这两个过程 使用相同的信号,但其中一个改变了它的值 信号。模拟器只能执行一个过程 时间由于顺序模拟模型(不要混淆 vhdl的并发模型。因此,如果首先模拟过程A和A 改变信号,B会有错误的信号值。因此 只有在完成所有触发过程后才能更改信号。
变量赋值(:=)不可复制地执行,可用于例如暂时将一些数据存储在流程中。
答案 1 :(得分:4)
signal a : std_logic := '1'; --initial value is 1
process(clk)
variable b : std_logic;
begin
--note that the variable assignment operator, :=, can only be used to assign the value of variables, never signals
--Likewise, the signal assignment operator, <=, can only be used to assign the value of signals.
if (clk'event and clk='1') then
b := '0' --b is made '0' right now.
a <= b; --a will be made the current value of b ('0') at time t+delta
a <= '0'; --a will be made '0' at time t+delta (overwrites previous event scheduling for a)
b := '1' --b will be made '1' right now. Any future uses of b will be equivalent to replacing b with '1'
a <= b; --a will be made the current value of b ('1') at time t+delta
a <= not(a); --at time t+delta, a will be inverted. None of the previous assignments to a matter, their scheduled event have been overwritten
--after the end of the process, b does not matter because it cannot be used outside of the process, and gets reset at the start of the process
end if;
end process;
同样重要的是要注意,虽然顺序过程从VHDL的逻辑角度顺序操作,但在合成时,它们实际上变成了连接触发器的复杂并发语句。整个过程作为每个时钟周期之间的一个单元同时运行(不在时钟上运行的过程成为纯组合逻辑)。信号是实际存储在触发器中的值。变量只是别名,使进程更容易阅读。它们在综合后被吸收到组合逻辑中。