FPGA分頻相信是FPGA中使用比較頻繁、比較基礎的一項技術。下面講具體來講解FPGA的時鐘分頻。
概念:
FPGA時鐘分頻即對FPGA的系統時鐘根據自己所需進行頻率處理,使之達到原來的1/N倍頻率。根據N的值,通常可分為偶數分頻和奇數分頻。
偶分頻:
偶分頻即N為偶數的對系統時鐘分頻。該設計主要通過一個計數器來實現。設計原理為:以系統參考時鐘為觸發條件做一個加計數器,當計數器值為(n/2 - 1)時,輸出時鐘發生跳轉。如要實現一個4分頻程序如下:
module div_4(clk,clr_n,clk_o);
input clk;
input clr_n;
output clk_o;
reg [1:0] cnt_div;
reg clk_o_1;
always @ (posedge clk or negedge clr_n)
begin
if( !clr_n)
cnt_div <= 0;
else if(cnt_div == 2'b01)
cnt_div <= 0;
else
cnt_div <= cnt_div+1;
end
always @ (posedge clk or negedge clr_n)
begin
if(!clr_n)
clk_o_1<=0;
else if (cnt_div == 2'b01)
clk_o_1 <= ~clk_o_1;
end
assign clk_o=clk_o_1;
endmodule
奇分頻:
奇數倍分頻方法即當N為奇數時的系統時鐘分頻。其原理為:設置兩個相同的最大值為(n-1)的計數器,其中一個以系統時鐘上升沿為觸發條件,另一個以系統時鐘下降沿為觸發條件;輸出時鐘在計數器值為(n-1)/2和(n-1)時分別進行翻轉,得到兩個占空比非50%的時鐘,最後把兩個輸出時鐘進行相或運算,即可得到一個占空比為50%的奇數分頻時鐘。如要實現一個5分頻時鐘的參考代碼如下:
module div_5(clk,clr_n,clk_o);
input clk;
input clr_n;
output clk_o;
reg [2:0] cnt_div1;
reg [2:0] cnt_div2;
reg clk_o_1;
reg clk_o_2;
always @ (posedge clk or negedge clr_n)
begin
if( !clr_n)
cnt_div1 <= 0;
else if(cnt_div1 == 3'b100)
cnt_div1 <= 0;
else
cnt_div1 <= cnt_div1+1;
end
always@ (posedge clk or negedge clr_n)
begin
if(!clr_n)
clk_o_1<=0;
else if (cnt_div 1== 3'b010)
clk_o_1 <= ~clk_o_1;
else if(cnt_div1 ==3'b100)
clk_o_1 <= ~clk_o_1;
end
always @ (negedge clk or negedge clr_n)
begin
if( !clr_n)
cnt_div2 <= 0;
else if(cnt_div2 == 3'b100)
cnt_div2 <= 0;
else
cnt_div2 <= cnt_div2+1;
end
always @ (posedge clk or negedge clr_n)
begin
if(!clr_n)
clk_o_2<=0;
else if (cnt_div2== 3'b010)
clk_o_2 <= ~clk_o_2;
else if(cnt_div2 ==3'b100)
clk_o_2 <= ~clk_o_2;
end
assign clk_o=clk_o_1 | clk_o_2;
endmodule
OK,大功告成!還有一些帶小數位的分頻待後面繼續補充