Verilog设计(二):分频电路设计
目錄
1.偶數(shù)分頻
2. 奇數(shù)分頻
3.半整數(shù)分頻
? ? ? ? 分頻器是FPGA中常用的設(shè)計(jì)之一,在FPGA設(shè)計(jì)中擔(dān)任重要的角色(時(shí)鐘對(duì)于FPGA電路系統(tǒng)的重要性不言而喻!)。盡管大多數(shù)設(shè)計(jì)中會(huì)廣泛采用廠家集成的鎖相環(huán)PLL資源進(jìn)行分頻,倍頻和相移(每個(gè)廠商Xilinx/Alter等其開發(fā)套件會(huì)提供各自的IP),但對(duì)對(duì)時(shí)鐘要求不高的基本設(shè)計(jì)還是需要通過(guò)自行設(shè)計(jì)分頻相移,可節(jié)省鎖相環(huán)資源。
? ? ? ? 提到分頻,對(duì)于初學(xué)者可定就會(huì)想到利用一個(gè)計(jì)數(shù)器才基時(shí)鐘下計(jì)數(shù),通過(guò)翻轉(zhuǎn)獲得想要的時(shí)鐘。這樣的方法的確可以實(shí)現(xiàn)偶數(shù)分頻,但是實(shí)現(xiàn)奇數(shù)分頻的話,一個(gè)計(jì)數(shù)器可能不夠,一般需要兩個(gè)計(jì)數(shù)器。
1.偶數(shù)分頻
? ? ? 偶數(shù)分頻較奇數(shù)分頻更為常見(jiàn),通過(guò)一個(gè)計(jì)數(shù)器就完全可以實(shí)現(xiàn)了。如需要N分頻(N為偶數(shù),則N/2為整數(shù)),可通過(guò)一個(gè)計(jì)數(shù)器在待分頻時(shí)鐘的觸發(fā)下循環(huán)奇數(shù)。當(dāng)計(jì)數(shù)器從0奇數(shù)至N/2 -1時(shí),輸出時(shí)鐘翻轉(zhuǎn)。
Verilog實(shí)現(xiàn):
module even( clk_in ,rst_n ,clk_out );input clk_in; input rst_n; output reg clk_out;parameter N=6; //定義分頻參數(shù) reg [3:0] cnt;always @(posedge clk_in or negedge rst_n) beginif(!rst_n) begin cnt <= 4'b0000 ;clk_out <= 1'b0 ;endelse if(cnt==(N/2-1)) beginclk_out <= ~clk_out;cnt <= 4'b0000;end else cnt<=cnt+1; endendmodule?
2. 奇數(shù)分頻
? ? ? ? 首先看一下3分頻的時(shí)序圖:
?從時(shí)序圖上可以看出,對(duì)于奇數(shù)分頻,就是分別利用主時(shí)鐘的上升沿觸發(fā)生成一個(gè)時(shí)鐘,然后用下降沿觸發(fā)生成一組時(shí)鐘,然后將兩個(gè)時(shí)鐘信號(hào)進(jìn)行或運(yùn)算得到奇數(shù)分頻的結(jié)果。
如果N是奇數(shù),那么N/2非整數(shù)了(N-1/2為整數(shù)),那么該如何實(shí)現(xiàn)呢?
實(shí)現(xiàn)方法為:
? ? ? ? Step1:? ?雙沿計(jì)數(shù)器計(jì)數(shù);
? ? ? ? ? ? ? ? ? ? ?使用2個(gè)計(jì)數(shù)器:cnt_up和cnt_down,分別在時(shí)鐘的上升沿觸發(fā)計(jì)數(shù)器cnt_up和cnt_down。
? ? ? ? Step2:生成兩個(gè)控制信號(hào)Clk_up和Clk_down;
? ? ? ? ? ? ? ? ? ? cnt_up計(jì)數(shù)到(N-1)/2-1電平翻轉(zhuǎn)信號(hào)Clk_up,再計(jì)數(shù)到N-1電平翻轉(zhuǎn)信號(hào)Clk_up,同時(shí)cnt_down計(jì)數(shù)到(N-1)/2-1電平翻轉(zhuǎn)信號(hào)Clk_down,再計(jì)數(shù)到N-1電平翻轉(zhuǎn)信號(hào)Clk_down。
? ? ? ? Step3:? 求出分頻后時(shí)鐘;
? ? ? ? ? ? ? ?如果Clk_up和Clk_down信號(hào)與Clk_out的關(guān)系與Clk_up和Clk_down信號(hào)中高低電平比有關(guān)(占空比):
? ? ? ? ? ? ? ?(1)如果高 / 低電平比例為N-1/2? ? ??: N-1/2 + 1??,則分頻時(shí)鐘 clk_div = clk_up || clk_down (如圖 1 所示)。
? ? ? ? ? ? ? ?(2)如果高 / 低電平比例為?N-1/2?+1 :N/2? ? ? ? ,則分頻時(shí)鐘 clk_div = clk_up && clk_down(如圖 2 所示)。
module div3(clk ,rst_n ,clk_out );input clk , rst_n; output clk_out ;//=======================================================================\ //**************************Internal Signals****************************** //=======================================================================/reg [3:0] cnt_p , cnt_n; //clk上升沿(下降沿)觸發(fā)生成的計(jì)數(shù)器cnt_p(cnt_n) reg clk_p , clk_n; //clk上升沿(下降沿)觸發(fā)生成的時(shí)鐘clk_p(clk_n)parameter N=5 ; //分頻參數(shù)//===========================================================================\ //*****************************main code************************************ //==========================================================================///cnt_p 0-4 always @(posedge clk or negedge rst_n) beginif(!rst_n)cnt_p <= 4'd0;else if(cnt_p == N-1)cnt_p <= 0;else cnt_p <= cnt_p + 1'b1;end//cnt_n 0-4 always @(negedge clk or negedge rst_n) begin if(!rst_n)cnt_n <= 4'd0;else if(cnt_n == (N-1))cnt_n <= 0;else cnt_n <= cnt_n + 1'b1;end//clk_p always @(posedge clk or negedge rst_n) beginif(!rst_n)clk_p <= 1;else if(cnt_p == (N-1)/2-1) clk_p <= ~clk_p;else if(cnt_p == (N-1))clk_p <= ~clk_p;end//clk_p always @(negedge clk or negedge rst_n) beginif(!rst_n)clk_n<=1;else if(cnt_n==(N-1)/2-1)clk_n<=~clk_n;else if(cnt_n==(N-1))clk_n<=~clk_n;end assign clk_out=clk_n|clk_p;endmodule3.半整數(shù)分頻
半整數(shù)分頻,本次以2.5分頻為例子。這個(gè)主要是利用時(shí)鐘的上升沿和下降沿進(jìn)行計(jì)數(shù)。
?
?
總結(jié)
以上是生活随笔為你收集整理的Verilog设计(二):分频电路设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小度独立融资,百度上演“大象跳舞”
- 下一篇: 柔性防水套管A型和B型的区别