收藏 分享(赏)

数字系统设计09.ppt

上传人:dzzj200808 文档编号:3314503 上传时间:2018-10-12 格式:PPT 页数:63 大小:1.16MB
下载 相关 举报
数字系统设计09.ppt_第1页
第1页 / 共63页
数字系统设计09.ppt_第2页
第2页 / 共63页
数字系统设计09.ppt_第3页
第3页 / 共63页
数字系统设计09.ppt_第4页
第4页 / 共63页
数字系统设计09.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、循环语句,Verilog HDL中有四类循环语句: forever循环 repeat循环 while循环 for 循环,forever 循环语句,forever procedural_statement forever语句在构成时钟时非常灵活,在模拟时非常有效。 循环语句连续执行过程语句,直至模拟结束。因此为跳出这样的循环,中止语句可以与过程语句共同使用。 在过程语句中必须使用某种形式的时序控制,否则, forever循环将在0时延后永远循环下去。 不可综合,只能用于产生测试平台。,reg clk; initial begin clk = 0; forever begin #10 clk =

2、1; #20 clk = 0; end end,repeat 循环语句,repeat(loop_count) procedural_statement 这种循环语句执行指定循环次数的过程语句。如果循环计数表达式的值不确定,即为x或z时,那么循环次数按0处理。 循环数表达式只在循环开始处计算一次,不能通过改变循环次数退出。,参数化移位乘法器,module multiplier(result, op_a, op_b); parameter size = 8; input size:1 op_a, op_b; output 2*size:1 result; reg 2*size:1 shift_op

3、a, result; reg size:1 shift_opb; always (op_a or op_b) begin result = 0; shift_opa = op_a; / Zero extend left shift_opb = op_b; repeat (size) begin #10 if (shift_opb1) result = result + shift_opa; shift_opa = shift_opa 1; / Shift right end end endmodule,repeat循环语句与重复事件控制,repeat(Count) /repeat循环语句 (p

4、osedge Clk) Sum = Sum+1; /表示计数的次数,等待Clk的正边沿,并在Clk正沿发生时,对Sum加1。 repeat(NUM_OF_TIMES) (negedge ClockZ) ; /它表示在执行跟随在repeat语句之后的语句之前,等待ClockZ 的NUM_OF_TIMES个负沿。,Sum = repeat(Count) (posedge Clk) Sum+1; / 重复事件控制 表示首先计算Sum + 1,随后等待C l k上正沿计数,最后为左端赋值。,只有当循环被时钟事件控制打断(posedge Clock)才可以综合。,while 循环语句,while(con

5、dition) procedural_statement 循环语句循环执行过程赋值语句直到指定的条件为假。 如果表达式在开始时为假,那么过程语句便永远不会执行。 如果条件表达式为x或z,它也同样按0(假)处理。 只有当循环被时钟事件控制打断(posedge Clock)才可以综合。,initial begin count = 0; while (count 101) begin $display (“Count = %d”, count); count = count + 1; end end,reg 15:0 Word; while (Word) begin if (Word0) Count

6、Ones = CountOnes + 1; Word = Word 1; end,for 循环语句,for (; ; ) procedural_statement 一个for 循环语句按照指定的次数重复执行过程赋值语句若干次。operation给出要修改的赋值,通常为增加或减少循环变量计数。,/ 寻找x for (index = 0; index size; index = index + 1) if (valindex = 1bx) $display (“found an X“); / 存储器赋值 for (i = size; i != 0; i = i - 1) memoryi-1 = 0

7、; / 阶乘 factorial = 1; for (j = num; j != 0; j = j - 1) factorial = factorial * j;,integer i; / declare the index for the FOR LOOP always (inp or cnt) begin result7:4 = 0; result3:0 = inp; if (cnt = 1) begin for (i = 4; i = 7; i = i + 1) begin resulti = resulti-4; end result3:0 = 0; end,循环的异常退出,循环语句通

8、常会有一个正常的出口。 使用disable语句可以退出任何循环。 disable语句能终止任何begin-end块。,begin:break for (I = 0; I n; I = I + 1) begin: continueif (a = 0)disable continue;if (a = b)disable break end end,过程性连续赋值,过程性连续赋值是过程性赋值的一类,即它能够在always语句或initial语句中出现。 对寄存器或线网赋值,它允许赋值中的表达式被连续驱动到寄存器或线网。并且防止普通的过程语句影响寄存器或线网的已赋值。 注意,这不是一个连续赋值,连续赋

9、值发生在initial或always语句之外。 对于大多数综合工具它是非法的。,过程性连续赋值,过程性连续赋值语句有两种类型: 1) 赋值和重新赋值过程语句:它们对寄存器进行赋值。 2) 强制和释放过程性赋值语句:虽然它们也可以用于对寄存器赋值,但主要用于对线网赋值。,过程性连续赋值,赋值和强制语句在如下意义上是“连续”的:即当赋值或强制发生效用时,右端表达式中操作数的任何变化都会引起赋值语句重新执行。 过程性连续赋值的目标不能是寄存器部分选择或位选择。 不能有语句内时延。,module latch_quasi (q, en, d); input en, d; output q; reg q;

10、 always (en) if (en) assign q = d; else deassign q; endmodule,赋值重新赋值,只能对寄存器赋值。 一个赋值过程语句包含所有对寄存器的过程性赋值,重新赋值过程语句中止对寄存器的连续赋值。 寄存器中的值被保留到其被重新赋值为止。 所有的综合工具都不支持,module DEF(D, Clr, Clk, Q) ; input D, Clr, Clk; output Q; reg Q; always (Clr) begin if(!Clr) assign Q = 0; / D对Q无效。 else deassign Q; end always (

11、negedge Clk) Q = D; endmodule,reg3:0 Pest; . . ./always或initial块 Pest = 0; . . . assign Pest = Hty Mtu; /Hty 或Mtu上的任何变化将促使赋值语句被重新计算。 assign Pest = 2; /将对Pest重新赋值,然后赋值。 deassign Pest; /Pest连续地保持值为2。 assign Pest2 = 1; /*错误:对寄存器的位选择不能够作为过程性连续赋值的目标* /,assign 和 deassign 覆盖寄存器上的当前值。 reg state_reg ; initia

12、l begin #10 assign state_reg = 2 ; #20 deassign state_reg ; end,force与release,force和release过程语句不仅能够应用于线网,也能够应用于寄存器的赋值。 当force语句应用于寄存器时,寄存器的当前值被force语句的值覆盖;当release语句应用于寄存器时,寄存器中的当前值保持不变。,reg(wire) scan_reg.q ; initial begin #10 force scan_reg.q = 0 ; #20 release scan_reg.q ; end,reg2:0 Colt; . . . C

13、olt = 2; force Colt = 1; . . . release Colt; / Colt 保持值为1。 . . . assign Colt = 5; . . . force Colt = 3; . . . release Colt; / Colt值变为5。 . . .,force和release小结,force和release不能用于位选、连接或部分选。 force优先于过程连续赋值。 force一直有效,直到另一force作用于同一线网或者寄存器,或者release。 当被强制的寄存器被释放,寄存器值不会立即改变,直到对寄存器进行赋值。 如果先assign后force,则变量取

14、force值,release后assign仍然有效。 当线网变量的force被release,线网的驱动立即生效。 如果多个force对一个变量赋值,relesease后所有force都失效。 不可综合,握手协议实例,RX ,接收器;MP微处理器。RX进程读取串行的输入数据。并发送Ready信号表明数据可被读入MP进程。MP进程在将数据分配给输出后,回送一个接收信号Ack到RX进程以读取新的输入数据。,module Interacting (Serial_In, Clk, Parallel_Out); input Serial_In, Clk; output 0:7 Parallel_Out;

15、 reg 0:7 Parallel_Out; reg Ready, Ack; wire 0:7 data; include “Read_Word.v“ / Read_Word任务在此文件中定义。,always begin: RX Read_Word(Serial_In, Clk, Data) ; / *任务Read_Word在每个时钟周期读取串行数据,将其转换为并行数据并存于Data中。*/ Ready = 1; wait(Ack) ; Ready = 0; # 40 ; end,always begin: MP # 25 ; Parallel_Out = Data; Ack = 1; #25

16、 Ack = 0; wait (ready) ; end endmodule,同步vs.异步,module sync (d,clk, clr, pre, q); input d, clk, clr, pre ; output q ; reg q ; always (posedge clk) begin if (clr) q = 1b0 ; else if (pre) q = 1b1 ; else q = d ; end endmodule,module async (d,clk, clr, q); input d, clk, clr ; output q ; reg q ; always (p

17、osedge clk or posedge clr) begin if (clr) q = 1b0 ; else q = d ; end endmodule,结构建模,在 Verilog中结构建模等效于电路图 。可以将简单的单元连接成复杂的单元。 结构建模由已有的单元构成。 结构建模方式用以下三种实例语句描述: Gate实例语句 UDP实例语句 Module实例语句,模块,Verilog HDL中,基本单元定义成模块形式,如下所示: module Module_name (Port_list) Port declarations (if ports are present) /端口队列port

18、_list列出了该模块通过哪些端口与外部模块通信。 Parameters (optional) Data type declarations Continuous Assignments (assign) Procedural Blocks (initial and always) behavioral statements Instantiation of lower-level modules Tasks and Functions Timing Specifications endmodule,端口,模块通过端口与外界通讯。 模块端口相当于硬件的pin。 模块的端口有三种: 输入端口 i

19、nput 输出端口 output 双向端口 inout,端口,缺省的端口类型为线网类型(即wire类型)。 端口也可被显式地指定为线网。 输出端口能够被重新声明为reg型寄存器,但不可以是real和time。 无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度相同。,端口说明,module Micro (PC, Instr, NextAddr ); input 3:1 PC; output 1:8 Instr; inout 16:1 NextAddr;wire 16:1 NextAddr; /该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。显示说明。 re

20、g 1:8 Instr; / /Instr被说明为reg类型,因此它能在always 语句或在initial语句中赋值。 . . . endmodule,模块实例语句,一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。 信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。 port_expr /通过位置。 .PortName (port_expr) /通过名称。,port_expr可以有5种类型: 1) 标识符 2) 位选择 3) 部分选择 4) 上述类型的合并 5) 表达式(只适用于输入端口),在位置关联中,端口表达式按指定的顺序与模块中的端口关联。 在通过名称实现的关联中

21、,模块端口和端口表达式的关联被显式地指定,因此端口的关联顺序并不重要。,使用不同端口表达式形式的模块实例语句,Micro M1 (UdIn3:0, WrN, RdN, Status0, Status 1 , 这个实例语句表示端口表达式可以是标识符( TxData)、位选择( Status0)、部分位选择(UdIn3:0)、合并(WrN,RdN)或一个表达式( &udOut0:7);表达式只能够连接到输入端口。 其中没有名称关联。,两个半加器模块构造全加器,module HA(A , B , S , C); input A , B; output S, C; assign #2 S= A B;

22、assign #1 C= A endmodule,悬空端口,悬空端口可通过将端口表达式表示为空白来指定为悬空端口。 DFF d1 ( .Q(QS), .Qbar(), .Data(D),.Preset(), .Clock(CK); /名称对应方式。 DFF d2 (QS, , D, , CK) ; / /位置对应方式。 / /输出端口Qbar悬空。 / /输入端口Preset打开,其值设定为z。 在这两个实例语句中,端口Qbar和Preset悬空。 模块的输入端悬空,值为高阻态z。模块的输出端口悬空,表示该输出端口废弃不用。,不同的端口长度,当端口和局部端口表达式的长度不同时,端口通过无符号数

23、的右对齐或截断方式进行匹配。,module Child(Pba, Ppy) ; input 5:0 Pba; output 2:0 Ppy; . . . endmodule module Top; wire 1:2 Bdl; wire 2:6 Mpr; Child C1 (Bdl, Mpr) ; endmodule,模块参数值,当某个模块在另一个模块内被引用时,高层模块能够改变低层模块的参数值。模块参数值的改变可采用下述两种方式: 1) 参数定义语句(defparam); 2) 带参数值的模块引用。,参数定义语句,defparam hier_path_name1 = value1, hier_

24、path_name2 = value2, .; 较低层模块中的层次路径名参数可以使用如下语句显式定义。,改变较低层次模块的参数,module full_adder(fco, fsum, cin, a, b); output fco, fsum; input cin, a, b; wire c1, s1, c2; defparam u1.and_delay = 4, u1.xor_delay = 6; defparam u2.and_delay = 3, u2.xor_delay = 5; half_adder u1(c1, s1, a, b); half_adder u2(.a(s1), .b

25、(cin),.sum(fsum), .co(fco); or u3(fco, c1, c2); endmodule module half_adder (a, b, sum, co); parameter and_delay = 8, xor_delay = 8; . endmodule,带参数值的模块引用,module full_adder(fco, fsum, cin, a, b); output fco, fsum; input cin, a, b; wire c1, s1, c2; half_adder #(4, 6) u1(c1, s1, a, b); half_adder #(3,

26、 5) u2(.a(s1), .b(cin),.sum(fsum), .co(fco); or u3(fco, c1, c2); endmodule module half_adder (a, b, sum, co); parameter and_delay = 8, xor_delay = 8; . endmodule,模块实例语句中参数值的顺序必须与较低层被引用的模块中说明的参数顺序匹配。 带参数的模块引用只能用于将参数值向下传递一个层次,但是参数定义语句能够用于替换层次中任意一层的参数值。 在带参数的模块引用中,参数的指定方式与门级实例语句中时延的定义方式相似。 参数经常用于指定宽度和时

27、延。,外部端口,外部可见的模块端口 module Scram_A(Arb, Ctrl, Mem_Blk, Byte); input0:3 Arb; input Ctrl; input 8:0 Mem_Blk; output 0:3 Byte; . . . endmodule Arb, Ctrl, Mem_Blk, Byte为模块端口。这些端口同时也是外部端口。 在模块Scram_A中,外部端口名称隐式地指定。,在实例中,当采用名称关联方式时,外部端口名称用于指定相互连接。 Scram_A SX( .B y t e(B 1) , .M e m _ B l k(M 1) , .C t r l(C

28、1) , .A r b(A 1) ) ;,HDL中提供显式方式指定外部端口名称。语法形式: .external_port_name(internal_port_name),module Scram_B ( .Data(Arb) , .Control(Ctrl) , .Mem_Word(Mem_Blk) , .Addr(Byte) ; input0:3 Arb; input Ctrl; input 8:0 Mem_Blk; output 0:3 Byte; . . . endmodule 外部端口是Data、Control、Mem_Word和Addr。 内部端口是Arb, Ctrl, Mem_B

29、lk, Byte,端口表显式地表明了外部端口和内部端口之间的连接。 外部端口无需声明,外部端口在模块内不可见,但是却要在模块实例语句中使用。 内部端口因为在模块中可见,所以必须在模块中说明。,外部端口的使用,Scram_B S1 ( .Addr(A1) , .Data(D1) , .Control(C1) , .Mem_Word(M1) ) ; 在模块定义的端口表中,这两种概念不能混淆,即在模块定义中所有端口必须指定显式的端口名称,或者没有一个端口带有显式的端口名称。 如果模块端口通过位置连接,则模块实例语句中不能使用外部端口名称。,内部端口名称,内部端口名称可以是标识符,也可以是下述类型的表

30、达式: 位选择; 部分选择; 位选择、部分选择和标识符的连接。,module Scram_C (Arb0:2 ,Ctrl, Mem_Blk0 ,Mem_Blk1 ,Byte3 ) ; input 0:3 Arb; input Ctrl; input 8:0 Mem_Blk; output 0:3 Byte; . . . endmodule,在内部端口是位选择、部分选择或合并的情况下,没有隐式地指定外部端口名。因此,在这样的模块实例语句中,模块端口必须通过位置关联相互连接。 若使用端口名称关联(即当内部端口不是标识符时),必须对模块中的端口指定外部端口名。如下面的Scram_D模块定义所示。,m

31、odule Scram_D ( .Data(Arb0:2), .Control(Ctrl), .Mem_Word(Mem_Blk0, Mem_Blk1), .Addr(Byte3); input 0:3 Arb; input Ctrl; input 8:0 Mem_Blk; output 0:3 Byte; . . . endmodule,在Scram_D模块实例语句中,端口既能够使用位置连接,也能够使用名称连接,但是不能混合使用。 Scram_D SZ (.Data(L14:6, .Control(CL),.Mem_Word(MMY1:0, .Addr(BT);,模块中可以只有外部端口而没有

32、内部端口。即模块在引用中其外部端口可以悬空,不与内部信号相连。 module Scram_E (.Data( ), .Control(Ctrl) , .Mem_Word(Mem_Blk0, Mem_Blk1), .Addr( ); input Ctrl; input 8:0 Mem_Blk; . . . endmodule,Verilog HDL允许一个内部端口能与多个外部端口连接。 module FanOut (.A(CtrlIn) , .B(CondOut), .C(CondOut) ; inputCtrlIn; output CondOut; assign CondOut = CtrlI

33、n; endmodule,结构模型描述十进制计数器,module Decade_Ctr (Clock, Z) ; input Clock; output 0:3 Z; and A1 (S1, Z2, Z1); / 4个模块实例语句: JK_FF JK1( .J(1b1), .K(1b1), .CK(Clock), .Q(Z0) , .NQ( ), JK2(.J(S2),.K(1b1),.CK(Z0), .Q(Z1) , .NQ(), JK3(.J(1b1), .K(1b1), .CK(Z1), .Q(Z2), .NQ(), JK4(.J(S1), .K(1b1), .CK(Z0), .Q(Z3

34、), .NQ(S2); endmodule,3位可逆计数器的逻辑,JK_FF JK1(1b1, 1b1, Clk, Q0, S1), JK2(1b1, 1b1, S4, Q1 ,S5), JK3(1b1, 1b1, S8, Q2,); and A1(S2, Cnt_Up, Q0), A2(S3, S1, Cnt_Down), A3(S7, Q1, Cnt_Up), A4(S6, S5, Cnt_Down); or O1(S4, S2, S3) , O2(S8, S7, S6); endmodule,module Up_Down(Clk, Cnt_Up, Cnt_Down, Q) ; input Clk, Cnt_Up, Cnt_Down; output 0:2 Q; wire S1, S2, S3, S4, S5, S6, S7, S8;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报