1、第7章代码第7章 基于Verilog的时序电路设计及验证7.1.3 带清零D锁存器一module latch_1_c(Clk,D,Q,Rst); input Clk,D,Rst; output Q; reg Q; always (D or Clk or Rst)if (!Rst) Q=0; / 语句1else if (Clk) Q=D;endmodule程序说明:(1)程序采用具有时序语句特色的进程语句,其中数据信号D、时钟信号Clk和清0(复位)信号Rst都被列于敏感信号表中,实现了Clk的电平触发特性和Rst的异步特性。(2)异步清0实现的效果,就是当Rst一旦变成0,就马上对输出进行清0
2、,而不需要理会时钟、输入数据等的状态。也就是Rst是优先级最高的控制信号,在代码(语句1)中,可通过“ifelse if”语句来实现优先级控制。测试平台设计timescale 1ns/1ns module testbench_latch; reg clk,D,rst; wire Q; initial begin clk=0; #50 clk=1; #70 clk=0; #80 clk=1; end initial begin D=0; repeat(20) #20 D=$random; end initial begin rst=0; #60 rst=1; #80 rst=0; #40 rst
3、=1; endlatch_1_c testbench_latch(clk,D,Q,rst); endmodule7.2.2 D触发器二(异步清零边沿触发)module d_ff_2(D,Clk,Q,Rst,En); input D,Clk,Rst,En; output Q; reg Q; always (posedge Clk or negedge Rst) begin if (!Rst) Q=0; else if (En) Q=D; endendmodule测试平台设计timescale 1ns/1ns module testbench; reg D,Rst,Clk,En;wire Q; i
4、nitial Clk=0; parameter clock_period=20; always #(clock_period/2) Clk=Clk; initial begin D=0; repeat(20) #20 D=$random; end initial begin Rst=0; repeat(20) #20 Rst=$random; end initial begin En=0; repeat(20) #20 En=$random; endd_ff_2 testbench_dff(D,Clk,Q,Rst,En); initial #400 $finish;endmodule 7.2.
5、7 JK触发器module jk_ff(J,K,Clk,Q,Qn); input J,K,Clk; output Q,Qn; reg Q; assign Qn=Q; always (posedge Clk) case(J,K) 2b00:Q=Q; 2b01:Q=1b0; 2b10:Q=1b1; 2b11:Q=Q; default:Q=1bx; endcaseendmodule测试平台设计timescale 1ns/1ns module testbench; reg j,k,Clk; wire Q,Qn; initial Clk=0; parameter clock_period=20; alw
6、ays #(clock_period/2) Clk=Clk; initial begin j=0; repeat(20) #20 j=$random; end initial begin k=0; repeat(20) #20 k=$random; end initial #300 $finish; jk_ff testbench_jk(j,k,Clk,Q,Qn); endmodule7.3.2 基本寄存器二(异步清零异步置1)以下的设计具有异步清零端(Aclr)和异步置1端(Aset),异步清零的优先级比异步置1高。module reg4_2 (Data, Aclr, Aset, Clock
7、, Q); input 3:0 Data; input Aclr; input Aset; input Clock; output 3:0 Q; reg 3:0 Q; always (posedge Clock or negedge Aclr or posedge Aset) if (!Aclr) Q = 4b0000; else if (Aset) Q = 4b1111; else Q = Data;endmodule测试平台设计timescale 1ns/1ns module testbench; reg 3:0 Data;reg Aclr,Aset,Clock;wire 3:0 Q; i
8、nitial Clock=0;parameter clock_period=20;always #(clock_period/2) Clock=Clock;initial begin Data=0;repeat(20) #20 Data=$random; endinitial begin Aclr=0;repeat(20) #20 Aclr=$random; endinitial begin Aset=0; #200 Aset=1; endreg4_2 test_reg(Data, Aclr, Aset, Clock, Q); initial #300 $finish;endmodule7.3
9、.4 移位寄存器二(并入串出单向左移)module shift_reg_piso (Data, Enable, Shiften, Shiftin, Aclr, Clock, Shiftout); input 1:0 Data; input Aclr; input Enable; input Shiften; input Shiftin; input Clock; output Shiftout; reg 1:0 Qaux; always (posedge Aclr or posedge Clock) begin if (Aclr) Qaux = 0; else if (Enable) Qaux
10、 = Data; else if (Shiften) Qaux = Qaux0, Shiftin; / 语句1 end assign Shiftout = Qaux1; / 语句2endmodule程序说明:(1)程序实现2位移位寄存器,串行输出左向移位。(2)程序逻辑与设计一的一致,只是在最后输出的时候,设计一是并行输出整个结果,而设计二是输出最高位,达到串行输出的结果。(3)如果要改为右移,语句1应改为“Qaux = Shiftin, Qaux1;”,并且语句2改为输出最低位Qaux0。测试平台设计(1)timescale 1ns/1ns module testbench; reg 1:0
11、 Data;reg Aclr,Enable,Shiften,Shiftin,Clock;wire Shiftout; parameter clock_period=20;always #(clock_period/2) Clock=Clock;initial begin Data=0; repeat(20) #20 Data=$random; endinitial begin Clock=0; / 时钟信号的初始化,可放在任一个initial过程中 Aclr=0; #40 Aclr=1; #100 Aclr=0; endinitial begin Enable=0; #100 Enable=1
12、; #100 Enable=0; endinitial begin Shiften=0; repeat(20) #20 Shiften=$random; endinitial begin Shiftin=0; repeat(10) #40 Shiftin=$random; endshift_reg_piso testbench_piso(Data, Enable, Shiften, Shiftin, Aclr, Clock, Shiftout); initial #400 $finish;endmodule为了查看效果更完整,要把Qaux也输出显示到Wave窗口中,需要在“sim”窗口中选择“
13、testbench_piso”实例,然后在“objects”窗口中找到Qaux变量,把该变量设置在Wave窗口中显示。如果不把Qaux加入到波形中,光从Shiftout是很难看出其移位过程的。测试平台设计(2)在测试平台设计(1)中,对于每一个控制信号,要么指定变化的时间,要么周期性用随机数生成,这样可以产生不同的测试信号组合。但这样的设计很容易产生一些无意义的状态组合和有些情况未能列出。在测试平台设计(2)中,Aclr和Clock的信号单独产生;另外3个控制和输入信号(Enable,Shiften,Shiftin)则通过循环方法,生成所有可能出现的组合情况;Data输入则随机产生。times
14、cale 1ns/1ns module testbench2; reg 1:0 Data;reg Aclr,Enable,Shiften,Shiftin,Clock;wire Shiftout; reg2:0 CtrlVec;integer I;parameter period=20;always #(period/2) Clock=Clock;initial begin Clock=0;Aclr =0; #160 Aclr =1; endinitial begin Data=0; repeat(12) #20 Data=$random; endinitial begin for (I = 0
15、 ; I =11 ; I = I + 1) beginCtrlVec=I;Enable,Shiften,Shiftin= CtrlVec;#20; endendshift_reg_piso testbench_piso2(Data, Enable, Shiften, Shiftin, Aclr, Clock, Shiftout); initial #240 $finish;endmodule程序说明:(1)I的循环只需要8次即可列举出Enable,Shiften,Shiftin三个控制信号的8种状态组合,但为了测试Aclr为0时的结果,增加了4次循环(I等于811时)。(2)Enable,Sh
16、iften,Shiftin的组合情况从000111变化后,又重新从000开始,因为当I为8(即b1000)时,Enable,Shiften,Shiftin分别获得了低位的0,而最高位的1没有被任何变量获得,这是一个常用技巧。7.4.2 计数器二(带置数)module cnt4_2 (clock, q, aclr, sload, data); input clock; output 3:0 q; input aclr; input sload; input 3:0 data; reg 3:0 qaux; always (posedge clock or posedge aclr) begin i
17、f (aclr) qaux = 4b0000; else if (sload) qaux = data; else qaux = qaux + 1; end assign q = qaux;endmodule测试平台设计timescale 1ns/1nsmodule testbench;reg clock,sload,aclr;reg3:0 data;wire3:0 q;initialclock=0;parameter DELY=20;always #(DELY/2) clock = clock;initial begin sload=0;repeat(15) # DELY sload=$random; endinitial begin aclr=0; # DELY aclr=1; #60 aclr=0; endinitial begin data=0;repeat(15) # DELY data=$random; endcnt4_2 test_cnt_42(clock,q,aclr,sload,data); initial #300 $finish;endmodule
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1