理论学习:
计数是一种最基本的运算,计数器就是实现着这种运算的逻辑电路。在数字系统中,计数器主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能。
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,发现第一种方法产生了两组寄存器,第二种产生了三组寄存器。