当前位置:高等教育资讯网  >  中国高校课件下载中心  >  大学文库  >  浏览文档

《Verilog HDL语言》教程教学资料(参考书籍)第12章 建模实例

资源类别:文库,文档格式:PDF,文档页数:21,文件大小:567.8KB,团购合买
本章给出了一些用 Verilog hdl编写的硬件建模实例。
点击下载完整版文档(PDF)

下载 第12章建模实例 本章给出了一些用 Verilog hdl编写的硬件建模实例。 121简单元件建模 连线是一种最基本的硬件单元。连线在 Verilog HDl中可被建模为线网数据类型。考虑4 位与门,其行为描述如下 module And4 (A, B, C)i input [3:0]B, output [3: 0A sign #5 A=B& Ci endmodule &(与)逻辑的时延定义为5ns。这个模型代表的硬件如图12-1所示。 C3]B[2]c[2]B1 门时延为5ns [1] A[O] 图 个4位与门 本实例和下面的实例表明布尔等式如何在连续赋值语句中被建模为表达式。连线单元能 被建模为线网数据类型。例如,在下面的描述中,F表示将~(非)操作符的输出连接到^(异或) 操作符输入的线网。该模块表示的电路如图12-2所示。 module Boolean Ex (D, G, E, utput D; wire F 图12-2组合电路 assign F= -Ei assign D= FG 考虑下列行为和如图12-3所示相应硬件的表示 module Asynchronous assign C=A/D >a。 =~(B4C); 图12-3异步反馈环路

下载 第12章 建 模 实 例 本章给出了一些用Verilog HDL编写的硬件建模实例。 12.1 简单元件建模 连线是一种最基本的硬件单元。连线在 Verilog HDL中可被建模为线网数据类型。考虑 4 位与门,其行为描述如下: ` t i m e s c a l e 1 n s / 1 n s m o d u l e And4 (A, B, C) ; i n p u t [3:0] B, C; o u t p u t [3:0] A; assign #5 A = B & C; e n d m o d u l e & (与)逻辑的时延定义为5 ns。这个模型代表的硬件如图 1 2 - 1所示。 图12-1 一个4位与门 本实例和下面的实例表明布尔等式如何在连续赋值语句中被建模为表达式。连线单元能 被建模为线网数据类型。例如,在下面的描述中, F表示将~ (非)操作符的输出连接到^ (异或) 操作符输入的线网。该模块表示的电路如图 1 2 - 2所示。 m o d u l e B o o l e a n _ E x (D, G, E, ) ; i n p u t G, E; o u t p u t D; w i r e F; assign F = ~E; a s s i g n D = F ^ G ; e n d m o d u l e 考虑下列行为和如图1 2 - 3所示相应硬件的表示。 m o d u l e A s y n c h r o n o u s; w i r e A, B, C, D; a s s i g n C = A|D a s s i g n A = ~ (B & C) ; e n d m o d u l e 门时延为5 ns 图12-2 组合电路 图12-3 异步反馈环路

Chinaopub.com 第2章建实例137 载 该电路带有一个异步反馈环路。如果模型用特定的值集(B=1,D=0)仿真,仿真时间将由于 仿真器总在两个赋值语句间迭代而永远停滞不前。迭代时间是两个零时延。因此,在使用带 有零时延的连续赋值语句对线网赋值,以及在表达式中使用相同的线网值时,必须格外小心 在特定的情况下,有时需要使用这样的异步反馈。下面将演示一个这样的异步反馈:语 句代表一个周期为20ns的周期性波形。其硬件表示如图12-4所示。注意这样的 always语句需 要一个 initial语句将寄存器初始化为0或1,否则寄存器的值将固定在值x上 reg Ace; ⊥n⊥tia1 Ace= 0 12-4时钟发生器 #10 Ace =4 Ace 向量线网或向量寄存器型元件能被访问,既可以访问称为位选择的单个元素,也可以访 问称为部分选择的片段。例如, reg A reg [0: 4] C: reg [5:0B, D D[4:0]=B[5:1]|c;∥/D[4:0]和B[5:1]都是部分选择 D[5]=AB[5];//D[5]和B[5]都是位选择。 第一个过程性赋值语句暗示着 D[4]=B[5]|c[0]; D[3]=B[4]|c[1]; 选择、部分选择和向量可以并置,形成更大的向量。如 wire [7: 0] C, CC wire cx assign C=CX, CC [6: 01 也可以引用索引值在运行时才可计算的向量元素。如 Adf Pib [K] 意味着解码器的输出为Adf,并且K指定选择地址。Pb是向量;本语句对解码器的行为建 模 可以使用预定义的移位操作符执行移位操作。移位操作可以用合并操作符建模。例如, wire [0: 7] A, Zi assign Z=(A [I: 7],A[0] 循环左移 assign z [7],A[0:6]}; /环右移。 assign Z=[A [1:7],1'b0)i 左移操作 向量的子域称为部分选择,也能够在表达式中使用。例如,32位指令寄存器 Instr Reg中 前16位表示地址,接下来8位表示操作码,余下的8位表示索引。给出如下说明:

该电路带有一个异步反馈环路。如果模型用特定的值集 (B=1, D= 0 )仿真,仿真时间将由于 仿真器总在两个赋值语句间迭代而永远停滞不前。迭代时间是两个零时延。因此,在使用带 有零时延的连续赋值语句对线网赋值,以及在表达式中使用相同的线网值时,必须格外小心。 在特定的情况下,有时需要使用这样的异步反馈。下面将演示一个这样的异步反馈;语 句代表一个周期为20 ns的周期性波形。其硬件表示如图 1 2 - 4所示。注意这样的always 语句需 要一个initial 语句将寄存器初始化为0或1,否则寄存器的值将固定在值 x上。 r e g A c e; i n i t i a l Ace = 0; a l w a y s #10 Ace = ~ Ace; 向量线网或向量寄存器型元件能被访问,既可以访问称为位选择的单个元素,也可以访 问称为部分选择的片段。例如, r e g A; r e g [0:4] C; r e g [ 5 : 0 ] B, D; always b e g i n . . . D [4:0] = B [5:1] | C; //D [ 4 : 0 ]和B[ 5 : 1 ]都是部分选择。 D [5] = A & B [5]; //D [ 5 ]和B[ 5 ]都是位选择。 e n d 第一个过程性赋值语句暗示着: D [4] = B [5] | C [0]; D [3] = B [4] | C [ 1 ] ; . . . 位选择、部分选择和向量可以并置,形成更大的向量。如, wire [7:0] C, CC; wire C X; . . . a s s i g n C = {CX, CC [ 6 : 0 ] } ; 也可以引用索引值在运行时才可计算的向量元素。如 : Adf = Plb [ K ] ; 意味着解码器的输出为 A d f,并且K指定选择地址。P l b是向量;本语句对解码器的行为建 模。 可以使用预定义的移位操作符执行移位操作。移位操作可以用合并操作符建模。例如, wire [0:7] A, Z; . . . a s s i g n Z = {A [1:7], A [0]}; //循环左移。 a s s i g n Z = {A [7], A [0:6]}; //循环右移。 a s s i g n Z = {A [1:7], 1'b0}; //左移操作。 向量的子域称为部分选择,也能够在表达式中使用。例如, 3 2位指令寄存器I n s t r _ R e g中 前1 6位表示地址,接下来8位表示操作码,余下的8位表示索引。给出如下说明: 第12章 建 模 实 例 137 下载 图12-4 时钟发生器

138 erilog hdl硬件描述语言 Chinapub coM 下载 reg [31: 0] Memory [0: 1023 wire [15: 0] Address wire[7: 0] op code, Index wire [0: 9] Prog ctr; wire Read ctl 从 Instr Reg读取子域信息的一种方法是使用三个连续赋值语句。指令寄存器的部份选择 被赋值给指定的线网。 assign INstr Reg Memoruprog ctr assign Address Instr Rebl: 16] assign op Code Instr Reg: 8 assign Index Instr Reg: 0] @(posedge Read ctI ask Ca11( Address, Op code 可用连续赋值语句为三态门的行为建模 wire Triout Enable TriIN 1bz 当 Enable为1时, TriO获得Tiln的值。当 Enable为0时, TroUt为高阻值 122建模的不同方式 本节给出了Ⅴ erilog HDL语言提供的三种不同ckB 建模方式的实例:数据流方式、行为方式和结构方A 式。参看图12-5所示的电路,该电路将输入A的值 8寄存器 存入寄存器,然后与输入C相乘 第一种建模方式是数据流方式,它使用连续赋 图12-5带缓冲的乘法器 值语句对电路建模 module Save Mult Df(A, C, ClkB, Z) [0:7]A input ClkB w⊥reS1 assign 2=s1*C assign S1=CIkB A S: 这种表示方法不直接蕴含任何结构,却隐式地描述了结构。但是,它的功能性非常清晰 寄存器已使用时钟控制方式建模。 第二种描述电路的方法是使用带有顺序程序块的 always语句,将电路建模为顺序程序描 module Save Mult seq (A, C, ClkB, 2)i input [0: 7]A; out [o input ClkB

r e g [31:0] Memory [0: 1023 ]; w i r e [31:0] I n s t r _ R e g ; w i r e [15:0] A d d r e s s ; w i r e [7:0] Op_Code, Index; w i r e [ 0 : 9 ] P r o g _ C t r ; w i r e R e a d _ C t l; 从I n s t r _ R e g读取子域信息的一种方法是使用三个连续赋值语句。指令寄存器的部份选择 被赋值给指定的线网。 a s s i g n INstr_Reg = Memory[P r o g _ C t r] ; a s s i g n Address = Instr_Reg[ 3 1 : 1 6 ] ; a s s i g n Op_Code = Instr_Reg[ 1 5 : 8 ] ; a s s i g n Index = Instr_Reg[ 7 : 0 ] ; . . . a l w a y s @ (p o s e d g e R e a d _ C t l) Task_Call ( Address, Op_Code, Index) ; 可用连续赋值语句为三态门的行为建模,如: w i r e Triout = Enable ? TriIN :1 ' b z ; 当E n a b l e为1时,Tr i O u t获得Tr i I n的值。当E n a b l e为0时,Tr i O u t为高阻值。 12.2 建模的不同方式 本节给出了 Verilog HDL语言提供的三种不同 建模方式的实例:数据流方式、行为方式和结构方 式。参看图 1 2 - 5所示的电路,该电路将输入 A的值 存入寄存器,然后与输入C相乘。 第一种建模方式是数据流方式,它使用连续赋 值语句对电路建模。 m o d u l e Save_Mult_Df (A , C , C l k B , Z) ; i n p u t [0:7] A; i n p u t [0:3] C; i n p u t C l k B; o u t p u t [ 0 : 1 1 ] Z; w i r e S 1; a s s i g n Z = S1 * C; assign S1 = ClkB ? A : S1; e n d m o d u l e 这种表示方法不直接蕴含任何结构,却隐式地描述了结构。但是,它的功能性非常清晰。 寄存器已使用时钟控制方式建模。 第二种描述电路的方法是使用带有顺序程序块的 always 语句,将电路建模为顺序程序描 述。 m o d u l e S a v e _ M u l t _ S e q (A , C , C l k B , Z); i n p u t [0:7] A ; i n p u t [0:3] C ; i n p u t C l k B; 138 Verilog HDL 硬件描述语言 下载 图12-5 带缓冲的乘法器 寄存器

第2章建实例139 下载 reg[0:11]z always e(Aorc。rc1kB) egin: SEQ //由于标记了程序块,可以说明一个局部寄存器变量s1 reg[0:7]S1; i£f(c1kB) Z=S1*G 这种模型也描述了电路的行为,但是没有蕴含任何结构,无论是隐式还是显示的。在这 种方式中,寄存器用谚语句建模。 第三种描述Save_Mal电路的方法是假定已存在8位寄存器和8位乘法器,将电路建模为线 网表 module Save MuIt Netlist (A, C, ClkB, 2) input [0: 7]A input [0:3]C, input ClkB; output [0: 11]2 w⊥re[0:7]S1,S3; Wire[0:15]S2; Reg8 R1(. Din(A), Clk(CIkB), Dout(s1))i Mu1t8M1(.A(s1),B(4′1b0000,c),z(z)); 种描述方式显式地描述了电路结构,但其行为是未知的。这是因为Reg8和Ml8的模块 名是任意的,并且它们可以有与其相关的各种行为。 12.3时延建模 考虑3输入或非门。它的行为可以使用连续赋值语句建模,如 assign #12 Gate out=+(A I B I C)i 这条语句对带有12个时间单位时延的或非门建模。这一时延表示从信号A、B或C上事件发 生到结果值出现在信号 Gate Out上的时间。一个事件可以是任何值的变化,如x→>z、x->0, 或者1->0 如果要显式地对上升和下降时间建模,则在连续赋值语句中使用两个时延,例如: assign #(12,14) Zoom =N(A I B I C)i /*12是上升时延,14是下降时延,min(12,14)=1是转换到x的时延+/ 在能够对高阻值Z赋值的逻辑中,也能够定义第三种时延,即关断时延。例如 assign #(12,14,10)Zoom =A>B? C: 1bz //上升时延为12,14是下降时延,min(12,14,10)=1是转换到x的时延,关断时延为10 每个时延值都能够用min:pp:max表示,例如

o u t p u t [ 0 : 1 1 ] Z; r e g [0:11] Z; a l w a y s @(A o r C o r C l k B) b e g i n: SEQ / /由于标记了程序块,可以说明一个局部寄存器变量 S 1。 r e g [0:7] S 1; i f (C l k B) S1 = A; Z = S1 * C; e n d e n d m o d u l e 这种模型也描述了电路的行为,但是没有蕴含任何结构,无论是隐式还是显示的。在这 种方式中,寄存器用i f语句建模。 第三种描述S a v e _ M u l t电路的方法是假定已存在 8位寄存器和8位乘法器,将电路建模为线 网表。 m o d u l e S a v e _ M u l t _ N e t l i s t (A , C , C l k B , Z) i n p u t [0:7] A ; i n p u t [0:3] C ; i n p u t C l k B ; o u t p u t [0:11] Z; w i r e [0:7] S 1 , S 3; W i r e [0:15] S 2; R e g 8 R 1 (. D i n(A) , .C l k(C l k B) , .D o u t(S 1) ) ; M u l t 8 M 1 ( .A(S 1) , .B( { 4′1 b 0 0 0 0 ,C} ) , .Z(Z) ) ; e n d m o d u l e 这种描述方式显式地描述了电路结构,但其行为是未知的。这是因为 R e g 8和M u l t 8的模块 名是任意的,并且它们可以有与其相关的各种行为。 12.3 时延建模 考虑3输入或非门。它的行为可以使用连续赋值语句建模,如 a s s i g n #12 Gate_Out = ~(A | B | C) ; 这条语句对带有1 2个时间单位时延的或非门建模。这一时延表示从信号 A、B或C上事件发 生到结果值出现在信号G a t e _ O u t上的时间。一个事件可以是任何值的变化,如 x -> z、 x - > 0, 或者1- > 0。 如果要显式地对上升和下降时间建模,则在连续赋值语句中使用两个时延,例如: a s s i g n #(12,14) Zoom = ~(A | B | C) ; / * 1 2是上升时延,1 4是下降时延,min(12,14) = 12是转换到x的时延* / 在能够对高阻值Z赋值的逻辑中,也能够定义第三种时延,即关断时延。例如: a s s i g n #(12,14,10) Z o o m = A > B ? C : 1bz; / /上升时延为1 2,1 4是下降时延,m i n ( 1 2 , 1 4,10) = 12是转换到x的时延,关断时延为1 0。 每个时延值都能够用m i n : t y p : m a x表示,例如, 第12章 建 模 实 例 139 下载

140 Verilog hdl硬述语言 Cb'a°dow 下载 assign#(9:10:11,11:12:13,13:14:15o0m=A>B? 时延值通常可以是表达式 基本门和UDP中的时延可以通过在实例中指定时延值建模。下面是5输入基本与门 and #(2,3)Al(Ot, InI, In2, In3, In4, In5 已指定输出的上升时延为2个时间单位,下降时延为3个时间单位 模型中位于端口边界的时延可使用指定程序块来定义。如下面的半加器模块的例子 module Half Adder(A, B,s, Cl input A, B: output s,C; specify (A=>S)=(1.2,0.8); (A=>C)=(1.2,1.0) endspecify assign S=A CB assign C=AIB 除在连续赋值语句中对时延建模外,时延还可以用指定程序块建模。是否存在一种从模 块外部指定时延的方法?一种选择是使用SDFθ(标准时延格式)和 Verilog仿真器可能提供的 反标机制。如果需要在 Verilog HDL模型中显式地指定这一信息,一种方法是在Half- Adder模 块上创建两个虚模块,每个模块带有不同的时延集 input A, Bi output s, Ci assign S=AB module Ha opt(A, B,s, C) output s,C. specify S)=(1.2,0 (B=>S)=(1.0,0.6); (A=>C)=(1.2,1.0) endspecify adde endmodule module Half Pess(A, B,s, Cl 6见参考文献

a s s i g n #(9:10:11,11:12:13,13:14:15) Z o o m = A > B ? C : 1bz; 时延值通常可以是表达式。 基本门和U D P中的时延可以通过在实例中指定时延值建模。下面是 5输入基本与门。 a n d #(2,3) A 1(O t , I n 1 , I n 2 , I n 3 , I n 4 , I n 5) ; 已指定输出的上升时延为2个时间单位,下降时延为3个时间单位。 模型中位于端口边界的时延可使用指定程序块来定义。如下面的半加器模块的例子。 m o d u l e H a l f _ A d d e r(A , B , S , C) ; i n p u t A , B; o u t p u t S , C; s p e c i f y (A => S) = (1.2,0.8); (B => S) = (1.0,0.6); (A => C) = (1.2,1.0); (B => C) = (1.2,0.6); e n d s p e c i f y a s s i g n S = A ^ B; a s s i g n C = A | B ; e n d m o d u l e 除在连续赋值语句中对时延建模外,时延还可以用指定程序块建模。是否存在一种从模 块外部指定时延的方法?一种选择是使用 S D F (标准时延格式)和 Ve r i l o g仿真器可能提供的 反标机制。如果需要在 Verilog HDL模型中显式地指定这一信息,一种方法是在 H a l f - A d d e r模 块上创建两个虚模块,每个模块带有不同的时延集。 m o d u l e H a l f _ A d d e r(A , B , S , C); i n p u t A , B ; o u t p u t S , C ; a s s i g n S = A ^ B; a s s i g n C = A | B; e n d m o d u l e module H a _ O p t(A , B , S , C); i n p u t A , B ; o u t p u t S , C ; s p e c i f y (A => S) = (1.2,0.8); (B => S) = (1.0,0.6); (A => C) = (1.2,1.0); (B => C) = (1.2,0.6); e n d s p e c i f y Half_Adder H1 (A , B , S , C) ; e n d m o d u l e m o d u l e H a l f _ P e s s(A , B , S , C) ; 140 Verilog HDL 硬件描述语言 下载 见参考文献

第2章建实例141 下载 output s,c specify A=>S)=(0.6,0.4); (B=>S) (0.5,0.3) A=>C)=(0.6,0.5); (B =>C (0.6,0.3) Half Adder HrA, B,s,c) endmodule 有了这两个模块,HaJf_Ader模块独立于任何时延,并且依赖于你所选用的时延方式 即模拟相应的高层模块H_Opr或 Ha pess 传输时延 在连续赋值语句和门级原语模型中指定的时延为惯性时延。传输时延能够用带有语句内 时延的非阻塞性赋值语句建模。实例如下 module Transport (waveA, De layedwave)i parameter TRANS PORT DELAY = 500: input waveA utput Dela yedwave reg De la yedwave always @( WaveA) De layedwave<=# TRANS PORT DELAY WaveA always语句中包含带有语句内时延的非阻塞性赋值。 WaveA上的任何变化以后都会使 Delayedwave在延迟 TRANSPORT DELAY时获得调度。结果在 WaveA上出现的波形在被延迟 TRANSPORT DELAY后出现在 Delayedwave上:;这种时延波形的实例如图12-6所示。 WaveA 500503506510 图12-6传输时延实例 124条件操作建模 在特定条件下发生的操作可以使用带有条件操作符的连续赋值语句,或在 always语句中 用i语句或case语句建模。请看一个算术逻辑电路。它的行为可用如下所示的连续赋值语句 模 module Simple ALU(A, B, C, PM, AL input [0: 3]A B c input PM;

i n p u t A , B; o u t p u t S , C ; s p e c i f y (A => S) = (0.6,0.4); (B => S) = (0.5,0.3); (A => C) = (0.6,0.5); (B => C) = (0.6,0.3); e n d s p e c i f y Half_Adder H2(A , B , S , C) ; e n d m o d u l e 有了这两个模块, H a l f _ A d d e r模块独立于任何时延,并且依赖于你所选用的时延方式, 即模拟相应的高层模块H a _ O p t或H a _ P e s s。 传输时延 在连续赋值语句和门级原语模型中指定的时延为惯性时延。传输时延能够用带有语句内 时延的非阻塞性赋值语句建模。实例如下, m o d u l e T r a n s p o r t (W a v e A , D e l a y e d W a v e) ; p a r a m e t e r T R A N S P O R T _ D E L A Y = 500; i n p u t W a v e A; o u t p u t D e l a y e d W a v e; r e g D e l a y e d W a v e ; a l w a y s @ (W a v e A) DelayedWave <= #TRANSPORT_DELAY WaveA; e n d m o d u l e a l w a y s语句中包含带有语句内时延的非阻塞性赋值。 Wa v e A上的任何变化以后都会使 D e l a y e d Wa v e在延迟T R A N S P O RT _ D E L AY时获得调度。结果在 Wa v e A上出现的波形在被延迟 T R A N S P O RT _ D E L AY后出现在D e l a y e d Wa v e上;这种时延波形的实例如图 1 2 - 6所示。 图12-6 传输时延实例 12.4 条件操作建模 在特定条件下发生的操作可以使用带有条件操作符的连续赋值语句,或在 a l w a y s语句中 用i f语句或c a s e语句建模。请看一个算术逻辑电路。它的行为可用如下所示的连续赋值语句 建模。 m o d u l e S i m p l e _ A L U(A,B,C, PM, ALU) ; i n p u t [0:3] A,B, C; i n p u t P M; 第12章 建 模 实 例 141 下载

142wimD硬述语言 下载 utput [0: 3] ALU assign ALU= PM A +B: A-B 多路选择开关也能够使用 always语句建模。首先确定选线的值,然后,case语句根据这 个值选择相应的输入赋值到输出 timescale lns/Ins module Multiplexer(sel, A,B, C, D, Mux Out input [0:1] sel input A, B, C, D output Mux Out; eg Mux out reg femp; parameter MUX DELAY=15i e(Sel or A or B or c or D) begin: P1 0: Temp=A 3: Temp = D Mux Out = MUX DELAY Temp 多路选择开关也可以用如下形式的连续赋值语句建模 assign #MUX DELAY Mux Out=(Sel = 0)? A: (Sel = 1)? B Se1==2)?c:(Se 125同步时序逻辑建模 到目前为止,本章中的绝大多数实例都是组合逻辑。对于同步时序逻辑建模,语言中已 提供寄存器数据类型对寄存器和存储器建模。但是并不意味着每种寄存器数据类型都可对同 步时序逻辑建模。通过控制赋值方式对同步时序逻辑建模是一种常见的方法 参见如下实例,它表明了如何通过控制寄存器对同步边沿触发的D型触发器建模 t⊥ mesca1e1ns/1ns module D Flip Flop (D, Clock, o reg always e(posedge Clock al ways语句表明当 Clock上出现上升沿时,Q会在5ns后被赋值为D;否则Q不发生变化 (寄存器在被赋新值前保持原值)。 always语句中的行为表达了D型触发器的语义。提供这一模

o u t p u t [0:3] A L U; a s s i g n A L U = P M ? A + B: A - B; e n d m o d u l e 多路选择开关也能够使用 always 语句建模。首先确定选线的值,然后, c a s e语句根据这 个值选择相应的输入赋值到输出。 ` t i m e s c a l e 1 n s / 1 n s module M u l t i p l e x e r(Sel, A,B,C,D, Mux_Out) ; i n p u t [0:1] S e l; i n p u t A, B,C, D; o u t p u t M u x _ O u t ; r e g M u x _ O u t; reg T e m p; p a r a m e t e r MUX_DELAY = 15; a l w a y s @ (Sel o r A o r B o r C o r D) b e g i n: P 1 c a s e (S e l) 0: T e m p = A; 1: T e m p = B; 2: T e m p = C; 3: T e m p = D; e n d c a s e M u x _ O u t = # MUX_DELAY Temp; e n d e n d m o d u l e 多路选择开关也可以用如下形式的连续赋值语句建模: a s s i g n #MUX_DELAY Mux_Out = (Sel == 0)? A : (Sel == 1)? B : (S e l == 2)? C : (S e l == 3)? D : 1'b x; 12.5 同步时序逻辑建模 到目前为止,本章中的绝大多数实例都是组合逻辑。对于同步时序逻辑建模,语言中已 提供寄存器数据类型对寄存器和存储器建模。但是并不意味着每种寄存器数据类型都可对同 步时序逻辑建模。通过控制赋值方式对同步时序逻辑建模是一种常见的方法。 参见如下实例,它表明了如何通过控制寄存器对同步边沿触发的 D型触发器建模。 ` t i m e s c a l e 1 n s / 1 n s m o d u l e D _ F l i p _ F l o p (D, Clock, Q) ; i n p u t D, Clock; o u t p u t Q; r e g Q; a l w a y s @ (p o s e d g e C l o c k) Q = #5 D; e n d m o d u l e a l w a y s语句表明当 C l o c k上出现上升沿时, Q会在5 ns后被赋值为 D;否则Q不发生变化 (寄存器在被赋新值前保持原值)。a l w a y s语句中的行为表达了D型触发器的语义。提供这一模 142 Verilog HDL 硬件描述语言 下载

Chinaopub.com 第2章建实例143 载 型后,8位寄存器可按如下方式进行建模 module Register(D, 0, ClocA ameter START =0, STOP =7 input [START STOP D; input CI。ck TART sToP]Q w⊥re[ START:STO驴cak D Flip Flop DFFO [START STOP(. D(D),. Clock (Cak),.0(Q))i buf B1 (Cak [0], Cak [l], Cak [2], Cak [3], Cak [4] Cak [5], Cak [6], Cak Clock) endmodule 考虑如图12-7所示的门级交叉耦合锁存器电路及其数据流模型。 图12-7门级锁存器 module Gated FF (A, G, 0, oba* output 0, obari assign sI assign S2=+(S1&G) assign o=4(obar. & S2i assign obar =4(0&S2) endmodule 在此例中,连续赋值语句的语义蕴含了锁存器结构。 存储器可用寄存器数组建模。实例如下,其中ASZE是地址端口的位数,DSZE是RAM数 据端口的位数 module RAM Generic(Address, Data In, Da ta out, ) Rw parameter ASIZE =6, DSIZE 4 input [ASIZE-1 0] Addres. input [DSIZE-1 :0 Data In; input RW; output [DSIZE-1:0] Data Out reg [DSIZE-1: 0] Da ta out reg [0: DsIZE-l] Mem FF [0: 63] always //从RAM中读取数据。 Da ta Out= Mem FF [Address];

型后,8位寄存器可按如下方式进行建模。 m o d u l e Register8 (D, Q, Clock) ; p a r a m e t e r START = 0, S T O P = 7; i n p u t [START : STOP] D; i n p u t C l o c k; o u t p u t [START : STOP ] Q; w i r e [START : STOP] C a k; D_Flip_Flop DFF0 [START : STOP] (. D (D), . Clock (C a k), .Q (Q) ) ; b u f B 1 (C a k [0], Cak [1], C a k [2], C a k [3], C a k [4], C a k [5], Cak [6], Cak [7], C l o c k) ; e n d m o d u l e 考虑如图1 2 - 7所示的门级交叉耦合锁存器电路及其数据流模型。 图12-7 门级锁存器 m o d u l e G a t e d _ F F (A, G, Q, Qbar) ; i n p u t A, G; o u t p u t Q, Qbar; w i r e S1, S2; a s s i g n S 1 = ~ (A & G) ; a s s i g n S 2 = ~ (S1 & G) ; a s s i g n Q = ~ (Qbar & S1) ; a s s i g n Qbar = ~ (Q & S2) ; endmodule 在此例中,连续赋值语句的语义蕴含了锁存器结构。 存储器可用寄存器数组建模。实例如下,其中 A S I Z E是地址端口的位数,D S I Z E是R A M数 据端口的位数。 m o d u l e RAM_Generic (Address, Data_In, Data_out, RW ) ; p a r a m e t e r A S I Z E = 6, D S I Z E = 4; i n p u t [A S I Z E-1 :0] A d d r e s s; i n p u t [D S I Z E-1 :0] D a t a _ I n; i n p u t R W; o u t p u t [D S I Z E-1 :0] D a t a _ O u t; r e g [D S I Z E-1:0] D a t a _ O u t; r e g [0: D S I Z E-1] M e m _ F F [ 0 : 6 3 ] ; a l w a y s @ (R W) if (R W) // 从R A M中读取数据。 Data_Out = Mem_FF [A d d r e s s] ; 第12章 建 模 实 例 143 下载

144 erilog hdl硬件描述语言 Chia°dow 下载 //向RAM写入数据 Mem FF [Address]= Data In endmodule 同步时序逻辑也可以用电平敏感或边沿触发控制方式建模。电平敏感类型锁存器建模实 例如下。 module Level Sens FF(Strobe, D, o, obar input strobe, Di reg o, obar always begin wait (strobe ==1)i endmodule 当 strobe为1时,D上的任何事件都被传输到Q;当 Strobe变成0时,Q和Ωbar中的值保持不 变,并且输入D上的任何变化都不再影响Q和Qbur上的值 理解过程性赋值语句的语义对决定同步时序逻辑的行为功能非常重要。考虑模块 Bodyl和 Body2之间的不同之处 module Body l dimodule reg A initial A= 0 always e (Clock i£(~C1。ck) 模块Bodl蕴含的电路结构如图12-8所示,而模块Body2蕴图12.8不蕴含触发器 含的电路结构如图12-9所示。 如果Bodl按如上所述进行模拟,模拟将由于零时延异步反 馈而陷入死循环(模拟时间停止不前)。在模块Body2中,A的 触发器 值只有在Cock信号下降沿时锁存,在其他情形下( Clock不处在 上升沿时),A上的任何变化(触发器的输入)都不会影响触发 器的输出 图12-9蕴含触发器

e l s e / /向R A M写入数据。 M e m _ F F [A d d r e s s] = D a t a _ I n; endmodule 同步时序逻辑也可以用电平敏感或边沿触发控制方式建模。电平敏感类型锁存器建模实 例如下。 m o d u l e Level_Sens_FF (Strobe, D, Q, Qbar) ; i n p u t Strobe, D; o u t p u t Q, Qbar; r e g Q, Qbar; a l w a y s b e g i n wait (Strobe = = 1); Q = D; Q b a r = ~ D; e n d endmodule 当s t ro b e为1时,D上的任何事件都被传输到 Q;当S t ro b e变成0时,Q和Q b a r中的值保持不 变,并且输入D上的任何变化都不再影响Q和Q b a r上的值。 理解过程性赋值语句的语义对决定同步时序逻辑的行为功能非常重要。考虑模块 B o d y 1和 B o d y 2之间的不同之处。 m o d u l e B o d y 1; r e g A; i n i t i a l A = 0; a l w a y s A = ~ A; e n d m o d u l e m o d u l e B o d y 2; w i r e C l o c k; r e g A; i n i t i a l A = 0; always @ (Clock ) i f (~ Clock) A = ~ A; e n d m o d u l e 模块B o d y 1蕴含的电路结构如图 1 2 - 8所示,而模块B o d y 2蕴 含的电路结构如图1 2 - 9所示。 如果B o d y 1按如上所述进行模拟,模拟将由于零时延异步反 馈而陷入死循环(模拟时间停止不前)。在模块Body 2中,A的 值只有在C l o c k信号下降沿时锁存,在其他情形下( C l o c k不处在 上升沿时),A上的任何变化(触发器的输入)都不会影响触发 器的输出。 144 Verilog HDL 硬件描述语言 下载 图12-8 不蕴含触发器 图12-9 蕴含触发器 触发器

Chinaopub.com 第2章建实例145 下载 126通用移位寄存器 通用串行输入、串行输出移位寄存器能够使用 al ways语句块内的for循环语句建模。寄 存器的数量被定义为参数,这样通用移位寄存器的数量在其他设计中被引用时,可以修 改。 module shift Reg (D, Clock, 4 input D, Clock i parameter NUM REG=6 reg [1: NUM REG]o integer P e(negedge Clock) begi //寄存器右移一位: for (P l; P NUM REG; P=P 1 Q[P+1]=Q[P] 载串行数据 /从最右端寄存器获取输出: assign Z =9 [NUM REG] endmodule 以通过用不同的参数值引用模块 Shift Reg获取不同长度的移位寄存器 module Dummy wire Data, Cik, Za, Zb, 2ci //6位移位寄存器: Shift Reg SRA(Da ta, Cik, 24 //4位移位寄存器: Shift Reg #4 SRB (Da ta, cik, 2D //10位移位寄存器: Shift Reg #10 SRC (Da ta, Clk, 24 endmodule 127状态机建模 状态机通常可使用带有 always语句的case语句建模。状态信息存储在寄存器中。case语句 的多个分支包含每个状态的行为。下面是表示状态机简单乘法算法的实例。当 Reset信号为高 时,累加器Ac和计数器Coun被初始化。当Rese变为低时,乘法开始运算。如果乘数Mpl在 Count位的值为1,被乘数加到累加器上。然后,被乘数左移1位且计数器加1。如果Cout是16, 乘法运算完成,并且 Donet信号被置为高。如若不然,检查乘数Mplr的Coum位,并重复 always 语句。状态图如图12-10所示,其后是相应的状态机模型

12.6 通用移位寄存器 通用串行输入、串行输出移位寄存器能够使用 a l w a y s语句块内的 f o r循环语句建模。寄 存器的数量被定义为参数,这样通用移位寄存器的数量在其他设计中被引用时,可以修 改。 m o d u l e S h i f t _ R e g (D, Clock, Z) ; i n p u t D, Clock; o u t p u t Z; p a r a m e t e r NUM_REG = 6, r e g [1: N U M _ R E G ] Q; i n t e g e r P; a l w a y s @ (n e g e d g e C l o c k) b e g i n / /寄存器右移一位: for (P = 1; P< N U M _ R E G; P = P + 1) Q[P+1] = Q[P] ; / /加载串行数据: Q[1] = D; e n d / /从最右端寄存器获取输出: a s s i g n Z = Q [NUM_REG]; e n d m o d u l e 可以通过用不同的参数值引用模块 S h i f t _ R e g获取不同长度的移位寄存器。 m o d u l e D u m m y; w i r e Data, Clk, Za, Zb, Zc; / / 6位移位寄存器: Shift_Reg SRA (Data, Clk, Za) ; / / 4位移位寄存器: Shift_Reg # 4 SRB (Data, Clk, Zb) ; / / 1 0位移位寄存器: Shift_Reg #10 SRC (Data, Clk, Zc) ; e n d m o d u l e 12.7 状态机建模 状态机通常可使用带有 a l w a y s语句的c a s e语句建模。状态信息存储在寄存器中。 c a s e语句 的多个分支包含每个状态的行为。下面是表示状态机简单乘法算法的实例。当 R e s e t信号为高 时,累加器A c c和计数器C o u n t被初始化。当R e s e t变为低时,乘法开始运算。如果乘数 M p l r在 C o u n t位的值为1,被乘数加到累加器上。然后,被乘数左移1位且计数器加1。如果C o u n t是1 6, 乘法运算完成,并且D o n e信号被置为高。如若不然,检查乘数 M p l r的C o u n t位,并重复a l w a y s 语句。状态图如图1 2 - 1 0所示,其后是相应的状态机模型。 第12章 建 模 实 例 145 下载

点击下载完整版文档(PDF)VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
共21页,试读已结束,阅读完整版请下载
相关文档

关于我们|帮助中心|下载说明|相关软件|意见反馈|联系我们

Copyright © 2008-现在 cucdc.com 高等教育资讯网 版权所有