计数器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,发现第一种方法产生了两组寄存器,第二种产生了三组寄存器。

相关推荐
江苏学蠡信息科技有限公司7 小时前
STM32中硬件I2C的时钟占空比
stm32·单片机·fpga开发
OliverH-yishuihan7 小时前
FPGA 入门 3 个月学习计划表
学习·fpga开发
FPGA狂飙10 小时前
传统FPGA开发流程的9大步骤是哪些?
fpga开发·verilog·fpga·vivado·xilinx
我爱C编程11 小时前
【硬件片内测试】基于FPGA的完整DQPSK链路测试,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·帧同步·viterbi译码·dqpsk·频偏锁定·定时点
szxinmai主板定制专家13 小时前
【NI测试方案】基于ARM+FPGA的整车仿真与电池标定
arm开发·人工智能·yolo·fpga开发
爱吃汽的小橘1 天前
基于ads1256的ADC控制实现
fpga开发
易享电子2 天前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
cycf2 天前
系统同步接口输入延迟(五)
fpga开发
cmc10282 天前
131.如何区分FPGA芯片型号是-2l还是-2方法
fpga开发
sz66cm2 天前
FPGA基础 -- 无毛刺时钟切换(glitch-free clock switching)
fpga开发