对于vhdl中的流程语句,据说流程语句内部的执行顺序是顺序的。我的问题是,请首先查看下面的代码,是否在流程语句中的if语句中同时,顺序地将a,b和c信号分配给它们的新值?
process(clk) is
begin
if rising_edge(clk) then
a <= b ;
b <= c ;
c <= a;
end if;
end process;
因此,如果这是顺序的,那么我必须说,在过程结束之后,a等于b,b等于c,c等于b,因为我们在将a分配给c之前将b分配给了a。但是,硬件似乎无法做到这一点。
构造一个包含您的过程的最小,完整和可验证的示例:
library ieee;
use ieee.std_logic_1164.all;
entity sequent_exec is
end entity;
architecture foo of sequent_exec is
signal a: std_ulogic := '1';
signal b, c: std_ulogic := '0';
signal clk: std_ulogic := '0';
begin
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if now > 200 ns then
wait;
end if;
end process;
DUT:
process(clk) is
begin
if rising_edge(clk) then
a <= b ;
b <= c ;
c <= a;
end if;
end process;
end architecture;
我们将a,b和c的移位值作为循环移位寄存器从一个移到另一个:
发生这种情况的原因在于VHDL的仿真周期如何运行。
参见IEEE Std 1076-2008
10.5简单信号分配(10.5.1常规):
信号分配声明会修改包含在一个或多个信号的驱动器中的投影输出波形(请参阅14.7.2),计划一个或多个信号的作用力,或计划一个或多个信号的释放(请参阅14.7.3)。
信号分配将新值排队以进行信号更新。在10.5.2.2执行简单的赋值语句中描述了投影输出波形队列的工作方式:
评估波形元素会产生一个事务。事务的时间部分由当前时间确定,该当前时间加到波形元素中时间表达式的值上。对于第一种形式的波形元素,交易的价值成分由波形元素中的价值表达方式决定。
没有时间表达式的分配是当前的模拟时间。(将发生增量周期-一个模拟周期,而不会提前模拟时间)。10.5.2.2中描述的事务顺序告诉我们,到相同模拟时间的旧事务被删除。
这意味着在任何模拟时间内只有一个队列条目,并解释了为什么对特定信号的最后一次分配是导致事务的交易(并为过程敏感的信号产生事件)。
14.7模型的执行包含有关仿真周期如何运行的信息(14.7.5模型执行)。
14.7.5.1概述:
模型的执行包括初始化阶段,然后在该模型的描述中重复执行流程语句。每次这样的重复被称为模拟周期。在每个循环中,将计算描述中所有信号的值。如果此计算的结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为仿真周期的一部分执行。
14.7.5.3仿真周期描述了仿真周期,此处使用IEEE Std 1076-1993为简单起见,不会因VHPI动作而混乱:
12.6.4仿真周期
模型的执行包括初始化阶段,然后在该模型的描述中重复执行流程语句。每次这样的重复被称为模拟周期。在每个循环中,将计算描述中所有信号的值。如果此计算的结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为仿真周期的一部分执行。
在初始化开始时,当前时间Tc假定为0 ns。
初始化阶段包括以下步骤:
-计算每个明确声明的信号的驱动值和有效值,并将信号的当前值设置为有效值。在开始模拟之前的无限长时间内,假定该值为信号值。
-形式为S'Stable(T)或S'Quiet(T)的每个隐式信号的值都设置为True。形式为S'Delayed(T)的每个隐式信号的值都设置为其前缀S的初始值。
-每个隐式GUARD信号的值设置为评估相应保护表达式的结果。
-模型中的每个未推迟的流程都将执行直到暂停。
-模型中的每个被延迟的过程都将执行直到暂停。
-下一个模拟周期(在本例中为第一个模拟周期)的时间Tn是根据以下模拟周期的步骤f的规则计算的。
仿真周期包括以下步骤:
一种。当前时间Tc设置为等于Tn。当Tn = TIME'HIGH并且Tn没有活动的驱动程序或过程恢复时,仿真完成。
b。模型中的每个活动显式信号都会更新。(结果可能会在信号上发生事件。)
c。模型中的每个隐式信号都会更新。(结果可能会在信号上发生事件。)
d。对于每个过程P,如果P当前对信号S敏感,并且在此模拟周期中S上发生了事件,则P恢复。
e。在当前模拟周期中恢复的每个未推迟的过程都将执行,直到暂停。
F。下一个模拟周期的时间Tn是通过将其设置为最早的
- TIME'HIGH,
- 驾驶员下次激活时,或
- 下一次恢复过程的时间。
- 如果Tn = Tc,则下一个仿真周期(如果有)将是增量周期。
G。如果下一个仿真周期是增量周期,则将跳过此步骤的其余部分。否则,将执行每个已恢复但自其最后一次恢复以来尚未执行的被推迟的进程,直到挂起为止。然后根据步骤f的规则重新计算Tn。如果任何延迟的过程的执行导致增量周期在当前模拟周期之后立即发生,则是错误的。
信号值在过程执行期间不会改变。他们的更新被排队,并在执行仿真周期的不同步骤中应用。
回到-2008:
子句中描述了各种形式的顺序语句。顺序语句用于定义用于执行子程序或过程的算法。它们按照它们出现的顺序执行。
我们看到顺序信号分配执行的顺序与更新信号的顺序无关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句