【连载】FPGAVerilogHDL系列实例--------4位二进制加减法计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【连载】FPGAVerilogHDL系列实例--------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
19if ( rst == 1'b0 )
20 cnt <= 0 ;
21else begin if ( a==1'b1 ) begin
22if ( cnt >= 32'd3000000 )
23 b <= 1 ;
24else
25 cnt <= cnt + 1'b1 ;
26
27 end
28else 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 counter
4 ( 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
37if ( clr == 1) //同步清零
38 data_r <= 0;
39else if ( load == 1) //同步预置
40 data_r <= DIN;
41else begin if ( up_down ==1)
42 begin
43if ( data_r == 4'b1111) begin //加计数
44 data_r <= 4'b0000;
45 c = 1;
46 end
47else begin //减计数
48 data_r <= data_r +1;
49 c = 0 ;
50 end
51 end
52else
53 begin
54if ( data_r == 4'b0000) begin //加计数
55 data_r <= 4'b1111;
56 c = 1;
57 end
58else begin //减计数
59 data_r <= data_r -1;
60 c = 0 ;
61 end
62 end
63 end
64 end
65 endmodule。