1. 程式人生 > 其它 >奇數分頻

奇數分頻

奇數倍分頻有多種實現方法,下面介紹常用的錯位“異或”法的原理。如進行三分頻,通過待分頻時鐘上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉。比如在計數器計數到1 時,輸出時鐘進行翻轉,計數到2 時再次進行翻轉,即在鄰近的1 和時刻進行兩次翻轉。這樣實現的三分頻佔空比為1/3 或者2/3。如果要實現佔空比為50%三分頻時鐘,可以通過待分頻時鐘下降沿觸發計數,和上升沿同樣的方法計數進行三分頻,然後將下降沿產生的三分頻時鐘和上升沿產生的時鐘進行相或運算,即可得到佔空比為50%的三分頻時鐘。

這種錯位“異或”法可以推廣實現任意的奇數分頻:對於實現佔空比為50%的N倍奇數分頻,首先進行上升沿觸發的模N計數,計數到某一選定值時進行輸出時鐘翻轉,然後經過(N-1)/2再次進行翻轉得到一個佔空比非50%奇數N分頻時鐘。再者同時進行下降沿觸發的模N計數,到和上升沿觸發輸出時鐘翻轉選定值相同值時,進行輸出時鐘時鐘翻轉,同樣經過(N-1)/2時,輸出時鐘再次翻轉生成佔空比非50%的奇數N分頻時鐘。兩個佔空比非50%的N分頻時鐘相或運算,得到佔空比為50%的奇數N分頻時鐘。

module clk_div_3(
clk_in,rst_n,clk_out
    );
 input clk_in;
 input rst_n;
 output clk_out;
 reg [1:0]cnt_p,cnt_n;
 reg clk_1to3_p,clk_1to3_n;
 always @( posedge clk_in ) begin
 if(!rst_n) begin
 cnt_p<=2'b00;
 clk_1to3_p<=1'b0;
 end
 else begin
 if(cnt_p==2'b10) begin
 cnt_p<=2'b00;
 clk_1to3_p<=clk_1to3_p;
 end
 else begin
 cnt_p<=cnt_p+1'b1;
 clk_1to3_p<=!clk_1to3_p;
 end
end 
 end
always @( negedge clk_in ) begin
 if(!rst_n) begin
 cnt_n<=2'b00;
 clk_1to3_n<=1'b0;
 end
 else begin
 if(cnt_n==2'b10) begin
 cnt_n<=2'b00;
 clk_1to3_n<=clk_1to3_n;
 end
 else begin
 cnt_n<=cnt_n+1'b1;
 clk_1to3_n<=!clk_1to3_n;
 end
end 
 end
assign clk_out=clk_1to3_p|clk_1to3_n;
Endmodule