n分頻器 verilog verilog奇偶分頻

2021-10-13 09:24:49 字數 4436 閱讀 8660

本文介紹了偶數分頻和奇數分頻電路的設計,分別從簡單的分頻介紹開始,延伸到任意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,...