【邏輯門的奇妙冒險(xiǎn)】第4篇 組合邏輯——開局三條狗,平地起高樓
本篇目標(biāo):
1.以異或門為例,理解從真值表到組合電路的構(gòu)造;
2.以相等判斷邏輯為例,理解電路的模塊級(jí)抽象;
3.搭建2路復(fù)用器;
4.搭建n路復(fù)用器;
5.理解二進(jìn)制數(shù)以及補(bǔ)碼表示法;
6.搭建1比特全加器;
7.搭建n比特加法器;
8.搭建n比特減法器;
9搭建n比特大小判斷邏輯;
10.搭建算術(shù)邏輯單元ALU。
?
在上一篇中,我們理解了與或非邏輯門,那是我們?cè)煳锏钠瘘c(diǎn),太重要了,梅開六度,再?gòu)?fù)習(xí)一遍:

在本篇中,我們就要開始帶著這仨邏輯門開始奇妙冒險(xiǎn)了。在冒險(xiǎn)的旅途中,我們會(huì)使用一個(gè)小巧討喜的軟件Logisim,這是下載地址:https://sourceforge.net/projects/circuit/,歡迎讀者下載安裝這個(gè)軟件。運(yùn)行該軟件需要安裝Java環(huán)境,這個(gè)不難,讀者簡(jiǎn)單搜索一下就可以搞定了。讓我們一起實(shí)現(xiàn)文檔中的各種奇妙電路吧(搓手手.jpg)!
1.以異或門為例,理解從真值表到組合電路的構(gòu)造
我們首先要整一個(gè)新的邏輯門,叫異或門,它要求是這樣的:
AB倆輸入相同,則得到0
AB倆輸入不同,則得到1
我們一般會(huì)簡(jiǎn)稱為“同0異1”。仿照上一篇的做法,可以得到一個(gè)真值表:

我們這里要學(xué)一個(gè)小技巧,也就是用數(shù)學(xué)表達(dá)式把Y等于多少A多少B寫出來。首先,不難注意到,Y在兩種可能的情況下會(huì)等于1,也就是A0B1和A1B0這兩個(gè)。那我們就用“|”連接,寫成這個(gè)樣子:
Y = (情況1: A=0而且B=1) | (情況2: A=0而且B=1)
對(duì)于這倆情況,我們也要用數(shù)學(xué)表達(dá)式寫出來,倆case就寫成乘法形式,用“&”連接,也就是這樣:
Y = ((A=0) & (B=1)) | ((A=0) & (B=1))
最后一步,把等于0的情況替換成取反,也即“~”符號(hào),等于1的不用管,直接寫變量名就可以,最后我們得到了Y的布爾代數(shù)表達(dá)式:
Y = (~A & B) | (~A & B)
好嘞,有了這個(gè)表達(dá)式,我們就可以畫電路啦!符號(hào)“~”就是非門,符號(hào)“&”就是與門,符號(hào)“|”就是或門,于是乎,我們就可以把上面得到的表達(dá)式變成這樣:

最后在軟件里面把各種組合試驗(yàn)一下,是否符合預(yù)期,符合一開始的要求(暗綠色的線就是0,亮綠色的線就是1):

誒嘿,完美匹配真值表,完美符合要求。剛剛我們的這個(gè)流程:理解需求,寫出真值表,得到數(shù)學(xué)表達(dá)式,根據(jù)表達(dá)式連接電路。這一套就是我們得到組合電路的基本操作,希望讀者可以get到~
?
2.以相等判斷邏輯為例,理解電路的模塊級(jí)抽象
這一部分我們的目標(biāo)是搭建一個(gè)用于相當(dāng)判斷的電路模塊,該模塊有倆輸入,要求是這樣的:
AB倆輸入相等,就得到1
AB倆輸入不相等,就得到0
AB倆輸入都是5比特
前兩個(gè)要求,稍微琢磨一下還是很簡(jiǎn)單的,也就是把異或門的結(jié)果取個(gè)反就可以了。但是我們的異或門輸入都是1比特的,而這次相等判斷的輸入是5比特的。誒嘿好像也簡(jiǎn)單,AB每一個(gè)比特分別判斷,最后用與門全部連起來就可以了呀。

如果5組對(duì)比都把異或邏輯擺一道,顯然就很累,我們可以把異或邏輯放在一個(gè)框框里面,只關(guān)注輸入輸出,不關(guān)注內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。這就是電路的模塊級(jí)抽象,其實(shí)也就是套娃,后面要經(jīng)常用,希望讀者可以get到。
?
進(jìn)一步地,異或后面緊緊跟著一個(gè)非門,我們可以把它們捏一塊,這個(gè)邏輯門也是有名字的,叫同或門,真值表和電路如下:

類似的,一堆兩輸入與門也可以捏一塊,捏成一個(gè)大的,這樣一來,我們剛剛的相等判斷邏輯就變成這樣了:

誒嘿,我們還可以再進(jìn)一步,這一整個(gè)相等判斷邏輯也可以捏一塊嘛,套娃繼續(xù),就變成這樣:

這部分的電路本身比較簡(jiǎn)單,主要是要向讀者展示電路的模塊級(jí)抽象,這其實(shí)也是理工科很常見的思維方式,通俗地說起來就是套娃加套娃。我們從一開始的Si元素電子排布到P型摻雜、再到二極管、CMOS管、以及邏輯門,也是抽象再抽象。這個(gè)思維方式很重要哦,手動(dòng)畫個(gè)重點(diǎn)~
?
3.搭建2路復(fù)用器
我們?cè)賮碚粋€(gè)小電路,熟練一下這部分的玩法。這個(gè)電路叫2路復(fù)用器,它的要求是這樣的:
當(dāng)選擇信號(hào)S等于0,輸出信號(hào)Y等于A
當(dāng)選擇信號(hào)S等于1,輸出信號(hào)Y等于B
OK,老套路,上真值表,這次是三個(gè)輸入,真值表有8行:

繼續(xù)我們的套路,寫出Y的表達(dá)式,共有四種情況,用“|”連接:
Y = ( S=0且A=1且B=0) | ( S=0且A=1且B=1) |
?( S=1且A=0且B=1) | ( S=1且A=1且B=1)
繼續(xù)變換,且的邏輯用“&”,等于0就換成“~”,于是乎:
Y = ( ~S & A & ~B) | ( ~S & A & B) | ( S & ~A & B) | ( S & A & B)
然后就是上電路,按照表達(dá)式的意思連接:

好勒,搞定,很漂亮。稍有不足的是,這個(gè)電路其實(shí)可以跟簡(jiǎn)單的。奧秘就在Y的數(shù)學(xué)表達(dá)式上,我們先觀察這一部分:
( S & ~A & B) | ( S & A & B)
可以發(fā)現(xiàn)當(dāng)S等于1且B也等于1的時(shí)候。A取反可以觸發(fā),A不取反也可以觸發(fā),誒,變量A擱著鬧呢?我們就可以把它去掉,也即:
( S & B) | ( S & B)
那如果這樣的話,或兩個(gè)一樣的也沒啥意思,浪費(fèi)了,不妨直接:
S & B
嗯嗯,很漂亮!同理,另一邊的表達(dá)式也可以化簡(jiǎn):
( ~S & A & ~B) | ( ~S & A & B) = ( ~S & A) | ( ~S & A) = ~S & A
哦吼,這樣一來,Y的表達(dá)式就是:
Y = ( ~S & A) | ( S & B)
對(duì)應(yīng)的電路就是:

測(cè)試一下,也是對(duì)的,好嘛,原來可以這么簡(jiǎn)單,布爾表達(dá)式的化簡(jiǎn)就是這么神奇。
?
4.搭建n路復(fù)用器
這部分我們搞一個(gè)進(jìn)階的,剛剛是2路復(fù)用,2選1,這次搞一個(gè)n路復(fù)用,n選1。要求就變成這樣了:
當(dāng)選擇信號(hào)S等于0,輸出信號(hào)Y等于A0
當(dāng)選擇信號(hào)S等于1,輸出信號(hào)Y等于A1
當(dāng)選擇信號(hào)S等于2,輸出信號(hào)Y等于A2
……
當(dāng)選擇信號(hào)S等于7,輸出信號(hào)Y等于A7
……
那具體要怎么做的?直接上真值表,上表達(dá)式?那玩意有2的n次方行,如果n等于10,或者等于32什么的,怕不是要裂開……
?
或許我們可以先好好理解一下2路復(fù)用器的電路邏輯:

S是選擇信號(hào),也可以理解為了允許信號(hào)。中間兩個(gè)與門可以理解為景區(qū)入口檢票的。最后的或門很隨便,不管事,隨便過,它就是一個(gè)捏信號(hào)的玩意。我們可以注意到:S信號(hào)等于0,就是說給上面的通道打開,A來了就可以走,下面的通道被關(guān)咯,B不能過;反之也類似。
?
靈光一閃,那n路復(fù)用,我們就整n個(gè)與門,最后也是用或門捏起來。那些與門,每一個(gè)都留出一個(gè)端口給游客(輸入信號(hào)),另一個(gè)端口聽S信號(hào)指揮。如果S信號(hào)對(duì)上了,就允許游客過去。具體地說,怎么叫對(duì)上了?哦吼,我們剛剛造了相等判斷的邏輯,用上:

測(cè)試一下,也是對(duì)的,很漂亮。但是因?yàn)檫@8個(gè)輸入都是1比特的,稍微還差點(diǎn)意思,我們需要給它加個(gè)buff,把這8個(gè)輸入都改成8比特的。這樣一來,與門、或門的端口也需要是8比特輸入。其實(shí)與或非的輸入都可以是多比特的,也即每比特分別進(jìn)行與、或、取反,然后再捏起來。上了這個(gè)buff之后,與門、或門另一個(gè)輸入,也即相等判斷邏輯的輸出,也應(yīng)該是8比特的。具體在電路上,可以直接使用位擴(kuò)展,這個(gè)操作其實(shí)等價(jià)于這樣:

最后看一下上了buff之后的8路復(fù)用器,內(nèi)部長(zhǎng)這樣:

再進(jìn)一步地,32路,每一個(gè)輸入32比特,類比一下,應(yīng)該也很好理解了,就是不停的連線連線,拉框框拉框框,最后就是這樣啦:

5.理解二進(jìn)制數(shù)以及補(bǔ)碼表示法
二進(jìn)制,相信大家都或多或少聽說過,每位都只有0、1兩個(gè)可能,進(jìn)位邏輯就是“逢二進(jìn)一”。其實(shí)在之前的文字中我也多少用了點(diǎn)。我覺得這個(gè)東西可以直接看下表。0到15這16個(gè)數(shù),用二進(jìn)制表示分別是這樣的:

從0看到15,其實(shí)規(guī)律就已經(jīng)很明顯了,一個(gè)一個(gè)往上加1,如果已經(jīng)有1了,那就進(jìn)位。不難看出,如果有16的話,16的二進(jìn)制編碼應(yīng)該是10000。于是有一個(gè)規(guī)律呼之欲出,2、4、8、16這種2的整數(shù)次冪,其二進(jìn)制編碼就是一個(gè)1,后面跟上若干0。是2的幾次冪,那就幾個(gè)0。例如8是2的三次冪,那就是1000。
?
再進(jìn)一步地,一般正整數(shù)都可以用2的整數(shù)次冪湊一湊得到,例如12就是8加4,也就是2的3次冪加上2的2次冪,那它二進(jìn)制編碼就是1000和0100的疊加。
?
二進(jìn)制數(shù)的加減運(yùn)算和我們小學(xué)學(xué)的那個(gè)是類似的,排豎式去加就可以了,記得逢二進(jìn)位,就像這樣:

左邊這個(gè)對(duì)應(yīng)回十進(jìn)制數(shù),也就是7+5=12,沒毛病;右邊這個(gè)明明是13+5=18,怎么變成2了?是不是應(yīng)該最高位進(jìn)位呀,變成10010?
沒錯(cuò),理論上是應(yīng)該最高位進(jìn)位,但是實(shí)際上可以直接不管。我們提前好規(guī)定4比特運(yùn)算,超過15就是溢出,不歸我們電路管了。就像時(shí)間:晚上11點(diǎn),再過倆小時(shí),就是1點(diǎn)了。準(zhǔn)確地說應(yīng)該是次日1點(diǎn),但是我們不管第幾天,只在乎幾點(diǎn)了,那么11+2就會(huì)得到1。換言之,對(duì)于4比特電路,我們默認(rèn)接受15+1得到0,15+2得到1。
?
嗯,好吧,勉強(qiáng)接受這個(gè)設(shè)定,雖然一時(shí)看起來有點(diǎn)奇怪……
?
OK,現(xiàn)在有意思的問題來了,剛剛這些操作,都是正數(shù)呀,負(fù)數(shù)怎么辦?也就是二進(jìn)制數(shù)是如何表示符號(hào)的?也像我們平時(shí)寫數(shù)字一個(gè)前面帶上一個(gè)“-”嗎?其實(shí)也可以,但是一般不這么干。二進(jìn)制數(shù)表示符號(hào)一般用補(bǔ)碼表示法。那啥是補(bǔ)碼表示?-1、-2又應(yīng)該是什么編碼呢?來,直接上表:

-1的編碼是1111、-2的編碼是1110,從最大的編碼倒回去減一、減一,直到1000這個(gè)編碼減到了-8。
?
嗯,好吧,勉強(qiáng)接受這個(gè)設(shè)定...個(gè)鬼呀!看起來太奇怪了!為什么呀!
?
其實(shí)補(bǔ)碼表示和上一個(gè)設(shè)定是要聯(lián)系起來一塊看的。想象這么一個(gè)表盤,11點(diǎn)了,再過兩個(gè)小時(shí),就是1點(diǎn)了,跨過了12點(diǎn),也正常OK,可以理解。我們可以再抽象一下,把表盤上面的數(shù)之間的加法,看做是順時(shí)針轉(zhuǎn)動(dòng)指針,11+2=1,對(duì)應(yīng)的既可以是11點(diǎn)再過2小時(shí),也可以是2點(diǎn)再過11小時(shí),都是1點(diǎn)。

相應(yīng)的,減法就是逆時(shí)針轉(zhuǎn)動(dòng)指針,6-3=3,6點(diǎn)倒回去三個(gè)格子就是3點(diǎn);1-2=11,1點(diǎn)倒回兩個(gè)格子就是11點(diǎn)。
?
有趣的事情發(fā)生了:我們注意到,每一個(gè)逆時(shí)針的操作,一定都等效于唯一的一個(gè)順時(shí)針的操作。例如這個(gè)黑指針到紅指針,6點(diǎn)到9點(diǎn),既可以順時(shí)針3格,也可以逆時(shí)針9格,也即在12個(gè)數(shù)的表盤中,加3與減9,這兩個(gè)操作的效果是一樣的。

同理,我們可以輕松理解,加6與減6也一樣。于是乎,所有減法都可以用對(duì)應(yīng)的加法代替,你想要減1,沒問題,加11就是了,沒毛病。誒嘿:
減9等價(jià)于加3
減6等價(jià)于加6
減1等價(jià)于加11
……
減3等價(jià)于加9
減11等價(jià)于加1
……
3與9我們稱之為一對(duì)補(bǔ)數(shù),同樣1和11也是一對(duì)補(bǔ)數(shù)。這些一對(duì)一對(duì)的補(bǔ)數(shù)是什么規(guī)律呢?沒錯(cuò),他們的和都是12。那12有什么特別的嗎?12是表盤的數(shù)字總量。
?
叮~是不是想到了什么,4比特二進(jìn)制數(shù),也可以看做一個(gè)表盤,只不過這個(gè)表盤上面有16個(gè)數(shù)。那么相應(yīng)的,在這個(gè)表盤上的補(bǔ)數(shù)對(duì),就應(yīng)該還是和為16的,也即1與15、2與14、3與13等等。進(jìn)一步地說,既然這種情況下,減1等價(jià)于加15、減2等價(jià)于加14……不如負(fù)1直接使用15的二進(jìn)制編碼表示、負(fù)2直接使用14的二進(jìn)制編碼表示……也即如果一個(gè)數(shù)是負(fù)的,那就用它的補(bǔ)數(shù)的編碼來表示。這就是補(bǔ)碼表示法:

此處留個(gè)小坑:補(bǔ)碼表示法的絕妙之處,將在設(shè)計(jì)減法器的時(shí)候顯現(xiàn)。
?
6.搭建1比特全加器
接下來我就要開始折騰二進(jìn)制的運(yùn)算器了,首先當(dāng)然是加法器咯。我們先回顧一下二進(jìn)制加法是怎么玩的:

這里我們需要一個(gè)抽象,也就是下圖的長(zhǎng)條虛線框,它叫做1比特全加器。其實(shí)這也就是在考慮1比特的加法:

這1比特的加法進(jìn)行的時(shí)候,其實(shí)還有一個(gè)隱含的輸入,就是低位給的進(jìn)位信號(hào),還有一個(gè)隱含的輸出,就是交給高位的進(jìn)位信號(hào):

我們分別給這些信號(hào)都取好了名字,本位的倆輸入就叫AB、本位的計(jì)算結(jié)果叫S,這個(gè)一般也叫本位和。還有進(jìn)位輸入和進(jìn)位輸入分別是Cin和Cout。根據(jù)二進(jìn)制加法的基本規(guī)律,逢二進(jìn)一,我們可以知道:

誒嘿想到了什么?沒錯(cuò),真值表。套路開始:

寫表達(dá)式:
S = (~A & ~B & Cin) | (~A & B & ~Cin) | (A & ~B & ~Cin) | (A & B & Cin)
Cout = (~A & B & Cin) | (A & ~B & Cin) | (A & B & ~Cin) | (A & B & Cin)
畫電路:

按照真值表測(cè)試一下,雖然沒有錯(cuò),但是這顯然說不上漂亮。這主要還是因?yàn)楸磉_(dá)式?jīng)]有化簡(jiǎn),來,繼續(xù)套路,化簡(jiǎn)表達(dá)式。這里補(bǔ)充一下,本篇的第一個(gè)小點(diǎn),異或運(yùn)算,它的數(shù)學(xué)符號(hào)是“^”。也就是說:
A^B = (~A & B) | (A & ~B)
這個(gè)公式我現(xiàn)在要倒過來用,找到類似 (~A & B) | (A & ~B)的結(jié)構(gòu),把它們換成A^B。再補(bǔ)充一下,與、或運(yùn)算是有分配率的,就是:
(A & B) | (C & B) = (A |C) & B
好勒,我們先用分配率處理一下S的表達(dá)式(注意&的優(yōu)先級(jí)高于|):
S = (~A & ~B & Cin) | (~A & B & ~Cin) | (A & ~B & ~Cin) | (A & B & Cin)
= (~A & B | A & ~B ) & ~Cin | (~A &~B | A & B) & Cin
= (A ^ B) & ~Cin | (~A &~B | A & B) & Cin
我們注意到異或運(yùn)算的取反,同或,回憶一下它的真值表,注意到它的表達(dá)式就是:
~(A^B) = (~A & ~B) | (A & B)
誒,這個(gè)東西S的表達(dá)式里面有呀,那就繼續(xù)化簡(jiǎn):
S = (A ^ B) & ~Cin | (~A &~B | A & B) & Cin
= (A ^ B) & ~Cin | ~(A ^ B) & Cin
哦吼,異或的結(jié)構(gòu)又出現(xiàn)了,繼續(xù)化簡(jiǎn):
S = A ^ B ^ Cin
Nice! 很漂亮,我們?cè)囋嘋out是不是也能化簡(jiǎn)?觀察Cout表達(dá)式后面兩項(xiàng)(A & B & ~Cin) | (A & B & Cin),也就是A為1、B為1的時(shí)候,Cin不是1可以觸發(fā)、Cin是還是可以觸發(fā)。Cin這個(gè)變量在摸魚,給它抓起來!化簡(jiǎn)Cout表達(dá)式:
Cout = (~A & B & Cin) | (A & ~B & Cin) | (A & B & ~Cin) | (A & B & Cin)
= (~A & B & Cin) | (A & ~B & Cin) | (A & B)
我們注意到原式中有(A & B & Cin),并且(A & B & Cin) | (A & B & Cin)和(A & B & Cin)的一樣的,那就意味我們可以多來幾個(gè)。為啥要多來幾個(gè)呢?有好處的,往下看:
Cout = (~A & B & Cin) | (A & ~B & Cin) | (A & B) |(A & B & Cin)
觀察第2項(xiàng)和第4項(xiàng),(A & ~B & Cin)和(A & B & Cin),誒,老套路,當(dāng)A為1、Cin為1的時(shí)候,B不是0觸發(fā),B是0還觸發(fā),變量B在摸魚,抓起來!化簡(jiǎn):
Cout = (~A & B & Cin) | (A & B) | (A & Cin)
啊哈,發(fā)現(xiàn)了規(guī)律了吧!再來一個(gè):
Cout = (~A & B & Cin) | (A & B) | (A & Cin) | (A & B & Cin)
觀察第1項(xiàng)和第4項(xiàng),(~A & B & Cin)和(A & B & Cin),變量A在摸魚,抓起來,最后得到:
Cout = (A & B) | (A & Cin) | (B & Cin)
S = A ^ B ^ Cin
我們根據(jù)新的表達(dá)式,畫出新的電路圖:

最后調(diào)整一下接口朝向,抽象封裝一下:

7.搭建n比特加法器
加法只有1比特肯定是不夠意思的,咱們剛剛整的1比特全加器,其實(shí)就是加法器內(nèi)部的一部分。其實(shí)如果充分理解了1比特全加器的位置,搭建一個(gè)n比特的加法器,就很簡(jiǎn)單了。

只需要把它們一個(gè)一個(gè)頭尾相連串起來就可以了。我們之前已經(jīng)完成了封裝,現(xiàn)在就可以直接上電路:

至于最低為的全加器的進(jìn)位輸入Cin,設(shè)置為常量0既可,最高位的進(jìn)位輸出額,直接丟掉就好了。最后,封裝一下,當(dāng)當(dāng)當(dāng)當(dāng),一個(gè)8比特加法器誕生了:

想要多少比特都可以哦,多連幾個(gè)就是了~
?
8.搭建n比特減法器
有了加法,接下來整一個(gè)減法,就是很自然的思路咯。我們當(dāng)然可以先設(shè)計(jì)一個(gè)一比特減法器,定義好輸入輸出,填真值表,寫表達(dá)式,畫電路圖,這當(dāng)然OK的。但是得益于我們先前介紹的補(bǔ)碼表示法,減法器的實(shí)現(xiàn)其實(shí)可以非常美妙。我們不妨先復(fù)習(xí)一下補(bǔ)碼表示法:

一個(gè)數(shù)如果是負(fù)的,那就用這個(gè)數(shù)的補(bǔ)數(shù)的編碼來表示。減去一個(gè)數(shù),就等于加上這個(gè)數(shù)的補(bǔ)數(shù)。補(bǔ)數(shù)的性質(zhì)很不錯(cuò)呀,既如此,那么現(xiàn)在我們來探究一下,一個(gè)數(shù)的補(bǔ)數(shù),要怎么求?
?
當(dāng)我們規(guī)定數(shù)位是4比特的時(shí)候,每一個(gè)數(shù)和它的補(bǔ)數(shù),加起來都是16。例如1和15、2和14等。對(duì)于二進(jìn)制編碼來說,也就是加起來得到0,例如0001和1111、0010和1110等。同時(shí),我們不難發(fā)現(xiàn),一個(gè)數(shù)和它的取反,這倆相加,永遠(yuǎn)是1111,而全1的編碼,只要再加上一個(gè)1,就會(huì)得到0,也就是一個(gè)n比特的二進(jìn)制數(shù)A,永遠(yuǎn)滿足:
A + ~A + 1 = 0
既然A和(~A+1)的和永遠(yuǎn)是0,那就說明,A的補(bǔ)數(shù)就是(~A+1),也就是說:
X - A = X + ~A + 1
我們發(fā)現(xiàn),減法,可以變成一次取反和兩次加法,取反簡(jiǎn)單,而加法剛剛已經(jīng)實(shí)現(xiàn)了,那么我們的減法器就可以直接這樣連接:

封裝測(cè)試一下,沒毛病,一個(gè)減法器,就這么漂亮地實(shí)現(xiàn)啦!

9.搭建n比特大小判斷邏輯
最后一個(gè)器件啦,我們做一點(diǎn)點(diǎn)小擴(kuò)展,搭建一個(gè)n比特的大小判斷邏輯,要求是這樣的:
如果A小于B,則輸入Y等于1,否則,Y等于0
Emmmm,要怎么做呢?難道要上真值表,有點(diǎn)折磨呀……我們不妨再看看補(bǔ)碼表示法,梅開三度了屬于是:

我們注意到,右邊都是小于0的數(shù),它們的最高位都是1,左邊都是不小于0的數(shù),它們的最高位都是0。顯然,右邊的數(shù)肯定是小于左邊的數(shù),也就是說,最高位是1的數(shù),小于最高位是0的數(shù)。誒嘿這個(gè)規(guī)律好誒,我們簡(jiǎn)單擺弄一下邏輯門就可以搞定了~

我們繼續(xù)看,如果最高位一樣的數(shù),也就是在同一排的數(shù),它們的次高位有沒有這個(gè)規(guī)律呢?啊,次高位是1的數(shù),大于次高位是0的數(shù),壞了,規(guī)律沒了,咋辦呢?
?
誒,根據(jù)套路,我們現(xiàn)在搞這個(gè),應(yīng)該要把之前造的東西用上,小腦袋瓜一轉(zhuǎn)~這不是有減法器嘛:
A < B 等價(jià)于 A - B < 0
小于0,只需要判斷最高位是否是1既可,是1就小于0。Nice!可行,小結(jié)一下,我們的電路邏輯就是這樣的:如果AB的高位異號(hào),也就是AB不在同一排,那么A的高位是1,就是A小,Y直接輸出1;如果AB的高位同號(hào),也就是在同一排,那么查看A-B的差值,如果差值的高位是1,說明差值小于0,說明A小,Y也是輸出1。直接上電路:

順手再封裝一下:

不妨再進(jìn)一小步,那么如果我們要求這樣呢:
如果A大于等于B,則輸入Y等于1,否則,Y等于0
啊哈,這不就是倒過來嘛,簡(jiǎn)單,秒了,上電路,順手封裝:

其實(shí)這個(gè)電路還有點(diǎn)小毛?。ū容^大小要分有符號(hào)比較還是無(wú)符號(hào)比較的),但是這里作者偷懶了,不想寫了,求原諒,直接下一個(gè)(
10.搭建算術(shù)邏輯單元ALU
到了本篇的最后一關(guān)啦,我們要把之前設(shè)計(jì)的器件都用起來,整一個(gè)稍微有用的電路,這個(gè)電路名字叫做算術(shù)邏輯單元,Arithmetic Logic Unit,一般簡(jiǎn)稱ALU,它的設(shè)計(jì)要求是這樣的:
當(dāng)S = 0,輸出Y = A & B
當(dāng)S = 1,輸出Y = A | B
當(dāng)S = 2,輸出Y = A ^ B
當(dāng)S = 3,輸出Y = A + B
當(dāng)S = 4,輸出Y = A - B
當(dāng)S=5,若A = B,輸入Y = 1,否則Y = 0
當(dāng)S = 6,若A < B,輸入Y = 1,否則Y = 0
當(dāng)S = 7,若A >= B,輸入Y = 1,否則Y = 0
誒,這其實(shí)就是一個(gè)大復(fù)用器,而且那些運(yùn)算咱們都會(huì)了,只要分別計(jì)算,把每種結(jié)果都準(zhǔn)備好,然后都丟給復(fù)用器的輸入端,最后的輸出根據(jù)S信號(hào)選擇出來就可以了。思路清晰,開工:

其中,相等判斷、小于判斷和大于等于判斷,這三個(gè)模塊的輸出是1比特的,所以需要擴(kuò)展一下再進(jìn)復(fù)用器,擴(kuò)展也就是零擴(kuò)展,說白了就是配上7比特的0,捏一塊。最后再測(cè)試,封裝,很完美~

預(yù)告一下,下一篇時(shí)序邏輯,很精彩哦~
擴(kuò)展閱讀:
(進(jìn)位與溢出判斷)
(超前進(jìn)位加法器)
(Booth算法與Wallace樹)
(寫不動(dòng)了,讓我偷懶一下吧……)