FPGA Verilog HDL 系列实例--------十进制加减法计数器

Verilog HDL 之 十进制加减法计数器

一、原理

  上面的一个实验我们介绍了二进制计数器, 这个实验我们介绍非二进制计数器。在非二进制计数器中我们最常用的就是十进制计数器。下面设计一个8421码十进制计数器为例
该计数器可以通过一个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有一个清零输入,低电平有效。还有一个load装载数据的信号输入,用于预置数据;还有一个C的输出,用于计数器的级联。其功能表如表1.1所示。

二、实现

在设计文件中输入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 counter10 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,seven_seg ,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 output [7:0] seven_seg;
21 wire [3:0] DOUT ;
22 reg    [3:0] data_r;
23 
24 /***************** 例化去抖模块  *************************************/
25 wire     clk_r ;
26 qu_dou qu_dou ( 
27 .clk (sysclk) ,
28 .rst (rst) , 
29 .a (clk),
30 .b  (clk_r));
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 if ( up_down ==1 & data_r == 9)
42             begin 
43                 c = 1;
44                 data_r <= 4'b0000;
45             end
46         else if ( up_down ==0 & data_r == 0) 
47             
48             begin 
49                 c = 1;
50                 data_r <= 9;
51             end
52         else
53             begin 
54                 if (  up_down ==1)    begin     //加计数
55                     data_r <= data_r +1;  
56                     c = 0 ;                 
57                     end
58                 else   begin                //减计数
59                     data_r <= data_r -1 ;  
60                     c = 0 ;
61                 end             
62             end    
63     end    
64 /*****************************数码管*********************************/    
65 assign seven_seg ={1'b1,~Y_r};
66 reg [6:0] Y_r;
67 
68 
69     always @(data_r  )
70     begin
71         Y_r = 7'b1111111;
72         case (data_r )
73                 4'b0000: Y_r = 7'b0111111; // 0
74                 4'b0001: Y_r = 7'b0000110; // 1
75                 4'b0010: Y_r = 7'b1011011; // 2
76                 4'b0011: Y_r = 7'b1001111; // 3
77                 4'b0100: Y_r = 7'b1100110; // 4
78                 4'b0101: Y_r = 7'b1101101; // 5
79                 4'b0110: Y_r = 7'b1111101; // 6
80                 4'b0111: Y_r = 7'b0000111; // 7
81                 4'b1000: Y_r = 7'b1111111; // 8
82                 4'b1001: Y_r = 7'b1101111; // 9
83                 4'b1010: Y_r = 7'b1110111; // A
84                 4'b1011: Y_r = 7'b1111100; // b
85                 4'b1100: Y_r = 7'b0111001; // c
86                 4'b1101: Y_r = 7'b1011110; // d
87                 4'b1110: Y_r = 7'b1111001; // E
88                 4'b1111: Y_r = 7'b1110001; // F
89                 default: Y_r = 7'b0000000;
90             endcase
91     end            
92 endmodule
复制代码
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值