FPGA中組合邏輯和時序邏輯的區(qū)別
數(shù)字電路根據(jù)邏輯功能的不同特點,可以分成兩大類,一類叫組合邏輯電路(簡稱組合電路),另一類叫做時序邏輯電路(簡稱時序電路)。
1.組合邏輯概念
組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決于該時刻的輸入,與電路原來的狀態(tài)無關(guān),不涉及對信號跳變沿的處理,無存儲電路,也沒有反饋電路。通常可以通過真值表的形式表達出來。
2.組合邏輯的Verilog HDL 描述
根據(jù)組合邏輯的電路行為,可以得到兩種常用的RTL 級描述方式。第一種是always 模塊的觸發(fā)事件為電平敏感信號列表;第二種就是用assign 關(guān)鍵字描述的數(shù)據(jù)流賦值語句。
(1)always 模塊的敏感表為電平敏感信號的電路
always模塊的敏感列表為所有判斷條件信號和輸入信號,但一定要注意敏感列表的完整性。在always 模塊中可以使用if、case和for 等各種RTL 關(guān)鍵字結(jié)構(gòu)。由于賦值語句有阻塞賦值和非阻塞賦值兩類,建議讀者使用阻塞賦值語句“=”。always 模塊中的信號必須定義為reg 型,不過最終的實現(xiàn)結(jié)果中并沒有寄存器。這是由于在組合邏輯電路描述中,將信號定義為reg型,只是為了滿足語法要求。
(2)assign語句描述的電路
利用條件符“?”可以描述一些相對簡單的組合邏輯電路,信號只能被定義為wire型。當(dāng)組合邏輯比較復(fù)雜時,需要很多條assign語句或者多重嵌套“?”,使得代碼可讀性極差,因此此時推薦第一種組合邏輯建模方式
3.組合邏輯電路的注意事項
(1)敏感信號列表
在組合邏輯設(shè)計中,讀者必須重點對待敏感信號列表。敏感信號列表出現(xiàn)在always塊中,其典型行為級的含義為:只要敏感信號列表內(nèi)的信號發(fā)生電平變化,則always模塊中的語句就執(zhí)行一次,因此設(shè)計人員必須將所有的輸入信號和條件判斷信號都列在信號列表中。
不完整的信號列表會造成不同的仿真和綜合結(jié)果,因此需要保證敏感信號的完備性。如果缺少信號,則無法觸發(fā)和該信號相關(guān)的仿真進程,也就得不到正確的仿真結(jié)果。如果設(shè)計人員在設(shè)計中,認(rèn)為列舉信號麻煩,則采用下面的語句:always@(*).此時,綜合工具和仿真工具會自動將所有的敏感信號自動加入敏感信號列表。
(2)不要在組合邏輯中引入環(huán)路
在組合邏輯中引入環(huán)路會導(dǎo)致電路產(chǎn)生振蕩、毛刺以及沖突等問題,從而降低設(shè)計的穩(wěn)定性和可靠性,因此要徹底避免環(huán)路。
之所以稱邏輯環(huán)路是一種高風(fēng)險設(shè)計,其原因如下:
首先,環(huán)回邏輯的延時完全依靠組合邏輯門延遲和布線延遲。一旦這些傳播時延有所變化,則環(huán)路的整體邏輯將徹底失效。
其次,環(huán)路的時序分析是個死循環(huán)過程。目前的EDA開發(fā)工具為了計算環(huán)路的時序邏輯都會主動割斷時序路徑,引入許多不確定的因素。
1 . 時序邏輯概念
時序邏輯是Verilog HDL 設(shè)計中另一類重要應(yīng)用。從電路特征上看來,其特點為任意時刻的輸出不僅取決于該時刻的輸入,而且還和電路原來的狀態(tài)有關(guān)。電路里面有存儲元件(各類觸發(fā)器,在FPGA芯片結(jié)構(gòu)中只有D 觸發(fā)器)用于記憶信息,如圖8-7 所示。從電路行為上講,不管輸入如何變化,僅當(dāng)時鐘的沿(上升沿或下降沿)到達時,才有可能使輸出發(fā)生變化。
(1)在描述時序電路的always塊中的reg型信號都會被綜合成寄存器,這是和組合邏輯電路所不同的。
(2)時序邏輯中推薦使用非阻塞賦值“<=”。
(3)時序邏輯的敏感信號列表只需要加入所用的時鐘觸發(fā)沿即可,其余所有的輸入和條件判斷信號都不用加入,這是因為時序邏輯是通過時鐘信號的跳變沿來控制的。
2. 競爭與冒險
(1)競爭與毛線概念
信號在組合邏輯電路內(nèi)部通過連線和邏輯單元時,都有一定的延時。延時的大小與連線的長短和邏輯單元的數(shù)目有關(guān),同時還受器件的制造工藝、工作電壓、溫度等條件的影響。此外,信號的高低電平轉(zhuǎn)換也需要一定的過渡時間。由于存在這兩方面因素,多路信號的電平值發(fā)生變化時,在信號變化的瞬間,組合邏輯的輸出有先后順序,并不是同時變化,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號稱為“毛刺”,如果一個組合邏輯電路中有“毛刺”出現(xiàn),就說明該電路存在“冒險”。
需要注意的是,冒險信號的脈沖寬度很小,常常只有數(shù)納秒或數(shù)十納秒,其頻帶帶寬可達數(shù)百兆赫茲或更寬。在板級調(diào)試時,如果示波器的上限頻率較低,會將幅度較大的毛刺顯示為幅度較小的毛刺,甚至不易被察覺。這都是在實際開發(fā)中捕獲毛刺應(yīng)該注意的問題。
冒險按產(chǎn)生形式的不同可以分為靜態(tài)冒險和動態(tài)冒險兩大類。靜態(tài)冒險是指輸入有變化,而輸出不應(yīng)變化時產(chǎn)生的單個窄脈沖;動態(tài)冒險則指的是輸入變化時,輸出也應(yīng)變化時產(chǎn)生的冒險。動態(tài)冒險是由靜態(tài)冒險引起的,因此存在動態(tài)冒險的電路也存在靜態(tài)冒險。
靜態(tài)冒險根據(jù)產(chǎn)生條件的不同,分為功能冒險和邏輯冒險兩大類。當(dāng)有兩個或兩個以上輸入信號同時產(chǎn)生變化時,在輸出端產(chǎn)生毛刺,這種冒險稱為功能冒險。如果只有一個變量產(chǎn)生變化時出現(xiàn)的冒險則是邏輯冒險。冒險往往會影響到邏輯電路的穩(wěn)定性。清零和置位端口對毛刺信號十分敏感,任何一點毛刺都可能會使系統(tǒng)出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設(shè)計人員必須要考慮的問題。
(2)冒險產(chǎn)生的原因
由于動態(tài)冒險主要是由靜態(tài)冒險引起的,消除了靜態(tài)冒險,動態(tài)冒險也就自然消除了,因此下面介紹靜態(tài)冒險的檢查和消除。
判斷一個邏輯電路在某些輸入信號發(fā)生變化時是否會產(chǎn)生冒險,首先要判斷信號是否會同時變化,然后判斷在信號同時變化的時候,是否會產(chǎn)生冒險,這可以通過邏輯函數(shù)的卡諾圖或邏輯函數(shù)表達式來進行判斷。
(1功能冒險的檢查
功能冒險是由電路的邏輯功能引起的,只要輸入信號不是按照循環(huán)碼的規(guī)律變化,組合邏輯就可能產(chǎn)生功能冒險,且不能通過修改設(shè)計加以消除,只能通過對輸出采用時鐘采樣來消除。
(2邏輯冒險的檢查
檢查電路是否產(chǎn)生邏輯冒險的方法有兩種,即代數(shù)法和卡諾圖法。
① 代數(shù)法。如果一個組合邏輯函數(shù)表達式F,在某些條件下能化簡成或的形式,在A產(chǎn)生變化時,就可能產(chǎn)生靜態(tài)邏輯冒險。
② 卡諾圖法。在組合邏輯的卡諾圖中,若存在素項圈相切,則可能會產(chǎn)生邏輯冒險。如圖8-16 所示的卡諾圖,AC 和兩個素項環(huán)相切,在B = C =1時,A 由1 變?yōu)?時,將產(chǎn)生邏輯冒險。