近日根據RF系統,本着節約FPGA內部邏輯資源以及引腳優化的角度,根據計數器的特征,記錄個人的一些偶得。
1. 時鍾分頻
在項目中經常會遇到需要時鍾分頻,除了使用PLL或DLL;有時所需的分頻時鍾較多,不適宜采用過多的PLL或DLL,此時采用計數器即為較好的解決方案。
下面以50 MHz的時鍾分頻產生1KHz的脈沖以及1Hz的時鍾信號為例來進行闡述。為避免產生時鍾偏移(skew),在設計時鍾分頻時,須使用主時鍾作為節拍。
//////////////////////////////////////////////////////////
/***************** 50000 = 500*100 **********************/
always @(posedge clk_50M) begin
if(!rst_n||cnt100 == 7'd100) cnt100 <= 7'd0;
else cnt100 <= cnt100 + 7'd1;
end
always @(posedge clk_50M) begin
if(!rst_n||cnt500 == 10'd500) cnt500 <= 10'd0;
else if(cnt100 == 7'd100) cnt500 <= cnt500 + 10'd1;
else cnt500 <= cnt500;
end
always @(posedge clk_50M) begin
if(cnt500 == 10'd500) clk_1K <= 1;
else clk_1K <= 0;
end
//////////////////////////////////////////////////////////
/************* 50000000 = 500*100*1000 ******************/
always @(posedge clk_50M) begin
if(!rst_n||cnt1K == 10'd499) cnt1K <= 10'd0;
else if(clk_1K) cnt1K <= cnt1K + 10'd1;
else cnt1K <= cnt1K;
end
always @(posedge clk_50M) begin
if(!rst_n) clk_1Hz <= 0;
else if(cnt1K == 10'd249 && clk_1K) clk_1Hz <= ~ clk_1Hz;
else clk_1Hz <= clk_1Hz;
end
2. 數據通路選擇
在某些系統設計中,經常需要選擇數據通路,並確定該數據通路數據的有效性。以下以4位計數器為例簡要介紹。
reg [3:0] cnt;
// 0000 0001 0010 0011 0100 0101 0110 0111 ……
always @(posedge clk) begin
if(!rst_n) cnt <= 4’d1;
else cnt <= cnt + 4’d1;
end
2.1 數據通路模型
如圖1所示,為4通道數據通路模型。 圖1 數據通路模型
2.2 數據通路有效
2.2.1 數據通路歷經2個時鍾有效
assign datadv = cnt[0];
assign datapath = cnt[2:1];
仿真如圖2所示。
圖2 數據通路歷經2個時鍾周期仿真圖
2.2.2 數據通路歷經4個時鍾有效
assign datadv = cnt[1]&cnt[0];
assign datapath = cnt[3:2];
仿真如圖3所示。
圖3 數據通路歷經4個時鍾周期仿真圖