【连载】 FPGA Verilog HDL 系列实例--------4位二进制加减法计数器
Verilog HDL 之 4位二进制加减法计数器
一、原理
计数器是数字系统中用的较多的基本逻辑器件。它不仅能记录输入时钟脉冲的个数,还可以实现分频、定时等功能。
计数器的种类很多。按脉冲方式可以分为同步计数器和异步计数器;按进制可以分为二进制计数器和非二进制计数器;按计数过程数字的增减,可分为加计数器、减计数器和可逆计数器。
本实验就是设计一个4位二进制加减法计数器,该计数器可以通过一个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有一个清零输入,低电平有效。还有一个load装载数据的信号输入,用于预置数据;还有一个C的输出,用于计数器的级联。其功能表如表1.1所示;
表1.1 4位二进制加减法计数器功能表
二、实现
在设计文件中输入Verilog代码
1 /****************************** 分频模块 *************************************/
2
3 `timescale 1 ns / 1 ps
4 module qu_dou ( clk ,rst , a ,b );
5
6 input clk ;
7 wire clk ;
8 input rst ;
9 input a ;
10 wire a ;
11
12 output b ;
13 reg b ;
14
15 reg [31:0] cnt ;
16 reg clkout ;
17 always @ ( posedge clk or negedge rst )
18 begin
19 if ( rst == 1'b0 )
20 cnt <= 0 ;
21 else begin if ( a==1'b1 ) begin
22 if ( cnt >= 32'd3000000 )
23 b <= 1 ;
24 else
25 cnt <= cnt + 1'b1 ;
26
27 end
28 else begin b <= 1'b0 ;
29 cnt <= 0 ;
30 end
31 end
32 end
33
34
35 endmodule
功能实现
1 `timescale 1 ns / 1 ps
2
3 module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst );
4
5 input load ;
6 input clk;
7 wire load ;
8 input clr ;
9 wire clr ;
10 input up_down ;
11 wire up_down ;
12 input [3:0] DIN ;
13 wire [3:0] DIN ;
14 input sysclk ;
15 input rst ;
16
17 output c ;
18 reg c ;
19 output [3:0] DOUT ;
20 wire [3:0] DOUT ;
21 reg [3:0] data_r;
22
23 /***************** 例化去抖模块 *************************************/
24 wire clk_r ;
25 qu_dou qu_dou (
26 .clk (sysclk) ,
27 .rst (rst) ,
28 .a (clk),
29 .b (clk_r));
30
31 //*********************************************************************
32
33
34 assign DOUT = data_r;
35 always @ ( posedge clk_r or posedge clr or posedge load)
36 begin
37 if ( clr == 1) //同步清零
38 data_r <= 0;
39 else if ( load == 1) //同步预置
40 data_r <= DIN;
41 else begin if ( up_down ==1)
42 begin
43 if ( data_r == 4'b1111) begin //加计数
44 data_r <= 4'b0000;
45 c = 1;
46 end
47 else begin //减计数
48 data_r <= data_r +1;
49 c = 0 ;
50 end
51 end
52 else
53 begin
54 if ( data_r == 4'b0000) begin //加计数
55 data_r <= 4'b1111;
56 c = 1;
57 end
58 else begin //减计数
59 data_r <= data_r -1;
60 c = 0 ;
61 end
62 end
63 end
64 end
65 endmodule