1.數字電路設計入門
2.FPGA 簡介
3.FPGA 開發流程
4.RTL設計
5.QuartusⅡ設計實例
6. ModelSim和 Testbench
1.數字電路設計入門
1.1 數字電路設計
數字電路設計的核心是邏輯設計。通常,數字電路的邏輯值只有‘1’和‘0’,表征的是模擬 電壓或電流的離散值,一般‘1’代表高電平,‘0’代表低電平。
高低電平的含義可以理解為,存在一個判決電平,當信號的電壓值高于判決電平時,我 們就認為該信號表征高電平,即為‘1’。反之亦然。
當前的數字電路中存在許多種電平標準,比較常見的有 TTL、CMOS、LVTTL、LVCMOS、
ECL、PECL、LVDS、HSTL、SSTL 等。這些電平的詳細指標請見《補充教程 1:電平標準》。 數字電路設計大致可分為組合邏輯電路和時序邏輯電路。 一般的數字設計的教材中對組合邏輯電路和時序邏輯電路的定義分別為:組合邏輯電
路的輸出僅與當前的輸入有關 ,而時序邏輯電路的輸出不但與輸入有關,還和系統上一個 狀態有關。
但是在設計中,我們一般以時鐘的存在與否來區分該電路的性質。由時鐘沿驅動工作 的電路為時序邏輯電路。大家注意,這兩種電路并不是獨立存在的,他們相互交錯存在于整 個電路系統的設計中。
1.1.1 組合邏輯電路 組合邏輯電路由任意數目的邏輯門電路組成,一般包括與門、或門、非門、
異或門、與非門、或非門等。一般的組合邏輯電路如下圖:
44.001.jpg (52.22 KB, 下載次數: 147)
下載附件
2018-2-13 01:50 上傳
其中 A,B,C,D,E,F 為輸入,G 為輸出。
1.1.2時序邏輯電路
時序邏輯電路由時鐘的上升沿或下降沿驅動工作,其實真正被時鐘沿驅動的是電路中的觸發器(Register),也稱為寄存器。觸發器的工作原理和參數如下圖:
Register的原理和參數
0.png (14.46 KB, 下載次數: 129)
下載附件
2018-2-13 01:37 上傳
tsu:建立時間,在時鐘有效沿到來之前觸發器數據輸入應保持穩定的時間,如果建立時 間不夠,數據將不能在這個時鐘沿被打入觸發器。它間接約束了組合邏輯的最大延時。
thold:保持時間,在觸發器數據輸入引腳的數據在系統有效時鐘沿到來后,需要保持穩 定的時間,如果保持時間不夠,數據同樣不能被打入觸發器。它間接約束了組合邏輯的最 小延時.
tc-q: 觸發器從有效時鐘沿到來到輸出有效的最大時間。
下面是兩個簡單的時序邏輯電路例子:
(1)、時鐘分頻電路
44.003.jpg (53.4 KB, 下載次數: 136)
下載附件
2018-2-13 01:50 上傳
該時序電路的功能為實現對時鐘’clk’的 4 分頻,其中’clk_2’為 2 分頻時鐘,’clk_4’為 4分頻時鐘,’enable’為該電路的使能信號。其功能仿真波形如下圖所示:
44.004.jpg (20.7 KB, 下載次數: 120)
下載附件
2018-2-13 01:50 上傳
(2)、序列檢測器
44.005.jpg (59.05 KB, 下載次數: 123)
下載附件
2018-2-13 01:50 上傳
該時序電路實現了一個序列檢測器,當輸入序列‘datain’中出現‘101’時,標志位 F 將輸 出‘1’,其他時刻輸出‘0’。電路中‘clk’為時鐘信號,‘D1’,‘D2’,‘D3’為移位寄存器的輸出,’enable’ 為該電路的使能信號。其功能仿真波形如下圖所示:
44.006.jpg (29.63 KB, 下載次數: 128)
下載附件
2018-2-13 01:50 上傳
可見,時序電路設計的核心是時鐘和觸發器,這兩者也是我們設計電路時需重點關注的。
1.2毛刺的產生與消除 1.2.1競爭與冒險
當一個邏輯門的輸入有兩個或兩個以上的變量發生改變時,由于這些變量是經過不同路 徑產生的,使得它們狀態改變的時刻有先有后,這種時差引起的現象稱為競爭(Race)。競 爭的結果將很可能導致冒險(Hazard)發生(例如產生毛刺),造成錯誤的后果,并影響系 統的工作。
組合邏輯電路的冒險僅在信號狀態改變的時刻出現毛刺,這種冒險是過渡性的,它不會 使穩態值偏離正常值,但在時序電路中,冒險是本質的,可導致電路的輸出值永遠偏離正常 值或者發生振蕩。
避免冒險的最簡單的方法是同一時刻只允許單個輸入變量發生變化,或者使用寄存器采 樣的辦法。
1.2.2毛刺的產生與危害
信號在 FPGA 器件中通過邏輯單元連線時,一定存在延時。延時的大小不僅和連線的長 短和邏輯單元的數目有關,而且也和器件的制造工藝、工作環境等有關。因此,信號在器件 中傳輸的時候,所需要的時間是不能精確估計的,當多路信號同時發生跳變的瞬間,就產生 了“競爭冒險”。這時,往往會出現一些不正確的尖峰信號,這些尖峰信號就是“毛刺”。
讓我們來具體看一下毛刺是如何產生的。下圖是一個與門電路,
44.007.jpg (28.09 KB, 下載次數: 135)
下載附件
2018-2-13 01:50 上傳
我們期望的設計是,a 和 b 信號同時變化,這樣輸出 OUT 將一直為 0,但是實際中 OUT
產生了毛刺,它的仿真波形如下所示:
44.008.jpg (14.25 KB, 下載次數: 131)
下載附件
2018-2-13 01:50 上傳
可見,即使是在最簡單的邏輯運算中,如果出現多路信號同時跳變的情況,在通過內部 走線之后,就一定會產生毛刺。而現在數字電路設計中的信號往往是由時鐘控制的,如果將 帶有毛刺的輸出信號直接連接到時鐘輸入端、清零或置位端口的設計,可能會導致嚴重的后 果;此外對于多數據輸入的復雜運算系統,每個數據都由相當多的位數組成。這時,每一級 的毛刺都會對結果有嚴重的影響,如果是多級的設計,那么毛刺累加后甚至會影響整個設計 的可靠性和精確性。 判斷一個邏輯電路在某些輸入信號發生變化時是否會產生毛刺,首先要判斷信號是否會 同時變化,然后判斷在信號同時變化的時候,是否會產生毛刺,這可以通過邏輯函數的卡諾 圖或邏輯函數表達式來進行判斷。 1.2.3毛刺的消除
毛刺是數字電路設計中的棘手問題,它的出現會影響電路工作的穩定性、可靠性,嚴重 時會導致整個數字系統的誤動作和邏輯紊亂。
可以通過以下幾種方法來消除毛刺:
1、輸出加 D觸發器
這是一種比較傳統的去除毛刺的方法。原理就是用一個 D 觸發器去讀帶毛刺的信號, 利用 D 觸發器對輸入信號的毛刺不敏感的特點,去除信號中的毛刺。在實際中,對于簡單 的邏輯電路,尤其是對信號中發生在非時鐘跳變沿的毛刺信號,去除效果非常的明顯。 但是如果毛刺信號發生在時鐘信號的跳變沿,D 觸發器的效果就沒有那么明顯了(加 D 觸發器以后的輸出 q,仍含有毛刺)。另外,D 觸發器的使用還會給系統帶來一定的延時, 特別是在系統級數較多的情況下,延時也將變大,因此在使用 D 觸發器去除毛刺的時候, 一定要視情況而定,并不是所有的毛刺都可以用 D 觸發器來消除。 2、信號同步法 設計數字電路的時候采用同步電路可以大大減少毛刺。由于大多數毛刺都比較短(大 概幾個納秒),只要毛刺不出現在時鐘跳變沿,毛刺信號就不會對系統造成危害了。因此一 般認為,只要在整個系統中使用同一個時鐘就可以實現系統同步。但是,時鐘信號在 FPGA 器件中傳遞時是有延時的,我們無法預知時鐘跳變沿的精確位置。也就是說我們無法保證在 某個時鐘的跳變沿讀取的數據是一個穩定的數據,尤其是在多級設計中,這個問題就更加突 出。因此,做到真正的"同步"就是去除毛刺信號的關鍵問題。所以同步的關鍵就是保證在時 鐘的跳變沿讀取的數據是穩定的數據而不是毛刺數據。以下為兩種具體的信號同步方法。 (1)信號延時同步法 信號延時法,它的原理就是在兩級信號傳遞的過程中加一個延時環節,從而保證在下一 個模塊中讀取到的數據是穩定后的數據,即不包含毛刺信號。這里所指的信號延時可以是數 據信號的延時,也可以是時鐘信號的延時。 (2)狀態機控制 使用狀態機也可以實現信號的同步和消除毛刺的目的。在數據傳遞比較復雜的多模塊系 統中,由狀態機在特定的時刻分別發出控制特定模塊的時鐘信號或者模塊使能信號,狀態機 的循環控制就可以使得整個系統協調運作,同時減少毛刺信號。那么只要我們在狀態機的觸 發時間上加以處理,就可以避免競爭冒險,從而抑制毛刺的產生。
3、格雷碼計數器
對于一般的二進制或十進制計數器,在計數時,將有多位信號同時跳變。例如一個 3bit
二進制計數器,由’111’轉換為’000’時,必將產生毛刺。此時,使用格雷碼計數器將避免毛
刺的出現,因為格雷碼計數器的輸出每次只有一位跳變。 其他關于毛刺的詳細討論,請見補充教程 2:關于毛刺問題的探討。
1.3同步電路設計
同步電路是指所有電路在同一個公共時鐘的上升沿或下降沿的觸發下同步地工作。但在 實際系統中,往往存在多時鐘域的情況,這時同步的概念有所延伸,不再專指整個設計同步 于同一時鐘沿,而是指設計應該做到局部同步,在每個時鐘域內的電路要同步于同一時鐘沿。
1.3.1同步電路設計的優點:
1.同步設計能有效地避免毛刺的影響,使得設計更可靠;
2.同步設計易于添加異步復位reset,以使整個電路有一個確定的初始狀態;
3.同步設計可以減小環境對芯片的影響,避免器件受溫度,電壓,工藝的影響;
4.同步設計可以使靜態時序分析變得簡單和可靠;
5.同步設計可以很容易地組織流水線,提高芯片的運行速度。
1.3.2同步電路的設計準則: 1.盡可能在設計中使用同一時鐘,時鐘走全局時鐘網絡。走全局時鐘網絡的時鐘是 最簡單、最可預測的時鐘,它具有很強的驅動能力,可以驅動 FPGA 內部中的所有觸發器, 并保證 Clock skew 可以小到忽略的地步。
2.避免使用混合時鐘沿采樣數據,即避免在設計中同時使用時鐘的上升沿和下降沿。
3.盡量少在模塊內部使用計數器分頻所產生的時鐘。計數器分頻時鐘需完成的邏輯 功能完全可由 PLL 鎖相環或時鐘使能電路替代。計數器分頻時鐘的缺點是使得系統內時鐘 不可控,并產生較大的 Clock skew,還使靜態時序分析變得復雜。
4.避免使用門控時鐘。因為經組合邏輯產生的門控時鐘極可能產生毛刺,使 D 觸發 器誤動作。
5.當整個電路需要多個時鐘來實現,則可以將整個電路分成若干局部同步電路(盡 量以同一個時鐘為一個模塊),局部同步電路之間接口當作異步接口考慮,而且每個時鐘信 號的時鐘偏差(△T)要嚴格控制。
6.電路的實際最高工作頻率不應大于理論最高工作頻率,留有設計余量,保證芯片 可靠工作。
7.電路中所有寄存器、狀態機在系統被 reset 復位時應處在一個已知的狀態。 關于同步電路設計中的其他問題請詳見補充教程 3:華為同步電路設計規范。
1.3.3關于時鐘設計的討論
目前的工程設計中一般使用同步時序電路來完成整個系統的設計,由上一節可見,時鐘 在同步電路設計中起著至關重要的作用。那么,我們在設計時首先要完成的是對時鐘的設計。 如今在設計中常見的時鐘類型包括: 全局時鐘、內部邏輯時鐘和門控時鐘。 1. 全局時鐘
全局時鐘即同步時鐘,它通過 FPGA 芯片內的全局時鐘布線網絡或區域時鐘網絡來驅 動,全局時鐘具有高扇出、高精度、低 Jitter 和低Skew 的特點,它到芯片中的每一個寄存 器的延遲最短,且該延遲可被認為是固定值。所以我們推薦在所有的設計中的時鐘都使用全 局時鐘。全局時鐘的設計有以下幾種方法: (1). 由 PLL 鎖相環來產生全局時鐘。
(2). 將 FPGA 芯片內部邏輯產生的時鐘分配至全局時鐘布線網絡。 (3). 將外部時鐘通過專用的全局時鐘輸入引腳引入 FPGA。 在我們的設計中,一般推薦電路中的所有的時鐘都由 PLL 鎖相環產生。一方面,PLL 鎖相環可實現倍頻和移相的操作,使我們很方便地獲得所需頻率和相位的時鐘;另一方面,
PLL 鎖相環默認將其驅動的時鐘分配至全局時鐘網絡或區域時鐘網絡,Jitter 和 Skew 都很小。 下圖取自我們項目中的一個 PLL 鎖相環設計,該PLL 用于驅動 DDR 的接口模塊。因為
功能所需,DDR 接口需要三個 133MHz 的時鐘,相位分別是‘-90 o ’、‘0 o ’、‘-180 o ’,圖中所示 即為該時鐘的產生模塊。我們使用 QuartusⅡ的Megawizard 生成 PLL 鎖相環的 IP core。其 中‘inclk_66’為 PLL 鎖相環的輸入時鐘,由外部的 66MHz 晶振提供,經過 PLL 倍頻和移相 后得到所需的三個全局時鐘。
44.019.jpg (41.53 KB, 下載次數: 124)
下載附件
2018-2-13 01:50 上傳
2. 內部邏輯時鐘 內部邏輯時鐘即指由芯片內部的組合邏輯或計數器分頻產生的時鐘。 對于組合邏輯時鐘,特別是由多級組合邏輯產生的時鐘,是要被嚴格禁止使用的,因 為一方面組合邏輯極容易產生毛刺,特別是對多級組合邏輯;另一方面組合邏輯電路的 Jitter 和 Skew 比較大,這將惡化時鐘的質量。所以,一般組合邏輯產生的內部時鐘僅僅適用于時 鐘頻率較低、時鐘精度要求不高的情況。 對于計數器分頻產生的時鐘,也應該盡量少地使用,因為這種時鐘會帶來比較大的延 遲,降低設計的可靠性,也使得靜態時序分析變得復雜。計數器分頻時鐘需完成的邏輯功能 完全可由 PLL 鎖相環或時鐘使能電路替代。 還有一種由觸發器產生的時鐘—行波時鐘,即一個觸發器的輸出用作另一個觸發器的 時鐘輸入。文中 1.1.2 節描述的時鐘分頻電路就是一種行波時鐘。因為各觸發器的時鐘之間 產生較大的時間偏移,很容易就會違反建立時間、保持時間的要求,導致亞穩態的發生。所 以,這種行波時鐘要被嚴格禁止使用。 3. 門控時鐘 一般情況下,應該避免使用門控時鐘。因為經組合邏輯產生的門控時鐘極可能產生毛 刺,對系統造成很大危害。但對于某些功耗很大的系統而言,需要使用門控時鐘來降低功耗。
我們推薦使用右圖中描述的門控時鐘的設計,該設計一般不會產生毛刺和亞穩態的問題。 因為觸發器避免了毛刺的產生,而亞穩態只可能 出現在源時鐘的下降沿,但是隨后它與源時鐘低 相位相與,最后不會產生影響。
0.png (27.71 KB, 下載次數: 125)
下載附件
2018-2-13 01:41 上傳
門控時鐘最好只在頂層模塊中出現,并將其分離到一個在頂層的獨立模塊中。這同時保
證了底層的每個模塊有單一的時鐘,且在本模塊中的時鐘不進行門控。
在補充教程 4 和補充教程 5 中,我們對時鐘和時序的設計進行了更詳細的討論。
1.3.4亞穩態
44.028.jpg (27.25 KB, 下載次數: 125)
下載附件
2018-2-13 01:50 上傳
在同步電路或異步電路中,如果觸發器的 setup 時間或 hold 時間不能得到滿足,就可 能產生亞穩態,此時觸發器輸出端 Q 在有效時鐘沿之后比較長的一段時間處于不確定的狀 態,在這段時間里 Q 端將會產生毛刺并不斷振蕩、最終固定在某一電壓值上,此電壓值并 不一定等于原來數據輸入端 D 的值。這段時間稱為決斷時間
(resolution time)。經過決斷 時間之后,Q 端將穩定到 0 或 1 上,但是究竟是 0 還是 1, 這是隨機的,與輸入沒有必然 的關系。
亞穩態的危害主要體 現在破壞系統得穩定性上,由于輸出在穩定下來之前可能是毛刺、振蕩、固定的某一電壓值, 因此亞穩態除了導致邏輯誤判之外,嚴重情況下輸出 0~1 之間的中間電壓值還會使下一級 產生亞穩態(即導致亞穩態的傳播)。 邏輯誤判將導致功能性錯誤,而亞穩態的傳播則擴 大了故障面,嚴重時將導致系統崩潰。 在異步時序電路中更容易發生亞穩態,因為異步電路一般具有多個時鐘域,數據在兩個 時鐘域間傳遞時,非常容易導致 setup 時間或 hold 時間不滿足而發生亞穩態。在同步時序 電路中,當兩個觸發器間的組合邏輯延遲過大時,會導致 setup 時間不滿足而發生亞穩態。
1.3.5對跨時鐘域數據的處理
對跨時鐘域數據的處理的核心就是要保證下級時鐘對上級數據采樣的 setup 時間或 hold 時間滿足要求,即盡量避免亞穩態的發生和傳播。但是,我們知道,只要系統中有異 步元件,亞穩態就是無法避免的,因此設計的電路首先要減少亞穩態導致錯誤的發生,其次 要使系統對產生的錯誤不敏感。我們推薦使用以下方法來解決異步時鐘域數據同步問題。 1. 用觸發器打兩拍 如下圖,左邊為異步輸入端,經過兩級觸發器同步,在右邊的輸出將是同步的,而且 該輸出基本不存在亞穩態。其原理是即使第一個觸發器的輸出端存在亞穩態,經過一個 CLK 周期后,第二個觸發器 D 端的電平仍未穩定的概率非常小,因此第二個觸發器 Q 端基本不 會產生亞穩態。然而,亞穩態是無法被根除的,一旦亞穩態發生,后果的嚴重程度依賴于你
設計系統對產生的錯誤是否敏感。
44.029.jpg (31.17 KB, 下載次數: 128)
下載附件
2018-2-13 01:50 上傳
2. 異步 FIFO 或 DPRAM
因為異步 FIFO 或 DPRAM 使用格雷碼計數器設計讀寫地址的指針,所以它可以很 好地避免亞穩態的發生。使用方法如下,將上級芯片提供的數據隨路時鐘作為寫信號,將數 據寫入異步 FIFO 或 DPRAM,然后使用本級的采樣時鐘將數據讀出即可。唯一需要注意的 是,當兩級時鐘頻率不同時,需要設計好緩沖區,并通過監控 full、half、empty、useword 信號,保證數據不會溢出,也不會被讀空。
44.030.jpg (35.11 KB, 下載次數: 119)
下載附件
2018-2-13 01:50 上傳
3. 調整時鐘相位
這種方法的設計難度較大,而且適用面有限。首先需對跨時鐘域數據的路徑進行詳
細的靜態時序分析,然后將違反 setup 時間和 hold 時間的情況一一列出,在不影響其它設 計性能的前提下,綜合考慮調整兩級時鐘的相位關系,最終使其 setup 時間和 hold 時間滿 足要求。
2.FPGA簡介
2.1什么是 FPGA
FPGA 是 Field Programmable Gate Array 的縮寫,即現場可編程門陣列, 是一種可編程的 IC
44.031.jpg (7.71 KB, 下載次數: 132)
下載附件
2018-2-13 01:50 上傳
芯片(集成電路芯片),以下是目前項目中使用的幾種 FPGA 芯片:
44.032.jpg (8.23 KB, 下載次數: 140)
下載附件
2018-2-13 01:50 上傳
44.033.jpg (7.04 KB, 下載次數: 129)
下載附件
2018-2-13 01:50 上傳
2.2FPGA的結構與組成
通常 FPGA 由布線資源分隔的可編程邏輯單元構成陣列,又由可編程 I/O 單元圍繞陣
列構成整個芯片,排成陣列的邏輯單元由布線通道中的可編程內連線連接起來實現一定的邏
輯功能。
目前我們使用的 FPGA 的可編程邏輯單元一般由查找表和觸發器構成。下圖所示即
為 Cyclone 系列 FPGA 芯片的邏輯單元(LE)組成。
44.034.jpg (18.67 KB, 下載次數: 140)
下載附件
2018-2-13 01:50 上傳
查找表(Look-Up-Table)簡稱為 LUT,其本質上就是一個靜態存儲器 SRAM。 對于下圖左邊所示的電路,查找表是這樣實現的:首先 FPGA 開發軟件會自動計算邏輯電路的所有可能的結果,然后把結果事先寫入查找表中,FPGA 工作時,輸入信號所進行的邏輯運算就等于輸入一個地址進行查表,找出地址對應的內容后輸出,即實現了該邏輯功能。
0.png (32.5 KB, 下載次數: 414)
下載附件
2018-2-13 01:43 上傳
如果所設計的是時序電路,需要觸發器,則 FPGA 開發軟件會自動將觸發器配置在查 找表的后面,實現組合邏輯時就將觸發器旁路掉。 當然,對于復雜的設計,一個 LUT 是無法完成的,FPGA 可以通過進位邏輯將多個 LUT
相連起來,實現 n 輸入的查找表,實現設計要求。
44.037.jpg (13.25 KB, 下載次數: 139)
下載附件
2018-2-13 01:50 上傳
通俗地說,FPGA 就是由查找 表、觸發器和布線資源組成。下圖 是一個 Cyclone 系列 FPGA 芯片的 內部結構,其中一對查找表和觸發 器構成邏輯單元 LE,若干個 LE 組 成邏輯陣列塊 LAB,最后再配上 各種布線資源,就是一個 FPGA 芯
片了。 詳細的介紹請見:補充教程 6 FPGA PLD 結構與原理。 2.3FPGA與 ASIC設計的區別
ASIC 是 Application Specific Integrated Circuit 的縮寫,即專用集成電路。ASIC 和 FPGA
屬于 SOC(System on a chip 片上系統)的兩個發展方向,兩者唯一的區別在于,ASIC 的邏
輯電路是固化在其芯片中的,我們可以將 ASIC 理解為不可編程的 FPGA。
由于 FPGA 設計是基于固有的硬件結構(如邏輯單元、塊 RAM、PLL/DLL、時鐘資源 等)的;而 ASIC 設計結構靈活,目標多樣,所以 ASIC 設計的代碼風格和 FPGA 設計的代 碼風格有明顯差異,特別是在功耗、速度、時序等要求上。例如 ASIC 設計中根據要求會有
意識地采用某些組合邏輯、門控時鐘等,以降低功耗或提高速度。
3.FPGA開發流程
HDL(Hardware Design Language)和原理圖是兩種最常用的數字硬件電路描述方法,HDL 設計法具有更好的可移植性、通用性和模塊劃分與重用性的特點,在目前的工程設計
0.png (90.69 KB, 下載次數: 146)
下載附件
2018-2-13 01:47 上傳
0.png (18.17 KB, 下載次數: 145)
下載附件
2018-2-13 01:48 上傳
余下內容預覽:
0.png (65.63 KB, 下載次數: 113)
下載附件
2018-2-13 01:49 上傳
0.png (154.74 KB, 下載次數: 134)
下載附件
2018-2-13 01:49 上傳
完整的pdf格式文檔51黑下載地址(共37頁):
FPGA入門教程.pdf
(672.08 KB, 下載次數: 478)
2018-2-12 15:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|