Chia°bub0 下载 第9章结构建模 本章讲述 Verilog HDl中的结构建模方式。结构建模方式用以下三种实例语句描述: Gate实例语句 ·UDP实例语句 Module实例语句 第5章和第6章已经讨论了门级建模方式和UDP建模方式,本章讲述模块实例语句 9.1模块 Verilog hdli中,基本单元定义成模块形式,如下所示 module module name(port list)i Declarations and statement 端口队列pσ rt list列出了该模块通过哪些端口与外部模块通信。 92端口 模块的端口可以是输入端口、输出端口或双向端口。缺省的端口类型为线网类型(即 wire类型)。但是,端口可被显式地指定为线网。输出或输入输出端口能够被重新声明为reg型 寄存器。无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度 相同。下面是一些端口说明实例 module Micro (PC, Instr, Nex tAdde //端口说明 output [1: 8] Instr inout [16: 1] NextAddri //重新说明端口类型 wire[16:1] Nex aDdr;//该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度 reg [1: 8] Instr. nstr已被重新说明为reg类型,因此它能在 always语句或在 initia1语句中赋值。 9.3模块实例语句 一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式 module name instance name port associations 信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口关联形式如下
下载 第9章 结 构 建 模 本章讲述Verilog HDL中的结构建模方式。结构建模方式用以下三种实例语句描述: • Gate实例语句 • UDP实例语句 • Module实例语句 第5章和第6章已经讨论了门级建模方式和 U D P建模方式,本章讲述模块实例语句。 9.1 模块 Verilog HDL中,基本单元定义成模块形式,如下所示 : m o d u l e m o d u l e _ n a m e(p o r t _ l i s t) ; D e c l a r a t i o n s _ a n d _ S t a t e m e n t s e n d m o d u l e 端口队列p o rt _ l i s t列出了该模块通过哪些端口与外部模块通信。 9.2 端口 模块的端口可以是输入端口、输出端口或双向端口。缺省的端口类型为线网类型(即 w i r e类型)。但是,端口可被显式地指定为线网。输出或输入输出端口能够被重新声明为 r e g型 寄存器。无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度 相同。下面是一些端口说明实例。 m o d u l e M i c r o (PC, Instr, NextAddr); / /端口说明 i n p u t [3:1] P C; o u t p u t [1:8] I n s t r; i n o u t [16:1] N e x t A d d r; / /重新说明端口类型: w i r e [16:1] N e x t A d d r; //该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。 r e g [1:8] I n s t r; / /I n s t r已被重新说明为r e g类型,因此它能在always 语句或在i n i t i a l语句中赋值。 . . . e n d m o d u l e 9.3 模块实例语句 一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式 如下: module_name instance_name(p o r t _ a s s o c i a t i o n s) ; 信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口关联形式如下:
84 Verilog hdl硬件描述语言 China-pub. coM 下载 //通过位置 PortName (port expr) //通过名称 port expr可以是以下的任何类型 1)标识符(reg或net) 2)位选择 3)部分选择 4)上述类型的合并 5)表达式(只适用于输入端口) 在位置关联中,端口表达式按指定的顺序与模块中的端口关联。在通过名称实现的关联 中,模块端口和端口表达式的关联被显式地指定,因此端口的关联顺序并不重要。下例使用 两个半加器模块构造全加器:逻辑图如图9-1所示 module HA(A, b,s, C) output s, parameter AND DELAY 1, XOR DELAY 2 assign #XOR DELAY S=A B ssign # AND DELAY C=A&B: module FA(P, 0, Cin, Sum, Cout 0, cin 图9-1使用两个半加器模块构造 output Sum, Cout 的全加器 parameter OR DELAY wire s1, C1, C2 //两个模块实例语句 HAh1(P,Q,S1,C1;//通过位置关联。 HAh2(.A(Cin),.s(sum),.B(S1),,C(C2));//通过端口与信号的名字关联 or #OR DELAY ol Cout, Cl, Ci 在第一个模块实例语句中,HA是模块的名字,hl是实例名称,并且端口按位置关联,即 信号P与模块(HA)的端口A连接,信号Ω与端口B连接,Sl与S连接,Cl与模块端口C 在第二个实例中,端口按名称关联,即模块(HA)和端口表达式间的连接是显示地定义 下例是使用不同端口表达式形式的模块实例语句。 Micro MI (UdIn[3: 0], rN, RaN), Status[o], Status [1] UdOut [0: 7], TxDa ta) 这个实例语句表示端口表达式可以是标识符( TxData)、位选择(Saus[0])、部分位选 择(Udm3:0])、合并({NRN})或一个表达式(& doull0:7]);表达式只能够连接到 输入端口 9.3.1悬空端口 在实例语句中,悬空端口可通过将端口表达式表示为空白来指定为悬空端口,例如:
p o r t _ e x p r / /通过位置。 .P o r t N a m e (p o r t _ e x p r) / /通过名称。 p o rt _ e x p r可以是以下的任何类型: 1) 标识符(r e g或n e t) 2) 位选择 3) 部分选择 4) 上述类型的合并 5) 表达式(只适用于输入端口) 在位置关联中,端口表达式按指定的顺序与模块中的端口关联。在通过名称实现的关联 中,模块端口和端口表达式的关联被显式地指定,因此端口的关联顺序并不重要。下例使用 两个半加器模块构造全加器;逻辑图如图 9 - 1所示。 m o d u l e H A(A , B , S , C); i n p u t A , B; o u t p u t S, C; p a r a m e t e r A N D _ D E L A Y = 1, X O R _ D E L A Y = 2; a s s i g n #X O R _ D E L A Y S = A ^ B; a s s i g n #A N D _ D E L A Y C = A & B; e n d m o d u l e m o d u l e F A(P, Q, Cin, Sum, Cout) ; i n p u t P, Q, Cin; o u t p u t Sum, Cout; p a r a m e t e r O R _ D E L A Y = 1; w i r e S1, C1, C2; / /两个模块实例语句 HA h1 (P, Q, S1, C1); //通过位置关联。 HA h2 ( .A(C i n), .S(S u m), .B(S 1), .C(C 2)); //通过端口与信号的名字关联。 / /门实例语句: or #O R _ D E L A Y O1 (Cout, C1, C2) ; e n d m o d u l e 在第一个模块实例语句中, H A是模块的名字 ,h 1是实例名称,并且端口按位置关联,即 信号P与模块(H A)的端口A连接,信号Q与端口B连接,S 1与S连接,C 1与模块端口 C连接。 在第二个实例中,端口按名称关联,即模块( H A)和端口表达式间的连接是显示地定义 的。 下例是使用不同端口表达式形式的模块实例语句。 Micro M1 (U d I n[3:0], {WrN, RdN}, S t a t u s[0], S t a t u s[ 1 ] , & U d O u t [0:7], T x D a t a) ; 这个实例语句表示端口表达式可以是标识符( T x D a t a)、位选择(S t a t u s[ 0 ])、部分位选 择(U d I n[ 3 : 0 ])、合并({Wr N,R d N})或一个表达式(& u d O u t[ 0 : 7 ]);表达式只能够连接到 输入端口。 9.3.1 悬空端口 在实例语句中,悬空端口可通过将端口表达式表示为空白来指定为悬空端口,例如: 84 Verilog HDL 硬件描述语言 下载 图9-1 使用两个半加器模块构造 的全加器
Chinaopub.com 物结建85 下载 DFF dI(o(0s),. obar(,. Data(D), Preset(),. Clock(CK));/名称对应方式 DFFd2(QS,,D,,CK;//位置对应方式。 //输出端口Qbax悬空 //输入端口 Preset打开,其值设定为z。 在这两个实例语句中,端口Qbar和 Preset悬空 模块的输入端悬空,值为髙阻态z。模块的输岀端口悬空,表示该输岀端口废弃不用 932不同的端口长度 当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹 配。例如: endmodule odule Top; wire [1: 2] BaI wire [2: 6] Mpr Chila c1(Bd1,№r) endmodule 在对 Child模块的实例中,Bd2]连接到Pba[0],Bal[连接到Pba[1],余下的输入端口 Pba[5]、Pba[4]和Pba[3悬空,因此为高阻态z。与之相似,Mr6连接到Ppy[0],Mpr[5]连 接到Ppy[1l,Mpr[4]连接到Ppy{2]。参见图9-2。 Pp[432|10 F[2|10 如[2|34||6 图92端口匹配 9.3.3模块参数值 当某个模埉在另一个模块内被引用时,髙层模块能够改变低层模块的参数值。模块参数 值的改变可采用下述两种方式: 1)参数定义语句( defparam) 2)带参数值的模块引用 参数定义语句 参数定义语句形式如下: defparam hier path name l= valuel hier path name2= value2,..i 较低层模块中的层次路径名参数可以使用如下语句显式定义(层次路径名在下一章中讲
DFF d1 ( .Q(Q S), .Q b a r(), .D a t a( D ) , .P r e s e t(), .C l o c k(CK)); //名称对应方式。 DFF d2 (QS, , D, , CK) ; / /位置对应方式。 / /输出端口Q b a r悬空。 / /输入端口P r e s e t打开,其值设定为z。 在这两个实例语句中,端口 Q b a r和P re s e t悬空。 模块的输入端悬空,值为高阻态 z。模块的输出端口悬空,表示该输出端口废弃不用。 9.3.2 不同的端口长度 当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹 配。例如: m o d u l e C h i l d(Pba, Ppy) ; i n p u t [5:0] P b a; o u t p u t [2:0] P p y; . . . e n d m o d u l e m o d u l e T o p; w i r e [1:2] B d l; w i r e [2:6] M p r; Child C1 (Bdl, Mpr) ; e n d m o d u l e 在对C h i l d模块的实例中, B d l[ 2 ]连接到P b a[ 0 ],B d l[1] 连接到P b a[ 1 ],余下的输入端口 P b a[ 5 ]、P b a[ 4 ]和P b a[ 3 ]悬空,因此为高阻态 z。与之相似,M p r[ 6 ]连接到P p y[ 0 ],M p r[ 5 ]连 接到P p y[ 1 ],M p r[4] 连接到P p y[ 2 ]。参见图9 - 2。 图9-2 端口匹配 9.3.3 模块参数值 当某个模块在另一个模块内被引用时,高层模块能够改变低层模块的参数值。模块参数 值的改变可采用下述两种方式: 1) 参数定义语句(d e f p a r a m); 2) 带参数值的模块引用。 1. 参数定义语句 参数定义语句形式如下: d e f p a r a m hier_path_name1 = v a l u e 1, hier_path_name2 = v a l u e 2, ...; 较低层模块中的层次路径名参数可以使用如下语句显式定义(层次路径名在下一章中讲 第9章 结 构 建 模 85 下载
86wiD)硬停述语言 Chinapub.com 下载 述)。下面是一个例。模块FA和HA已在本节前面描述过 module ToP(Ne wA, Ne wB, News, NewC) input NewA, NewB output News, NewC defparam Hal XOR DELAY =5 //实例Ha1中的参数 XOR DELAY a1 AND DELAY 2 //实例Ha1中参数的 AND DELAY HA HaI(NewA, NewB, News, Newc endmodule module ToP2(NewP, Ne wo, Ne wCin, Ne wSum, Ne wcout input NewP, Ne wQ, Ne wCin utput New Sum, NewCout defparam Fal. hI. XOR DELAY =2 //实例Fa1的实例h中的参数 XOR DELAY。 Fa1. h1. AND DELAY =3 //实例Fa1的实例h1中的参数 AND DELAY FaI OR DELAY= 3: //实例Fa1中的参数 OR DELAY) FA FaI (NewP, Newo, NewCin, NewSum, NewCojurt 2.带参数值的模块引用 在这种方法中,模块实例语句自身包含有新的参数值。下面的例子在前几节中也出现过, 本例中采用带参数的模块引用方式。 module ToP3(NewA, NewB, News, New C)i input NewA, Ne wB; HA (5, 2) HaI(NewA, NewB, News, NewC) ′/第1个值5赋给参数 AND DELAY,该参数在模块HA中说明。 /第2个值2赋给参数 XOR DELAY,该参数在模块HA中说明 endmodule module TOP4( NewP, Newo, NewCin, Newcout)i output Ne wSum, NewCounti defparam 2,/例Fa1中实例h1的参数xOR Fa1.h1. AND DELAY=3;/例Fa1中实例h1的参数 AND DELAY。 FA #(3) Fal(NewP, Newo, Newcin, NewCout //值3是参数 OR DELAY的新值 模块实例语句中参数值的顺序必须与较低层被引用的模块中说明的参数顺序匹配。在模 块TOP3中, AND DELAY已被设置为5, XOR DELAY已被设置为2 模块TOP3和TOP4解释说明了带参数的模块引用只能用于将参数值向下传递一个层次(例 如, OR DELAY),但是参数定义语句能够用于替换层次中任意一层的参数值 应注意到:在带参数的模块引用中,参数的指定方式与门级实例语句中时延的定义方式
述)。下面是一个例。模块FA和H A已在本节前面描述过。 m o d u l e TOP (N e w A , N e w B , N e w S , N e w C) ; i n p u t N e w A , N e w B; o u t p u t N e w S , N e w C; d e f p a r a m H a 1 . X O R _ D E L A Y = 5, / /实例H a 1中的参数X O R _ D E L A Y。 H a 1 . A N D _ D E L A Y = 2; / /实例H a 1中参数的A N D _ D E L A Y。 HA Hal (NewA, NewB, NewS,NewC) ; e n d m o d u l e m o d u l e T O P 2 (NewP, NewQ, NewCin,NewSum,NewCout ) ; i n p u t NewP, NewQ, NewCin; o u t p u t N e w S u m , N e w C o u t; d e f p a r a m F a 1 . h 1 . X O R _ D E L A Y = 2, / /实例F a 1的实例h 1中的参数X O R _ D E L A Y。 F a 1 . h 1 . A N D _ D E L A Y = 3, / /实例F a 1的实例h 1中的参数A N D _ D E L A Y。 F a 1 . O R _ D E L A Y = 3; / /实例F a 1中的参数O R _ D E L A Y) FA Fa1 (NewP, NewQ, NewCin,NewSum,NewCout ) ; e n d m o d u l e 2. 带参数值的模块引用 在这种方法中,模块实例语句自身包含有新的参数值。下面的例子在前几节中也出现过, 本例中采用带参数的模块引用方式。 m o d u l e T O P 3 (N e w A , N e w B , N e w S , N e w C) ; i n p u t N e w A , N e w B; o u t p u t N e w S , N e w C; H A #(5,2) H a 1(N e w A , N e w B , N e w S , N e w C) ; / /第1个值5赋给参数A N D_D E L A Y,该参数在模块H A中说明。 / /第2个值2赋给参数 X O R_D E L A Y,该参数在模块H A中说明。 e n d m o d u l e m o d u l e T O P 4(N e w P , N e w Q , N e w C i n , N e w C o u t) ; i n p u t N e w P , N e w Q , N e w C i n; o u t p u t N e w S u m , N e w C o u n t; d e f p a r a m F a 1 . h 1 . X O R _ D E L A Y = 2, //实例F a 1中实例h 1的参数X O R _ D E L A Y。 F a 1 . h 1 . A N D _ D E L A Y = 3; //实例F a 1中实例h 1的参数A N D _ D E L A Y。 F A #(3) F a 1(N e w P , N e w Q , N e w C i n , N e w C o u t) ; / /值3是参数O R _ D E L A Y的新值。 e n d m o d u l e 模块实例语句中参数值的顺序必须与较低层被引用的模块中说明的参数顺序匹配。在模 块TO P 3中,A N D _ D E L AY已被设置为5,X O R _ D E L AY已被设置为2。 模块TO P 3和TO P 4解释说明了带参数的模块引用只能用于将参数值向下传递一个层次(例 如,O R _ D E L AY),但是参数定义语句能够用于替换层次中任意一层的参数值。 应注意到:在带参数的模块引用中,参数的指定方式与门级实例语句中时延的定义方式 86 Verilog HDL 硬件描述语言 下载
物结建颇87 下载 相似:但由于对复杂模块的引用时,其实例语句不能像对门实例语句那样指定时延,故此处 不会导致混淆。 参数值还可以表示长度。下面是通用的M×N乘法器建模的实例。 module Multiplier(Opd 1, Opd 2, Result parameter EM=4,EN=2;//默认值 input [EM: 1] Opd 1 input [EN: 1] opd 2 output [EM+EN: 1] Result assign Result Opd 1* Opd 2: endmodule 这个带参数的乘法器可在另一个设计中使用,下面是8×6乘法器模块的带参数引用方式: wire [1: 8] Pipe Reg: wire [l: 6]Dbus; wire [1: 14 Addr counter Multiplier #(8, 6)Mi(Pipe Reg, Dbus, Addr counter) 第1个值8指定了参数EM的新值,第2个值6指定了参数EN的新值 94外部端口 在迄今为止所见到的模块定义中,端口表列举出了模块外部可见的端口。例如 module Scram A(Arb, Ctrl, Mem Blk, Byte)i input[0: 3] Arb input ctrl input [8: 0] Mem Blk; output [0: 3] Byte endmodule Amb、Cmrl、 Mem blk和Bvte为模块端口。这些端口同时也是外部端口,即在实例中, 釆用名称关联方式时,外部端口名称用于指定相互连接。下面是模块 Scram a的实例, Scram A SX. Byte(B1), Mem Blk(Mi), ctrI(CI), Arb(Al))i 在模块ScrωmA中,外部端口名称隐式地指定。Ⅴ erilog HDl中提供显式方式指定外部端 口名称。这可以通过按如下形式指定一个端口来完成 external port name (internal port name) 下面是同一个例子,只不过是显式地指定外部端口 module Scram B(. Da ta(Arb), Control(ctrl) Mem Word (Mem Blk), Addr(Byte)) input [0: 3] Arbi input ctrl input [8: 0]Mem Blk; utput [0: 3] Byte 模块 Scram B在此实例中指定的外部端口是Data、 Control、 Mem Word和Addr。端口表显 式地表明了外部端口和内部端口之间的连接。注意外部端口无需声明,但是模块的内部端口
相似;但由于对复杂模块的引用时,其实例语句不能像对门实例语句那样指定时延,故此处 不会导致混淆。 参数值还可以表示长度。下面是通用的 M×N乘法器建模的实例。 m o d u l e M u l t i p l i e r(O p d _ 1 , O p d _ 2 , R e s u l t) ; p a r a m e t e r E M = 4,E N = 2; //默认值 i n p u t [E M:1] O p d_ 1 ; i n p u t [E N:1] O p d_ 2 ; o u t p u t [E M+E N:1] R e s u l t; a s s i g n R e s u l t = O p d _ 1 * O p d _ 2; e n d m o d u l e 这个带参数的乘法器可在另一个设计中使用,下面是 8×6乘法器模块的带参数引用方式: w i r e [1:8] P i p e _ R e g; w i r e [1:6] D b u s; w i r e [1:14] A d d r _ C o u n t e r; . . . M u l t i p l i e r #(8,6) M 1(P i p e_R e g,D b u s,A d d r_C o u n t e r) ; 第1个值8指定了参数E M的新值,第2个值6指定了参数E N的新值。 9.4 外部端口 在迄今为止所见到的模块定义中,端口表列举出了模块外部可见的端口。例如, m o d u l e S c r a m _ A(A r b , C t r l , M e m _ B l k , B y t e) ; i n p u t[0:3] A r b; i n p u t C t r l; i n p u t [8:0] M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e A r b、C t r l、M e m _ B l k和B y t e为模块端口。这些端口同时也是外部端口,即在实例中,当 采用名称关联方式时,外部端口名称用于指定相互连接。下面是模块 S c r a m _ A的实例。 Scram_A SX( .B y t e(B 1) , .M e m _ B l k(M 1) , .C t r l(C 1) , .A r b(A 1) ) ; 在模块S c r a m _ A中,外部端口名称隐式地指定。 Verilog HDL中提供显式方式指定外部端 口名称。这可以通过按如下形式指定一个端口来完成: .e x t e r n a l _ p o r t _ n a m e(i n t e r n a l _ p o r t _ n a m e) 下面是同一个例子,只不过是显式地指定外部端口。 m o d u l e S c r a m _ B ( .D a t a(A r b) , .C o n t r o l(C t r l) , .M e m _ W o r d(M e m _ B l k) , .A d d r(B y t e) ) ; i n p u t [0:3] A r b; i n p u t C t r l; i n p u t [ 8 : 0 ]M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e 模块S c r a m _ B在此实例中指定的外部端口是 D a t a、C o n t ro l、M e m _ Wo rd和A d d r。端口表显 式地表明了外部端口和内部端口之间的连接。注意外部端口无需声明,但是模块的内部端口 第9章 结 构 建 模 87 下载
88wiD硬件插述语言 China-pub. coM 下载 却必须声明。外部端口在模块内不可见,但是却要在模块实例语句中使用,而内部端口因为 在模块中可见,所以必须在模块中说明。在模块实例语句中,外部端口的使用如下所示 Scram B S1 (. Addr(A1), Da ta(D1), Control(C1), Mem word (M1)): 在模块定义的端口表中,这两种概念不能混淆,即在模块定义中所有端口必须指定显式 的端口名称,或者没有一个端口带有显式的端口名称。 如果模块端口通过位置连接,则模块实例语句中不能使用外部端口名称。 内部端口名称可以是标识符,也可以是下述类型的表达式: 位选择; ·部分选择 ·位选择、部分选择和标识符的合并 例如, module Scram c(Arb[0: 2], ctrl, Mem Blk[0], Mem Blk[l]), Byte[3]) input [o input ctrl; input [8: 0] Mem Biki output [0: 3] Byte endmodule 在 Scram_C的模块定义中,端口表包括部分选择(Arb[0:2])、标识符(Cr1)、合并 ({Mem_Blko], Mem Blk1]})和位选择(Bυvte[3])。在内部端口是位选择、部分选择或合并的 情况下,没有隐式地指定外部端口名。因此,在这样的模块实例语句中,模块端口必须通过 位置关联相互连接。例如, Scram C SYA (LI[4: 6], CL, MMY[1: 0], Br)i 在这个实例语句中,端口通过位置关联相连接,因此Ll4:6连接到Arb[0:2],CL连接 到Cm,MMI]连接到 Mem blk[O,MM连接到 Mem blk[],BT连接到Bye[3 若使用端口名称关联(即当内部端口不是标识符时),必须对模块中的端口指定外部端口 名。如下面的 Scram d模块定义所示 module Scram D( Data(Arb[0: 2]), Control(Ctrl) Mem word(i Mem Blk[o, Mem Blk[111 Addr( Byte[3])) input [0: 3] Arb nput [8: 0] Mem Biki output [0: 3] Byte endmodule 在 Scram d模块实例语句中,端口既能够使用位置连接,也能够使用名称连接,但是不 能混合使用。下例的模块实例语句端口通过名称连接 Scram D S2( Data(Li[4: 6], Control(CL) Mem word(MMY[l:0,. Addr(BT)) 模块中可以只有外部端口而没有内部端口。即模块在引用中其外部端口可以悬空,不与 内部信号相连。例如:
却必须声明。外部端口在模块内不可见,但是却要在模块实例语句中使用,而内部端口因为 在模块中可见,所以必须在模块中说明。在模块实例语句中,外部端口的使用如下所示: Scram_B S1 ( .A d d r(A 1) , .D a t a(D 1) , .C o n t r o l(C 1) , .M e m _ W o r d(M 1) ) ; 在模块定义的端口表中,这两种概念不能混淆,即在模块定义中所有端口必须指定显式 的端口名称,或者没有一个端口带有显式的端口名称。 如果模块端口通过位置连接,则模块实例语句中不能使用外部端口名称。 内部端口名称可以是标识符,也可以是下述类型的表达式: • 位选择; • 部分选择; • 位选择、部分选择和标识符的合并。 例如, m o d u l e S c r a m _ C (A r b[ 0 : 2 ] ,C t r l, { M e m _ B l k[ 0 ] ,M e m _ B l k[ 1 ] } ,B y t e[ 3 ] ) ; i n p u t [0:3] A r b; i n p u t C t r l; i n p u t [8:0] M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e 在S c r a m _ C的模块定义中,端口表包括部分选择( A r b[ 0 : 2 ])、标识符( C t r l)、合并 ({M e m _ B l k[ 0 ],M e m _ B l k[ 1 ] } )和位选择(B y t e[ 3 ])。在内部端口是位选择、部分选择或合并的 情况下,没有隐式地指定外部端口名。因此,在这样的模块实例语句中,模块端口必须通过 位置关联相互连接。例如, Scram_C SYA (L 1[ 4 : 6 ] ,C L , M M Y[ 1 : 0 ] ,B T) ; 在这个实例语句中,端口通过位置关联相连接,因此 L 1[ 4∶6 ]连接到A r b[ 0∶2 ],C L连接 到C t r l,M M Y[ 1 ]连接到M e m _ B l k[ 0 ] ,M M Y[ 0 ]连接到M e m _ B l k[ 1 ],B T连接到B y t e[ 3 ]。 若使用端口名称关联(即当内部端口不是标识符时),必须对模块中的端口指定外部端口 名。如下面的S c r a m _ D模块定义所示。 m o d u l e S c r a m _ D ( .D a t a(A r b[ 0 : 2 ] ) , .C o n t r o l(C t r l) , .M e m _ W o r d( {M e m _ B l k[ 0 ] ,M e m _ B l k[ 1 ] } ) , .A d d r(B y t e[ 3 ] ) ) ; i n p u t [0:3] A r b; i n p u t C t r l; i n p u t [8:0] M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e 在S c r a m _ D模块实例语句中,端口既能够使用位置连接,也能够使用名称连接,但是不 能混合使用。下例的模块实例语句端口通过名称连接。 Scram_D SZ ( .D a t a(L 1[ 4 : 6 ] , .C o n t r o l(C L) , .M e m _ W o r d(M M Y[ 1 : 0 ],.A d d r(B T) ) ; 模块中可以只有外部端口而没有内部端口。即模块在引用中其外部端口可以悬空,不与 内部信号相连。例如: 88 Verilog HDL 硬件描述语言 下载
Chinaopub.com 物结建89 下载 module Scram E( Data(),. Control (ctrl), Mem word([ Mem Blk [o], Mem Blk [1]) Addr()) nput[8:0]MemB】k endmodule 模块 Scram e有两个外部端口Dala和Addr,这两个端口在使用时被悬空 个内部端口是否能与多个外部端口连接? erilog hdl允许这样连接。例如 module Fanout (A(ctrIIn), B(Condout), C( Condout))i input carlIn output condotti assign CondOut carlIn endmodule 内部端口 Condo与两个外部端口B和C连接,所以 CondOut的值在B和C上都出现 95举例 下例采用结构模型描述十进制计数器。十进制计数器的逻辑图如图9-3所示 CK ∠间0] z[2] 图9-3十进制计数器 module Decade ctr (Clock, 2) input Clock tput[0:3]2 wire SI,S2 andA1(s1,2[2],2[1]);/基本门实例语句 /4个模块实例语句 JK FF JK1(.J(1"b1),,K(1"b1),,CK(c1ock),.Q(z[01),,M()) JK2(.J(S2),K(1"b1),.cK(z[0),.Q(z[11),.MQ0) J3(.J(1"b1),.K(1"b1),,cK(z[11),,Q(z[2]),.MQ()), J4(.J(S1),,K(1"b1),CK(z[0]),.Q(z[3]),,MQ(S2)) endmodule 注意常数作为输入端口信号的用法,以及悬空端口。 下面是另一个例子,3位可逆计数器的逻辑结构如图9-4所示,其结构描述如下 module Up Down(Clk, Cnt Up, Cnt Down, g) input Clk, Cnt Up, Cnt Down; output [0: 2] o
m o d u l e Scram_E ( .D a t a(), .C o n t r o l (C t r l) , .M e m _ W o r d ({ M e m _ B l k[0], M e m _ B l k [ 1 ] } ) , .A d d r( ) ) ; i n p u t C t r l; i n p u t [8:0] M e m _ B l k; . . . e n d m o d u l e 模块S c r a m _ E 有两个外部端口D a t a和A d d r,这两个端口在使用时被悬空。 一个内部端口是否能与多个外部端口连接? Verilog HDL允许这样连接。例如, m o d u l e F a n O u t ( .A(C t r l I n) , .B(C o n d O u t) , .C(C o n d O u t) ) ; i n p u t C t r l I n; o u t p u t C o n d O u t; a s s i g n CondOut = C t r l I n; e n d m o d u l e 内部端口C o n d O u t 与两个外部端口B和C连接,所以C o n d O u t的值在B和C上都出现。 9.5 举例 下例采用结构模型描述十进制计数器。十进制计数器的逻辑图如图 9 - 3所示。 图9-3 十进制计数器 m o d u l e D e c a d e _ C t r (C l o c k , Z) ; i n p u t C l o c k; o u t p u t [0:3] Z; w i r e S 1 , S 2; a n d A 1 (S 1,Z[ 2 ] ,Z[1]); //基本门实例语句。 // 4个模块实例语句: JK_FF JK1 ( .J( 1 ' b 1 ) , .K( 1 ' b 1 ) , .C K(C l o c k) , .Q(Z[ 0 ] ) , .N Q( ) ) , J K 2( .J(S 2) , .K( 1 ' b 1 ) , .C K(Z[ 0 ] ) , .Q(Z[ 1 ] ) , .N Q( ) ) , J K 3( .J( 1 ' b 1 ) , . K ( 1 ' b 1 ) , . C K (Z[ 1 ] ) , . Q (Z[ 2 ] ) , .N Q( ) ) , J K 4( .J(S 1) , .K( 1 ' b 1 ) , .C K(Z[ 0 ] ) , .Q(Z[ 3 ] ) , .N Q(S 2) ) ; e n d m o d u l e 注意常数作为输入端口信号的用法,以及悬空端口。 下面是另一个例子,3位可逆计数器的逻辑结构如图 9 - 4所示,其结构描述如下: m o d u l e U p _ D o w n(C l k , C n t _ U p , C n t _ D o w n , Q) ; i n p u t C l k , C n t _ U p , C n t _ D o w n; o u t p u t [0:2] Q; 第9章 结 构 建 模 89 下载
90wD硬停插述语言 China pul coM 下载 wire S1,S2,s3,s4,s5,s6,s7,s8 JK FF JKAl bl,lbl, Clk, o[0],S1) JK2(1"b1,1"b1,S4,Q[1],s5) J3(1"b1,1"b1,s8,Q[2],) and Al(S2, Cnt Up, o[0]), A2(S3,S1,CntD。wn) 13(S7, o[1], Cnt Up) A4(S6,S5, Cnt Down)i oro1(S4,S2,S3), 02(s8,S7,S6); endmodule Cnt_up K QN K QN Cnt Down 所有触发器的J、K输入端口与高电平相连 图94位可逆计数器 习题 1.模块实例语句与门实例语句的区别是什么? 2当端口悬空时,即端口没有被连接时,端口的值是什么? 3对于9.3节中的模块FA, OR DELAY值为4, XOR DELAY值为7, AND DELAY值为5,写出 其结构描述形式。 4用本章讲述的模块FA编写执行加法和减法的4位ALU的结构模型 5用5.Il节中描述的MUX4xl模块编写16-1多路选择器的结构化模型 6用异步低电平复位描述通用N位计数器。将通用计数器在实例语句中用作5位计数器用测试 验证程序验证这个5位计数器
w i r e S 1 , S 2 , S 3 , S 4 , S 5 , S 6 , S 7 , S 8 JK_FF JK1( 1 ' b 1 , 1 ' b 1 ,C l k,Q[ 0 ] ,S 1) , J K 2( 1 ' b 1 , 1 ' b 1 ,S 4,Q[ 1 ] ,S 5) , J K 3( 1 ' b 1 , 1 ' b 1 ,S 8,Q[ 2 ] , ) ; a n d A 1(S 2,C n t _ U p,Q[ 0 ] ) , A 2(S 3,S 1,C n t _ D o w n) , A 3(S 7,Q[ 1 ] ,C n t _ U p) , A 4(S 6,S 5,C n t _ D o w n) ; o r O 1(S 4 , S 2 , S 3) , O 2(S 8 , S 7 , S 6) ; endmodule 图9-4 位可逆计数器 习题 1 .模块实例语句与门实例语句的区别是什么? 2 .当端口悬空时,即端口没有被连接时,端口的值是什么? 3 .对于9 . 3节中的模块FA,O R _ D E L AY值为4,X O R _ D E L AY值为7,A N D _ D E L AY值为5,写出 其结构描述形式。 4 .用本章讲述的模块FA编写执行加法和减法的4位A L U的结构模型。 5 .用5 . 11节中描述的M U X 4 x 1模块编写1 6 - 1多路选择器的结构化模型。 6 .用异步低电平复位描述通用 N位计数器。将通用计数器在实例语句中用作 5位计数器用测试 验证程序验证这个5位计数器。 90 Verilog HDL 硬件描述语言 下载 所有触发器的J、 K输入端口与高电平相连