zoukankan      html  css  js  c++  java
  • 【连载】 FPGA Verilog HDL 系列实例4位二进制加减法计数器

    【连载】 FPGA Verilog HDL 系列实例  

    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
  • 相关阅读:
    关闭ThinkPHP Runtime Log
    Robots协议的写法
    Getif工具获取 交换机的OID/Zabbix设置
    命令方式启动 vmware 虚拟机
    wireshark 抓包使用教程
    Sniffer 交换机端口抓包
    H3C 开启ssh/snmp
    Apache Superset BI
    洛谷5588 小猪佩奇爬树
    luogu5536 核心城市
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2151856.html
Copyright © 2011-2022 走看看