1.整數分頻電路,無占空比要求
對於偶數,N分頻電路,只需實現一個N/2個狀態的計數器即可,觸發器 采到計數器為N/2-1時,將clk_out取反。
對於奇數,N分頻電路,可用狀態機實現,前幾個狀態輸出0,后幾個狀態輸出1;也可用計數器實現,比如7分頻電路,計數器從0到6循環計數,觸發器采到2和6時,將clk_out取反。
2.整數分頻電路,50%占空比
對於偶數,保證50%占空比很簡單。
對於奇數,N分頻時鍾,可用兩個差90°相位的2N分頻時鍾異或得到。如3分頻時鍾,可以用兩個6分頻的時鍾異或得到,如何保證兩個6分頻時鍾相位差為90°呢?也很簡單,先生成一個上升沿觸發的計數器cnt,第一個時鍾clk1使用上升沿觸發器產生,當觸發器采到cnt為2或5時,將clk1取反;第二個時鍾使用下降沿觸發器產生,當觸發器采到cnt為1或4時,將clk2取反。這樣便得到了兩個差90°相位的6分頻時鍾,如下圖所示。
3.小數分頻
如3.5分頻電路,意味着7個周期產生2個對稱的脈沖,生成一個可以簡單划分下前1.5個周期輸出1(0),1.5~3.5輸出0(1),3.5~5輸出1(0),5~7輸出0(1),那么怎么去實現半個周期呢?,可以注意到上升沿和下降沿就差半個周期。我們生成一個7bit的上升沿的環形計數器,那么cnt[0]就可以實現第一個時鍾周期輸出1(0),前面的分析說到要在前1.5個時鍾周期輸出0(1),那剩下0.5個時鍾周期怎么實現呢?我們產生一個下降沿觸發的clk1,讓clk1在采到cnt[0]為1時輸出1,其他情況輸出0. 再cnt[0]和clk1相或,就可以得到前1.5個周期clk_out輸出1,其他輸出0;同樣的方法對3.5~5這1.5個周期進行同樣處理,就可以讓clk_out在這1.5個周期輸出1。最終得到了3.5分頻的時鍾。此種方法還可以用來得到前面的50%占空比的奇數分頻時鍾。
代碼如下:
module main (
);
reg clk,rst;
initial begin
clk = 1'b0;
forever #5 clk = ~clk;
end
initial begin
rst = 1'b1;
#20 rst = 1'b0;
#1000;
$finish;
end
reg clk_p_div6,clk_n_div6;
wire clk_div;
reg [6:0] cnt;
reg clk1;
always @(posedge clk ) begin
if (rst) begin
cnt <= 7'b0000001;
end
else begin
cnt <= {cnt[5:0],cnt[6]};
end
end
always @(negedge clk ) begin
if (rst) begin
clk1 <= 1'b0;
end
else if (cnt == 7'b0000001 || cnt==7'b0001000) begin
clk1 <= 1'b1;
end
else begin
clk1 <= 1'b0;
end
end
assign clk_div = cnt[0] | clk1 | cnt[4];
endmodule