FPGA学习笔记——分频电路设计
FPGA學習筆記——分頻電路設計
發布時間:2015-10-3023:29:52
??? 分頻就是用一個時鐘信號通過一定的電路結構變成不同頻率的時鐘信號,這里介紹一下整數分頻電路的設計方法。整數分頻電路有偶數分頻和奇數分頻兩種,我們以實現占空比為50%的分頻電路為例子來解釋一下分頻電路設計的基本原理。假設時鐘周期為T,則二分頻后輸出的時鐘周期為2T,三分頻后輸出的時鐘周期為3T,N分頻后輸出的時鐘周期為NT,這是設計分析的基本思路。
1.偶數分頻實現
二分頻電路設計
二分頻電路的實現是最為簡單的,只需要用一個D觸發器便能實現,因為D觸發的輸出值每隔一個輸入時鐘周期T才更新一次值,所以我們只要每次D觸發器寄存值的時候把它的輸出值取反就可以了,這樣它的高電平持續時間為T,低電平持續時間也為T,則為二分頻。具體的代碼如下所示。
module clkdiv(clk,rst_n,clk_2);
input clk,rst_n;
output clk_2;
reg q;
?
always @(posedge clk or negedge rst_n)
if(!rst_n)
q<=1'b0;
else
q<=~q;
?
assign clk_2=q;
endmodule
這個設計非常簡單,不作過多解釋。
?
?
?
六分頻電路設計
按照設計的思路,六分頻總的時鐘周期應該為6T,高電平持續時間為3T,低電平持續時間為3T,我們只需要用一個0-5的計數器,計數從0到5一直循環,當計數器為0,1,2時,輸出高電平,計數器為3,4,5時,輸出低電平。
?
具體代碼實現如下
module clkdiv6(clk,rst_n,clk_2);
input clk,rst_n;
output clk_2;
reg [2:0] q; //因為用到0-5的計數器,一共要3位D觸發器
reg clk_2;
always @(posedge clk or negedge rst_n)
? if(!rst_n)
q<=3'd0;
else if(q==3'd5)
q<=3'd0;
else
q<=q+1'b1;
?
always @(posedge clk or negedge rst_n)
if(!rst_n)
clk_2<=1'b0;
else if(q<3'd3)
clk_2<=1'b1;
else
clk_2<=1'b0;
endmodule
?
?
經過仿真,符合六分頻的設計思路,占空比也為50%,3T的時間為高電平,3T的時間為低電平。
?
?
?
2N分頻電路設計思路
偶數分頻電路的基本實現思路就是利用計數器,利用0-(2N-1)的計數器,當計數器計數在0-(N-1)的時候輸出高電平,其余時間輸出低電平就可以完成占空比50%的2N分頻電路了
?
?
?
?
?
2.奇數分頻實現
三分頻電路實現
三分頻的電路如果按照偶數分頻的思想來設計就會遇到一個難題,因為是奇數,不能做到計數器計數到一半的時候輸出取反,也就是說按照偶數分頻的思路做不到占空比50%,在這里要換一個思路來設計。我們仍然分析一下三分頻電路的特點,三分頻電路的周期為3T,高電平持續時間為1.5T,低電平持續時間也為1.5T。假設用上面的思路,用1個計數器來分頻,則也可以得到三分頻,但是占空比為66.7%,即高電平持續時間為2T,低電平持續時間為1T。以下為占空比50%的三分頻電路實現,用2個三進制計數器,第1個為時鐘上升沿觸發,第2個為時鐘下降沿觸發。對第1個計數器而言,小于2取高電平則,0-2T為高電平,2T-3T為低電平,對第2個計數器而言,小于2取高電平,則0.5T-2.5T為高電平,2.5T-3.5T為低電平,實質上第2個的波形延時了0.5T,他們公共的取高電平的時間為0.5T-2T,剛好是1.5T,正式三分頻占空比為50%高電平所持續的時間。下面為具體代碼實現。
?
module clkdiv3(clk,rst_n,clk_2);
input clk,rst_n;
output clk_2;
reg [1:0]count1;//上升沿觸發的3進制計數器1
reg [1:0]count2;//下降沿觸發的3進制計數器2
reg clk_p,clk_n;
always @(posedge clk or negedge rst_n)//上升沿觸發的3進制計數器1
if(!rst_n)
count1<=2'd0;
else if(count1==2'd2)
count1<=1'b0;
else
count1<=count1+1'b1;
always?@(posedge clk or negedge rst_n)
if(!rst_n)
clk_p<=1'b0;
else if(count1<2'd2)
clk_p<=1'b1;
else
clk_p<=1'b0;
always @(negedge clk or negedge rst_n)//下降沿觸發的3進制計數器2
if(!rst_n)
count2<=2'd0;
else if(count2==2'd2)
count2<=2'd0;
else
count2<=count2+1'b1;
always @(negedge clk or negedge rst_n)
if(!rst_n)
clk_n<=1'b0;
else if (count2<2'd2)
clk_n<=1'b1;
else
clk_n<=1'b0;
assign clk_2=clk_p&clk_n;
endmodule
?
仿真的波形圖如下
?
?
可見,實現了三分頻占空比為50%的功能,但是仍然有不足的地方就是相位不是和原始時鐘同相,延遲了0.5T。
?
?
?
?
五分頻電路設計
按照三分頻的分頻思路,五分頻的代碼如下
module clkdiv5(clk,rst_n,clk_2);
input clk,rst_n;
output clk_2;
reg [2:0]count1;//上升沿觸發的5進制計數器1
reg [2:0]count2;//下降沿觸發的5進制計數器2
reg clk_p,clk_n;
always @(posedge clk or negedge rst_n)//上升沿觸發的5進制計數器1
if(!rst_n)
count1<=3'd0;
else if(count1==3'd4)
count1<=1'b0;
else
count1<=count1+1'b1;
always?@(posedge clk or negedge rst_n)
if(!rst_n)
clk_p<=1'b0;
else if(count1<5'd4)
clk_p<=1'b1;
else
clk_p<=1'b0;
always @(negedge clk or negedge rst_n)//下降沿觸發的5進制計數器2
if(!rst_n)
count2<=3'd0;
else if(count2==3'd4)
count2<=3'd0;
else
count2<=count2+1'b1;
always @(negedge clk or negedge rst_n)
if(!rst_n)
clk_n<=1'b0;
else if (count2<3'd4)
clk_n<=1'b1;
else
clk_n<=1'b0;
assign clk_2=clk_p&clk_n;
endmodule
?
?
?
設計的思路和三分頻一樣,只是把計數器的進制改動了,并且把翻轉時的判斷邏輯改動了。
?
?
總結
按照以上偶數分頻和奇數分頻的方法,可以設計任意的N分頻電路,以獲得占空比為50%的時鐘,不足之處是奇數分頻不能獲得與時鐘同相的波形。
總結
以上是生活随笔為你收集整理的FPGA学习笔记——分频电路设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仅展示成果:基于ROS的自动驾驶系统搭建
- 下一篇: 我对APPCAN的初步理解