第一,偶數倍分頻:偶數倍分頻應該是大家都比較熟悉的分頻,通過計數器計數是完全可以實現的。如進行N倍偶數分頻,那麼可以通過由待分頻的時鐘觸發計數器計數,當計數器從0計數到N/2‐1時,輸出時鐘進行翻轉,並給計數器一個復位信號,使得下一個時鐘從零開始計數。以此循環下去。這種方法可以實現任意的偶數分頻。
第二:奇數倍分頻:奇數倍分頻常常在論壇上有人問起,實際上,奇數倍分頻有兩種實現方法:
第三 ,小數分頻:首先講講如何進行n+0.5分頻,這種分頻需要對輸入時鐘進行操作。基本的設計思想:對於進行n+0.5分頻,首先進行模n的計數,在計數到n‐1時,輸出時鐘賦爲'1’,回到計數0時,又賦爲0,因此,可以知道,當計數值爲n‐1時,輸出時鐘才爲1,因此,只要保持計數值n‐1爲半個輸入時鐘週期,即實現了n+0.5分頻時鐘,因此保持n‐1爲半個時鐘週期即是一個難點。從中可以發現,因爲計數器是通過時鐘上升沿計數,因此可以在計數爲n‐1時對計數觸發時鐘進行翻轉,那麼時鐘的下降沿變成了上升沿。即在計數值爲n‐1期間的時鐘下降沿變成了上升沿,則計數值n‐1只保持了半個時鐘週期,由於時鐘翻轉下降沿變成上升沿,因此計數值變爲0。因此,每產生一個n+0.5分頻時鐘的週期,觸發時鐘都是要翻轉一次.
module three (clk,d,out);
input clk;
output d,out;
reg q1,q2,d,out;
initial
begin
d= 0;// d是1.5倍分頻的輸出;
out = 0;
end//必須進行初始化;
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)
out =~ out;//3倍分頻輸出
endmodule