第二種方法:對進行奇數倍n分頻時鐘,首先進行n/2分頻(帶小數,即等於(n-1)/2+0.5),而後再進行二分頻獲得。獲得佔空比爲50%的奇數倍分頻。下面講講進行小數分頻的設計方法。spa
小數分頻:首先講講如何進行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分頻時鐘的週期,觸發時鐘都是要翻轉一次.設計
半整數分頻器:計數器是經過上升沿觸發,故在計數爲N-1時對計數觸發進行翻轉,時鐘的降低沿變爲上升沿,所以計數值爲0,因此每產生n+0.5分頻時鐘的週期,觸發時鐘都要翻轉一次。如圖所示,採用異或門和2分頻模塊設計脈衝扣除電路,脈衝扣除是輸入頻率和2分頻輸出相異或的結果。code
module fenpin(clk,rst_n,clk_out); input clk; input rst_n; output clk_out; reg clk_out2; wire clk_out1; reg [1:0] cnt; reg FB_CLK; always@(posedge clk_out2,negedge rst_n) begin if (!rst_n) FB_CLK<=0; else FB_CLK<=~FB_CLK; end always@(posedge clk_out1,negedge rst_n) begin if (!rst_n) begin cnt<=0; clk_out2<=0; end else if (cnt==2) begin cnt<=0; clk_out2<=1; end else begin cnt<=cnt+1'b1; clk_out2<=0; end end xor xor1(clk_out1,clk,FB_CLK); wire CLK_OUT_R; assign CLK_OUT_R=(cnt==1) ? 1'b0:1'b1; assign clk_out=clk_out2 | CLK_OUT_R; endmodule