Verilog之计数器资源优化

采用Verilog编写计数器延时或定时时,会消耗FPGA的片内资源,同时也进而对综合出来的逻辑电路的路径延时产生影响。为此本文探讨以下两种情况对FPGA片内资源的消耗,以及路径延时对系统最大工作频率的影响。其一,计数器实现语句位于同一个always逻辑块中;其二,计数器实现语句采用单独的always逻辑块,与程序其他逻辑块相互独立。

(1)计数器实现语句与程序其他逻辑位于同一个always逻辑块

上述代码如下所示,系统最大工作频率约为256.6MHz,消耗61个LUT,22个寄存器。
//-------------------------------------------------
Clear: begin
if( (!en)&& (cnt1==cnt_ms) ) begin
cnt1 <= 0;
dout <= 0;
state <= Idle;
end
else begin
cnt1 <= cnt1 + 1;
state <= Clear;
end
end
//-------------------------------------------------


(2)计数器实现语句与程序其他逻辑位于两个独立的always逻辑块

上述代码如下所示,系统最大工作频率约为277.5MHz,消耗38个LUT,23个寄存器。多用的一个寄存器为DelayOver变量。

//-------------------------------------------------
Clear: begin
if( (!en)&& DelayOver ) begin
dout <= 0;
state <= Idle;
end
else begin
state <= Clear;
end
end

default: state <= Idle;
endcase
end

always@(posedge clk)
if(rst) begin
cnt1 <= 0;
DelayOver <= 0;
end
else begin
if(cnt1==cnt_ms) begin
cnt1 <= 0;
DelayOver <= 1;
end
else begin
cnt1 <= cnt1 + 1;
DelayOver <= 0;
end
end
//-------------------------------------------------


结论

对比两种情况可知,尤其对于位宽较大的计数器可以进行优化,由独立的always块进行实现,同时可以将一个计数器拆分为两级计数实现,这样可以减小计数器的位宽。

文章来源:CAOXUN_FPGA的博客