任意分頻的verilog語言實現資料_第1頁
任意分頻的verilog語言實現資料_第2頁
任意分頻的verilog語言實現資料_第3頁
免費預覽已結束,剩余9頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、任意分頻的 verilog 語言實現1偶數倍(2N)分頻使用一模N計數器模塊即可實現,即每當模N計數器上升沿從0開始計數至N-1 時,輸出時鐘進行翻轉, 同時給計數器一復位信號使之從 0 開始重新計數, 以此 循環即可。偶數倍分頻原理示意圖見圖 1。2. 奇數倍(2N+1分頻(1) 占空比為X/(2N+1)或(2N+ 1-X) / (2N+1分頻,用模(2N+ 1)計數器 模塊可以實現。取0至2N-1之間一數值X(0,當計數器時鐘上升沿從0開始計 數到 X 值時輸出時鐘翻轉一次,在計數器繼續計數達到 2N 時,輸出時鐘再次翻 轉并對計數器置一復位信號,使之從 0 開始重新計數,即可實現。(2)

2、 占空比為 50的分頻,設計思想如下:基于( 1)中 占空比為非 50的輸出時鐘在輸入時鐘的上升沿觸發翻轉; 若在同一個輸入時鐘周期內, 此計數器的 兩次輸出時鐘翻轉分別在與( 1 )中對應的下降沿觸發翻轉, 輸出的時鐘與( 1 ) 中輸出的時鐘進行邏輯或,即可得到占空比為50的奇數倍分頻時鐘。當然其輸出端再與偶數倍分頻器串接則可以實現偶數倍分頻。奇數倍分 頻原理示意圖 見圖2。(這也是許多公司常出的面試題,A_A,是不是很簡單?)3. N-0.5 倍分頻采用模N計數器可以實 現。具體如下:計數器從0開始上升沿計數,計數達到 N-1 上升沿時,輸出時鐘需翻轉,由于分頻值為 N-0.5 ,所以在

3、時鐘翻轉后經歷 0.5個周期時,計數 器輸出時鐘必須進行再次翻轉,即當CLK為下降沿時計數器的輸入端應為上升沿脈沖,使計數器計數達到N而復位為0重新開始計數同時 輸出時鐘翻轉。這個過程 所要做的就是對CLK進行適當的變換,使之送給計數 器的觸發時鐘每經歷N-0.5個周期就翻轉一次。N-0.5倍:取N=3,分頻原理示 意圖見圖 3。對于任意的N+ A/B倍分頻(N A B Z,A三B)分別設計一個分頻值為N和分頻值N+ 1的整數分頻器,采用脈沖計數來控制單 位時間內兩個分頻器出現的次數, 從而獲得所需要的小數分頻值。 可以采取如下 方法來計算個子出現的頻率:設N出現的頻率為a,則NX a+( N

4、+1) x( B-a)= NX B+ A求解a= B-A;所 以N+ 1出現的頻率為A.例如實現7 + 2/5分頻,取a為3,即7X 3+ 8X2就可 以實現。但是由于這種小數分頻輸出的時鐘脈沖抖動很大,現實中很少使用。通常實現偶數的分頻比較容易,以十分頻為例 :always ( posedge clk or posedge reset)if(reset)begink<=0;clk_10<=0;endelseif(k=4)begink<=0;clk_10<=clk_10;endelsek<=k+1;二分頻最簡單了,一句話就可以了: (negedge clk)clk

5、_2<=clk_2;若進行奇數分頻,則稍微麻煩點,以 11 分頻為例:always ( posedge clk)if(!reset)begini<=0;clk11<=0;endelseif(i=5)beginclk11<=clk11;i<=i+1;endelseif(i=10)begini<=0;clk11<=clk11;endelsei<=i+1;以上語句雖然可以實現, 但是邏輯有點繁, 弄不好就出錯了, always 語句來實現: always ( posedge clk) if(!reset)i<=0;elsealways建議使用兩個

6、beginif(i=10)i<=0; else i<=i+1;endalways ( posedge clk)if(!reset) clk11<=0;elseif(i=5)|(i=10) clk11<=clk11;兩個 always ,一個用來計數,一個用來置數。另外,這個樣子好像也可以, 在時鐘的上升沿和下降沿都計數, 但是不被綜合器綜合, 會提示敏感信號太復雜: always ( posedge clk or negedge clk)if(reset)begink<=0; clk_11<=0;endelseif(k=10)begink<=0; cl

7、k_11<=clk_11; endelsek<=k+1;1.2 奇數倍分頻 奇數倍分頻有兩種實現方法, 其中之一完全可以通過計數器來實現, 如進行三分 頻,就可通過待分頻時鐘上升沿觸發計數器來進行模三計數, 當計數器計數到鄰 近值時進行兩次翻轉。 比如可以在計數器計數到 1 時,輸出時鐘進行翻轉, 計數 到 2 時再次進行翻轉。這樣,就在計數值鄰近的 1 和 2 進行了兩次翻轉。如此 便實現了三分頻,其占空比為 13 或 23。占空比 115的 15分頻設計的主要代碼如下:如 果要實現占空比為 50的三分頻時鐘,則可通過待分頻時鐘下降沿觸發計 數,并以和上升沿同樣的方法計數進行三分

8、頻, 然后對下降沿產生的三分頻時鐘 和上升沿 產生的時鐘進行相或運算。 即可得到占空比為 50的三分頻時鐘這是奇數分頻的第三種方法。 這種方法可以實現任意的奇數分頻。 如將其歸類為一般 的方法:對于 實現占空比為 50的 N 倍奇數分頻,首先要進行上升沿觸發以進 行模N計數,計數選定到某一個值再進行輸出時鐘翻轉,然后過 (N-1) /2再次 進行翻轉,就 可得到一個占空比非 50的奇數 n 分頻時鐘。再同時進行下降沿 觸發的模N計數,當其到達與上升沿觸發輸出時鐘翻轉選定值相同時,再進行輸出時鐘翻轉,同 樣,經過(N-1) /2時,輸出時鐘再次翻轉以生成占空比非 50% 的奇數n分頻時鐘。將這兩

9、個占空比非50%的n分頻時鐘相或運算,就可以得 到占空比為50 %的奇數n分頻時鐘。圖2所示是占空比為1:1的3分頻電路原 理圖。圖 3為其仿真波形。2 半整數分頻器設計進行 n+0.5 分頻一般需要對輸入時鐘先進行操作。 其基本設計思想是: 首先進行 模n的計數,在計數到n-1時,將輸出時鐘賦為1,而當回到計數0時,又賦 為 0 ,這樣,當計數值為 n-1 時,輸出時鐘才為 1,因此,只要保持計數值 n-1 為半個輸入時鐘周期,即可實現 n+0.5 分頻時鐘。因此,保持 n-1 為半個時 鐘 周期即是該設計的關鍵。 從中可以發現, 因為計數器是通過時鐘上升沿計數, 故 可在計數為 n-1 時

10、對計數觸發時鐘進行翻轉, 那么,時鐘的下降沿就變成了上升 沿。即在計數值為 n-1 期間的時鐘下降沿變成了上升沿,也就是說,計數值 n-1 只保持了半個時鐘周期。 由于時鐘翻轉下降沿變成上升沿, 因此,計數值變為 0。 所以,每產生一個 n+0.5 分頻時鐘的周期, 觸發時鐘都要翻轉一次。 圖 4 給出了 通用的半整數分頻器的電路原理圖。圖5所示是一個分頻系數為2.5的分頻器電路,該電路是用FPG/來設計半整數 分頻器的。它由模3計數器、異或門和D觸發器組成。圖6是其仿真波形圖。3 任意整數帶小數分頻任意整數帶小數分頻的基本原理是采用脈沖吞吐計數器和鎖相環技術先設計兩 個不同分頻比的整數分頻器

11、,然后通過控制單位時間內兩種分頻比出 現的不同 次數來獲得所需要的小數分頻值。若設計一個分頻系數為 10.1 的分頻器,即可 以將分頻器設計成 9次10分頻和 1次11分頻,這樣,總的分頻值為:F=(9X 10+1X 11)/ (9+1)=10.1從 這種實現方法的特點可以看出,由于分頻器的分頻值不斷改變,分頻后得到 的信號抖動一般較大。當分頻系數為 N-0.5(N 為整數)時,可控制扣除脈沖的時 間,以使輸出成為一個穩定的脈沖頻率,而不是一次N分頻,一次N-1分頻。一般而言,這種分頻由于分頻輸出的時鐘脈沖抖動很大, 故在設計中的使用已經非 常 少。但是,這也是可以實現的。總結:由3分頻可以推

12、得任意奇數分頻。對于任意奇數(2n-1)的50%占空比 分頻,則計數器ent的模值為(2n-1),假設信號1為上升沿觸發,在ent二0時 跳變,則信號 2 為下降沿觸發,在 cnt=n 時跳變。這樣就保持信號 1 和信號 2 間間隔(2n-1)/2的周期,在(2n-1) x2的周期內elkout為兩個周期,實現了(2n-1)的50%占空比分頻。比如要7分頻,則計數器的模值為7,信號S2在 ent = 4時跳變即可。實現的 verilog 源碼:module fdiv ( elk, reset_n, elkout );inputelk;inputreset_n;outputelkout;reg

13、1:0eount;regdiv1;regdiv2;always (posedge elk) begin if (reset_n )eount <= 2''b00;elseease ( eount )2''b00 : eount <= 2''b01;2''b01 : eount <= 2''b10;2''b10 : eount <= 2''b00; default :eount <= 2''b00; endeaseendalways ( p

14、osedge reset_n or posedge elk ) begin if (reset_n )div1 <= 1''b1;else if ( eount = 2''b00 )div1 <= div1;endalways ( posedge reset_n ornegedge elk )begin if ( reset_n )div2 <= 1''b1;else if ( eount = 2''b10 )div2 <= div2;endassig n clkout = divl A div2;en d

15、module分頻器是FPGA設計中使用頻率非常高的基本設計之一,盡管在目前大部分設計中,廣泛使用芯片廠家集成的鎖相環資源,如賽靈思(Xilinx )的DLL.來進行時鐘的分頻,倍頻以及相移。但是對于時鐘要求不高的基本設計,通過語言進 行時鐘的分頻相移仍然非常流行,首先這種方法可以節省芯片內部的鎖相環資源,再者,消耗不多的邏輯單元就可以達 到對時鐘操作的目的。另一方面,通過語言設計進行時鐘分頻,可以看出設計者對設計語言的理解程度。因此很多招聘 單位在招聘時往往要求應聘者寫一個分頻器(比如奇數分頻)以考核應聘人員的設計水平和理解程度。下面講講對各種分頻系數進行分頻的方法:第一,偶數倍分頻:偶數倍分

16、頻應該是大家都比較熟悉的分頻,通過計數器計數是完全可以實現的。如進行N倍偶數分頻,那么可以通過由待分頻的時鐘觸發計數器計數,當計數器從0計數到N/2-1時,輸出時鐘進行翻轉,并給計數器一個復位信號,使得下一個時鐘從零開始計數。以此循環下去。這種方法可以實現任意的偶數分頻。電路上只需一個D觸發器和一個非門即可實現,Q(n+1)=D, D=Q(n),clk_out=Q(n+1).第二,奇數倍分頻:奇數倍分頻常常在論壇上有人問起,實際上,奇數倍分頻有兩種實現方法:占空比為非50%勺三分頻時鐘,完全可以通過計數器來實現,如進行三分頻,通過待分頻時鐘上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行

17、兩次翻轉,比如可以在計數器計數到1時,輸出時鐘進行翻轉,計數到2時再次進行翻轉。即是在計數值在鄰近的1和2進行了兩次翻轉。這樣實現的三分頻占空比為1/3或者2/3。module three(clk_in,rst,clk_out);input clk_in,rst;output clk_out;reg clk_out;reg 1:0 count;always (negedge rst or posedge clk_in)beginif(rst=0)begincount<=0;clk_out<=0;endelsebegincount<=count+1;if(count=1)clk

18、_out<=clk_out;else if(count=2)beginclk_out=clk_out;count<=0;endend endmodule另一種實現:module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;regq1,q2;wireCLKOUT;always (negedge RESETn or posedge CLKIN) beginif (RESETn=1'bO)q1<=1'bO;elseq1<=d;q1是d延遲一個時鐘后的信號end always

19、 (negedge RESETn or posedge CLKIN)beginif (RESETn=1'b0)q2<=1'b0;elseq2<=q1;q2是q1延遲一個時鐘后的信號endassign d=q1 & q2;/d在一個周期內,一個 elk為高,另外兩個elk為低assign CLKOUT=q2;endmodule電路中,利用兩個D觸發器和簡單的門電路即可實現。如果要實現占空比為50%勺三分頻時鐘,可以通過待分頻時鐘下降沿觸發計數,和上升沿同樣的方法計數進行三分頻,然后下降沿產生的三分頻時鐘和上升沿產生的時鐘進行相或運算,即可得到占空比為50%勺三

20、分頻時鐘。這種方法可以實現任意的奇數分頻。歸類為一般的方法為:對于實現占空比為50%勺N倍奇數分頻,首先進行上升沿觸發進行模N計數,計數選定到某一個值進行輸出時鐘翻轉,然后經過(N-1) /2再次進行翻轉得到一個占空比非 50%奇數n分頻時鐘。再者同時進行 下降沿觸發的模N計數,到和上升沿觸發輸出時鐘翻轉選定值相同值時,進行輸出時鐘時 鐘翻轉,同樣經過(N-1) /2時,輸出時鐘再次翻轉生成占空比非 50%勺奇數n分頻時鐘。兩個占空比非50%勺n分頻時 鐘相或運算,得到占空比為50%勺奇數n分頻時鐘。舉例:用Verilog語言寫的三分頻電路 方法一:/上升沿觸發的分頻設計module thre

21、e(clkin, clkout);input clkin;/定義輸入端口output clkout;/定義輸出端?reg 1:0 stepl, step;always ( posedgeclkin)begincase (step)/這個狀態機就是一個計數器2'b00: step<=2'b01;2'b01: step<=2'b10;2'b10: step<=2'b00;default :step<=2'b00;endcaseendalways ( negedgeclkin)step1 與 step 相差半個 clkb

22、egincase (step1)2'b00: step1<=2'b01;2'b01: step1<=2'b10;2'b10: step1<=2'b00;default :step1<=2'b00;endcaseendassign clkout=step1 | step11;endmodule/利用step和step1高位的或運算,實現在1.5個clk時翻轉。dk oul£空比為孫3專博電躍棟竝田用Verilog語言寫五分頻電路,占空比為50%:module div_5 ( clkin,rst,clkout

23、 );input clkin,rst;output clkout;reg 2:0 stepl, step2;always (posedge clkin )if(!rst)step1<=3'b000;elsebegincase (step1)3'b000: step1<=3'b001;3'b001: step1<=3'b011;3'b011: step1<=3'b100;3'b100: step1<=3'b010;3'b010: step1<=3'b000;default:

24、step1<=3'b000;endcaseendalways (negedge clkin )if(!rst)step2<=3'b000;elsebegincase (step2)3'b000: step2<=3'b001;3'b001: step2<=3'b011;/注意調換了順序,目的為了使最低位為1的情況互鄰3'b011: step2<=3'b100;3'b100: step2<=3'b010;3'b010: step2<=3'b000;default

25、:step2<=3'b000;endcaseendstep1 與step2最低位相或assign clkout=step10 | step20;endmodule下面給出一個任意整數分頻器的代碼:module div n(clk,rst_n,o_clk); in put clk,rst_ n;output o_clk;parameter WIDTH = 3; parameter N = 5;reg WIDTH-1:0 cnt_p,c nt_n; reg clk_p,clk_n;/coun t_pose,co unt_n egeassign o_clk = (N=1)? clk :

26、 (N0)?(clk_p&clk_n) :clk_p;/如果N=1,o_clk=clk; 如果N為偶數,o_clk=clk_p; 如果N為奇數, o_clk=clk_p & clk_n ,/ 之所以是 相與運算 ,是因為 clk_p 和 clk_n 兩者高電平比低電平多一個 clk , 而兩者相差半個 clk, 相與結果使 /o_clk 占空比為 50%always (posedge clk or negedge rst_n)beginif(!rst_n)cnt_p<=0;else if (cnt_p=(N-1)cnt_p<=0;else cnt_p<=cnt

27、_p+1;endalways (posedge clk or negedge rst_n)beginif(!rst_n)clk_p<=0;else if (cnt_p<(N>>1)/N>>1 ,計數到 N/2 時,時鐘翻轉。如果將 cnt_p <改成 cnt_p <=,則 clk_p 低電平比 / 高電平多一個 clk ,如果 clk_n 也做類似修 改,則 N 為奇數時,應執行 相或運算 , o_clk=clk_p | clk_nclk_p<=0;else clk_p<=1;end always (negedge clk or ne

28、gedge rst_n) beginif(!rst_n)cnt_n<=0;else if (cnt_n=(N-1)cnt_n<=0;else cnt_n<=cnt_n+1;endalways (negedge clk or negedge rst_n) beginif(!rst_n)clk_n<=0;else if (cnt_n<(N>>1)clk_n<=0;else clk_n<=1;endendmodule另外一種方法:對進行奇數倍 n 分頻時鐘,首先進行 n/2 分頻(帶小數,即等于 (n-1)/2+0.5 ),然后再進行二分頻得 到。得到占空比為 50%的奇數倍分頻。下面講講進行小數分頻的設計方法小數分頻 :首先講講如何進行 n+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論