十四、傳輸門
下圖所示的傳輸門的作用是:當(dāng)左邊的“~1G”端輸入為0時,左側(cè)的1A4、1A3、1A2、1A1會直接傳輸?shù)接覀?cè)對應(yīng)的1Y*,就像一條線直接從1A*連接到1Y*一樣;當(dāng)左邊的“~1G”端輸入為1時,左側(cè)的1A4、1A3、1A2、1A1都不能傳輸?shù)接覀?cè)對應(yīng)的1Y*,就像從1A*到1Y*的連線被剪斷了一樣。
注:本文里我做的電路圖片都是GIF格式的,你可以在瀏覽器里看到隨著開關(guān)的開閉,輸入和輸出電路上的燈泡是如何變化的。每個圖上都有(http://bitzhuwei.cnblogs.com)標(biāo)識我的博客地址,不過每個GIF圖的最后一幀都去掉了這個標(biāo)識。這樣,看到一幀沒有標(biāo)識的時候,就知道下一幀將是GIF圖的第一幀了。
傳輸門的原理很簡單,就是在每個1A*到1Y*之間的連線上放個繼電器而已,如下圖所示。(取自《穿》)
十五、寄存器
在上一篇已經(jīng)說明了寄存器的原理,這里僅僅是為了說明“74LS194”這個帶有各種無聊管腳的四位寄存器的用法。將“~CLR”、“S1”和“S0”置為1,“SR”和“SL”置為0,然后,“74LS194”就是一個簡單的四位寄存器了。(本人在multisim12.0里只找到了這個靠譜的四位寄存器,湊合用吧。)
十六、數(shù)值顯示器
為了更直觀地看到CPU的運算結(jié)果,我們將使用“DCD_HEX”這個東西。它能夠把輸入的“0101”顯示為“5”,把“1010”顯示為“A”。
本文還要用一個四位的加法器,直接在下面這個簡陋的CPU里看就好了,不再單獨展示。
十七、回到頂部(go to top)
一個簡陋的CPU現(xiàn)在一切就緒,可以開始設(shè)計CPU了!
CPU包括運算器和控制器兩部分。我們首先做出運算器,然后逐步實現(xiàn)控制器,最后感受一下用機器語言編程的過程。本文實現(xiàn)的CPU雖然功能及其簡陋,但是能夠傳達(dá)出當(dāng)前真實CPU的原理。
十八、運算器和手動控制器
現(xiàn)在我們要做的這個CPU,字長是4位,只能做兩個數(shù)的加法。實現(xiàn)了運算器和手動版的控制器的CPU如下圖所示。我們把這個版本稱為version1的CPU。
上圖中,“Add”是加法器,能執(zhí)行兩個4位數(shù)的加法運算?!癛A”和“TR”是寄存器,“GAA”和“GBA”是傳輸門?!?”“3”“2”“1”用來準(zhǔn)備需要相加的數(shù)據(jù)(0到15),“KTR”“KRA”“KGA”“KGB”是用來控制傳輸門通斷和寄存器脈沖的開關(guān)。
在上圖所示的GIF動畫中,顯示了“5+1+2+4”這個過程。這個過程可以分為4個步驟:①加載一個數(shù)值(Load);②加上一個數(shù)值(Add);③加上一個數(shù)值(Add);④加上一個數(shù)值(Add)。具體來說,每一個步驟要做的事情是:
十九、指令內(nèi)容
加載一個數(shù)(Load)準(zhǔn)備數(shù)據(jù)(0101); KGB↓, KGA↑; KRA↓↑
加一個數(shù)(Add)準(zhǔn)備數(shù)據(jù)(0001); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑
加一個數(shù)(Add)準(zhǔn)備數(shù)據(jù)(0002); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑
加一個數(shù)(Add)準(zhǔn)備數(shù)據(jù)(0004); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑
你可以看到,每次執(zhí)行(Add)這一步,要做的事情(搬動開關(guān))是一樣的,規(guī)律性極強。這意味著可以用簡化的方式控制“KTR”“KRA”“KGA”“KGB”這幾個開關(guān)的狀態(tài)。經(jīng)過簡化的CPU就有一定的自動化控制的性質(zhì)了,如下圖所示。我們把這個版本的CPU稱為version2的CPU。
Verison2要比剛才的verison1進(jìn)化了一些。為便于理解,我們保留原來的“KTR”“KRA”“KGA”“KGB”這四個開關(guān)(把它們挪到了右上角,因為實在沒地方放了),但讓它們永遠(yuǎn)保持閉合的狀態(tài)。這是想說明:version2里新增的電路只是實現(xiàn)了更加自動化地控制“KTR”“KRA”“KGA”“KGB”的開閉,它沒有改變version1中電路的工作流程。
Version2中的“KLoad”和“KAdd”開關(guān)分別代表了“Load”和“Add”這兩個指令。當(dāng)“KLoad”閉合時,表示CPU要進(jìn)行加載操作,這會把“4”“3”“2”“1”上的數(shù)據(jù)存入寄存器“RA”;當(dāng)“KAdd”閉合時,表示CPU要進(jìn)行相加操作,這會把“4”“3”“2”“1”上的數(shù)據(jù)與“RA”當(dāng)前的數(shù)據(jù)相加,然后相加的結(jié)果又存儲到“RA”。
Version2中的“K0”和“K1”兩個開關(guān)會依次的開閉,即兩者總有一個是斷開且另一個是閉合的(若出現(xiàn)其它情況那就是電路設(shè)計錯了)。所以實際上“K0”和“K1”可以用一個“2位循環(huán)移位寄存器”代替。(為便于理解,仍然保留“K0”和“K1”這兩個開關(guān),只不過讓它們永遠(yuǎn)保持閉合的狀態(tài))
Version2中,只需重復(fù)“準(zhǔn)備指令,準(zhǔn)備數(shù)據(jù),執(zhí)行指令(K↓↑↓↑)”這樣的操作,就能完成version1中的控制功能。這需要一個從“KLoad”“KAdd”“K0”“K1”到“KTR”“KRA”“KGA”“KGB”的轉(zhuǎn)換電路,即version2電路圖中的上半部分,如下圖所示。
這需要一點點設(shè)計邏輯電路的知識,本文直接列出真值表,據(jù)此即可畫出轉(zhuǎn)換電路。(想知道如何推導(dǎo)的話,請查閱《穿》或者數(shù)字電路類書籍)
KloadKaddK0K1KGAKRAKTRKGB
10101100
01101010
01010101
其中“KLoad”“KAdd”“K0”“K1”為輸入,“KTR”“KRA”“KGA”“KGB”為輸出。只有如上三種輸入情況下,輸出部分會有1;其它的輸入情況下,輸出全部為0,所以就不需要列出來了。
舉個例子,“KGA”=“KLoad”“~KAdd”“K0”“~K1” + “~KLoad”“KAdd”“K0”“~K1”=(“KLoad” ⊕“KAdd”)“K0”“~K1”,據(jù)此可以畫出“KGA”的轉(zhuǎn)換電路。
在version2中,CPU要做的就是重復(fù)“準(zhǔn)備指令,準(zhǔn)備數(shù)據(jù),執(zhí)行指令(K↓↑↓↑)”這件事。其中執(zhí)行指令這一步是完全重復(fù)完全自動化的(只要用振蕩器替換K就可以),而準(zhǔn)備指令和準(zhǔn)備數(shù)據(jù)還需要手工操作。每次要執(zhí)行哪個指令、要準(zhǔn)備的數(shù)據(jù)是多少,這都是沒有規(guī)律的,可改進(jìn)的方法就是:把指令和數(shù)據(jù)按順序保存到一些特別的寄存器里,需要的時候取出來用。這些特別的寄存器,就是內(nèi)存。