前言
今天的主題十分有趣,我們將在我的世界(Minecraft)
這個游戲里,靠一個個邏輯門來組合實現(xiàn)一個簡單的七段顯示器,可以實現(xiàn)將選擇的數(shù)字輸出在顯示器上。
演示視頻在下面,來看看這個宏大的工程:
接下來,我會從最基礎的與或非實現(xiàn)開始,親自畫出電路原理圖,并且用我的世界來帶領大家領略數(shù)字電子技術的精妙之處。
本文所涉及的數(shù)電知識包括電路編碼
、基本邏輯門
、組合電路
。
當然,由于電路的精密性以及游戲里實現(xiàn)的復雜性,實現(xiàn)完整的電路是非常困難的,也會讓人難以看懂,一下子就勸退了,這也就違背了我們學習知識的初衷。
所以,我會適當?shù)膶﹄娐愤M行化簡,讓人看起來簡單易懂。
在這個過程中,我相信你一定會加深對數(shù)電的認識。學好數(shù)電,對更好更快地理解計算機組成,乃至于我們吸收軟件知識都十分有幫助。
準備工作
二進制編碼
我們首先復習一下電路是如何傳輸十進制。
當你在電路里傳輸一個十進制數(shù)時,肯定要先轉成二進制,一般有兩種二進制編碼形式,分別是自然二進制碼和 BCD 碼。
自然二進制碼
這是人們常說二進制碼,用除二取余進行真實的轉化,也就是自然二進制。
我們舉個例子,用除二取余法將十進制 123 轉換成二進制:
可以得到 123 的二進制表達為 0111011
。其他一些數(shù)的轉換我也列在下面了:
但是在實際電路中,這樣的編碼設計起來太復雜,所以電路里面一般用下面的編碼形式。
BCD 碼
如果單純?yōu)榱?strong style="font-size: inherit;line-height: inherit;color: rgb(48, 79, 254);">傳輸而不需要對數(shù)字進行加減等處理的話,搞個四位對一位的編碼最省力,很容易用一個四輸入一輸出的編碼器電路實現(xiàn),傳過去之后再用譯碼器轉成十進制就行了。
于是有了 BCD 碼(Binary-Code Decimal),常用的 BCD 碼有8421BCD 碼
,余 3 BCD碼
和 2421BCD 碼
。通常采用 4 位二進制數(shù)表示一位十進制數(shù)中的 0~9 這 10 個數(shù)碼,優(yōu)點是二進制和十進制之間的轉換可以快速進行,缺點就是有 6 種狀態(tài)為冗余狀態(tài)。
這里著重介紹一下?8421BCD 碼。
8421BCD 碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的權值為 8、4、2、1,故稱為有權 BCD 碼。
和四位自然二進制碼不同的是,它只選用了四位二進制碼中前 10 組代碼,即用 0000~1001
分別代表它所對應的十進制數(shù),余下的六組代碼不用,便是 8421BCD 碼的六種冗余狀態(tài)。
讓我們直接看表格吧,更直觀一點
從表格里可以發(fā)現(xiàn),0~9 的 8421BCD 碼和自然二進制的前十個一模一樣。從 10 開始就有所不同了,舉以下幾個例子:
比如求 16 的 8421BBCD 碼,先將 16 分開成 1 和 6 。因為1 的二進制為 0001 ,6 的二進制為 0110,所以得到 0001 0110。
很顯然,有多少位的十進制,就拆開成多少位,再對每一位進行單個編碼。
實現(xiàn)基本邏輯門
在這一小節(jié)里,我們將開始借助我的世界
里的物品實現(xiàn)簡單的邏輯門,看下圖片先熟悉一下這些物品:
從左到右分別是:
開關 :可以激活電路,相當于信號源
電線 :用于傳遞信號
紅石火把 :有兩種狀態(tài),當火把被信號激活時會熄滅,此時無法激活后續(xù)電路;當沒有被激活時,本身處于激活狀態(tài),會激活后續(xù)電路,是非門實現(xiàn)的基礎。且有向上傳遞信號的特性。
中繼器 :用于延續(xù)信號。電路傳遞信號時,信號會不斷衰減,所以在適當位置放上中繼器來使信號繼續(xù)傳遞。
好了,有了以上的基礎,我們就可以來實現(xiàn)基本邏輯門了。
非門
非門有一個輸入和一個輸出端。當其輸入端為高電平(邏輯 1 )時輸出端為低電平(邏輯 0 ),當其輸入端為低電平時輸出端為高電平。
也就是說,輸入端和輸出端的電平狀態(tài)總是反相的。非門的邏輯功能相當于邏輯代數(shù)中的非,電路功能相當于反相,這種運算亦稱非運算。
邏輯圖
當 A 端有輸入信號時,Y 端不輸出;
當 A 端無信號時,Y 端輸出。
非門邏輯表達式為:
邏輯圖為:
實現(xiàn)圖
利用紅石火把反轉信號的特性,可快速實現(xiàn)一個非門。類比高低電平,游戲里的激活和未激活狀態(tài)分別表示了邏輯 1 和邏輯 0。
當開關沒有打開時,輸入端無信號,即輸入為 0 。因為紅石火把只有被電路激活時才熄滅,所以紅石火把沒有熄滅,會激活后面的電路。紅石燈只有在激活的情況下會亮,可以用來檢測信號的狀態(tài)。雖然輸入端沒有信號,但紅石火把有信號,所以輸出端為 1,激活了紅石燈。
當開關打開時,輸入為 1 。將紅石火把激活,就會熄滅火把,熄滅后輸出端沒有信號,輸出為 0 ,紅石燈不亮。
利用以上裝置可以將輸入的信號進行反相。
或門
或門有多個輸入端,一個輸出端,只要輸入中有一個為高電平時(邏輯 1 ),輸出就為高電平(邏輯 1 );只有當所有的輸入全為低電平(邏輯 0 )時,輸出才為低電平(邏輯 0 )。
邏輯圖
當 A,B 端有一個輸入信號時,Y 端就輸出信號。只有當 A,B 都無信號時,Y 端不輸出。
或門邏輯表達式為∶Y=A+B
實現(xiàn)圖
將兩個輸入端用紅石電路并聯(lián)在一起,可實現(xiàn)一個或門。
只有同時沒有輸入,輸出才為 0 。
只要有一個輸入,輸出就為 1 。
與門
與門有多個輸入端,一個輸出端。當所有的輸入同時為高電平(邏輯 1 )時,輸出才為高電平,否則輸出為低電平(邏輯 0 )。
邏輯圖
當 A,B 端同時輸入信號時,Y 端才輸出信號。A,B 有一個無信號時,Y 端不輸出。
與門邏輯表達式為∶Y=AB
實現(xiàn)圖
與門作為一個基本的邏輯門電路,可是在我的世界里面沒有現(xiàn)成的電路來表示與門。
但是我們往上翻,會發(fā)現(xiàn)我們已經(jīng)實現(xiàn)完了或門和非門。此時可以用摩根定律來求出與門的等價邏輯表達式:
即兩個輸入端各搭非門,合并信號后再加個非門。如下圖所示,只有當兩個輸入端都有信號時,輸出端才輸出。
只有一個輸入信號則不輸出。
可能你會有點意外,這樣還能叫與門嗎?
其實無論在電路組成上采用什么形式,只要最后的結果是一個與邏輯,那么它就是與門,即使通過與非門和非門組合而成,它也叫做"與門"而不叫"與非非"門。
簡單來說,你去買一個電路的時候,也只會關心它的輸入與輸出間的邏輯關系最終是什么。
至此,與、或、非已全部實現(xiàn),且組成完備集,可以表達所有電路。 但是在實際應用中,我們不得不提到下面這個邏輯門——與非門。
與非門
在集成電路中,與非門
和或非門
是僅次于非門
的第二簡單的門,但與非門
比或非門
性能好,而且用與非門
可以實現(xiàn)任意邏輯表達式。這么高的性價比,與非門確實是有資格作為表達式的終極化簡因子的。
在手工設計電路時,如果可以的話,工程師是傾向于用與非門的,后續(xù)我們設計電路時,也傾向于把表達式轉換為與非門。
邏輯圖
當 A,B 端同時輸入信號時,Y 端才不輸出信號。其他情況時,Y 端都輸出。
與非門邏輯表達式為∶
邏輯圖為:
實現(xiàn)圖
我們將與門表達式代入以上表達式,并計算
發(fā)現(xiàn)消掉了與門的最后一個非門,與非門實現(xiàn)了對與門的化簡,只要兩個輸入端各搭一個非門,將輸出并聯(lián)在一起就能實現(xiàn)。
這也是我在設計電路時,傾向于把表達式化簡為與非門的原因之一。
組合電路
當然,只有邏輯門還是不夠的,接下來我們將在這些基本邏輯門的基礎上來實現(xiàn)一些復雜的組合電路,最后再連接起來。
為了不被復雜的電路套進去,專注于原理,我對顯示器進行了化簡,功能為可以選擇將 ?0、1、2、3 這四個數(shù)輸出在顯示器上。
編碼器
由前面所介紹的知識可知,十進制在電路里是按 8421BCD 碼進行傳輸?shù)?。那我們要怎么將十進制碼轉換為 8421BCD 碼呢?這就是編碼器要做的事了。
我們的顯示器可以選擇四個數(shù)顯示,所以編碼器只要將 0~3 進行編碼即可。
編碼器的輸入端要有四個,分別是 I?、I? 、I? 和 I?,輸出端為 Y? 和 Y?。
如果要對 2 進行編碼,則將 I? 輸入信號,其他輸入端無信號,為 0。對應的輸出端為 10,這個 10 就是 2 的 BCD 碼。
對其他數(shù)編碼同理,完整的功能表如下,輸入端 I 為 1 時,表示對應的數(shù)被按下:
根據(jù)功能表寫出輸出邏輯函數(shù)表達式:
Y? = I? + I?
Y?= I? + I?
將表達式變換為與非表達式:
根據(jù)以上與非表達式可畫出邏輯圖。
即輸入端各搭非門,按邏輯表達式加與非門。
實現(xiàn)圖
這是我們的五個輸入端,第一個消隱端/總開關將在下面的小節(jié)進行講解,后面四個就是我們可以選擇的數(shù)字。
從上面俯瞰一下,電路從這五個輸入端引出。
這是編碼器的具體實現(xiàn)部分:
應當指出,當 I? ~ I? 都為 0 時,輸出 Y?Y?=00,所以 I? 輸入線可以不接入編碼器。
好了,一個簡單的 4 線 - 2 線編碼器就完成啦。輸入端按下對應十進制的按鈕,輸出端就輸出對應的 8421BCD 碼。如果有興趣的可以按以上步驟設計出 8 線 - 3 線的完整編碼器,可以對 0~9 進行編碼。
七段顯示器
有了編碼器,自然就有譯碼器。但是在介紹譯碼器之前,我們得先了解一下七段顯示器。
七段數(shù)字顯示器由七個發(fā)光二極管構成,七段 a,b,c,d,e,f,g 分別對應一只發(fā)光二極管,利用不同段的組合,可以顯示十進制數(shù)字 0 到 9。
在我的世界里面,可以將三個紅石燈利用紅石連成一段,當成一個發(fā)光二極管。
下面則是七段顯示器正面圖:
下面則是七段顯示器背面圖:
這樣,只要信號從輸入端輸入,屏幕上對應輸出端的那一段就會亮起。
二線七段驅動/譯碼器
現(xiàn)在,編碼器和七段顯示器已經(jīng)完成,剩下了最關鍵的一個電路——顯示譯碼器,也可以稱之為顯示驅動器。
顯示譯碼器把 BCD 碼作為輸入編碼,通過譯碼器產(chǎn)生一組信號,用于驅動七段數(shù)字顯示器。
A、B 為輸入的 BCD 碼,a,b,c,d,e,f,g 則是對應編碼的輸出信號。
比如輸入的 A、B 是 0 0,代表著要將 0 顯示出來。于是 0 所對應的 a,b,c,d,e,f 段二極管要亮起來,剛好組成一個「0」的形狀,要亮起來輸出就要為 1 ,所以 a,b,c,d,e,f 都為1。
以下為完整的功能表:
根據(jù)功能表,寫出與非邏輯表達式:
按表達式將譯碼器搭建完成,效果圖如下所示:
下圖是譯碼器的俯視視角圖:
現(xiàn)在一個顯示器的基本功能有了,可是還有一點不足,就是無法將屏幕完全熄滅。沒有任何輸入的情況也代表著 0 ,所以屏幕上會一直顯示 「0
」。
但是我們回憶一下輸入端的第一個按鈕,這個輸入就是要起到一個消隱的作用。當消隱按鈕打開,屏幕完全熄滅,不論輸入什么都不顯示數(shù)字;關閉時,才能將對應的數(shù)字顯示出來。
根據(jù)我們的需求,要實現(xiàn)這樣的電路也很簡單,只要將這個輸入端和顯示器的 a,b,c,d,e,f,g 各段分別進行與門連接,只有兩個輸入端同時有信號才可以輸出。
圖中從消隱端延伸到顯示器的七段輸入,再每段連接與門。
至此,一個顯示器基本大功告成。讓我們總覽一下這件藝術品
尾聲
其實關于程序員要不要學習這么底層的知識向來是有些爭議的。
我要說的是,盡量去打開你身邊的「盒子」。 ?
本文所涉及的是數(shù)電,算是最為底層的了,甚至可以說數(shù)字電路是計算機體系結構的基礎。
你會發(fā)現(xiàn)計算機的內(nèi)存,ALU 等等都是基于門來實現(xiàn)的?;镜拈T只有與,或和非,但是他們的各種組合卻可以完成各種 NB 的功能比如說加法器減法器時鐘。在邏輯層面進行推導和組合這難道不是很有趣嗎?
他只是邏輯而已,涉及不到太多的電路和計算,很容易感興趣的。
現(xiàn)在的開發(fā)都是使用別人封裝好的包。如果只是當碼農(nóng),數(shù)電模電底層東西不懂也好,但這些底層東西的學習和理解能讓你對計算機有更本質的認識,在程序員的道路上才能走的更遠。
當你把你的底層知識征服了,你就有資本去征服更高層的知識了。
不學習底層的知識是否會阻礙成為大師?
思考中。。。
哈嘍,我是小林,就愛圖解計算機基礎,如果覺得文章對你有幫助,歡迎分享給你的朋友,也給小林點個「在看」,這對小林非常重要,謝謝你們,給各位小姐姐小哥哥們抱拳了,我們下次見!
推薦閱讀
10 張圖打開 CPU 緩存一致性的大門
知道硬盤很慢,但沒想到比 CPU Cache 慢 10000000 倍
免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!