FPGA设计中的所有有关时间的内容都要通过计数器来实现,计时的本质是对时钟周期计数,以时钟周期为基准,通过计数多少个时钟周期来确定时间。
计数器设计规则:
规则1:三要素——初值、加1条件、结束值。
规则2:计数器初值为0。
规则3:使用计数器的结束值时,要满足加1条件。
规则4:结束条件必须同时满足加1条件,结束值是x-1的形式。
规则5:当取某个数时,assign形式必须为:(加1条件)&&(cnt==计数值-1)。
规则6:结束后回到0。
规则7:若需要限定范围,使用“>=” 、 “<”两种符号。
规则8:设计步骤——先写计数器的always段,条件用名字代替;然后用assign写出加1条件;最后用assign写出结束条件。
规则9:命名要符合规范。
计数器设计实例:实现1ms与10ms计数
module temp( clk , rst_n );
input clk; //50MHz时钟信号
input rst_n; //复位信号
//----------------------------------------------------
reg [15:0] cnt_1ms; //1ms计数寄存器 16位最高计数65536
wire add_cnt_1ms; //加1条件
wire end_cnt_1ms; //计数器结束条件
always @( posedge clk or negedge rst_n ) begin
if( !rst_n )
cnt_1ms <= 16'd0; //计数器初值
if( add_cnt_1ms ) begin //满足加1条件
if( end_cnt_1ms )
cnt_1ms <= 16'd0;
else
cnt_1ms <= cnt_1ms + 1'b1;
end
end
assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && ( cnt_1ms == 50000-1 ) //计数值50000
//-----------------
reg [3:0] cnt_10ms; //10ms计数寄存器
wire add_cnt_10ms; //加1条件
wire end_cnt_10ms; //计数器结束条件
always @( posedge clk or negedge rst_n ) begin
if( !rst_n )
cnt_10ms <= 4'd0;
else if( add_cnt_10ms ) begin
if( end_cnt_10ms )
cnt_10ms <= 4'd0;
else
cnt_10ms <= cnt_10ms + 1'b1;
end
end
assign add_cnt_10ms = end_cnt_1ms; //1ms计满10ms计数
assign end_cnt_10ms = add_cnt_10ms && ( cnt_10ms == 10-1 ); //10ms计满end_cnt_10ms置1
//----------------------------------------------------
endmodule