|
勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載37:Verilog代碼風(fēng)格之同步以及時鐘的設(shè)計原則 特權(quán)同學(xué),版權(quán)所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD
有了前面的鋪墊,大家應(yīng)該明白了寄存器的代碼編寫。接下來我們要更進一步從深沉次來探討基于寄存器的同步以及時鐘的設(shè)計原則。 雖然在上一章已經(jīng)對組合邏輯和時序邏輯的基本概念做過描述,但是這里還是要再額外嘮叨幾句組合邏輯和時序邏輯的歷史淵源,好讓大家更加信服為什么時序邏輯要明顯優(yōu)于組合邏輯的設(shè)計。早期的可編程邏輯設(shè)計,限于當時的工藝水平,無論是邏輯資源還是布線資源都比較匱乏,所以工程師們更多是用可編程器件做一些簡單的邏輯粘合。所謂的邏輯粘合,無非是一些與、或、非等邏輯門電路簡單拼湊的組合邏輯,沒有時序邏輯,因此不需要引入時鐘。而今天的FPGA器件的各種資源都非常豐富,已經(jīng)很少有人只是用其實現(xiàn)簡單的組合邏輯功能,而是更多的大量使用時序邏輯來實現(xiàn)各種復(fù)雜的功能,而一旦大量的使用時序邏輯,時鐘設(shè)計的各種攻略也就被不斷的提上臺面。可不是,時鐘好比時序邏輯的心臟,它的好壞直接關(guān)系到整個系統(tǒng)的是非成敗。那么,時鐘設(shè)計到底有什么講究,哪些基本原則是必須遵循的呢?搞清楚這個問題之前,我們勢必要先全面的了解時鐘以及整個時序電路的工作原理。 在一個時序邏輯中,時鐘信號掌控著所有輸入和輸出信號的進出。在每個時鐘有效沿(通常是上升沿),寄存器的輸入數(shù)據(jù)將會被采樣并傳送到輸出端,此后輸出信號可能會在經(jīng)歷長途跋涉般的“旅途”中經(jīng)過各種組合邏輯電路并會隨著信號的傳播延時而處于各種“搖擺晃蕩”之中,直到所有相關(guān)的信號都到達下一級寄存器的輸入端。這個輸入端的信號將會一直保持直到下一個時鐘有效沿的來臨。每一級寄存器都在不斷的重復(fù)著這樣的數(shù)據(jù)流采集和傳輸。單是這樣枯燥的文字描述時序邏輯和時鐘之間的工作機理未免有些乏味,不妨舉個輪船通行三峽大壩的例子做類比。 如圖5.8所示,三峽大壩有五級船閘,船由上游駛往下游時,船位于上游。①先關(guān)閉上游閘門和上游閥門。②關(guān)閉第一級下游閘門和閥門,打開上游閥門,水由上游流進閘室,閘室水面與上游相平時,打開上游閘門,船由上游駛進閘室。③關(guān)閉上游閘門和閥門,打開第一級下游閥門,當閘室水面降到跟下游水面相平時,打開下游閘門,船駛出第一級閘室。如此操作4次,通過后面的四級船閘,開往下游。船閘的原理實際上是靠兩個閥門開關(guān),人為地先后造成兩個連通器,使船閘內(nèi)水面先后與上、下游水面相平。
圖5.8 三峽大壩五級閘門示意圖 對于單個數(shù)據(jù)的傳輸,就非常類似這里輪船通過多級閘門的例子。輪船就是我們要傳輸?shù)臄?shù)據(jù),閘門的開關(guān)就好比時鐘的有效邊沿變化,水位的升降過程也好像相關(guān)數(shù)據(jù)在兩個寄存器間經(jīng)過各種組合邏輯的傳輸過程。當輪船還處于上一級閘門準備進入下一級閘門時,要么當前閘門的水位要降低到下一級閘門的水平,要么下一級閘門的水位要升到上一級閘門的水平,只要這個條件不滿足,最終結(jié)果都有可能造成輪船的顛簸甚至翻船。這多少頁有點像寄存器鎖存數(shù)據(jù)需要保證的建立時間和保持時間要求。關(guān)于建立時間和保持時間,有如下的定義: ● 在時鐘的有效沿之前,必須確保輸入寄存器的數(shù)據(jù)在“建立時間”內(nèi)是穩(wěn)定的。 ● 在時鐘的有效沿之后,必須確保寄存器的輸出數(shù)據(jù)至少在“保持時間”內(nèi)是穩(wěn)定的。 在大家理解了時鐘和時序邏輯的工作機理后,也就能夠理解為什么時鐘信號對于時序邏輯而言是如此的重要。關(guān)于時鐘的設(shè)計要點,主要有以下幾個方面: ① 避免使用門控時鐘或系統(tǒng)內(nèi)部邏輯產(chǎn)生的時鐘,多用使能時鐘去替代。 門控時鐘或系統(tǒng)內(nèi)部邏輯產(chǎn)生的時鐘很容易導(dǎo)致功能或時序出現(xiàn)問題。尤其是內(nèi)部邏輯(組合邏輯)產(chǎn)生的時鐘容易出現(xiàn)毛刺,影響設(shè)計的功能實現(xiàn);組合邏輯固有的延時也容易導(dǎo)致時序問題。 ② 對于需要分頻或倍頻的時鐘,用器件內(nèi)部的專用時鐘管理(如PLL或DLL)單元去生成。 用FPGA內(nèi)部的邏輯去做分頻倒不是難事,倍頻恐怕就不行了。但是無論是分頻還是倍頻,在通常情況下都不建議用內(nèi)部邏輯去實現(xiàn),而應(yīng)該采用器件內(nèi)部的專用時鐘管理單元(如PLL或DLL)來產(chǎn)生,這類專用時鐘管理單元的使用并不復(fù)雜,在EDA工具中打開配置頁面進行簡單參數(shù)的設(shè)置,然后在代碼中對接口進行例化就可以很方便的使用引出的相應(yīng)分頻或倍頻時鐘進行使用了。 ③ 盡量對輸入的異步信號用時鐘進行鎖存。 所謂異步信號,是指兩個處于不同時鐘頻率或相位控制下的信號。這樣的信號在相互接口的時候如果沒有可靠的同步機制,則存在很大的隱患,甚至極有可能導(dǎo)致數(shù)據(jù)的誤采集。筆者在工程實踐中常常遇到這類異步信號誤觸發(fā)或誤采集的問題,因此也需要引起初學(xué)者足夠的重視。在筆者的《深入淺出玩轉(zhuǎn)FPGA》筆記6中列舉的一些改進的復(fù)位設(shè)計方法就是非常典型的異步信號的同步機制。 ④ 避免使用異步信號進行復(fù)位或置位控制。 這個點和上一個點所強調(diào)的是同一類問題,異步信號不建議直接作為內(nèi)部的復(fù)位或置位控制信號,最好能夠用本地時鐘鎖存多拍后做同步處理,然后再使用。 上述幾個點對于初學(xué)者可能很難理解和體會,沒有關(guān)系,當你有了實踐經(jīng)歷以后回頭再品味一下或許就有味道多了。由于這幾個點多少也算是比較高級的技巧了,所以無法一一擴展開來深入剖析。更多相關(guān)擴展的知識點讀者可以參考筆者的《深入淺出玩轉(zhuǎn)FPGA》一書,那里有更多更詳細的介紹和說明。 |