在現(xiàn)代芯片中,芯片運(yùn)行時(shí)有必要在兩個(gè)不同的時(shí)鐘之間切換。如果我們使用普通的多路復(fù)用器進(jìn)行切換時(shí)鐘會(huì)發(fā)生什么?多路復(fù)用器有一個(gè)名為 SELECT 的控制信號(hào),該信號(hào)在設(shè)置為“零”時(shí)將 CLK1 傳播到輸出,或者在設(shè)置為“1”時(shí)將 CLK2 傳播到輸出。當(dāng) SELECT 值更改時(shí),由于輸出從當(dāng)前時(shí)鐘源立即切換到下一個(gè)時(shí)鐘源,可能會(huì)引起毛刺。
圖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時(shí)鐘切換的正常多路復(fù)用器實(shí)現(xiàn)的波形(有毛刺)
假如時(shí)鐘由 clk1 切換到 clk2,且切換時(shí)刻為 clk1 輸出電平為高的時(shí)候,此時(shí)立即切換時(shí)鐘就會(huì)導(dǎo)致輸出時(shí)鐘出現(xiàn)毛刺(glitch)。在兩個(gè)時(shí)鐘電平相反的時(shí)候切換時(shí)鐘,肯定有毛刺;電平相同的時(shí)候,即使不產(chǎn)生毛刺,時(shí)鐘切換后的第一個(gè)時(shí)鐘的周期或占空比也不是理想的。所以,為避免毛刺的產(chǎn)生,需要在兩個(gè)時(shí)鐘都為低電平的時(shí)候進(jìn)行時(shí)鐘切換。
時(shí)鐘切換方案的設(shè)計(jì)思路
1.先關(guān)斷當(dāng)前選擇的時(shí)鐘,再新選擇的時(shí)鐘;
2.在時(shí)鐘為低電平的時(shí)鐘進(jìn)行時(shí)鐘切換;
一種典型的時(shí)鐘切換電路如下所示。其中左邊部分存在一個(gè) 互鎖結(jié)構(gòu) ,與SR鎖存器結(jié)構(gòu)類似,不同之處是中間嵌入了2個(gè)下降沿觸發(fā)器,這個(gè)設(shè)計(jì)非常巧妙。 互鎖電路保證了當(dāng)輸出穩(wěn)定后,其兩端的輸出值是互斥的 。插入dff后,電路有了記憶功能, 將互鎖的邏輯用下降沿DFF抓一拍后反饋給另一側(cè),即使當(dāng)目前select發(fā)現(xiàn)變化,只要當(dāng)前選擇的時(shí)鐘下降沿沒有到來時(shí),不會(huì)切換時(shí)鐘,只有當(dāng)select發(fā)生變化,且當(dāng)前選擇的時(shí)鐘下降沿到來后,關(guān)閉當(dāng)前選擇的時(shí)鐘系統(tǒng),等到另一個(gè)時(shí)鐘系統(tǒng)下降沿到來時(shí),切換至另一個(gè)時(shí)鐘系統(tǒng),完成時(shí)鐘無毛刺切換 ,具體如下:
- 當(dāng)select穩(wěn)定值為0時(shí),此時(shí)系統(tǒng)選擇的是clk1時(shí)鐘,i_and1=1,flop1_o=1;i_and2=0,flop2_o=0;
- 當(dāng)selec由0向1進(jìn)行變化時(shí),i_and1輸出變?yōu)?,但是在clk1下降沿到來前,flop1_0會(huì)穩(wěn)定輸出為1,因此i_and2仍然輸出0,flop2_o保持為0,此時(shí)選擇的是clk1時(shí)鐘;
- 當(dāng)clk1下降沿到來時(shí),flop1_0輸出變?yōu)?,關(guān)閉clk1,i_and2的輸出會(huì)變?yōu)?,在clk2下降沿到來前,flop2_o保持為0,此時(shí)系統(tǒng)輸出低電平;
- 當(dāng)clk2下降沿到來時(shí),flop2_0輸出變?yōu)?,打開clk2,此時(shí)系統(tǒng)選擇的時(shí)clk2時(shí)鐘;
圖3無毛刺時(shí)鐘多路復(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
考慮到選擇信號(hào)有可能是異步信號(hào),需要在時(shí)鐘選擇信號(hào)的緩存觸發(fā)器之前加兩級(jí)觸發(fā)器進(jìn)行同步處理,來減少亞穩(wěn)態(tài)的傳播,結(jié)構(gòu)圖如下。該時(shí)鐘切換電路更具有普遍性。
圖4無毛刺時(shí)鐘多路復(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
-
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1884瀏覽量
132856 -
鎖存器
+關(guān)注
關(guān)注
8文章
922瀏覽量
42134 -
多路復(fù)用器
+關(guān)注
關(guān)注
9文章
909瀏覽量
65875 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2032瀏覽量
61891 -
CLK
+關(guān)注
關(guān)注
0文章
127瀏覽量
17523 -
時(shí)鐘切換電路
+關(guān)注
關(guān)注
0文章
7瀏覽量
5843
發(fā)布評(píng)論請(qǐng)先 登錄
關(guān)于如何讓多路復(fù)用器變得簡(jiǎn)單

AD8174緩沖模擬多路復(fù)用器
你真的了解的模擬多路復(fù)用器和開關(guān)的原理和應(yīng)用嗎?
電源多路復(fù)用器是什么
組合邏輯基礎(chǔ)之多路復(fù)用器設(shè)計(jì)
模擬開關(guān)和多路復(fù)用器的基礎(chǔ)參數(shù)
有多路復(fù)用器的運(yùn)算放大器切換到新設(shè)置需要多長(zhǎng)時(shí)間?
cd4052b模擬多路復(fù)用器
多路復(fù)用器:并非那么簡(jiǎn)單
AD9559/PCBZ 時(shí)鐘多路復(fù)用器參考設(shè)計(jì)
AD9558/PCBZ 時(shí)鐘多路復(fù)用器參考設(shè)計(jì)
AD9552/PCBZ 時(shí)鐘多路復(fù)用器參考設(shè)計(jì)
AD9557/PCBZ 時(shí)鐘多路復(fù)用器參考設(shè)計(jì)
1-of-8 FET 多路復(fù)用器/解復(fù)用器-CBT3251

評(píng)論