简单介绍一下四位计数器所要满足的条件:
1.4bit循环计数;
1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,1,.......
2.能同步清零;
高电平有效
3.有加载功能;
高电平加载
4.优先级:清零信号 > 加载信号;
给出计数器的设计代码:
1 module count4(clk, reset, clr, ld, init, out); 2 3 input clk, reset; 4 input clr; 5 input ld; 6 input [3:0] init; 7 output [3:0] out; 8 reg [3:0] out; 9 10 always @(posedge clk or posedge reset) 11 begin if(reset) 12 out <= 0; 13 else if(clr) 14 out <= 0; 15 else if(ld) 16 out <= init; 17 else 18 out <= out+1; 19 end 20 endmodule
计数器的testbench设计:
对clr信号进行验证:
1. 一个周期;
2.二个周期(多个周期);
3.毛刺
1 `timescale 1ns/1ns 2 3 module tb_a; 4 5 parameter CYCLE=10; 6 7 reg clk; 8 reg reset; 9 reg clr; 10 reg ld; 11 reg[3:0] init; 12 wire[3:0] out; 13 14 //RTL instance 15 count4 count4( 16 .clk(clk), 17 .reset(reset), 18 .ld(ld), 19 .init(init), 20 .clr(clr), 21 .out(out) 22 ); 23 24 //generate input-clk 25 initial begin 26 clk=0; 27 forever begin 28 #(CYCLE/2); 29 clk=1; 30 #(CYCLE/2); 31 clk=0; 32 end 33 end 34 35 initial begin 36 reset=1; 37 #(5*CYCLE); 38 reset=0; 39 end 40 41 initial begin 42 clr=0; 43 ld=0; 44 init=0; 45 #(6*CYCLE); 46 47 48 49 @(negedge clk); 50 51 clr=1; 52 ld=0; 53 init=0; 54 #(CYCLE); 55 56 @(negedge clk); 57 clr=0; 58 ld=0; 59 init=0; 60 #(5*CYCLE); 61 62 @(negedge clk); 63 clr=1; 64 ld=0; 65 init=0; 66 #(2*CYCLE); 67 68 @(negedge clk); 69 clr=0; 70 ld=0; 71 init=0; 72 #(5*CYCLE); 73 74 @(negedge clk) 75 clr=1; 76 ld=0; 77 init=0; 78 #(CYCLE/8); 79 80 81 clr=0; 82 ld=0; 83 init=0; 84 #(20*CYCLE); 85 86 $finish; 87 88 89 end 90 91 endmodule
波形图:
对ld加载信号进行验证:
1. 一个周期;
2.二个周期(多个周期);
3.毛刺
注意:写在一个initial块里面;
测试ld信号时,clr信号为0.
testbench:
1 `timescale 1ns/1ns 2 3 module tb_a; 4 5 parameter CYCLE=10; 6 7 reg clk; 8 reg reset; 9 reg clr; 10 reg ld; 11 reg[3:0] init; 12 wire[3:0] out; 13 14 //RTL instance 15 count4 count4( 16 .clk(clk), 17 .reset(reset), 18 .ld(ld), 19 .init(init), 20 .clr(clr), 21 .out(out) 22 ); 23 24 //generate input-clk 25 initial begin 26 clk=0; 27 forever begin 28 #(CYCLE/2); 29 clk=1; 30 #(CYCLE/2); 31 clk=0; 32 end 33 end 34 35 initial begin 36 reset=1; 37 #(5*CYCLE); 38 reset=0; 39 end 40 41 initial begin 42 clr=0; 43 ld=0; 44 init=0; 45 #(6*CYCLE); 46 47 48 49 @(negedge clk); 50 51 clr=1; 52 ld=0; 53 init=0; 54 #(CYCLE); 55 56 @(negedge clk); 57 clr=0; 58 ld=0; 59 init=0; 60 #(5*CYCLE); 61 62 @(negedge clk); 63 clr=1; 64 ld=0; 65 init=0; 66 #(2*CYCLE); 67 68 @(negedge clk); 69 clr=0; 70 ld=0; 71 init=0; 72 #(5*CYCLE); 73 74 @(negedge clk) 75 clr=1; 76 ld=0; 77 init=0; 78 #(CYCLE/8); 79 80 81 clr=0; 82 ld=0; 83 init=0; 84 #(10*CYCLE); 85 //clr_testbench 86 @(negedge clk); 87 clr=0; 88 ld=1; 89 init=5; 90 #(CYCLE); 91 92 clr=0; 93 ld=0; 94 init=0; 95 #(2*CYCLE); 96 97 @(negedge clk); 98 clr=0; 99 ld=1; 100 init=5; 101 #(2*CYCLE); 102 103 clr=0; 104 ld=0; 105 init=0; 106 #(2*CYCLE); 107 108 @(negedge clk); 109 clr=0; 110 ld=1; 111 init=5; 112 #(CYCLE/8); 113 114 clr=0; 115 ld=0; 116 init=0; 117 #(10*CYCLE); 118 119 $finish; 120 121 122 end 123 124 endmodule
波形图:
对计数器功能进行验证:
1. 极值测试(最大值,最小值);
2.优先级测试;
testbench:
1 `timescale 1ns/1ns 2 3 module tb_a; 4 5 parameter CYCLE=10; 6 7 reg clk; 8 reg reset; 9 reg clr; 10 reg ld; 11 reg[3:0] init; 12 wire[3:0] out; 13 14 //RTL instance 15 count4 count4( 16 .clk(clk), 17 .reset(reset), 18 .ld(ld), 19 .init(init), 20 .clr(clr), 21 .out(out) 22 ); 23 24 //generate input-clk 25 initial begin 26 clk=0; 27 forever begin 28 #(CYCLE/2); 29 clk=1; 30 #(CYCLE/2); 31 clk=0; 32 end 33 end 34 35 initial begin 36 reset=1; 37 #(5*CYCLE); 38 reset=0; 39 end 40 41 initial begin 42 clr=0; 43 ld=0; 44 init=0; 45 #(6*CYCLE); 46 47 48 49 @(negedge clk); 50 51 clr=1; 52 ld=0; 53 init=0; 54 #(CYCLE); 55 56 @(negedge clk); 57 clr=0; 58 ld=0; 59 init=0; 60 #(5*CYCLE); 61 62 @(negedge clk); 63 clr=1; 64 ld=0; 65 init=0; 66 #(2*CYCLE); 67 68 @(negedge clk); 69 clr=0; 70 ld=0; 71 init=0; 72 #(5*CYCLE); 73 74 @(negedge clk) 75 clr=1; 76 ld=0; 77 init=0; 78 #(CYCLE/8); 79 80 81 clr=0; 82 ld=0; 83 init=0; 84 #(10*CYCLE); 85 //clr_testbench 86 @(negedge clk); 87 clr=0; 88 ld=1; 89 init=5; 90 #(CYCLE); 91 92 clr=0; 93 ld=0; 94 init=0; 95 #(2*CYCLE); 96 97 @(negedge clk); 98 clr=0; 99 ld=1; 100 init=5; 101 #(2*CYCLE); 102 103 clr=0; 104 ld=0; 105 init=0; 106 #(2*CYCLE); 107 108 @(negedge clk); 109 clr=0; 110 ld=1; 111 init=5; 112 #(CYCLE/8); 113 114 clr=0; 115 ld=0; 116 init=0; 117 #(10*CYCLE); 118 //function testbench 119 @(negedge clk); 120 clr=0; 121 ld=1; 122 init=0; 123 #(CYCLE); 124 125 clr=0; 126 ld=0; 127 init=0; 128 #(2*CYCLE); 129 130 @(negedge clk); 131 clr=0; 132 ld=1; 133 init=15; 134 #(CYCLE); 135 136 clr=0; 137 ld=0; 138 init=0; 139 #(2*CYCLE); 140 141 @(negedge clk); 142 clr=1; 143 ld=1; 144 init=5; 145 #(CYCLE); 146 147 clr=0; 148 ld=0; 149 init=0; 150 #(2*CYCLE); 151 152 153 154 155 156 157 158 159 160 161 162 163 $finish; 164 165 166 end 167 168 endmodule
波形图:
编写中一个小错误:
是#(CYCLE),不是(#CYCLE).
标签:ld,clk,negedge,init,计数器,四位,testbench,clr,CYCLE From: https://www.cnblogs.com/love-dog/p/17205756.html