資源描述:
《分頻的verilog語言實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。
1、分頻的Verilog實現(xiàn)1.分頻:在實際應用中,自己設計的開發(fā)板上不會去裝多個晶振來產(chǎn)生不同頻率的時鐘信號,這就要我們在已有的基礎上自己來創(chuàng)造設計電路中所需要的時鐘信號來,有時候所需要的頻率并不是在已有的頻率上直接進行簡單的整數(shù)分頻就可以得到的,有時需要進行小數(shù)的分頻。2.在分頻的過程中,偶數(shù)分頻并不困難,若要進行2N次分頻的話,只需要計數(shù)到N的時候,波形進行翻轉就行了,或者在最后一級加一個2分頻也可以實現(xiàn)。下面是我寫的一個偶數(shù)分頻的代碼:modulediv2n(rst,clk,cnt,clk_2n);//偶數(shù)次分頻inputrst,clk;outpu
2、tclk_2n,cnt;reg[3:0]cnt;//剛開始沒有定義計數(shù)的位寬仿真的時候老是出現(xiàn)輸出為0的現(xiàn)象,看似很簡單的程序搞的有些糾結啊regclk_2n;always@(posedgeclk)beginif(rst)//若復位信號為高電平則計數(shù)清零和輸出清零begincnt<=0;clk_2n<=0;endelseif(cnt==3)//進行8分頻,這里的cnt取不同的值進行其他的分頻,若計數(shù)到達4時從0開始的輸出電平翻轉beginclk_2n<=~clk_2n;cnt<=0;endelsecnt<=cnt+1;endendmodule功能仿真波
3、形以及后仿真波形如下:從后仿真中可以明顯的看出輸出時鐘信號和輸入的標準信號有延遲時間,在計數(shù)寄存器中出現(xiàn)了相鄰兩個數(shù)之間的競爭,但是沒有出現(xiàn)在時鐘的上升沿,不會引起最后實現(xiàn)的錯誤!奇數(shù)分頻:若奇數(shù)分頻中不考慮占空比的話,分頻代碼可以按照偶數(shù)分頻的思路來寫,但是大多數(shù)情況下需要考慮的是使占空比設計為50%。若要進行奇數(shù)次的分頻而且要求占空比為50%可以采用:用兩個計數(shù)器,一個由輸入時鐘下降沿觸發(fā),一個由輸入時鐘的上升沿觸發(fā),最后將兩個計數(shù)器的輸出進行相或,就可得到。程序代碼:modulediv7(rst,clk,cout1,cout2,cout);inp
4、utclk,rst;outputcout1,cout2,cout;reg[2:0]m,n;//定義兩個中間的計數(shù)變量wirecout;regcout1,cout2;assigncout=cout1
5、cout2;//將上升沿和下降沿的輸出相或得到占空比為50%的波形always@(posedgeclk)//上升沿觸發(fā)beginif(rst)begincout1<=0;m<=0;end//當rst為1時復位elseif(!rst)beginif(m==6)beginm<=0;end//計數(shù)到達7時計數(shù)復位elsem<=m+1;//其他情況計數(shù)器正常計數(shù)if
6、(m==2)cout1=~cout1;//計數(shù)到達3時翻轉elseif(m==5)cout1=~cout1;//計數(shù)器達到6時再翻轉endendalways@(negedgeclk)//下降沿觸發(fā),情況同上beginif(rst)begincout2<=0;n<=0;endelseif(!rst)beginif(n==6)beginn<=0;endelsen<=n+1;if(n==2)cout2=~cout2;elseif(n==5)cout2=~cout2;endendendmodule最后仿真波形:時序仿真波形為:半整數(shù)分頻:半整數(shù)分頻N.5的分頻
7、。設計的思想是:比如說要實現(xiàn)2.5分頻可以先設計一個模3計數(shù)器,再設計一個脈沖扣除電路,加在模3計數(shù)器之后,每來3個脈沖就扣除半個脈沖,即可實現(xiàn)分頻系數(shù)為2.5的半整數(shù)分頻,采用類似的方法,可以實現(xiàn)任意半整數(shù)分配器。脈沖扣除是輸入頻率與2分頻輸出異或的結果。大致的思路可用下圖來分析:clk1=1模N計數(shù)器2分頻clk2clkoutclkin5.5分頻代碼為modulexfp(clkin,clr,clkout);inputclkin,clr;outputclkout;regclkout,clk1;wireclk2;integercount;xorxor1
8、(clk2,clkin,clk1);//將輸出2分頻時鐘與clk2/6分頻時鐘相異或得到5.5分頻always@(posedgeclkoutornegedgeclr)//輸出時鐘2分頻beginif(~clr)beginclk1<=1'b0;endelseclk1<=~clk1;endalways@(posedgeclk2ornegedgeclr)//將時鐘clk26分頻beginif(~clr)begincount<=0;clkout<=1'b0;endelseif(count==5)//改變count的值可實現(xiàn)不同模的分頻begincount<=0
9、;clkout<=1'b1;endelsebegincount<=count+1;clkout