• 【连载】 FPGA Verilog HDL 系列实例十进制加减法计数器


    【连载】 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
  • 相关阅读:
    自学python day 10 函数的动态参数、命名空间、作用域
    老男孩 python 自学 打印05 dict 复习总结
    老男孩python 自学day09 函数开始
    今天
    day 03
    eclipse如何安装配置tomcat
    windows上配置maven环境
    如何创建ssh key使电脑和Github关联在一起
    怎么将本地文件上传到github
    使用git工具上传代码到github
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2151868.html
Copyright © 2020-2023  润新知