【導(dǎo)讀】如果將如何設(shè)計(jì)防止毛刺發(fā)生的時(shí)鐘切換電路及危害告訴大家,大家知道后直接用這個(gè)電路就好了,但是如果你忘記了或者沒見過這個(gè)電路是不是就無從下手了!所謂知其然也要知其所以然,只有知道了防毛刺的時(shí)鐘切換電路設(shè)計(jì)思路才能夠融會(huì)貫通!
這里從一個(gè)角度,通過電路設(shè)計(jì)技巧來闡述防毛刺時(shí)鐘切換電路的設(shè)計(jì)思路。希望看過之后,不用參考文章就能夠自己設(shè)計(jì)出這個(gè)電路。
對于一個(gè)時(shí)鐘切換電路,輸入兩個(gè)異步時(shí)鐘clk0、clk1,以及一個(gè)選擇信號(hào)sel。
(1) 假設(shè)不考慮glitch,直接使用Mux就可以完成切頻。電路如下:
由于clk0/clk1/sel之間是異步關(guān)系,時(shí)鐘切換會(huì)發(fā)生在任意時(shí)刻,有一定的概率會(huì)發(fā)生glitch. glitch的危害文章里已經(jīng)詳述,這里不再重復(fù)。
(2) 由于sel和clk0和clk1都是不同步的,我們可以從sel同步的方向入手,假如sel需要和clk0和clk1進(jìn)行同步,那么sel必須分成兩路,一個(gè)和clk0同步,一個(gè)和clk1同步,同步之后的sel訊號(hào)再和clk0/clk1 gating起來,就可以讓問題簡單化。為了將sel分成兩路,并且clk0/clk1需要分別gating, 那么可以將mux邏輯用and/or設(shè)計(jì)出來,如下:
當(dāng)然此Mux電路還可以用兩個(gè)or加上一個(gè)and來實(shí)現(xiàn),都可以。 注意G0和G1兩點(diǎn)就是分別對clk0和clk1進(jìn)行g(shù)ating. 將來會(huì)在G0/G1點(diǎn)插入同步DFF.
(3) 將上面電路拆開成兩部分,一部分電路通過sel產(chǎn)生sel+和sel-兩路,另一部分電路是gating mux電路, 如下:
對于一個(gè)時(shí)鐘切換電路,輸入兩個(gè)異步時(shí)鐘clk0、clk1,以及一個(gè)選擇信號(hào)sel。
(1) 假設(shè)不考慮glitch,直接使用Mux就可以完成切頻。電路如下:
只需要將sel-接上G0, sel+接上G1就是一個(gè)mux電路。將電路分開,是為了后續(xù)技巧性的功能替換。
[page]
(4) 將part0電路換成同樣功能的帶反饋的組合電路(為何要這樣做,屬于電路設(shè)計(jì)直覺和技巧)。最常見帶反饋的電路是RS
觸發(fā)器,因此可以將part0換成如下電路。
(5) 將part0_a或者part0_b替換part0電路,功能不變。如下:
不過,此時(shí)插入同步DFF的地方就多了一個(gè)選擇, 如果直接在G0, G1插入同步DFF, clk0和clk1的gating時(shí)間先后順序不確定,還是有可能發(fā)生毛刺。而在s0和s1處插入同步DFF, 正好利用反饋,讓時(shí)鐘切換按照安全的順序進(jìn)行:
(1) 先gating住之前選擇的時(shí)鐘
(2) 然后再放開將要選擇的時(shí)鐘
在(1)和(2)之間, 輸出時(shí)鐘一直都是無效狀態(tài)(對于2and + 1or的mux來說,無效狀態(tài)就是0)
[page]
(6) 按照上面的分析,得到電路如下:
注意幾點(diǎn):
(1) 對s0插入的DFF需要用clk0作為時(shí)鐘, 對于s1插入的DFF需要用clk1作為時(shí)鐘。
(2) 后一級(jí)的DFF必須使用clock下降沿,因?yàn)槭怯肁ND門進(jìn)行g(shù)ating(如果用上升沿,則更容易出現(xiàn)毛刺)。如果換成2個(gè)OR+1個(gè)AND的MUX, 則必須用上升沿。
(3) 必須插入兩級(jí)DFF防止metal stable, 前一級(jí)可以用上升沿,也可以用下降沿,用上升沿是為了節(jié)省時(shí)間。
(4) 所有的DFF 復(fù)位值都是0,即讓clk_out處于無效狀態(tài)。
(5) 必須滿足先gating后放開的順序,如果不滿足,可以在G0/G1處各插入一個(gè)反相器。(用part0_b搭配part1的時(shí)候需要插入反相器,如下圖)
(6)搭配不同的part0電路和part1電路,經(jīng)過稍許修改,都可以完成防毛刺切頻電路的設(shè)計(jì)。