2时序逻辑电路--计数器

2.4.1 二进制计数器

代码如下

View Code
 1 module counter
2 #(parameter N=8)
3 (
4 input clk,
5 input rst_n,
6 output [N-1:0] Q,
7 output Max_tick
8 );
9
10 reg [N-1:0] r_reg;
11 wire [N-1:0] r_next;
12
13 always @ (posedge clk or negedge rst_n)
14 if(!rst_n)
15 r_reg<=0;
16 else r_reg<=r_next;
17
18 assign r_next=r_reg+1'b1;
19 assign Q=r_reg;
20 assign Max_tick=(r_reg==2**N-1)?1'b1:1'b0;
21
22 endmodule

2.4.2具有控制位的计数器

设计相应的控制线,根据设计的真值表编写代码,参考COM缺氧设计的真值表如下,需要说明的是rst_n异步清零主要用在系统的初始化,而syn_ctrl同步清零是在一般操作中使用。

代码如下

View Code
 1 module counter
2 #(parameter N=8)
3 (
4 input clk,
5 input rst_n,
6 input syn_ctrl,
7 input load,
8 input en,
9 input up,
10 output [N-1:0] Q,
11 output Max_tick,
12 output Min_tick
13 );
14
15 reg [N-1:0] r_reg;
16 reg [N-1:0] r_next;
17
18 always @ (posedge clk or negedge rst_n)
19 if(!rst_n)
20 r_reg<=0;
21 else r_reg<=r_next;
22
23 always @(*)
24 if(syn_ctrl)r_next=0;
25 else if(load) r_next=Q;
26 else if(en & up)r_next=r_reg+1'b1;
27 else if(en & ~up)r_next=r_reg-1'b1;
28 else r_next=r_reg;
29
30 assign Q=r_reg;
31 assign Max_tick=(r_reg==2**N-1)?1'b1:1'b0;
32 assign Min_tick=(r_reg==0)?1'b1:1'b0;
33
34 endmodule

将上述代码N值改为3,编写testbench如下

View Code
 1 `timescale 1ns/10ps
2 module counter_tb;
3 reg clk,rst_n,syn_ctrl,load,en,up;
4 reg [2:0] D;
5 wire [2:0] Q;
6 wire Min_tick;
7 wire Max_tick;
8
9 counter counter_inst
10 (
11 .clk(clk),
12 .rst_n(rst_n),
13 .syn_ctrl(syn_ctrl),
14 .load(load),
15 .up(up),
16 .en(en),
17 .D(D),
18 .Q(Q),
19 .Min_tick(Min_tick),
20 .Max_tick(Max_tick)
21 );
22
23 //***************************************
24 //时钟与复位激励
25 parameter CLK_PERIOD=20,
26 RESET_TIME=10;
27 initial clk=0;
28 initial forever #(CLK_PERIOD/2) clk=~clk;
29 initial rst_n=0;
30 initial forever #RESET_TIME rst_n=1;
31 //***************************************
32
33 initial
34 begin
35 //initial ctrl_signal input
36 syn_ctrl=1'b0;
37 load=1'b0;
38 en=1'b0;
39 up=1'b1;
40 //initial data_signal input
41 D=3'b000;
42 //initial ctrl_signal input
43 @(posedge rst_n);//wait rst_n to deassert
44 @(negedge clk);//wait for one clk
45 //test load
46 load=1'b1;
47 D=3'b011;
48 @(negedge clk)
49 load=1'b0;
50 repeat(2) @(negedge clk);
51 //test syn_ctrl
52 syn_ctrl=1'b1;
53 @(negedge clk)
54 syn_ctrl=1'b0;
55 repeat(2) @(negedge clk);
56 //test up counter and pause
57 en=1'b1;
58 up=1'b1;
59 repeat(10) @(negedge clk);
60 en=1'b0;
61 repeat(2) @(negedge clk);
62 en=1'b1;
63 repeat(2) @(negedge clk);
64 //test down mod
65 up=1'b0;
66 repeat(10) @(negedge clk);
67 //test Max_tick and Min_tick
68 wait(Q==2);
69 @(negedge clk);
70 up=1'b1;
71 @(negedge clk);
72 wait(Min_tick);
73 @(negedge clk);
74 up=1'b0;
75 //delay
76 #(4*CLK_PERIOD);
77 en=1'b0;
78 #(4*CLK_PERIOD);
79 $stop;
80 end
81
82 endmodule

RTL级仿真波形如下

验证syn_ctrl波形如下

验证load信号波形如下

验证Max_tick,Min_tick波形如下

2.4.3模m计数器

将上述二进制计数器判断语句r_reg==2**N-1改为r_reg==M-1;即构成模M计数器。

posted on 2011-08-02 20:43  万好好  阅读(1029)  评论(0编辑  收藏  举报

导航