本文介紹了偶數分頻和奇數分頻電路的設計,分別從簡單的分頻介紹開始,延伸到任意n分頻電路的設計,做了詳細的說明,並且附有verilog源程式,並有**結果。
在數字邏輯電路中,分頻器是一種常用電路,通常用來對某個給定的頻率進行分頻,以得到所需的頻率。
1.1、 偶數分頻電路
偶數倍分頻是最簡單的一種分頻模式,完全可以通過計數器計數實現,如果要進行n倍(n為偶數)偶數分頻,可由待分頻的時鐘觸發計數器計數,當計數器從0計數到n/2—1時,輸出時鐘進行翻轉,並給計數器乙個復位訊號,使得下乙個時鐘從零開始計數,以此迴圈下去。這種方法可以實現任意的偶數分頻。下面的程式給出的是乙個16分頻電路,其他倍數的分頻電路可以通過修改計數器的上限值得到。
用verilog實現乙個16分頻電路,其源程式如下。
module clk_div16(clk_in,reset,clk_out);
input clk_in;
input reset;
output clk_out;
reg clk_out;
reg[2:0] cnt;
always@(posedge clk_in) begin
if(!reset) begin
cnt<=0;
clk_out<=0;
endelse
if(cnt==7) begin
clk_out<=~clk_out;
cnt<=0;
endelse begin
cnt<=cnt+1;
//clk_out<=clk_out;
endend
endmodule
測試激勵程式如下:
module clk_div16_tb;
reg clk_in;
reg reset;
wire clk_out;
clk_div16 uut (
.clk_in(clk_in),
.reset(reset),
.clk_out(clk_out)
initial begin
// initialize inputs
clk_in = 0;
reset = 0;
#10 reset=1;
endalways #2 clk_in=~clk_in;
endmodule
上述程式經過synplify pro 綜合後,其rtl級結構如下圖所示
在modelsim6.5中完成**,結果如圖所示。
總結:如果要實現任意n(偶數)分頻電路。其程式如下
module clk_divn(clk_in,reset,clk_out);
input clk_in;
input reset;
output clk_out;
reg clk_out;
reg[2:0] cnt;
parameter n=8;//只需修改n的值即可
always@(posedge clk_in) begin
if(!reset) begin
cnt<=0;
clk_out<=0;
endelse
if(cnt==(n/2-1)) begin
clk_out<=~clk_out;
cnt<=0;
endelse begin
cnt<=cnt+1;
clk_out<=clk_out;
endend
endmodule
1.2、 奇數分頻電路
奇數分頻電路有多種實現方式,下面介紹常用的錯位「異或」法的原理。如果要進行3分頻,通過待分頻時鐘上公升沿觸發計數器進行模3計數,當計數器計到鄰近值時進行兩次翻轉。比如在計數器計計數到1時,輸出時鐘進行翻轉;計數到2時,再次翻轉,即在鄰近的1和2時刻進行兩次翻轉,在0時刻不翻轉。這樣實現的3分頻占空比為1/3或2/3。如果要實現占空比為50%的3分頻時鐘,可以通過待分頻時鐘下降沿觸發計數,和上公升沿同樣的方法計數進行3分頻,然後將下降沿產生的3分頻時鐘和上公升沿產生的時鐘進行相或運算,即可得到占空比為50%的3分頻時鐘。
這種錯位「異或」法可以推廣到實現任意的奇數分頻:對於實現占空比為50%的n倍奇數分頻,首先進行上公升沿觸發的模n計數,計數到某一選定值時(0到n—1之間的任意數值,比如在計數為0)進行輸出時鐘翻轉,然後經過(n-1)/2再次翻轉,得到乙個占空比非50%的奇數n分頻電路。再者,同時進行下降觸發沿的模n計數,和上公升沿觸發輸出時鐘翻轉選定值相同的值時,進行輸出時鐘翻轉,同樣經過(n-1)/2,輸出時鐘再次翻轉,生成占空比非50%的奇數n分頻時鐘。將兩個占空比非50%的n分頻時鐘相或運算,得到占空比為50%的奇數n分頻時鐘。
使用verilog程式實現3分頻電路:
module clk_div3(clk_in,reset,clk_out);
input clk_in;
input reset;
output clk_out;
integer cnt1,cnt2;
reg clk_div3p;
reg clk_div3n;
always@(posedge clk_in) begin
if(!reset) begin
clk_div3p<=0;
cnt1<=0;
endelse
if(cnt1==2)
cnt1<=0;
else begin
cnt1<=cnt1+1;
clk_div3p<=~clk_div3p;
endend
always@(negedge clk_in) begin
if(!reset) begin
clk_div3n<=0;
cnt2<=0;
endelse
if(cnt2==2)
cnt2<=0;
else begin
cnt2<=cnt2+1;
clk_div3n<=~clk_div3n;
endend
assign clk_out=clk_div3p|clk_div3n;
endmodule
測試激勵程式如下:
module clk_div3_tb;
// inputs
reg clk_in;
reg reset;
// outputs
wire clk_out;
// instantiate the unit under test (uut)
clk_div3 uut (
.clk_in(clk_in),
.reset(reset),
.clk_out(clk_out)
initial begin
// initialize inputs
clk_in = 0;
reset = 0;
#10 reset=1;
endalways #2 clk_in=~clk_in;
endmodule
經modlesim6.5**後的圖形如下圖
總結:如果要實現任意n(奇數)分頻電路。其程式如下
module clk_divn(clk_in,reset,clk_out);
input clk_in;
input reset;
output clk_out;
integer cnt1,cnt2;
reg clk_div3p;
reg clk_div3n;
parameter n=19 ; //n一定要為奇數
always@(posedge clk_in) begin
if(!reset) begin
clk_div3p<=0;
cnt1<=0;
endelse
if(cnt1==(n-1))
cnt1<=0;
else
if((cnt1==1)|(cnt1==(1+(n-1)/2))) begin
cnt1<=cnt1+1;
clk_div3p<=~clk_div3p;
endelse
cnt1<=cnt1+1;
endalways@(negedge clk_in) begin
if(!reset) begin
clk_div3n<=0;
cnt2<=0;
endelse
if(cnt2==(n-1))
cnt2<=0;
else
if((cnt2==1)|(cnt2==(1+(n-1)/2))) begin
cnt2<=cnt2+1;
clk_div3n<=~clk_div3n;
endelse
cnt2<=cnt2+1;
endassign clk_out=clk_div3p|clk_div3n;
endmodule
經modlesim6.5**後的圖形如下圖
2012-5-13
時鐘分頻器
1 偶數倍分頻 2 奇數倍分頻,占空比50 3 小數分頻 1 在clk上公升沿和下降沿分別產生2n分頻時鐘,兩時鐘相位差90度。2 兩時鐘異或。如此下 11分頻 module clockdiv parameter n 11,counter width 4 input clk,input resetn...
分頻器設計(一)偶分頻
目錄 一 2 n的偶分頻器設計 這種級聯觸發器的方式優缺點分析 二 任意偶數的分頻器設計 所謂 分頻 就是把輸入訊號的頻率變成成倍數地低於輸入頻率的輸出訊號。數位電路中的分頻器主要是分為兩種 整數分頻和小數分頻。其中整數分頻又分為偶分頻和奇分頻,首先從偶分頻開始吧,入門先從簡單的開始!先來看最簡單的...
pll製作分頻器 PLL中CML分頻器設計求助
小弟最近在設計乙個工作在20ghz的除2分頻器,用的是最傳統的兩個cml latch級聯的形式,管子的尺寸都很大,電流也在5 10ma左右,可以實現分頻的功能。但小弟有一點不明,從瞬態 波形上看,一開始 大概前2ns 差分對管並不是差分工作,對管柵極波形基本一致,使得整個電路在正反饋狀態,輸出為0,...