计数器code

理论学习:

计数是一种最基本的运算,计数器就是实现着这种运算的逻辑电路。在数字系统中,计数器主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能。

code

实现不带标志信号的计数器

复制代码
module    counter
    #(
        parameter        CNT_MAX    =    32'd24_999_999
    )

(
    input    wire    sys_clk          ,
    input    wire    sys_rst_n        ,

    output   reg    led_out    
);


    reg    [31:0]    cnt    ;


    always@(posedge sys_clk or negedge sys_rst_n    )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt    <=    32'd0    ;
        end
        else if( cnt == CNT_MAX )
        begin
            cnt    <=    32'd0    ;
        end
        else
        begin
            cnt    <=    cnt    + 1'b1    ;
        end
    end

    always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if( sys_rst_n    ==    1'b0 )
        begin
            led_out    <=    1'b0    ;
        end
        else if( cnt == CNT_MAX )
        begin
            led_out    <=    ~led_out    ;
        end
    end


endmodule

实现带标志信号的计数器

复制代码
module    counter
    #(
        parameter    CNT_MAX    =    32'd24_999_999
    )

(
    input    wire    sys_clk      ,
    input    wire    sys_rst_n    ,

    output   reg     led_out

);

    reg    [31:0]    cnt         ;
    reg              cnt_flag    ;
    
    always@(posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin   
            cnt    <=    32'd0    ;
        end
        else if( cnt == CNT_MAX )
        begin
            cnt    <=    32'd0    ;
        end
        else
        begin
            cnt    <=    cnt    + 1'b1    ;
        end
    end

    always@(posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt_flag    <=    1'b0    ;
        end
        else if( cnt == CNT_MAX - 1'b1 )
        begin
            cnt_flag    <=    1'b1
        end
        else
        begin
            cnt_flag    <=    1'b0    ;
        end
    end

    always@( posedge sys_clk or negedge sys_rst_n )
    begin]
        if( sys_rst_n == 1'b0 )
        begin
            led_out    <=    1'b0    ;
        end
        else if( cnt_flag == 1'b1 )
        begin
            led_out    <=    ~led_out    ;
        end
    end



endmodule

对比发现,第一种方法用了两个always,第二种方式用了三个always,发现第一种方法产生了两组寄存器,第二种产生了三组寄存器。

相关推荐
第二层皮-合肥13 小时前
高速采集卡FPGA设计方案及代码
fpga开发
Runner.DUT15 小时前
详解赛灵思SRIO IP并提供一种FIFO封装SRIO的收发控制器仿真验证
fpga开发
嵌入式-老费16 小时前
再谈fpga开发(fpga调试方法)
fpga开发
XINVRY-FPGA19 小时前
XCZU4EV-1FBVB900E Xilinx FPGA AMD Zynq UltraScale+ MPSoC EV(Embedded Vision)
arm开发·嵌入式硬件·计算机视觉·fpga开发·硬件架构·硬件工程·fpga
从今天开始学习Verilog20 小时前
FFT算法实现之fft IP核
算法·fpga开发
Turing_kun1 天前
基于FPGA的SPI控制FLASH读写
fpga开发
hahaha60161 天前
差模干扰 & 共模干扰
fpga开发
璞致电子2 天前
【PZ-KU060-KFB】——Kintex UltraScale 纯 FPGA 开发平台,释放高速并行计算潜能,高性价比的 FPGA 解决方案
fpga开发·fpga
我爱C编程2 天前
基于FPGA的16QAM软解调+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR
fpga开发·16qam·软解调·帧同步·卷积编码·viterbi译码
南棱笑笑生2 天前
20250726让荣品的PRO-RK3566开发板使用TF卡启动
fpga开发