一、什么是組合邏輯電路?
在數字電路中,根據邏輯功能的不同,我們可以將數字電路分成兩大類,一類叫做組合邏輯電路、另一類叫做時序邏輯電路。本次主要講解組合邏輯電路的原理、應用和Verilog實現。
組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決于該時刻的輸入,與電路原來的狀態無關。而時序邏輯電路在邏輯功能上的特點是任意時刻的輸出不僅取決于當時的輸入信號,而且還取決于電路原來的狀態,或者說,還與以前的輸入有關。
我們從圖中可以看出,左側的X是表示它的輸入變量,右側的Y是表示它的輸出變量,對于這種電路,它的輸出Y僅僅與當時的相應輸入X有關系,而與之前的輸入X是沒有關系的,像這種電路,我們就稱它為組合邏輯電路。
二、如何分析組合邏輯電路?
了解了什么是組合邏輯電路之后, 我們應該如何去分析電路?如果有了電路圖,我們用什么方法可以快速準確知道它所實現的邏輯功能?
上圖給出了組合邏輯電路的分析方法和流程,具體每一步如何實現,不記得的同學可以復習數電基礎,溫習一下公式化簡、卡諾圖化簡、真值表等內容。
三、如何設計組合邏輯電路?
由上面我們可以知道,分析組合邏輯電路是根據給定的組合電路邏輯圖,分析出其邏輯功能。那么設計組合邏輯電路是分析組合邏輯電路的逆過程,我們要根據給定的邏輯功能要求,設計出一個能實現這種功能的最簡邏輯電路。
首先要根據邏輯功能建立真值表,通過真值表寫出邏輯函數表達式,再進行表達式化簡,再根據化簡后的函數表達式畫出邏輯電路圖。
邏輯門因輸入端的競爭而導致輸出產生不應有的尖峰干擾脈沖(又稱過渡干擾脈沖)的現象,稱為冒險。
在實際電路中,輸入信號通過每一個門電路然后輸出,它總是要有傳輸時間的,那么這個就做門電路的傳輸時間或是延遲時間。在一個組合電路當中,當某一個變量經過兩條以上的路徑到達輸出端的時候,由于每條路徑上的延遲時間的不同到達終點的時間就會有先有后,就會產生競爭。
1)加封鎖脈沖。在輸入信號產生競爭冒險的時間內,引入一個脈沖將可能產生尖峰干擾脈沖的門封鎖住。封鎖脈沖應在輸入信號轉換前到來,轉換結束后消失。
2)加選通脈沖。對輸出可能產生尖峰干擾脈沖的門電路增加一個接選通信號的輸入端,只有在輸入信號轉換完成并穩定后,才引入選通脈沖將它打開,此時才允許有輸出。在轉換過程中,由于沒有加選通脈沖,因此,輸出不會出現尖峰干擾脈沖。
3)接入濾波電容。由于尖峰干擾脈沖的寬度一般都很窄,在可能產生尖峰干擾脈沖的門電路輸出端與地之間接入一個容量為幾十皮法的電容就可吸收掉尖峰干擾脈沖。
4)修改邏輯設計。
五、組合邏輯電路的應用
1、編碼器
邏輯功能:上圖是8-3編碼器的真值表,有8個輸入信號和3個輸出信號。I7輸入為1時,對應的3個輸出為110,當I6輸入為1時,對應的3個輸出為101,以此類推直至到I0的輸入為1的時候。對應的三個輸出為000。
變量表達式:依照前面設計組合邏輯電路的方法流程,我們根據邏輯功能真值表寫出函數表達式如下所示:
電路圖:再根據表達式畫出電路圖:
Verilog實現:
上述case語句是多分支選擇語句,是不帶優先級的,要實現優先編碼器,要使用elseif語句。如下圖:
如果輸入I7等于1,那么便會執行A=3’b000,如果I7不等于1,那么就不會執行A=3’b000,而會執行下面else if語句。如果I6同樣也不等于1,那么將會依次往下執行直至判斷I0等不等于1,如果I0也不等于1,那么執行else中的A=3’b000語句。我們從這個過程中可以看出, I7的優先級最高,我們先判斷的I7,依次I6,直至I0。
2、譯碼器
邏輯功能:上圖是3-8譯碼器的真值表,有3個輸入信號和8個輸出信號。邏輯公牛和編碼器相反。
變量表達式:依照前面設計組合邏輯電路的方法流程,我們根據邏輯功能真值表寫出函數表達式如下所示:
電路圖:再根據表達式畫出電路圖:
Verilog實現:
譯碼器的應用:
數碼管,就是將七個發光二極管,按一定的方式排列起來,利用不同發光段的組合,顯示出0-9十個十進制數,這就是應用了譯碼器原理。
3、數據選擇器
8-1數據選擇器
邏輯功能:上圖是8-1數據選擇器的真值表,我們從真值表中可以看出,當A=000時,輸出I0為高電平,其余為低電平,對應高電平的開關閉合,而對應低電平的開關則仍保持斷開,因此,Y的輸出為D0,,當D0=0時,Y=0,當D0=1時, Y=1,下面我們可以根據真值表來寫出它的函數表達式:
變量表達式:依照前面設計組合邏輯電路的方法流程,我們根據邏輯功能真值表寫出函數表達式如下所示:
電路圖:再根據表達式畫出電路圖:
Verilog實現:
4、數值比較器
邏輯功能:上圖是一位數值比較器的真值表,我們從真值表中可以看出,有A>B,A<B,A=B三種情況。下面我們可以根據真值表來寫出它的函數表達式:
變量表達式:依照前面設計組合邏輯電路的方法流程,我們根據邏輯功能真值表寫出函數表達式如下所示:
電路圖:再根據表達式畫出電路圖:
Verilog實現:
明白了數值比較器的原理,下面我們用Verilog實現4位二進制數值比較器:
5、加法器
邏輯功能:上圖是全加器的真值表,可以根據真值表來寫出它的函數表達式:
變量表達式:依照前面設計組合邏輯電路的方法流程,我們根據邏輯功能真值表寫出函數表達式如下所示:
電路圖:再根據表達式畫出電路圖:
要進行多位數相加,最簡單的方法是將多個全加器進行級聯:
Verilog實現:
6、組合邏輯的兩種賦值方式
由于數字電路由與導線連接的邏輯門組成,因此任何電路都可以表示為模塊和分配語句的某種組合。但是,有時這不是描述電路的最方便的方法。過程(始終以塊為例)為描述電路提供了另一種語法。
對于綜合硬件,兩種類型的始終塊是相關的:
組合:always@(*)
時序:always@(posegeclk)
組合總是塊等同于賦值語句,因此總有一種方法可以用兩種方式表示組合電路。使用哪種選擇主要是哪種語法更方便的問題。程序塊內部代碼的語法與外部代碼不同。過程塊具有更豐富的語句集(例如,if-then,case),不能包含連續的賦值*,但是還引入了許多新的非直觀的錯誤處理方式。 (* 過程上的連續分配確實存在,但是與連續分配有些不同,并且不能綜合。)
例如,分配和組合始終塊描述了同一電路。兩者都創建相同的組合邏輯塊。每當任何輸入(右側)更改值時,兩者都將重新計算輸出。
對于組合always@塊,請始終使用(*)的靈敏度列表。明確列出信號很容易出錯(如果您錯過了一個信號),并且在硬件綜合中會被忽略。如果您明確指定了靈敏度列表并錯過了信號,則合成的硬件仍會像指定了(*)一樣運行,但是模擬不會且與硬件的行為也不匹配。(在SystemVerilog中,使用always_comb)
關于wire和reg:assign語句的左側必須為net類型(例如,wire),而過程賦值的左側(在Always塊中)必須為變量類型(例如reg)。這些類型(wire與reg)與合成的硬件無關,而僅僅是Verilog用作硬件仿真語言而留下的語法。
以上介紹了組合邏輯電路的原理,以及一些典型的組合邏輯電路的一些應用,并用Verilog實現這些電路,看起來很簡單的電路,卻是很經典很基礎的,有助于我們從硬件層面去理解和設計FPGA。有機會的話,再總結時序邏輯電路的原理和典型應用。