理论学习:
计数是一种最基本的运算,计数器就是实现着这种运算的逻辑电路。在数字系统中,计数器主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能。
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 )beginif( sys_rst_n == 1'b0 )begincnt <= 32'd0 ;endelse if( cnt == CNT_MAX )begincnt <= 32'd0 ;endelsebegincnt <= cnt + 1'b1 ;endendalways@(posedge sys_clk or negedge sys_rst_n)beginif( sys_rst_n == 1'b0 )beginled_out <= 1'b0 ;endelse if( cnt == CNT_MAX )beginled_out <= ~led_out ;endendendmodule
实现带标志信号的计数器
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 )beginif( sys_rst_n == 1'b0 )begin cnt <= 32'd0 ;endelse if( cnt == CNT_MAX )begincnt <= 32'd0 ;endelsebegincnt <= cnt + 1'b1 ;endendalways@(posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )begincnt_flag <= 1'b0 ;endelse if( cnt == CNT_MAX - 1'b1 )begincnt_flag <= 1'b1endelsebegincnt_flag <= 1'b0 ;endendalways@( posedge sys_clk or negedge sys_rst_n )begin]if( sys_rst_n == 1'b0 )beginled_out <= 1'b0 ;endelse if( cnt_flag == 1'b1 )beginled_out <= ~led_out ;endendendmodule
对比发现,第一种方法用了两个always,第二种方式用了三个always,发现第一种方法产生了两组寄存器,第二种产生了三组寄存器。