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

来源:互联网 发布:维普软件 编辑:程序博客网 时间:2024/04/29 00:30

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 ) begin22             if ( cnt >= 32'd3000000 ) 23             b <= 1 ;24             else 25             cnt <= cnt + 1'b1 ;26             27             end28             else begin b <= 1'b0 ;29                 cnt <= 0 ;30             end31         end32     end33 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             end46         else if ( up_down ==0 & data_r == 0) 47             48             begin 49                 c = 1;50                 data_r <= 9;51             end52         else53             begin 54                 if (  up_down ==1)    begin     //加计数55                     data_r <= data_r +1;  56                     c = 0 ;                 57                     end58                 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     begin71         Y_r = 7'b1111111;72         case (data_r )73                 4'b0000: Y_r = 7'b0111111; // 074                 4'b0001: Y_r = 7'b0000110; // 175                 4'b0010: Y_r = 7'b1011011; // 276                 4'b0011: Y_r = 7'b1001111; // 377                 4'b0100: Y_r = 7'b1100110; // 478                 4'b0101: Y_r = 7'b1101101; // 579                 4'b0110: Y_r = 7'b1111101; // 680                 4'b0111: Y_r = 7'b0000111; // 781                 4'b1000: Y_r = 7'b1111111; // 882                 4'b1001: Y_r = 7'b1101111; // 983                 4'b1010: Y_r = 7'b1110111; // A84                 4'b1011: Y_r = 7'b1111100; // b85                 4'b1100: Y_r = 7'b0111001; // c86                 4'b1101: Y_r = 7'b1011110; // d87                 4'b1110: Y_r = 7'b1111001; // E88                 4'b1111: Y_r = 7'b1110001; // F89                 default: Y_r = 7'b0000000;90             endcase91     end            92 endmodule
复制代码
原创粉丝点击