差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

always [2018/09/13 17:06] (当前版本)
group001 创建
行 1: 行 1:
 +always语句总是循环执行,​或者说此语句重复执行。\\  
 +只有寄存器类型数据能够在这种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。\\ 
 +{{ ::​一位全加器.png?​nolink&​500 |}} 
 +<WRAP centeralign>​ **一位全加器电路** </​WRAP>​ 
 +下例为always语句对1位全加器电路建模的示例 \\  
 +<code verilog>​ 
 +module FA_Seq(A,​B,​Cin,​Sum,​Cout);​ 
 +input A,B,Cin; 
 +output Sum,Cout; 
 +reg Sum,Cout; 
 +reg T1,T2,T3; 
 +always @(A or B or Cin) begin 
 +    Sum = (A^B)^Cin;​ 
 +    T1 = A & Cin; 
 +    T2 = B & Cin; 
 +    T3 = A & B; 
 +    Cout=(T1 | T2) | T3; 
 +end 
 +endmodule 
 +</​code> ​           
 +模块FA_Seq有三个输入和两个输出。由于Sum、Cout、T1、T2和T3在always语句中被赋值,​它们被说明为reg类型(reg是寄存器数据类型的一种)。\\  
 +always语句中有一个与事件控制(紧跟在字符@后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要A、B或Cin上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always语句再次等待A、B或Cin上发生的事件。\\  
 +在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。\\ 
 + ​时延可以细分为两种类型:​ 
 +  - 语句间时延:​这是时延语句执行的时延。 
 +  - 语句内时延:​这是右边表达式数值计算与左边表达式赋值间的时延。 
 +下面是语句间时延的示例:\\  
 +<code verilog>​ 
 +Sum=(A^B)^Cin; ​  
 +#​4T1=A&​Cin;​  
 +</​code>​ 
 +在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。\\ 
 +<code verilog>​ 
 +Sum=#​3(A^B)^Cin;​  
 +</​code>​ 
 +这个赋值中的时延意味着首先计算右边表达式的值,​等待3个时间单位,然后赋值给Sum。