任意分頻的verilog語言實現(xiàn)資料_第1頁
任意分頻的verilog語言實現(xiàn)資料_第2頁
任意分頻的verilog語言實現(xiàn)資料_第3頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、+1) x( B-a)= NX B+ A求解a= B-A;所 以N+ 1出現(xiàn)的頻率為A.例如實現(xiàn)7 + 2/5分頻,取a為3,即7X 3+ 8X2就可 以實現(xiàn)。但是由于這種小數(shù)分頻輸出的時鐘脈沖抖動很大,現(xiàn)實中很少使用。通常實現(xiàn)偶數(shù)的分頻比較容易,以十分頻為例 :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_2=clk_2;若進行奇數(shù)分頻,則稍微

5、麻煩點,以 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;以上語句雖然可以實現(xiàn), 但是邏輯有點繁, 弄不好就出錯了, always 語句來實現(xiàn): always ( posedge clk) if(!reset)i=0;elsealways建議使用兩個beginif(i=10)i=0; else i=i+1;endalways ( posedge clk)if(

6、!reset) clk11=0;elseif(i=5)|(i=10) clk11=clk11;兩個 always ,一個用來計數(shù),一個用來置數(shù)。另外,這個樣子好像也可以, 在時鐘的上升沿和下降沿都計數(shù), 但是不被綜合器綜合, 會提示敏感信號太復雜: always ( posedge clk or negedge clk)if(reset)begink=0; clk_11=0;endelseif(k=10)begink=0; clk_11=clk_11; endelsek=k+1;1.2 奇數(shù)倍分頻 奇數(shù)倍分頻有兩種實現(xiàn)方法, 其中之一完全可以通過計數(shù)器來實現(xiàn), 如進行三分 頻,就可通過待分頻時

7、鐘上升沿觸發(fā)計數(shù)器來進行模三計數(shù), 當計數(shù)器計數(shù)到鄰 近值時進行兩次翻轉(zhuǎn)。 比如可以在計數(shù)器計數(shù)到 1 時,輸出時鐘進行翻轉(zhuǎn), 計數(shù) 到 2 時再次進行翻轉(zhuǎn)。這樣,就在計數(shù)值鄰近的 1 和 2 進行了兩次翻轉(zhuǎn)。如此 便實現(xiàn)了三分頻,其占空比為 13 或 23。占空比 115的 15分頻設計的主要代碼如下:如 果要實現(xiàn)占空比為 50的三分頻時鐘,則可通過待分頻時鐘下降沿觸發(fā)計 數(shù),并以和上升沿同樣的方法計數(shù)進行三分頻, 然后對下降沿產(chǎn)生的三分頻時鐘 和上升沿 產(chǎn)生的時鐘進行相或運算。 即可得到占空比為 50的三分頻時鐘這是奇數(shù)分頻的第三種方法。 這種方法可以實現(xiàn)任意的奇數(shù)分頻。 如將其歸類為一般

8、 的方法:對于 實現(xiàn)占空比為 50的 N 倍奇數(shù)分頻,首先要進行上升沿觸發(fā)以進 行模N計數(shù),計數(shù)選定到某一個值再進行輸出時鐘翻轉(zhuǎn),然后過 (N-1) /2再次 進行翻轉(zhuǎn),就 可得到一個占空比非 50的奇數(shù) n 分頻時鐘。再同時進行下降沿 觸發(fā)的模N計數(shù),當其到達與上升沿觸發(fā)輸出時鐘翻轉(zhuǎn)選定值相同時,再進行輸出時鐘翻轉(zhuǎn),同 樣,經(jīng)過(N-1) /2時,輸出時鐘再次翻轉(zhuǎn)以生成占空比非 50% 的奇數(shù)n分頻時鐘。將這兩個占空比非50%的n分頻時鐘相或運算,就可以得 到占空比為 50%的奇數(shù) n 分頻時鐘。 圖2 所示是占空比為 1:1 的 3分頻電路原 理圖。圖 3 為其仿真波形。2 半整數(shù)分頻器設

9、計進行 n+0.5 分頻一般需要對輸入時鐘先進行操作。 其基本設計思想是: 首先進行 模 n 的計數(shù),在計數(shù)到 n-1 時,將輸出時鐘賦為 1,而當回 到計數(shù) 0時,又賦 為 0 ,這樣,當計數(shù)值為 n-1 時,輸出時鐘才為 1,因此,只要保持計數(shù)值 n-1 為半個輸入時鐘周期,即可實現(xiàn) n+0.5 分頻時鐘。因此,保持 n-1 為半個時 鐘 周期即是該設計的關鍵。 從中可以發(fā)現(xiàn), 因為計數(shù)器是通過時鐘上升沿計數(shù), 故 可在計數(shù)為 n-1 時對計數(shù)觸發(fā)時鐘進行翻轉(zhuǎn), 那么,時鐘的下降沿就變成了上升 沿。即在計數(shù)值為 n-1 期間的時鐘下降沿變成了上升沿,也就是說,計數(shù)值 n-1 只保持了半個時

10、鐘周期。 由于時鐘翻轉(zhuǎn)下降沿變成上升沿, 因此,計數(shù)值變?yōu)?0。 所以,每產(chǎn)生一個 n+0.5 分頻時鐘的周期, 觸發(fā)時鐘都要翻轉(zhuǎn)一次。 圖 4給出了 通用的半整數(shù)分頻器的電路原理圖。圖5所示是一個分頻系數(shù)為2.5的分頻器電路,該電路是用FPG/來設計半整數(shù) 分頻器的。它由模3計數(shù)器、異或門和D觸發(fā)器組成。圖6是其仿真波形圖。3 任意整數(shù)帶小數(shù)分頻任意整數(shù)帶小數(shù)分頻的基本原理是采用脈沖吞吐計數(shù)器和鎖相環(huán)技術(shù)先設計兩 個不同分頻比的整數(shù)分頻器,然后通過控制單位時間內(nèi)兩種分頻比出 現(xiàn)的不同 次數(shù)來獲得所需要的小數(shù)分頻值。若設計一個分頻系數(shù)為 10.1 的分頻器,即可 以將分頻器設計成 9次 10分

11、頻和 1 次 11 分頻,這樣,總的分頻值為:F=(9X 10+1X 11)/ (9+1)=10.1從 這種實現(xiàn)方法的特點可以看出,由于分頻器的分頻值不斷改變,分頻后得到 的信號抖動一般較大。當分頻系數(shù)為 N-0.5(N 為整數(shù))時,可控制扣除脈沖的時 間,以使輸出成為一個穩(wěn)定的脈沖頻率,而不是一次N分頻,一次N-1分頻。一般而言,這種分頻由于分頻輸出的時鐘脈沖抖動很大, 故在設計中的使用已經(jīng)非 常 少。但是,這也是可以實現(xiàn)的??偨Y(jié):由3分頻可以推得任意奇數(shù)分頻。對于任意奇數(shù)(2n-1)的50%占空比 分頻,則計數(shù)器ent的模值為(2n-1),假設信號1為上升沿觸發(fā),在ent二0時 跳變,則信

12、號 2 為下降沿觸發(fā),在 cnt=n 時跳變。這樣就保持信號 1 和信號 2 間間隔(2n-1)/2的周期,在(2n-1) x2的周期內(nèi)elkout為兩個周期,實現(xiàn)了(2n-1)的50%占空比分頻。比如要7分頻,則計數(shù)器的模值為7,信號S2在 ent = 4時跳變即可。實現(xiàn)的 verilog 源碼:module fdiv ( elk, reset_n, elkout );inputelk;inputreset_n;outputelkout;reg 1:0eount;regdiv1;regdiv2;always (posedge elk) begin if (reset_n )eount = 2

13、b00;elseease ( eount )2b00 : eount = 2b01;2b01 : eount = 2b10;2b10 : eount = 2b00; default :eount = 2b00; endeaseendalways ( posedge reset_n or posedge elk ) begin if (reset_n )div1 = 1b1;else if ( eount = 2b00 )div1 = div1;endalways ( posedge reset_n ornegedge elk )begin if ( reset_n )div2 = 1b1;el

14、se if ( eount = 2b10 )div2 = div2;endassig n clkout = divl A div2;en dmodule分頻器是FPGA設計中使用頻率非常高的基本設計之一,盡管在目前大部分設計中,廣泛使用芯片廠家集成的鎖相環(huán)資源,如賽靈思(Xilinx )的DLL.來進行時鐘的分頻,倍頻以及相移。但是對于時鐘要求不高的基本設計,通過語言進 行時鐘的分頻相移仍然非常流行,首先這種方法可以節(jié)省芯片內(nèi)部的鎖相環(huán)資源,再者,消耗不多的邏輯單元就可以達 到對時鐘操作的目的。另一方面,通過語言設計進行時鐘分頻,可以看出設計者對設計語言的理解程度。因此很多招聘 單位在招聘時往

15、往要求應聘者寫一個分頻器(比如奇數(shù)分頻)以考核應聘人員的設計水平和理解程度。下面講講對各種分頻系數(shù)進行分頻的方法:第一,偶數(shù)倍分頻:偶數(shù)倍分頻應該是大家都比較熟悉的分頻,通過計數(shù)器計數(shù)是完全可以實現(xiàn)的。如進行N倍偶數(shù)分頻,那么可以通過由待分頻的時鐘觸發(fā)計數(shù)器計數(shù),當計數(shù)器從0計數(shù)到N/2-1時,輸出時鐘進行翻轉(zhuǎn),并給計數(shù)器一個復位信號,使得下一個時鐘從零開始計數(shù)。以此循環(huán)下去。這種方法可以實現(xiàn)任意的偶數(shù)分頻。電路上只需一個D觸發(fā)器和一個非門即可實現(xiàn),Q(n+1)=D, D=Q(n),clk_out=Q(n+1).第二,奇數(shù)倍分頻:奇數(shù)倍分頻常常在論壇上有人問起,實際上,奇數(shù)倍分頻有兩種實現(xiàn)方法

16、:占空比為非50%勺三分頻時鐘,完全可以通過計數(shù)器來實現(xiàn),如進行三分頻,通過待分頻時鐘上升沿觸發(fā)計數(shù)器進行模三計數(shù),當計數(shù)器計數(shù)到鄰近值進行兩次翻轉(zhuǎn),比如可以在計數(shù)器計數(shù)到1時,輸出時鐘進行翻轉(zhuǎn),計數(shù)到2時再次進行翻轉(zhuǎn)。即是在計數(shù)值在鄰近的1和2進行了兩次翻轉(zhuǎn)。這樣實現(xiàn)的三分頻占空比為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)begin

17、count=0;clk_out=0;endelsebegincount=count+1;if(count=1)clk_out=clk_out;else if(count=2)beginclk_out=clk_out;count=0;endend endmodule另一種實現(xiàn):module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;regq1,q2;wireCLKOUT;always (negedge RESETn or posedge CLKIN) beginif (RESETn=1bO)q1=1bO;e

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

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

20、odule three(clkin, clkout);input clkin;/定義輸入端口output clkout;/定義輸出端?reg 1:0 stepl, step;always ( posedgeclkin)begincase (step)/這個狀態(tài)機就是一個計數(shù)器2b00: step=2b01;2b01: step=2b10;2b10: step=2b00;default :step=2b00;endcaseendalways ( negedgeclkin)step1 與 step 相差半個 clkbegincase (step1)2b00: step1=2b01;2b01: st

21、ep1=2b10;2b10: step1=2b00;default :step1=2b00;endcaseendassign clkout=step1 | step11;endmodule/利用step和step1高位的或運算,實現(xiàn)在1.5個clk時翻轉(zhuǎn)。dk oul空比為孫3專博電躍棟竝田用Verilog語言寫五分頻電路,占空比為50%:module div_5 ( clkin,rst,clkout );input clkin,rst;output clkout;reg 2:0 stepl, step2;always (posedge clkin )if(!rst)step1=3b000;e

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

23、p2=3b010;3b010: step2=3b000;default:step2=3b000;endcaseendstep1 與step2最低位相或assign clkout=step10 | step20;endmodule下面給出一個任意整數(shù)分頻器的代碼: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 egea

24、ssign o_clk = (N=1)? clk : (N0)?(clk_p&clk_n) :clk_p;/如果N=1,o_clk=clk; 如果N為偶數(shù),o_clk=clk_p; 如果N為奇數(shù), o_clk=clk_p & clk_n ,/ 之所以是 相與運算 ,是因為 clk_p 和 clk_n 兩者高電平比低電平多一個 clk , 而兩者相差半個 clk, 相與結(jié)果使 /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

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

26、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_n1)clk_n=0;else clk_n=1;endendmodule另外一種方法:對進行奇數(shù)倍 n 分頻時鐘,首先進行 n/2 分頻(帶小數(shù),即等于 (n-1)/2+0.5 ),然后再進行二分頻得 到。得到占空比為 50%的奇數(shù)倍分頻。下面講講進行小數(shù)分頻的設計方法小數(shù)分頻 :首先講講如何進行 n+0.5 分頻,這種分頻 需要對輸入時鐘進行操作?;镜脑O計思想:對于進行 n+0.5 分 頻,首先進

溫馨提示

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

評論

0/150

提交評論