下载 第7章数据流模型化 本章讲述 Verilog HDL语言中连续赋值的特征。连续赋值用于数据流行为建模;相反,过 程赋值用于(下章的主题〕顺序行为建模。组合逻辑电路的行为最好使用连续赋值语句建模 7.1连续赋值语句 连续赋值语句将值赋给线网(连续赋值不能为寄存器赋值),它的格式如下(简单形式): assign LHs target = RHs expression 例如, wire[3:0]2, Preset, Clear;/线网说明 ssign 2=Preset Cleari 连续赋值的目标为Z,表达式右端为“ Preset& Clear”。注意连续赋值语句中的关键词 assign 连续赋值语句在什么时候执行呢?只要在右端表达式的操作数上有事件(事件为值的变化) 发生时,表达式即被计算:如果结果值有变化,新结果就赋给左边的线网。 在上面的例子中,如果 Prese或 Clear变化,就计算右边的整个表达式。如果结果变化 那么结果即赋值到线网Z。 连续赋值的目标类型如下 1)标量线网 3)向量的常数型位选择 4)向量的常数型部分选择 5)上述类型的任意的拼接运算结果 下面是连续赋值语句的另一些例子: assign BusErr Parity ( One OP) assign z 只要A、B、C、D、E或F的值变化,最后一个连续赋值语句就执行。在这种情况下,计 算右边整个表达式,并将结果赋给目标Z。 在下一个例子中,目标是一个向量线网和一个标量线网的拼接结果。 wire Cout, cin wire [3:0] sum, A, B assign Cout, Sum)=A B+ Cin 因为A和B是4位宽,加操作的结果最大能够产生5位结果。左端表达式的长度指定为5位 ( Cout 1位,Sam4位)。赋值语句因此促使右端表达式最右边的4位的结果赋给Sm,第5位(进 位位)赋给Cot 下例说明如何在一个连续赋值语句中编写多个赋值方式
下载 第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。 下例说明如何在一个连续赋值语句中编写多个赋值方式
Chinaopub.com 第章数据流模型化55 ss⊥ gn Mux=( 0)?A 2)?c 这是下述4个独立的连续赋值语句的简化书写形式。 assign Mux =(s 0)?A:"b ssign Mux =(S==1)?B: b: assign Mux assign Mux =(S==3)2D:bz; 7.2举例 下例采用数据流方式描述1位全加器 module FA Df (A, B, Cin, Sum, Cou)t: input A,B,C⊥n output Sum, Cout i assign sum=A^B^c⊥z assign cout =(A Cin I (B Cin)I (A B endmodule 在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关。只要 连续赋值语句右端表达式中操作数的值变化(即有事件发生),连续赋值语句即被执行。如果A 变化,则两个连续赋值都被计算,即同时对右端表达式求值,并将结果赋给左端目标 7.3线网说明赋值 连续赋值可作为线网说明本身的一部分。这样的赋值被称为线网说明赋值。例如 wire [3: 0] Sum =4'bo wire clear wire A GT B= A> B, B GT A= B>A: 线网说明赋值说明线网与连续赋值。说明线网然后编写连续赋值语句是一种方便的形式。 参见下例 wire clear assign Clear ='bl 等价于线网声明赋值: wire clear 不允许在同一个线网上出现多个线网说明赋值。如果多个赋值是必需的,则必须使用连 续赋值语句。 74时延 如果在连续赋值语句中没有定义时延,如前面的例子,则右端表达式的值立即赋给左端 表达式,时延为0。如下例所示显式定义连续赋值的时延。 assign #6 Ask Quiet II ate 规定右边表达式结果的计算到其赋给左边目标需经过6个时间单位时延。例如,如果在时 刻5,Late值发生变化,则赋值的右端表达式被计算,并且Ask在时刻11(=5+6)被赋于新值
第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硬件描述语言 Chinapub coM 下载 图7-1举例说明了时延概念 图7-1连续赋值语句中的时延 如果右端在传输给左端之前变化,会发生什么呢?在这种情况下,应用最新的变化值 下例显示了这种行为: assign #4 cab =Drm; 图7-2显示了这种变化的效果。右端发生在时延间隔内的变化被滤掉。例如,在时刻5, Drm的上升边沿预定在时刻9显示在Cab上,但是因为Drm在时刻8下降为0,预定在Cab上的值 被删除。同样,Drm在时刻18和20之间的脉冲被滤掉。这也同样适用于惯性时延行为:即右 端值变化在能够传播到左端前必须至少保持时延间隔:如果在时延间隔内右端值变化,则前 面的值不能传输到输出 Drm 图7-2值变化快于时延间隔 对于每个时延定义,总共能够指定三类时延值 1)上升时延 2)下降时延 3)关闭时延 这三类时延的语法如下 assign (rise, fall, turn-off lhs target RHs expression 下面是当三类时延值定义为0时,如何解释时延的实例 assign #4 Ask Quiet Il Late //one delay value assign #(4,8) Ask Quick //rw。 delay values assign #(4, 8, 6)Arb = DataBus: / Three delay values assign Bu 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向量,那么就使用
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向量,那么就使用
第章数据流型化57 下降时延。如果右端值到达z,那么使用下降时延:否则使用上升时延 7.5线网时延 时延也可以在线网说明中定义,如下面的说明。 wire #5 Arb 这个时延表明Arb驱动源值改变与线网Arb本身间的时延。考虑下面对线网Arb的连续赋值 语句: assign #2 Arb Bod Cap 假定在时刻10,Bod上的事件促使右端表达式计 算。如果结果不同,则在2个时间单位后赋值给Arb, 即时刻12。但是因为定义了线网时延,实际对Arb的 赋值发生在时刻17(=10+2+5)。图7-3的波形举例 说明了不同的时延。 图7-4很好地描述了线网时延的效果。首先使用 赋值时延,然后增加任意线网时延。 如果时延在线网说明赋值中出现,那么时延不是 图7-3带有赋值时延的线网时延 网时延,而是赋值时延。下面是A的线网说明赋值,2个时间单位是赋值时延,而不是线 w⊥e#2A=B-C /赋值时延 驱动 线网目标 assign时延 RHS表达式 网时延 asgn时延|RHs表达式 图74线网时延的效果 7.6举例 7.6.1主从触发器 下面是图5-9所示的主从触发器的 Verilog hdli模型 module MSDFF DF (D, C, o, obari wire Notc, NotD, NotY, Y, DI, D2, Ybar, Y1,i Y2 assign NotD =+D assign Notc=+C assign NotY =* Yi assign D2=+(C& NotDi
第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 时延
58wiD硬停述语言 Chinapub.com 下载 ssign Y2 =* Noty Not; assign oba Y2 0) 7.62数值比较器 下面是8位(参数定义的)数值比较器数据流模型。 module Magni tudeComparator(A, B, AgtB, AegB, Al0B parameter EO DELAY= 5, LT DELAY=8, GT DELAY=8: output AgtB, Egb, Alts assign #EQ DELAY AeqB=A==B: assign #GT DELAY AgtB= A>B 习题 1.举例说明截止时延在连续赋值语句中如何使用? 2.当对同一目标有2个或多个赋值形式时,如何决定目标有效值? 3.写出图5-10所示的奇偶产生电路的数据流模型描述形式。只允许使用2个赋值语句,并规定 上升和下降时延 4.使用连续赋值语句,描述图5-12所示的优先编码器电路的行为, 5.假定 trio [4: 0] obus assign obus = Sbus 如果Pb和Sbs均为高阻态z,Qbus上的值是什么?
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 硬件描述语言 下载