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

相关推荐
吉他英雄一里14 小时前
FPGA--RAM
fpga开发
szxinmai主板定制专家15 小时前
储能 EMS、微网控制器选型:RK3588、RK3576、RK3568+FPGA 怎么选?多网、多 CAN、EMC 设计权衡
人工智能·深度学习·机器学习·fpga开发·工业网关·rk3576·电力网关
XMAIPC_Robot16 小时前
ARM+FPGA+AI船舶/工业自动化控制器EMC测试等级解析(IEC60533/IEC60945)
arm开发·人工智能·fpga开发·zynq·arm+fpga·rk3588+fpga
ALINX技术博客17 小时前
ALINX 亮相 2026 工博会,聚焦 FPGA 行业应用场景
ai·fpga开发·射频工程
星夜离尘561 天前
FPGA 复位回归实验:双时钟停钟、释放中重入与消费端首拍自检
fpga开发
szxinmai主板定制专家1 天前
ZYNQ 数据采集方案踩坑总结:电力强电磁干扰、工业现场多协议适配优化
运维·人工智能·fpga开发·机器人·zynq
幻智星科技1 天前
一个开源的纯FPGA网口采集卡
网络协议·fpga开发·udp
bobuddy1 天前
硬件加速三件套:emulator-FPGA 原型-云仿真
fpga开发
szxinmai主板定制专家1 天前
软硬协同!ZYNQ 高速多通道同步采集,变电站 / 工厂设备状态监测方案详解
人工智能·深度学习·机器学习·fpga开发·zynq·rk3576
FPGA小徐1 天前
FPGA 8阶LFSR加扰/解扰器设计
fpga开发