該時序電路實現(xiàn)了一個序列檢測器,當輸入序列‘datain’中出現(xiàn)‘101’時,標志位 F 將輸 出‘1’,其他時刻輸出‘0’。電路中‘clk’為時鐘信號,‘D1’,‘D2’,‘D3’為移位寄存器的輸出,’enable’ 為該電路的使能信號。其功能仿真波形如下圖所示:
當一個邏輯門的輸入有兩個或兩個以上的變量發(fā)生改變時,由于這些變量是經(jīng)過不同路 徑產(chǎn)生的,使得它們狀態(tài)改變的時刻有先有后,這種時差引起的現(xiàn)象稱為競爭(Race)。競 爭的結(jié)果將很可能導致冒險(Hazard)發(fā)生(例如產(chǎn)生毛刺),造成錯誤的后果,并影響系 統(tǒng)的工作。
組合邏輯電路的冒險僅在信號狀態(tài)改變的時刻出現(xiàn)毛刺,這種冒險是過渡性的,它不會 使穩(wěn)態(tài)值偏離正常值,但在時序電路中,冒險是本質(zhì)的,可導致電路的輸出值永遠偏離正常 值或者發(fā)生振蕩。
避免冒險的最簡單的方法是同一時刻只允許單個輸入變量發(fā)生變化,或者使用寄存器采 樣的辦法。
信號在 FPGA 器件中通過邏輯單元連線時,一定存在延時。延時的大小不僅和連線的長 短和邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號在器件 中傳輸?shù)臅r候,所需要的時間是不能精確估計的,當多路信號同時發(fā)生跳變的瞬間,就產(chǎn)生 了“競爭冒險”。這時,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號就是“毛刺”。
可見,即使是在最簡單的邏輯運算中,如果出現(xiàn)多路信號同時跳變的情況,在通過內(nèi)部 走線之后,就一定會產(chǎn)生毛刺。而現(xiàn)在數(shù)字電路設計中的信號往往是由時鐘控制的,如果將 帶有毛刺的輸出信號直接連接到時鐘輸入端、清零或置位端口的設計,可能會導致嚴重的后 果;此外對于多數(shù)據(jù)輸入的復雜運算系統(tǒng),每個數(shù)據(jù)都由相當多的位數(shù)組成。這時,每一級 的毛刺都會對結(jié)果有嚴重的影響,如果是多級的設計,那么毛刺累加后甚至會影響整個設計 的可靠性和精確性。
判斷一個邏輯電路在某些輸入信號發(fā)生變化時是否會產(chǎn)生毛刺,首先要判斷信號是否會 同時變化,然后判斷在信號同時變化的時候,是否會產(chǎn)生毛刺,這可以通過邏輯函數(shù)的卡諾 圖或邏輯函數(shù)表達式來進行判斷。
毛刺是數(shù)字電路設計中的棘手問題,它的出現(xiàn)會影響電路工作的穩(wěn)定性、可靠性,嚴重 時會導致整個數(shù)字系統(tǒng)的誤動作和邏輯紊亂。
這是一種比較傳統(tǒng)的去除毛刺的方法。原理就是用一個 D 觸發(fā)器去讀帶毛刺的信號, 利用 D 觸發(fā)器對輸入信號的毛刺不敏感的特點,去除信號中的毛刺。在實際中,對于簡單 的邏輯電路,尤其是對信號中發(fā)生在非時鐘跳變沿的毛刺信號,去除效果非常的明顯。
但是如果毛刺信號發(fā)生在時鐘信號的跳變沿,D 觸發(fā)器的效果就沒有那么明顯了(加 D 觸發(fā)器以后的輸出 q,仍含有毛刺)。另外,D 觸發(fā)器的使用還會給系統(tǒng)帶來一定的延時, 特別是在系統(tǒng)級數(shù)較多的情況下,延時也將變大,因此在使用 D 觸發(fā)器去除毛刺的時候, 一定要視情況而定,并不是所有的毛刺都可以用 D 觸發(fā)器來消除。
2、信號同步法 設計數(shù)字電路的時候采用同步電路可以大大減少毛刺。由于大多數(shù)毛刺都比較短(大
概幾個納秒),只要毛刺不出現(xiàn)在時鐘跳變沿,毛刺信號就不會對系統(tǒng)造成危害了。因此一 般認為,只要在整個系統(tǒng)中使用同一個時鐘就可以實現(xiàn)系統(tǒng)同步。但是,時鐘信號在 FPGA 器件中傳遞時是有延時的,我們無法預知時鐘跳變沿的精確位置。也就是說我們無法保證在 某個時鐘的跳變沿讀取的數(shù)據(jù)是一個穩(wěn)定的數(shù)據(jù),尤其是在多級設計中,這個問題就更加突 出。因此,做到真正的"同步"就是去除毛刺信號的關(guān)鍵問題。所以同步的關(guān)鍵就是保證在時 鐘的跳變沿讀取的數(shù)據(jù)是穩(wěn)定的數(shù)據(jù)而不是毛刺數(shù)據(jù)。以下為兩種具體的信號同步方法。
(1)信號延時同步法 信號延時法,它的原理就是在兩級信號傳遞的過程中加一個延時環(huán)節(jié),從而保證在下一
個模塊中讀取到的數(shù)據(jù)是穩(wěn)定后的數(shù)據(jù),即不包含毛刺信號。這里所指的信號延時可以是數(shù) 據(jù)信號的延時,也可以是時鐘信號的延時。
(2)狀態(tài)機控制 使用狀態(tài)機也可以實現(xiàn)信號的同步和消除毛刺的目的。在數(shù)據(jù)傳遞比較復雜的多模塊系
統(tǒng)中,由狀態(tài)機在特定的時刻分別發(fā)出控制特定模塊的時鐘信號或者模塊使能信號,狀態(tài)機 的循環(huán)控制就可以使得整個系統(tǒng)協(xié)調(diào)運作,同時減少毛刺信號。那么只要我們在狀態(tài)機的觸 發(fā)時間上加以處理,就可以避免競爭冒險,從而抑制毛刺的產(chǎn)生。
刺的出現(xiàn),因為格雷碼計數(shù)器的輸出每次只有一位跳變。 其他關(guān)于毛刺的詳細討論,請見補充教程 2:關(guān)于毛刺問題的探討。
同步電路是指所有電路在同一個公共時鐘的上升沿或下降沿的觸發(fā)下同步地工作。但在 實際系統(tǒng)中,往往存在多時鐘域的情況,這時同步的概念有所延伸,不再專指整個設計同步 于同一時鐘沿,而是指設計應該做到局部同步,在每個時鐘域內(nèi)的電路要同步于同一時鐘沿。
目前的工程設計中一般使用同步時序電路來完成整個系統(tǒng)的設計,由上一節(jié)可見,時鐘 在同步電路設計中起著至關(guān)重要的作用。那么,我們在設計時首先要完成的是對時鐘的設計。 如今在設計中常見的時鐘類型包括: 全局時鐘、內(nèi)部邏輯時鐘和門控時鐘。
全局時鐘即同步時鐘,它通過 FPGA 芯片內(nèi)的全局時鐘布線網(wǎng)絡或區(qū)域時鐘網(wǎng)絡來驅(qū) 動,全局時鐘具有高扇出、高精度、低 Jitter 和低Skew 的特點,它到芯片中的每一個寄存 器的延遲最短,且該延遲可被認為是固定值。所以我們推薦在所有的設計中的時鐘都使用全 局時鐘。全局時鐘的設計有以下幾種方法:
(2). 將 FPGA 芯片內(nèi)部邏輯產(chǎn)生的時鐘分配至全局時鐘布線網(wǎng)絡。 (3). 將外部時鐘通過專用的全局時鐘輸入引腳引入 FPGA。 在我們的設計中,一般推薦電路中的所有的時鐘都由 PLL 鎖相環(huán)產(chǎn)生。一方面,PLL
PLL 鎖相環(huán)默認將其驅(qū)動的時鐘分配至全局時鐘網(wǎng)絡或區(qū)域時鐘網(wǎng)絡,Jitter 和 Skew 都很小。 下圖取自我們項目中的一個 PLL 鎖相環(huán)設計,該PLL 用于驅(qū)動 DDR 的接口模塊。因為
功能所需,DDR 接口需要三個 133MHz 的時鐘,相位分別是‘-90 o ’、‘0 o ’、‘-180 o ’,圖中所示 即為該時鐘的產(chǎn)生模塊。我們使用 QuartusⅡ的Megawizard 生成 PLL 鎖相環(huán)的 IP core。其 中‘inclk_66’為 PLL 鎖相環(huán)的輸入時鐘,由外部的 66MHz 晶振提供,經(jīng)過 PLL 倍頻和移相
2. 內(nèi)部邏輯時鐘 內(nèi)部邏輯時鐘即指由芯片內(nèi)部的組合邏輯或計數(shù)器分頻產(chǎn)生的時鐘。 對于組合邏輯時鐘,特別是由多級組合邏輯產(chǎn)生的時鐘,是要被嚴格禁止使用的,因
為一方面組合邏輯極容易產(chǎn)生毛刺,特別是對多級組合邏輯;另一方面組合邏輯電路的 Jitter 和 Skew 比較大,這將惡化時鐘的質(zhì)量。所以,一般組合邏輯產(chǎn)生的內(nèi)部時鐘僅僅適用于時 鐘頻率較低、時鐘精度要求不高的情況。
對于計數(shù)器分頻產(chǎn)生的時鐘,也應該盡量少地使用,因為這種時鐘會帶來比較大的延 遲,降低設計的可靠性,也使得靜態(tài)時序分析變得復雜。計數(shù)器分頻時鐘需完成的邏輯功能 完全可由 PLL 鎖相環(huán)或時鐘使能電路替代。
還有一種由觸發(fā)器產(chǎn)生的時鐘—行波時鐘,即一個觸發(fā)器的輸出用作另一個觸發(fā)器的 時鐘輸入。文中 1.1.2 節(jié)描述的時鐘分頻電路就是一種行波時鐘。因為各觸發(fā)器的時鐘之間 產(chǎn)生較大的時間偏移,很容易就會違反建立時間、保持時間的要求,導致亞穩(wěn)態(tài)的發(fā)生。所 以,這種行波時鐘要被嚴格禁止使用。
3. 門控時鐘 一般情況下,應該避免使用門控時鐘。因為經(jīng)組合邏輯產(chǎn)生的門控時鐘極可能產(chǎn)生毛
在同步電路或異步電路中,如果觸發(fā)器的 setup 時間或 hold 時間不能得到滿足,就可 能產(chǎn)生亞穩(wěn)態(tài),此時觸發(fā)器輸出端 Q 在有效時鐘沿之后比較長的一段時間處于不確定的狀 態(tài),在這段時間里 Q 端將會產(chǎn)生毛刺并不斷振蕩、最終固定在某一電壓值上,此電壓值并 不一定等于原來數(shù)據(jù)輸入端 D
(resolution time)。經(jīng)過決斷 時間之后,Q 端將穩(wěn)定到 0 或
1 上,但是究竟是 0 還是 1, 這是隨機的,與輸入沒有必然 的關(guān)系。
亞穩(wěn)態(tài)的危害主要體 現(xiàn)在破壞系統(tǒng)得穩(wěn)定性上,由于輸出在穩(wěn)定下來之前可能是毛刺、振蕩、固定的某一電壓值, 因此亞穩(wěn)態(tài)除了導致邏輯誤判之外,嚴重情況下輸出 0~1 之間的中間電壓值還會使下一級 產(chǎn)生亞穩(wěn)態(tài)(即導致亞穩(wěn)態(tài)的傳播)。 邏輯誤判將導致功能性錯誤,而亞穩(wěn)態(tài)的傳播則擴 大了故障面,嚴重時將導致系統(tǒng)崩潰。
在異步時序電路中更容易發(fā)生亞穩(wěn)態(tài),因為異步電路一般具有多個時鐘域,數(shù)據(jù)在兩個 時鐘域間傳遞時,非常容易導致 setup 時間或 hold 時間不滿足而發(fā)生亞穩(wěn)態(tài)。在同步時序 電路中,當兩個觸發(fā)器間的組合邏輯延遲過大時,會導致 setup 時間不滿足而發(fā)生亞穩(wěn)態(tài)。
對跨時鐘域數(shù)據(jù)的處理的核心就是要保證下級時鐘對上級數(shù)據(jù)采樣的 setup 時間或 hold 時間滿足要求,即盡量避免亞穩(wěn)態(tài)的發(fā)生和傳播。但是,我們知道,只要系統(tǒng)中有異 步元件,亞穩(wěn)態(tài)就是無法避免的,因此設計的電路首先要減少亞穩(wěn)態(tài)導致錯誤的發(fā)生,其次 要使系統(tǒng)對產(chǎn)生的錯誤不敏感。我們推薦使用以下方法來解決異步時鐘域數(shù)據(jù)同步問題。
1. 用觸發(fā)器打兩拍 如下圖,左邊為異步輸入端,經(jīng)過兩級觸發(fā)器同步,在右邊的輸出將是同步的,而且
該輸出基本不存在亞穩(wěn)態(tài)。其原理是即使第一個觸發(fā)器的輸出端存在亞穩(wěn)態(tài),經(jīng)過一個 CLK 周期后,第二個觸發(fā)器 D 端的電平仍未穩(wěn)定的概率非常小,因此第二個觸發(fā)器 Q 端基本不 會產(chǎn)生亞穩(wěn)態(tài)。然而,亞穩(wěn)態(tài)是無法被根除的,一旦亞穩(wěn)態(tài)發(fā)生,后果的嚴重程度依賴于你
細的靜態(tài)時序分析,然后將違反 setup 時間和 hold 時間的情況一一列出,在不影響其它設 計性能的前提下,綜合考慮調(diào)整兩級時鐘的相位關(guān)系,最終使其 setup 時間和 hold 時間滿 足要求。
如果所設計的是時序電路,需要觸發(fā)器,則 FPGA 開發(fā)軟件會自動將觸發(fā)器配置在查 找表的后面,實現(xiàn)組合邏輯時就將觸發(fā)器旁路掉。
FPGA入門教程.pdf
(672.08 KB, 下載次數(shù): 478)

感謝樓主| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |