FPGA中高时钟频率计数器设计
题目描述:在一个高速项目中,我的时钟当时达到了400MHz,在此极高时钟速率下,计时/计数counter-计数器逻辑在综合布局布线时也出现了时序问题,即使是换了加法操作为IP核资源也没有解决问题。那么,程序应该怎样设计才能解决?
设想
既然时钟问题导致的时序不收敛,那么首先应该考虑能否降低频率,但是又不能改变原始的计数结果。故可以利用流水线的设计思想,用2路cnt计数器来实现计时功能。
解决方案:
具体设计代码如下:
module cnt_ctrl (
input clk,
input rst_n,
output [7:0] cnt
);
reg clk_2div,clk_2divd;
reg [7:0] cnt1,cnt2;
always @(posedge clk,negedge rst_n)
if(!rst_n)
clk_2div <= 1'b0;
else
clk_2div <= ~clk_2div;
always @(posedge clk,negedge rst_n)
if(!rst_n)
clk_2divd <= 1'b1;
else
clk_2divd <= ~clk_2divd;
always @(posedge clk_2div,negedge rst_n)
if(!rst_n)
cnt1 <= 8'd0;
else if(cnt1 == 8'hff)
cnt1 <= 8'd0;
else
cnt1 <= cnt1 + 1'b1;
always @(posedge clk_2div,negedge rst_n)
if(!rst_n)
cnt2 <= 8'd0;
else if(cnt2 == 8'hff)
cnt2 <= 8'd0;
else
cnt2 <= cnt2 + 1'b1;
endmodule
原因分析:
如图:cnt计数器被分成两路cnt1、cnt2,它们的累加时钟分别对应clk_2div、clk_2divd,其频率为clk时钟的一半,且clk_2divd延迟于clk_2div一个clk周期。这样就可以利用clk来判断cnt1和cnt2的值来确定cnt计到哪个位置,累加部分的频率就降低了一半。