在現(xiàn)代芯片中,芯片運行時有必要在兩個不同的時鐘之間切換。如果我們使用普通的多路復(fù)用器進行切換時鐘會發(fā)生什么?多路復(fù)用器有一個名為 SELECT 的控制信號,該信號在設(shè)置為“零”時將 CLK1 傳播到輸出,或者在設(shè)置為“1”時將 CLK2 傳播到輸出。當(dāng) SELECT 值更改時,由于輸出從當(dāng)前時鐘源立即切換到下一個時鐘源,可能會引起毛刺。

圖1普通多路復(fù)用器
verilog代碼:
module clk_select1(
input clk1,
input clk2,
input rst_n,
input sel,
output out_clk
);
assign out_clk = sel?clk2:clk1;
endmodule

圖2時鐘切換的正常多路復(fù)用器實現(xiàn)的波形(有毛刺)
假如時鐘由 clk1 切換到 clk2,且切換時刻為 clk1 輸出電平為高的時候,此時立即切換時鐘就會導(dǎo)致輸出時鐘出現(xiàn)毛刺(glitch)。在兩個時鐘電平相反的時候切換時鐘,肯定有毛刺;電平相同的時候,即使不產(chǎn)生毛刺,時鐘切換后的第一個時鐘的周期或占空比也不是理想的。所以,為避免毛刺的產(chǎn)生,需要在兩個時鐘都為低電平的時候進行時鐘切換。
時鐘切換方案的設(shè)計思路
1.先關(guān)斷當(dāng)前選擇的時鐘,再新選擇的時鐘;
2.在時鐘為低電平的時鐘進行時鐘切換;
一種典型的時鐘切換電路如下所示。其中左邊部分存在一個 互鎖結(jié)構(gòu) ,與SR鎖存器結(jié)構(gòu)類似,不同之處是中間嵌入了2個下降沿觸發(fā)器,這個設(shè)計非常巧妙。 互鎖電路保證了當(dāng)輸出穩(wěn)定后,其兩端的輸出值是互斥的 。插入dff后,電路有了記憶功能, 將互鎖的邏輯用下降沿DFF抓一拍后反饋給另一側(cè),即使當(dāng)目前select發(fā)現(xiàn)變化,只要當(dāng)前選擇的時鐘下降沿沒有到來時,不會切換時鐘,只有當(dāng)select發(fā)生變化,且當(dāng)前選擇的時鐘下降沿到來后,關(guān)閉當(dāng)前選擇的時鐘系統(tǒng),等到另一個時鐘系統(tǒng)下降沿到來時,切換至另一個時鐘系統(tǒng),完成時鐘無毛刺切換 ,具體如下:
- 當(dāng)select穩(wěn)定值為0時,此時系統(tǒng)選擇的是clk1時鐘,i_and1=1,flop1_o=1;i_and2=0,flop2_o=0;
- 當(dāng)selec由0向1進行變化時,i_and1輸出變?yōu)?,但是在clk1下降沿到來前,flop1_0會穩(wěn)定輸出為1,因此i_and2仍然輸出0,flop2_o保持為0,此時選擇的是clk1時鐘;
- 當(dāng)clk1下降沿到來時,flop1_0輸出變?yōu)?,關(guān)閉clk1,i_and2的輸出會變?yōu)?,在clk2下降沿到來前,flop2_o保持為0,此時系統(tǒng)輸出低電平;
- 當(dāng)clk2下降沿到來時,flop2_0輸出變?yōu)?,打開clk2,此時系統(tǒng)選擇的時clk2時鐘;

圖3無毛刺時鐘多路復(fù)用器
verilog代碼:
module clk_select2(
input clk1,
input clk2,
input rst_n,
input sel,
output out_clk
);
reg ff1;
reg ff2;
always @(negedge clk1 or negedge rst_n) begin
if(!rst_n)
ff1 <= 1'b0;
else begin
ff1 <= ~ff2 & !sel;
end
end
always @(negedge clk2 or negedge rst_n) begin
if(!rst_n)
ff2 <= 1'b0;
else begin
ff2 <= ~ff1 & sel;
end
end
assign out_clk = (ff1 & clk1) | (ff2 & clk2);
endmodule
考慮到選擇信號有可能是異步信號,需要在時鐘選擇信號的緩存觸發(fā)器之前加兩級觸發(fā)器進行同步處理,來減少亞穩(wěn)態(tài)的傳播,結(jié)構(gòu)圖如下。該時鐘切換電路更具有普遍性。

圖4無毛刺時鐘多路復(fù)用器(使用雙同步器)
verilog代碼:
module clk_select3(
input clk1,
input clk2,
input rst_n,
input sel,
output out_clk
);
reg ff1,ff1_d;
reg ff2,ff2_d;
always @(negedge clk1 or negedge rst_n) begin
if(!rst_n)
{ff1,ff1_d} <= 2'b00;
else begin
ff1_d <= ~ff2 & !sel;
ff1 <= ff1_d;
end
end
always @(negedge clk2 or negedge rst_n) begin
if(!rst_n) {ff2,ff2_d} <= 2'b00;
else begin
ff2_d <= ~ff1 & sel;
ff2 <= ff2_d;
end
end
assign out_clk = (ff1 & clk1) | (ff2 & clk2);
endmodule
-
時鐘
+關(guān)注
關(guān)注
11文章
1982瀏覽量
135062 -
鎖存器
+關(guān)注
關(guān)注
8文章
957瀏覽量
45203 -
多路復(fù)用器
+關(guān)注
關(guān)注
9文章
1058瀏覽量
66788 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2063瀏覽量
63432 -
CLK
+關(guān)注
關(guān)注
0文章
132瀏覽量
18054 -
時鐘切換電路
+關(guān)注
關(guān)注
0文章
7瀏覽量
5911
發(fā)布評論請先 登錄
關(guān)于如何讓多路復(fù)用器變得簡單
PXI高密度多路復(fù)用器應(yīng)用于飛機雷電防護試驗
AD8174緩沖模擬多路復(fù)用器
你真的了解的模擬多路復(fù)用器和開關(guān)的原理和應(yīng)用嗎?
電源多路復(fù)用器是什么
組合邏輯基礎(chǔ)之多路復(fù)用器設(shè)計
模擬開關(guān)和多路復(fù)用器的基礎(chǔ)參數(shù)
有多路復(fù)用器的運算放大器切換到新設(shè)置需要多長時間?
多路復(fù)用器:并非那么簡單
AD9559/PCBZ 時鐘多路復(fù)用器參考設(shè)計
AD9558/PCBZ 時鐘多路復(fù)用器參考設(shè)計
AD9552/PCBZ 時鐘多路復(fù)用器參考設(shè)計
AD9557/PCBZ 時鐘多路復(fù)用器參考設(shè)計
1-of-8 FET 多路復(fù)用器/解復(fù)用器-CBT3251
使用普通的多路復(fù)用器進行切換時鐘會發(fā)生什么?
評論