分頻器是FPGA設(shè)計(jì)中使用頻率非常高的基本設(shè)計(jì)之一,盡管在目前大部分設(shè)計(jì)中,廣泛使用芯片廠家集成的鎖相環(huán)資源,如賽靈思(Xilinx)的DLL.來進(jìn)行時(shí)鐘的分頻,倍頻以及相移。但是對(duì)于時(shí)鐘要求不高的基本設(shè)計(jì),通過語言進(jìn)行時(shí)鐘的分頻相移仍然非常流行,首先這種方法可以節(jié)省芯片內(nèi)部的鎖相環(huán)資源,再者,消耗不多的邏輯單元就可以達(dá)到對(duì)時(shí)鐘操作的目的。另一方面,通過語言設(shè)計(jì)進(jìn)行時(shí)鐘分頻,可以看出設(shè)計(jì)者對(duì)設(shè)計(jì)語言的理解程度。因此很多招聘單位在招聘時(shí)往往要求應(yīng)聘者寫一個(gè)分頻器(比如奇數(shù)分頻)以考核應(yīng)聘人員的設(shè)計(jì)水平和理解程度。下面講講對(duì)各種分頻系數(shù)進(jìn)行分頻的方法:
第一,偶數(shù)倍分頻:偶數(shù)倍分頻應(yīng)該是大家都比較熟悉的分頻,通過計(jì)數(shù)器計(jì)數(shù)是完全可以實(shí)現(xiàn)的。如進(jìn)行N倍偶數(shù)分頻,那么可以通過由待分頻的時(shí)鐘觸發(fā)計(jì)數(shù)器計(jì)數(shù),當(dāng)計(jì)數(shù)器從0計(jì)數(shù)到N/2-1時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),并給計(jì)數(shù)器一個(gè)復(fù)位信號(hào),使得下一個(gè)時(shí)鐘從零開始計(jì)數(shù)。以此循環(huán)下去。這種方法可以實(shí)現(xiàn)任意的偶數(shù)分頻。
第二,奇數(shù)倍分頻:奇數(shù)倍分頻常常在論壇上有人問起,實(shí)際上,奇數(shù)倍分頻有兩種實(shí)現(xiàn)方法:
首先,完全可以通過計(jì)數(shù)器來實(shí)現(xiàn),如進(jìn)行三分頻,通過待分頻時(shí)鐘上升沿觸發(fā)計(jì)數(shù)器進(jìn)行模三計(jì)數(shù),當(dāng)計(jì)數(shù)器計(jì)數(shù)到鄰近值進(jìn)行兩次翻轉(zhuǎn),比如可以在計(jì)數(shù)器計(jì)數(shù)到1時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),計(jì)數(shù)到2時(shí)再次進(jìn)行翻轉(zhuǎn)。即是在計(jì)數(shù)值在鄰近的1和2進(jìn)行了兩次翻轉(zhuǎn)。這樣實(shí)現(xiàn)的三分頻占空比為1/3或者2/3。
如果要實(shí)現(xiàn)占空比為50%的三分頻時(shí)鐘,可以通過待分頻時(shí)鐘下降沿觸發(fā)計(jì)數(shù),和上升沿同樣的方法計(jì)數(shù)進(jìn)行三分頻,然后下降沿產(chǎn)生的三分頻時(shí)鐘和上升沿產(chǎn)生的時(shí)鐘進(jìn)行相或運(yùn)算,即可得到占空比為50%的三分頻時(shí)鐘。這種方法可以實(shí)現(xiàn)任意的奇數(shù)分頻。歸類為一般的方法為:對(duì)于實(shí)現(xiàn)占空比為50%的N倍奇數(shù)分頻,首先進(jìn)行上升沿觸發(fā)進(jìn)行模N計(jì)數(shù),計(jì)數(shù)選定到某一個(gè)值進(jìn)行輸出時(shí)鐘翻轉(zhuǎn),然后經(jīng)過(N-1)/2再次進(jìn)行翻轉(zhuǎn)得到一個(gè)占空比非50%奇數(shù)n分頻時(shí)鐘。再者同時(shí)進(jìn)行下降沿觸發(fā)的模N計(jì)數(shù),到和上升沿觸發(fā)輸出時(shí)鐘翻轉(zhuǎn)選定值相同值時(shí),進(jìn)行輸出時(shí)鐘時(shí)鐘翻轉(zhuǎn),同樣經(jīng)過(N-1)/2時(shí),輸出時(shí)鐘再次翻轉(zhuǎn)生成占空比非50%的奇數(shù)n分頻時(shí)鐘。兩個(gè)占空比非50%的n分頻時(shí)鐘相或運(yùn)算,得到占空比為50%的奇數(shù)n分頻時(shí)鐘。
另外一種方法:對(duì)進(jìn)行奇數(shù)倍n分頻時(shí)鐘,首先進(jìn)行n/2分頻(帶小數(shù),即等于(n-1)/2+0.5),然后再進(jìn)行二分頻得到。得到占空比為50%的奇數(shù)倍分頻。下面講講進(jìn)行小數(shù)分頻的設(shè)計(jì)方法
第三,小數(shù)分頻:首先講講如何進(jìn)行n+0.5分頻,這種分頻需要對(duì)輸入時(shí)鐘進(jìn)行操作?;镜脑O(shè)計(jì)思想:對(duì)于進(jìn)行n+0.5分頻,首先進(jìn)行模n的計(jì)數(shù),在計(jì)數(shù)到n-1時(shí),輸出時(shí)鐘賦為‘1’,回到計(jì)數(shù)0時(shí),又賦為0,因此,可以知道,當(dāng)計(jì)數(shù)值為n-1時(shí),輸出時(shí)鐘才為1,因此,只要保持計(jì)數(shù)值n-1為半個(gè)輸入時(shí)鐘周期,即實(shí)現(xiàn)了n+0.5分頻時(shí)鐘,因此保持n-1為半個(gè)時(shí)鐘周期即是一個(gè)難點(diǎn)。從中可以發(fā)現(xiàn),因?yàn)橛?jì)數(shù)器是通過時(shí)鐘上升沿計(jì)數(shù),因此可以在計(jì)數(shù)為n-1時(shí)對(duì)計(jì)數(shù)觸發(fā)時(shí)鐘進(jìn)行翻轉(zhuǎn),那么時(shí)鐘的下降沿變成了上升沿。即在計(jì)數(shù)值為n-1期間的時(shí)鐘下降沿變成了上升沿,則計(jì)數(shù)值n-1只保持了半個(gè)時(shí)鐘周期,由于時(shí)鐘翻轉(zhuǎn)下降沿變成上升沿,因此計(jì)數(shù)值變?yōu)?。因此,每產(chǎn)生一個(gè)n+0.5分頻時(shí)鐘的周期,觸發(fā)時(shí)鐘都是要翻轉(zhuǎn)一次.
舉例:用Verilog語言寫的三分頻電路
方法一:
//上升沿觸發(fā)的分頻設(shè)計(jì)
module three(clkin, clkout);
input clkin;//定義輸入端口
output clkout;//定義輸出端?
reg [1:0] step1, step;
always @(posedge clkin)
begin
case (step)
2'b00: step<=2'b01;
2'b01: step<=2'b10;
2'b10: step<=2'b00;
default :step<=2'b00;
endcase
end
always @(negedge clkin)
begin
case (step1)
2'b00: step1<=2'b01;
2'b01: step1<=2'b10;
2'b10: step1<=2'b00;
default :step1<=2'b00;
endcase
end
assign clkout=~(step[1]|step1[1]);
endmodule
方法二:
// 如果duty cycle =50%, 可以第一個(gè)周期
第二個(gè)周期輸出原先clock,第三個(gè)周期輸出低
這樣可以實(shí)現(xiàn)三分頻,
輸出是占空比1:1的三分頻.module three(clk,throut) ;
input clk ;
output throut;
reg q1,q2,d,throut;
always @(posedge clk)
if(!d)
q1=1'b1;
else
q1=~q1 ;
always @(negedge clk)
if(!d)
q2=1'b1;
else
q2=~q2 ;
always @(q1 or q2)
d=q1&q2 ;
always @(posedge d)
throut=~throut;
endmodule
用Verilog語言寫五分頻電路,占空比為50%:module div_5 ( clkin,rst,clkout );
input clkin,rst;
output clkout;
reg [2:0] step1, step2;
always @(posedge clkin )
if(!rst)
step1<=3'b000;
else
begin
case (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:step1<=3'b000;
endcase
end
always @(negedge clkin )
if(!rst)
step2<=3'b000;
else
begincase (step2)
3'b000: step2<=3'b001;
3'b001: step2<=3'b011;
3'b011: step2<=3'b100;
3'b100: step2<=3'b010;
3'b010: step2<=3'b000;
default:step2<=3'b000;
endcase
end
assign clkout=step1[0]|step2[0];
評(píng)論
查看更多