下载第 7章 数据流模型化本章讲述 Verilog HDL语言中连续赋值的特征。连续赋值用于数据流行为建模;相反,过程赋值用于 (下章的主题 )顺序行为建模。组合逻辑电路的行为最好使用连续赋值语句建模。
7.1 连续赋值语句连续赋值语句将值赋给线网 (连续赋值不能为寄存器赋值 ),它的格式如下 (简单形式 ):
a s s i g n LHS_target = RHS_expression;
例如,
w i r e [3:0] Z,Preset,Clear; //线网说明
a s s i g n Z = Preset & Clear; //连续赋值语句连续赋值的目标为 Z,表达式右端为,Preset & Clear” 。注意连续赋值语句中的关键词
a s s i g n。
连续赋值语句在什么时候执行呢? 只要在右端表达式的操作数上有事件 (事件为值的变化 )
发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。
在上面的例子中,如果 P re s e t或 C l e a r变化,就计算右边的整个表达式。如果结果变化,
那么结果即赋值到线网 Z。
连续赋值的目标类型如下,
1) 标量线网
2),向量线网
3) 向量的常数型位选择
4) 向量的常数型部分选择
5) 上述类型的任意的拼接运算结果下面是连续赋值语句的另一些例子:
a s s i g n BusErr = Parity| (One & OP) ;
a s s i g n Z = ~ (A | B) & (C | D) & (E | F) ;
只要 A,B,C,D,E或 F的值变化,最后一个连续赋值语句就执行。在这种情况下,计算右边整个表达式,并将结果赋给目标 Z。
在下一个例子中,目标是一个向量线网和一个标量线网的拼接结果。
wire C o u t,C i n ;
w i r e [3:0] Sum,A,B;
.,,
a s s i g n {Cout,Sum} = A + B + Cin;
因为 A和 B是 4位宽,加操作的结果最大能够产生 5位结果。左端表达式的长度指定为 5位
(Cout 1位,Sum 4位 )。赋值语句因此促使右端表达式最右边的 4位的结果赋给 S u m,第 5位 (进位位 )赋给 C o u t。
下例说明如何在一个连续赋值语句中编写多个赋值方式。
第 7章 数据流模型化 55下载
a s s i g n M u x = (S = = 0)? A,'bz,
M u x = (S = = 1)? B,'bz,
M u x = (S = = 2)? C,'bz,
M u x = (S = = 3)? D,'bz;
这是下述 4个独立的连续赋值语句的简化书写形式。
a s s i g n M u x = (S = = 0)? A,'bz;
a s s i g n M u x = (S = = 1)? B,'bz;
a s s i g n M u x = (S = = 2)? C,'bz;
a s s i g n M u x = (S = = 3)? D,'bz;
7.2 举例下例采用数据流方式描述 1位全加器。
m o d u l e F A _ D f (A,B,Cin,Sum,Cout) ;
i n p u t A,B,Cin;
o u t p u t Sum,Cout;
a s s i g n S u m = A ^B ^Cin;
a s s i g n C o u t = (A & Cin) | (B & Cin) | (A & B) ;
e n d m o d u l e
在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关。只要连续赋值语句右端表达式中操作数的值变化 (即有事件发生 ),连续赋值语句即被执行。如果 A
变化,则两个连续赋值都被计算,即同时对右端表达式求值,并将结果赋给左端目标。
7.3 线网说明赋值连续赋值可作为线网说明本身的一部分。这样的赋值被称为线网说明赋值。例如,
w i r e [3:0] S u m = 4'b0;
w i r e C l e a r = 'b1;
w i r e A _ G T _ B = A > B,B_GT_A= B > A;
线网说明赋值说明线网与连续赋值。说明线网然后编写连续赋值语句是一种方便的形式。
参见下例。
w i r e C l e a r ;
a s s i g n C l e a r = 'b1;
等价于线网声明赋值:
w i r e C l e a r = 'b1;
不允许在同一个线网上出现多个线网说明赋值。如果多个赋值是必需的,则必须使用连续赋值语句。
7.4 时延如果在连续赋值语句中没有定义时延,如前面的例子,则右端表达式的值立即赋给左端表达式,时延为 0。如下例所示显式定义连续赋值的时延。
assign #6 Ask = Quiet | | L a t e;
规定右边表达式结果的计算到其赋给左边目标需经过 6个时间单位时延。例如,如果在时刻 5,L a t e值发生变化,则赋值的右端表达式被计算,并且 A s k在时刻 11( = 5 +6)被赋于新值。
56 Verilog HDL 硬件描述语言 下载图 7 - 1举例说明了时延概念。
图 7-1 连续赋值语句中的时延如果右端在传输给左端之前变化,会发生什么呢?在这种情况下,应用最新的变化值。
下例显示了这种行为:
a s s i g n #4 Cab = Drm;
图 7 - 2显示了这种变化的效果。右端发生在时延间隔内的变化被滤掉。例如,在时刻 5,
D r m的上升边沿预定在时刻 9显示在 C a b上,但是因为 D r m在时刻 8下降为 0,预定在 C a b上的值被删除。同样,D r m在时刻 1 8和 2 0之间的脉冲被滤掉。这也同样适用于惯性时延行为:即右端值变化在能够传播到左端前必须至少保持时延间隔;如果在时延间隔内右端值变化,则前面的值不能传输到输出。
图 7-2 值变化快于时延间隔对于每个时延定义,总共能够指定三类时延值:
1) 上升时延
2) 下降时延
3) 关闭时延这三类时延的语法如下,
assign # (rise,fall,turn-off) L H S _ t a r g e t = R H S _ e x p r e s s i o n;
下面是当三类时延值定义为 0时,如何解释时延的实例:
a s s i g n #4 A s k = Q u i e t | | L a t e; // One delay value.
a s s i g n # (4,8) A s k = Q u i c k ; // Two delay values.
a s s i g n # (4,8,6) A r b = & DataBus; // Three delay values.
a s s i g n B u s = MemAddr [7:4]; // No delay value.
在第一个赋值语句中,上升时延、下降时延、截止时延和传递到 x的时延相同,都为 4。
在第二个语句中,上升时延为 4,下降时延为 8,传递到 x和 z的时延相同,是 4和 8中的最小值,
即 4。在第 3个赋值中,上升时延为 4,下降时延为 8,截止时延为 6,传递到 x的时延为 4 ( 4,8
和 6中的最小值 )。在最后的语句中,所有的时延都为 0。
上升时延对于向量线网目标意味着什么呢? 如果右端从非 0向量变化到 0向量,那么就使用第 7章 数据流模型化 57下载下降时延。如果右端值到达 z,那么使用下降时延;否则使用上升时延。
7.5 线网时延时延也可以在线网说明中定义,如下面的说明。
w i r e #5 A r b;
这个时延表明 A r b驱动源值改变与线网 A r b本身间的时延。考虑下面对线网 A r b的连续赋值语句:
a s s i g n # 2 Arb = Bod & Cap;
假定在时刻 1 0,B o d上的事件促使右端表达式计算。如果结果不同,则在 2个时间单位后赋值给 A r b,
即时刻 1 2。但是因为定义了线网时延,实际对 A r b的赋值发生在时刻 17( = 10 + 2 + 5)。图 7 - 3的波形举例说明了不同的时延。
图 7 - 4很好地描述了线网时延的效果。首先使用赋值时延,然后增加任意线网时延。
如果时延在线网说明赋值中出现,那么时延不是线网时延,而是赋值时延。下面是 A的线网说明赋值,2个时间单位是赋值时延,而不是线网时延。
w i r e #2 A = B - C; // 赋值时延图 7-4 线网时延的效果
7.6 举例
7.6.1 主从触发器下面是图 5 - 9所示的主从触发器的 Verilog HDL模型。
m o d u l e M S D F F _ D F (D,C,Q,Qbar) ;
i n p u t D,C;
o u t p u t Q,Qbar;
w i r e NotC,NotD,NotY,Y,D1,D2,Ybar,Y1,Y2;
a s s i g n N o t D = ~ D;
a s s i g n N o t C = ~ C;
a s s i g n N o t Y = ~ Y;
a s s i g n D 1 = ~ (D & C) ;
a s s i g n D 2 = ~ (C & NotD) ;
图 7-3 带有赋值时延的线网时延时延线网时延线网目标 表达式表达式驱动 1
驱动 2
时延
a s s i g n Y = ~ (D1 & Ybar) ;
a s s i g n Ybar = ~ (Y & D2) ;
a s s i g n Y1 = ~ (Y & NotC) ;
a s s i g n Y2 = ~ (NotY & NotC) ;
a s s i g n Q = ~ (Qbar & Y1) ;
a s s i g n Q b a r = ~ (Y2 & Q) ;
e n d m o d u l e
7.6.2 数值比较器下面是 8位 (参数定义的 )数值比较器数据流模型。
m o d u l e MagnitudeComparator (A,B,AgtB,AeqB,AltB) ;
p a r a m e t e r BUS = 8;
p a r a m e t e r EQ_DELAY = 5,LT_DELAY = 8,GT_DELAY = 8;
i n p u t [1,BUS]A,B;
o u t p u t AgtB,AeqB,AltB;
a s s i g n #EQ_DELAY AeqB = A = = B;
a s s i g n #GT_DELAY AgtB= A > B;
a s s i g n #LT_DELAY AltB= A < B;
e n d m o d u l e
习题
1,举例说明截止时延在连续赋值语句中如何使用?
2,当对同一目标有 2个或多个赋值形式时,如何决定目标有效值?
3,写出图 5 - 1 0所示的奇偶产生电路的数据流模型描述形式。只允许使用 2个赋值语句,并规定上升和下降时延。
4,使用连续赋值语句,描述图 5 - 1 2所示的优先编码器电路的行为。
5,假定:
tri0 [4:0] Q b u s;
a s s i g n Q b u s = S b u s;
a s s i g n Q b u s = P b u s;
如果 P b u s和 S b u s均为高阻态 z,Q b u s上的值是什么?
58 Verilog HDL 硬件描述语言 下载