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

相关推荐
ZYNQRFSOC2 小时前
基于XCKU5P纯逻辑 NVME测试
fpga开发
FPGA小迷弟7 小时前
使用FPGA开发高速AD/DA芯片的接口学习
fpga开发
stars-he8 小时前
FPGA学习笔记(6)逻辑设计小结与以太网发送前置
笔记·学习·fpga开发
燎原星火*8 小时前
FPGA 逻辑级数
fpga开发
175063319451 天前
Vivado Zynq7020 生成正弦波(查表法) + 行为级仿真
fpga开发
Terasic友晶科技1 天前
4-DE10-Nano的HDMI方块移动案例——I2C通信协议
fpga开发·i2c·hdmi·de10-nano·i2c通信协议
云雾J视界1 天前
FPGA在AI时代的角色重塑:硬件可重构性与异构计算的完美结合
fpga开发·边缘计算·gpu·vitis·ai推理·azure云·异构编程
s09071362 天前
FPGA中CIC设计注意事项
算法·fpga开发·cic滤波器
Aaron15882 天前
RFSOC+VU13P在无线信道模拟中的技术应用分析
数据结构·人工智能·算法·fpga开发·硬件架构·硬件工程·射频工程
碎碎思2 天前
BerkeleyLab Bedrock:为 FPGA 与加速计算打造的开源基石
fpga开发·开源