基于FPGA的任意分頻器設計
1、前言
本文引用地址:http://www.j9360.com/article/261789.htm分頻器是FPGA設計中使用頻率非常高的基本單元之一。盡管目前在大部分設計中還廣泛使用集成鎖相環(如Altera的PLL,Xilinx的DLL)來進行時鐘的分頻、倍頻以及相移設計,但是,對于時鐘要求不太嚴格的設計,通過自主設計進行時鐘分頻的實現方法仍然非常流行。首先這種方法可以節省鎖相環資源,再者這種方式只消耗不多的邏輯單元就可以達到對時鐘的操作目的。
2、整數倍分頻器的設計
2.1 偶數倍分頻
偶數倍分頻器的實現非常簡單,只需要一個計數器進行計數就能實現。如需要N分頻器(N為偶數),就可以由待分頻的時鐘觸發計數器進行計數,當計數器從0計數到N/2-1時,將輸出時鐘進行翻轉,并給計數器一個復位信號,以使下一個時鐘開始從零計數。以此循環,就可以實現偶數倍分頻。以10分頻為例,相應的verilog代碼如下:
regclk_div10;
reg [2:0]cnt;
always@(posedge clk or posedge rst) begin
if(rst)begin //復位
cnt<=0;
clk_div10<=0;
end
elseif(cnt==4) begin
cnt<=0; //清零
clk_div10<=~clk_div10; //時鐘翻轉
end
else
cnt<=cnt+1;
end
2.2 奇數倍分頻
奇數倍分頻因占空比不同,主要有以下兩種方法。對于非50%占空比的分頻,與偶數倍分頻類似,只需要一個計數器就能實現特定占空比的時鐘分頻。如需要1/11占空比的十一分頻時鐘,可以在計數值為9和10時均進行時鐘翻轉,該方法也是產生抽樣脈沖的有效方法。相應的verilog代碼如下:
always @(posedge clk or posedge rst) begin
if(rst)begin //復位
cnt<=0;
clk_div11<=0;
end
elseif(cnt==9) begin
clk_div11<=~clk_div11; //時鐘翻轉
cnt<=cnt+1; //繼續計數
end
elseif(cnt==10) begin
clk_div11<=~clk_div11; //時鐘翻轉
cnt<=0; //計數清零
end
else
cnt<=cnt+1;
end
對于50%奇數分頻器的設計,用到的思維是錯位半個時鐘并相或運算。具體實現步驟如下:分別利用待分頻時鐘的上升沿與下降沿進行((N-1)/2)/N分頻,最后將這兩個時鐘進行或運算即可。以三分頻為例,相應的電路原理圖和時序仿真圖如圖1和圖2所示,相應代碼如下:
reg clk1;
reg[1:0]cnt1;
always@(posedge clk or posedge rst) begin
if(rst)begin //復位
cnt1<=0;
clk1<=0;
end
elseif(cnt1==1) begin
clk1<=~clk1; //時鐘翻轉
cnt1<=cnt1+1; //繼續計數
end
elseif(cnt1==2) begin
clk1<=~clk1; //時鐘翻轉
cnt1<=0; //計數清零
end
else
cnt1<=cnt1+1;
end
reg clk2;
reg[1:0]cnt2;
always@(negedge clk or posedge rst) begin
if(rst)begin //復位
cnt2<=0;
clk2<=0;
end
elseif(cnt2==1) begin
clk2<=~clk2; //時鐘翻轉
cnt2<=cnt2+1; //繼續計數
end
elseif(cnt2==2) begin
clk2<=~clk2; //時鐘翻轉
cnt2<=0; //計數清零
end
else
cnt2<=cnt2+1;
end
assignclk_div3=clk1 | clk2; //或運算

圖1 50%占空比的三分頻電路原理圖

圖2 50%占空比的三分頻時序仿真圖
fpga相關文章:fpga是什么
分頻器相關文章:分頻器原理 塵埃粒子計數器相關文章:塵埃粒子計數器原理 鎖相環相關文章:鎖相環原理 全息投影相關文章:全息投影原理
評論