【文章】組合邏輯電路詳解、實現(xiàn)及其應(yīng)用
一、什么是組合邏輯電路?
在數(shù)字電路中,根據(jù)邏輯功能的不同,我們可以將數(shù)字電路分成兩大類,一類叫做組合邏輯電路、另一類叫做時序邏輯電路。本次主要講解組合邏輯電路的原理、應(yīng)用和Verilog實現(xiàn)。

組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決于該時刻的輸入,與電路原來的狀態(tài)無關(guān)。而時序邏輯電路在邏輯功能上的特點是任意時刻的輸出不僅取決于當時的輸入信號,而且還取決于電路原來的狀態(tài),或者說,還與以前的輸入有關(guān)。
我們從圖中可以看出,左側(cè)的X是表示它的輸入變量,右側(cè)的Y是表示它的輸出變量,對于這種電路,它的輸出Y僅僅與當時的相應(yīng)輸入X有關(guān)系,而與之前的輸入X是沒有關(guān)系的,像這種電路,我們就稱它為組合邏輯電路。
二、如何分析組合邏輯電路?
了解了什么是組合邏輯電路之后, 我們應(yīng)該如何去分析電路?如果有了電路圖,我們用什么方法可以快速準確知道它所實現(xiàn)的邏輯功能?

上圖給出了組合邏輯電路的分析方法和流程,具體每一步如何實現(xiàn),不記得的同學(xué)可以復(fù)習(xí)數(shù)電基礎(chǔ),溫習(xí)一下公式化簡、卡諾圖化簡、真值表等內(nèi)容。
三、如何設(shè)計組合邏輯電路?

由上面我們可以知道,分析組合邏輯電路是根據(jù)給定的組合電路邏輯圖,分析出其邏輯功能。那么設(shè)計組合邏輯電路是分析組合邏輯電路的逆過程,我們要根據(jù)給定的邏輯功能要求,設(shè)計出一個能實現(xiàn)這種功能的最簡邏輯電路。
首先要根據(jù)邏輯功能建立真值表,通過真值表寫出邏輯函數(shù)表達式,再進行表達式化簡,再根據(jù)化簡后的函數(shù)表達式畫出邏輯電路圖。
四、競爭與冒險
1、競爭冒險的產(chǎn)生
當一個邏輯門的兩個輸入端的信號同時向相反方向變化時,從變化開始到達穩(wěn)定狀態(tài)所需的時間不同,稱為競爭。
邏輯門因輸入端的競爭而導(dǎo)致輸出產(chǎn)生不應(yīng)有的尖峰干擾脈沖(又稱過渡干擾脈沖)的現(xiàn)象,稱為冒險。

在實際電路中,輸入信號通過每一個門電路然后輸出,它總是要有傳輸時間的,那么這個就做門電路的傳輸時間或是延遲時間。在一個組合電路當中,當某一個變量經(jīng)過兩條以上的路徑到達輸出端的時候,由于每條路徑上的延遲時間的不同到達終點的時間就會有先有后,就會產(chǎn)生競爭。
2、競爭冒險的消除方法
1)加封鎖脈沖。在輸入信號產(chǎn)生競爭冒險的時間內(nèi),引入一個脈沖將可能產(chǎn)生尖峰干擾脈沖的門封鎖住。封鎖脈沖應(yīng)在輸入信號轉(zhuǎn)換前到來,轉(zhuǎn)換結(jié)束后消失。
2)加選通脈沖。對輸出可能產(chǎn)生尖峰干擾脈沖的門電路增加一個接選通信號的輸入端,只有在輸入信號轉(zhuǎn)換完成并穩(wěn)定后,才引入選通脈沖將它打開,此時才允許有輸出。在轉(zhuǎn)換過程中,由于沒有加選通脈沖,因此,輸出不會出現(xiàn)尖峰干擾脈沖。
3)接入濾波電容。由于尖峰干擾脈沖的寬度一般都很窄,在可能產(chǎn)生尖峰干擾脈沖的門電路輸出端與地之間接入一個容量為幾十皮法的電容就可吸收掉尖峰干擾脈沖。
4)修改邏輯設(shè)計。
五、組合邏輯電路的應(yīng)用
1、編碼器

邏輯功能:上圖是8-3編碼器的真值表,有8個輸入信號和3個輸出信號。I7輸入為1時,對應(yīng)的3個輸出為110,當I6輸入為1時,對應(yīng)的3個輸出為101,以此類推直至到I0的輸入為1的時候。對應(yīng)的三個輸出為000。
變量表達式:依照前面設(shè)計組合邏輯電路的方法流程,我們根據(jù)邏輯功能真值表寫出函數(shù)表達式如下所示:

電路圖:再根據(jù)表達式畫出電路圖:

Verilog實現(xiàn):

上述case語句是多分支選擇語句,是不帶優(yōu)先級的,要實現(xiàn)優(yōu)先編碼器,要使用elseif語句。如下圖:

如果輸入I7等于1,那么便會執(zhí)行A=3’b000,如果I7不等于1,那么就不會執(zhí)行A=3’b000,而會執(zhí)行下面else if語句。如果I6同樣也不等于1,那么將會依次往下執(zhí)行直至判斷I0等不等于1,如果I0也不等于1,那么執(zhí)行else中的A=3’b000語句。我們從這個過程中可以看出, I7的優(yōu)先級最高,我們先判斷的I7,依次I6,直至I0。
2、譯碼器

邏輯功能:上圖是3-8譯碼器的真值表,有3個輸入信號和8個輸出信號。邏輯公牛和編碼器相反。
變量表達式:依照前面設(shè)計組合邏輯電路的方法流程,我們根據(jù)邏輯功能真值表寫出函數(shù)表達式如下所示:

電路圖:再根據(jù)表達式畫出電路圖:

Verilog實現(xiàn):

譯碼器的應(yīng)用:

數(shù)碼管,就是將七個發(fā)光二極管,按一定的方式排列起來,利用不同發(fā)光段的組合,顯示出0-9十個十進制數(shù),這就是應(yīng)用了譯碼器原理。

3、數(shù)據(jù)選擇器
8-1數(shù)據(jù)選擇器

邏輯功能:上圖是8-1數(shù)據(jù)選擇器的真值表,我們從真值表中可以看出,當A=000時,輸出I0為高電平,其余為低電平,對應(yīng)高電平的開關(guān)閉合,而對應(yīng)低電平的開關(guān)則仍保持斷開,因此,Y的輸出為D0,,當D0=0時,Y=0,當D0=1時, Y=1,下面我們可以根據(jù)真值表來寫出它的函數(shù)表達式:
變量表達式:依照前面設(shè)計組合邏輯電路的方法流程,我們根據(jù)邏輯功能真值表寫出函數(shù)表達式如下所示:

電路圖:再根據(jù)表達式畫出電路圖:

Verilog實現(xiàn):

4、數(shù)值比較器

邏輯功能:上圖是一位數(shù)值比較器的真值表,我們從真值表中可以看出,有A>B,A<B,A=B三種情況。下面我們可以根據(jù)真值表來寫出它的函數(shù)表達式:
變量表達式:依照前面設(shè)計組合邏輯電路的方法流程,我們根據(jù)邏輯功能真值表寫出函數(shù)表達式如下所示:

電路圖:再根據(jù)表達式畫出電路圖:

Verilog實現(xiàn):
明白了數(shù)值比較器的原理,下面我們用Verilog實現(xiàn)4位二進制數(shù)值比較器:
5、加法器
邏輯功能:上圖是全加器的真值表,可以根據(jù)真值表來寫出它的函數(shù)表達式:
變量表達式:依照前面設(shè)計組合邏輯電路的方法流程,我們根據(jù)邏輯功能真值表寫出函數(shù)表達式如下所示:

電路圖:再根據(jù)表達式畫出電路圖:

要進行多位數(shù)相加,最簡單的方法是將多個全加器進行級聯(lián):

Verilog實現(xiàn):
6、組合邏輯的兩種賦值方式
由于數(shù)字電路由與導(dǎo)線連接的邏輯門組成,因此任何電路都可以表示為模塊和分配語句的某種組合。但是,有時這不是描述電路的最方便的方法。過程(始終以塊為例)為描述電路提供了另一種語法。
對于綜合硬件,兩種類型的始終塊是相關(guān)的:
組合:always@(*)
時序:always@(posegeclk)
組合總是塊等同于賦值語句,因此總有一種方法可以用兩種方式表示組合電路。使用哪種選擇主要是哪種語法更方便的問題。程序塊內(nèi)部代碼的語法與外部代碼不同。過程塊具有更豐富的語句集(例如,if-then,case),不能包含連續(xù)的賦值*,但是還引入了許多新的非直觀的錯誤處理方式。?(*?過程上的連續(xù)分配確實存在,但是與連續(xù)分配有些不同,并且不能綜合。)
例如,分配和組合始終塊描述了同一電路。兩者都創(chuàng)建相同的組合邏輯塊。每當任何輸入(右側(cè))更改值時,兩者都將重新計算輸出。

對于組合always@塊,請始終使用(*)的靈敏度列表。明確列出信號很容易出錯(如果您錯過了一個信號),并且在硬件綜合中會被忽略。如果您明確指定了靈敏度列表并錯過了信號,則合成的硬件仍會像指定了(*)一樣運行,但是模擬不會且與硬件的行為也不匹配。(在SystemVerilog中,使用always_comb)
關(guān)于wire和reg:assign語句的左側(cè)必須為net類型(例如,wire),而過程賦值的左側(cè)(在Always塊中)必須為變量類型(例如reg)。這些類型(wire與reg)與合成的硬件無關(guān),而僅僅是Verilog用作硬件仿真語言而留下的語法。
以上介紹了組合邏輯電路的原理,以及一些典型的組合邏輯電路的一些應(yīng)用,并用Verilog實現(xiàn)這些電路,看起來很簡單的電路,卻是很經(jīng)典很基礎(chǔ)的,有助于我們從硬件層面去理解和設(shè)計FPGA。有機會的話,再總結(jié)時序邏輯電路的原理和典型應(yīng)用。