日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

继电器是如何成为CPU的(2)

發(fā)布時(shí)間:2024/3/24 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继电器是如何成为CPU的(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

繼電器是如何成為CPU的(2)

——《穿越計(jì)算機(jī)的迷霧》整理和總結(jié)

上一篇已經(jīng)從電池、開(kāi)關(guān)、燈泡和繼電器開(kāi)始,畫(huà)出了設(shè)計(jì)CPU所需的基本器件。這些器件將成為設(shè)計(jì)CPU的磚瓦木料。這一篇就用這些基本器件做一個(gè)CPU的雛形。

本篇所需基礎(chǔ)器件

傳輸門(mén)

下圖所示的傳輸門(mén)的作用是:當(dāng)左邊的"~1G"端輸入為0時(shí),左側(cè)的1A41A31A21A1會(huì)直接傳輸?shù)接覀?cè)對(duì)應(yīng)的1Y*,就像一條線(xiàn)直接1A*連接到1Y*一樣;當(dāng)左邊的"~1G"端輸入為1時(shí),左側(cè)的1A41A31A21A1都不能傳輸?shù)接覀?cè)對(duì)應(yīng)的1Y*,就像從1A*1Y*的連線(xiàn)被剪斷了一樣。

注:本文里我做的電路圖片都是GIF格式的,你可以在瀏覽器里看到隨著開(kāi)關(guān)的開(kāi)閉,輸入和輸出電路上的燈泡是如何變化的。每個(gè)圖上都有(http://bitzhuwei.cnblogs.com)標(biāo)識(shí)我的博客地址,不過(guò)每個(gè)GIF圖的最后一幀都去掉了這個(gè)標(biāo)識(shí)。這樣,看到一幀沒(méi)有標(biāo)識(shí)的時(shí)候,就知道下一幀將是GIF圖的第一幀了。

傳輸門(mén)的原理很簡(jiǎn)單,就是在每個(gè)1A*1Y*之間的連線(xiàn)上放個(gè)繼電器而已,如下圖所示。(取自《穿》)

?

寄存器

在上一篇已經(jīng)說(shuō)明了寄存器的原理,這里僅僅是為了說(shuō)明"74LS194"這個(gè)帶有各種無(wú)聊管腳的四位寄存器的用法。將"~CLR"、"S1"和"S0"置為1,"SR"和"SL"置為0,然后,"74LS194"就是一個(gè)簡(jiǎn)單的四位寄存器了。(本人在multisim12.0里只找到了這個(gè)靠譜的四位寄存器,湊合用吧。)

?

數(shù)值顯示器

為了更直觀地看到CPU的運(yùn)算結(jié)果,我們將使用"DCD_HEX"這個(gè)東西。它能夠把輸入的"0101"顯示為"5",把"1010"顯示為"A"。

本文還要用一個(gè)四位的加法器,直接在下面這個(gè)簡(jiǎn)陋的CPU里看就好了,不再單獨(dú)展示。

一個(gè)簡(jiǎn)陋的CPU

現(xiàn)在一切就緒,可以開(kāi)始設(shè)計(jì)CPU了!

CPU包括運(yùn)算器和控制器兩部分。我們首先做出運(yùn)算器,然后逐步實(shí)現(xiàn)控制器,最后感受一下用機(jī)器語(yǔ)言編程的過(guò)程。本文實(shí)現(xiàn)的CPU雖然功能及其簡(jiǎn)陋,但是能夠傳達(dá)出當(dāng)前真實(shí)CPU的原理。

運(yùn)算器和手動(dòng)控制器

現(xiàn)在我們要做的這個(gè)CPU,字長(zhǎng)是4位,只能做兩個(gè)數(shù)的加法。實(shí)現(xiàn)了運(yùn)算器和手動(dòng)版的控制器的CPU如下圖所示。我們把這個(gè)版本稱(chēng)為version1的CPU。

上圖中,"Add"是加法器,能執(zhí)行兩個(gè)4位數(shù)的加法運(yùn)算。"RA"和"TR"是寄存器,"GAA"和"GBA"是傳輸門(mén)。"4""3""2""1"用來(lái)準(zhǔn)備需要相加的數(shù)據(jù)(0到15),"KTR""KRA""KGA""KGB"是用來(lái)控制傳輸門(mén)通斷和寄存器脈沖的開(kāi)關(guān)。

在上圖所示的GIF動(dòng)畫(huà)中,顯示了"5+1+2+4"這個(gè)過(guò)程。這個(gè)過(guò)程可以分為4個(gè)步驟:①加載一個(gè)數(shù)值(Load);②加上一個(gè)數(shù)值(Add);③加上一個(gè)數(shù)值(Add);④加上一個(gè)數(shù)值(Add)。具體來(lái)說(shuō),每一個(gè)步驟要做的事情是:

指令

內(nèi)容

加載一個(gè)數(shù)(Load)

準(zhǔn)備數(shù)據(jù)(0101); KGB↓, KGA↑; KRA↓↑

加一個(gè)數(shù)(Add)

準(zhǔn)備數(shù)據(jù)(0001); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑

加一個(gè)數(shù)(Add)

準(zhǔn)備數(shù)據(jù)(0002); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑

加一個(gè)數(shù)(Add)

準(zhǔn)備數(shù)據(jù)(0004); KGB↓, KGA↑; KTR↓↑; KGA↓, KGB↑; KRA↓↑

你可以看到,每次執(zhí)行(Add)這一步,要做的事情(搬動(dòng)開(kāi)關(guān))是一樣的,規(guī)律性極強(qiáng)。這意味著可以用簡(jiǎn)化的方式控制"KTR""KRA""KGA""KGB"這幾個(gè)開(kāi)關(guān)的狀態(tài)。經(jīng)過(guò)簡(jiǎn)化的CPU就有一定的自動(dòng)化控制的性質(zhì)了,如下圖所示。我們把這個(gè)版本的CPU稱(chēng)為version2的CPU。

Verison2要比剛才的verison1進(jìn)化了一些。為便于理解,我們保留原來(lái)的"KTR""KRA""KGA""KGB"這四個(gè)開(kāi)關(guān)(把它們挪到了右上角,因?yàn)閷?shí)在沒(méi)地方放了),但讓它們永遠(yuǎn)保持閉合的狀態(tài)。這是想說(shuō)明:version2里新增的電路只是實(shí)現(xiàn)了更加自動(dòng)化地控制"KTR""KRA""KGA""KGB"的開(kāi)閉,它沒(méi)有改變version1中電路的工作流程。

Version2中的"KLoad"和"KAdd"開(kāi)關(guān)分別代表了"Load"和"Add"這兩個(gè)指令。當(dāng)"KLoad"閉合時(shí),表示CPU要進(jìn)行加載操作,這會(huì)把"4""3""2""1"上的數(shù)據(jù)存入寄存器"RA";當(dāng)"KAdd"閉合時(shí),表示CPU要進(jìn)行相加操作,這會(huì)把"4""3""2""1"上的數(shù)據(jù)與"RA"當(dāng)前的數(shù)據(jù)相加,然后相加的結(jié)果又存儲(chǔ)到"RA"。

Version2中的"K0"和"K1"兩個(gè)開(kāi)關(guān)會(huì)依次的開(kāi)閉,即兩者總有一個(gè)是斷開(kāi)且另一個(gè)是閉合的(若出現(xiàn)其它情況那就是電路設(shè)計(jì)錯(cuò)了)。所以實(shí)際上"K0"和"K1"可以用一個(gè)"2位循環(huán)移位寄存器"代替。(為便于理解,仍然保留"K0"和"K1"這兩個(gè)開(kāi)關(guān),只不過(guò)讓它們永遠(yuǎn)保持閉合的狀態(tài))

Version2中,只需重復(fù)"準(zhǔn)備指令,準(zhǔn)備數(shù)據(jù),執(zhí)行指令(K↓↑↓↑)"這樣的操作,就能完成version1中的控制功能。這需要一個(gè)從"KLoad""KAdd""K0""K1"到"KTR""KRA""KGA""KGB"的轉(zhuǎn)換電路,即version2電路圖中的上半部分,如下圖所示。

這需要一點(diǎn)點(diǎn)設(shè)計(jì)邏輯電路的知識(shí),本文直接列出真值表,據(jù)此即可畫(huà)出轉(zhuǎn)換電路。(想知道如何推導(dǎo)的話(huà),請(qǐng)查閱《穿》或者數(shù)字電路類(lèi)書(shū)籍)

Kload

Kadd

K0

K1

KGA

KRA

KTR

KGB

1

0

1

0

1

1

0

0

0

1

1

0

1

0

1

0

0

1

0

1

0

1

0

1

其中"KLoad""KAdd""K0""K1"為輸入,"KTR""KRA""KGA""KGB"為輸出。只有如上三種輸入情況下,輸出部分會(huì)有1;其它的輸入情況下,輸出全部為0,所以就不需要列出來(lái)了。

舉個(gè)例子,"KGA"="KLoad""~KAdd""K0""~K1" + "~KLoad""KAdd""K0""~K1"=("KLoad" "KAdd")"K0""~K1",據(jù)此可以畫(huà)出"KGA"的轉(zhuǎn)換電路。

在version2中,CPU要做的就是重復(fù)"準(zhǔn)備指令,準(zhǔn)備數(shù)據(jù),執(zhí)行指令(K↓↑↓↑)"這件事。其中執(zhí)行指令這一步是完全重復(fù)完全自動(dòng)化的(只要用振蕩器替換K就可以),而準(zhǔn)備指令和準(zhǔn)備數(shù)據(jù)還需要手工操作。每次要執(zhí)行哪個(gè)指令、要準(zhǔn)備的數(shù)據(jù)是多少,這都是沒(méi)有規(guī)律的,可改進(jìn)的方法就是:把指令和數(shù)據(jù)按順序保存到一些特別的寄存器里,需要的時(shí)候取出來(lái)用。這些特別的寄存器,就是內(nèi)存。

內(nèi)存

所謂飯前便后要洗手,一個(gè)完整的衛(wèi)生間,除了有若干坑位,還得有洗手池配套。類(lèi)似的,學(xué)習(xí)CPU的結(jié)構(gòu)原理,也得把"內(nèi)存"牽出來(lái)溜溜,否則無(wú)法說(shuō)明計(jì)算機(jī)編程的本質(zhì)。CPU+內(nèi)存才是一個(gè)完整的計(jì)算機(jī)(核心),才能展現(xiàn)出CPU的功能。由此也能聯(lián)系到,將鼠標(biāo)鍵盤(pán)顯示器等稱(chēng)為"外部"設(shè)備的道理。

最基本的內(nèi)存單元能夠存儲(chǔ)和讀寫(xiě)一個(gè)位(bit),是由一個(gè)上升沿D觸發(fā)器和傳輸門(mén)組成,如下圖所示。傳輸門(mén)電路我沒(méi)有找到只有一位的,拿這個(gè)四位GAA的湊合看吧。

內(nèi)存單元的符號(hào)如下圖所示。(取自《穿》)

把8個(gè)bit單元的讀寫(xiě)端分別連起來(lái),就可以存儲(chǔ)一個(gè)字節(jié)(8bit)。下圖是能夠存儲(chǔ)5bit的內(nèi)存單元。(取自《穿》)此圖所示的結(jié)構(gòu),我們稱(chēng)之為"一層"。

存儲(chǔ)4bit的一層的符號(hào)如下圖所示。這時(shí)我學(xué)會(huì)了multisim12里的"層次塊"這個(gè)東西,下圖就是用層次塊畫(huà)的,這樣可以將復(fù)雜的電路封裝起來(lái),省地方了,還能復(fù)用。所以說(shuō)模塊化的思想在硬件設(shè)計(jì)里就有了。("用層次塊替換…"和VS里的"Extract Method…"功能是何其類(lèi)似!)

用一層一層的內(nèi)存單元,即可構(gòu)成存儲(chǔ)器。對(duì)于有8層的存儲(chǔ)器,需要3個(gè)bit表示需要讀寫(xiě)的層數(shù)(23=8)。地址譯碼器的作用是:輸入101時(shí),輸出的第5個(gè)(從0開(kāi)始計(jì)數(shù))引腳為1,其余均為0。有了地址譯碼器,存儲(chǔ)器對(duì)外只需很少的地址線(xiàn)(例如10根)即可使用很多層(例如1024層)。這也符合了軟件設(shè)計(jì)中接口盡可能簡(jiǎn)單的原則。本文所用的RAM存儲(chǔ)器的結(jié)構(gòu)如下圖所示。其中左邊的"3-8translator"就是譯碼器。

其層次塊符號(hào)如下圖所示。

這個(gè)RAM有三條地址線(xiàn)(Addr3Addr2Addr1),能夠表示23=8個(gè)字(層),每個(gè)字的長(zhǎng)度是4bit。這個(gè)小小的RAM剛好夠存儲(chǔ)(5+1+2+4)這個(gè)示例的指令和數(shù)據(jù),下面就用這個(gè)RAM繼續(xù)進(jìn)化CPU。

這里也順便把"3-8translator"譯碼器的電路實(shí)現(xiàn)貼出來(lái)吧,如下圖所示。

?

9位循環(huán)移位寄存器

在version2里用的"2位循環(huán)移動(dòng)寄存器"只需要一個(gè)乒乓觸發(fā)器(詳見(jiàn)上一篇)就可以了,但是后面要做的全自動(dòng)控制器,需要一個(gè)"9位循環(huán)移位寄存器",且這個(gè)寄存器要在加電時(shí)自動(dòng)將第一個(gè)輸出管腳置為1,其余為0。具有這樣的功能的寄存器如下圖所示。

如上圖所示,第二行有4個(gè)D↑觸發(fā)器,其中最左邊的那個(gè)負(fù)責(zé)第一個(gè)輸出管腳,即應(yīng)該在加電時(shí)就置為1的那個(gè)管腳。這是通過(guò)左下方的電路實(shí)現(xiàn)的,其原理大家自己琢磨吧,無(wú)非是利用反饋電路實(shí)現(xiàn)了只生效一次這個(gè)功能而已。"9位循環(huán)移位寄存器"的符號(hào)如下圖所示,其中"D0"是第一個(gè)輸出管腳。

還有一個(gè)3bit的計(jì)數(shù)器,在上一篇里已經(jīng)提過(guò)計(jì)數(shù)器,這里直接上圖。

?其層次塊表示如下圖所示。

?

自動(dòng)控制器

有了內(nèi)存,我們就要把指令和數(shù)據(jù)存進(jìn)去。存儲(chǔ)數(shù)據(jù)很好理解,是多少就寫(xiě)入多少。存指令之前,我們需要為每條指令分配一個(gè)4位的編碼,比如0000表示Load,1111表示Add,然后用這個(gè)指令碼控制"KLoad"和"KAdd"的開(kāi)閉,所以這又是一個(gè)轉(zhuǎn)換電路。有了這個(gè)轉(zhuǎn)換電路,就可以只用"K"開(kāi)關(guān)來(lái)完成"準(zhǔn)備指令、準(zhǔn)備數(shù)據(jù)、執(zhí)行"這些操作了。全部自動(dòng)化的CPU如下圖所示。我們將這個(gè)版本的CPU稱(chēng)為version3的CPU。

這里的"ALU"是用層次塊表示的version1里的電路,因?yàn)椴贿@樣的話(huà),電路太大,而且不容易重點(diǎn)突出自動(dòng)控制器的工作流程。同樣的,"ShiftRegister9bit"、"Translator"、"Counter3bit"、"RAM8F4bit"都是層次塊表示的電路。

"ShiftRegister9bit"會(huì)依次將輸出端置為1,這可以從上方的三個(gè)數(shù)值顯示器看出來(lái)。"Counter3bit"是3bit的計(jì)數(shù)器。"RAM8F4bit"是8層(每層4bit)的內(nèi)存。"Translator"實(shí)現(xiàn)了控制信號(hào)的自動(dòng)控制,"Translator"的內(nèi)部實(shí)現(xiàn)如下圖所示。

Version3所示的下半部分展示了譯碼電路,即把代表指令的4bit信號(hào)轉(zhuǎn)換為指令信號(hào)的電路。由于我們指定Load和Add指令的代碼(0000和1111)都是很規(guī)則的,所以譯碼電路也比較簡(jiǎn)單,如下圖所示。

Version3的CPU用"9位循環(huán)移位寄存器"等器件實(shí)現(xiàn)了"取指令、分析指令,取數(shù)、執(zhí)行"的全部自動(dòng)化,其中取指令、分析指令、取數(shù)、執(zhí)行分別占用了移位寄存器的t0- t2、t3、t4-t6、t7-t8這9個(gè)階段。

注:如果用振蕩器替換了"K",這個(gè)CPU會(huì)不停地運(yùn)轉(zhuǎn)下去,這樣就得不到我們想要的結(jié)果0xC(十進(jìn)制的12)了。所以還需要添加"停機(jī)"指令。不過(guò)到這里已經(jīng)說(shuō)清了CPU的控制器是如何一步步實(shí)現(xiàn)自動(dòng)化的,不再繼續(xù)講述如何添加新的指令。

最原始的機(jī)器語(yǔ)言編程

在給出上文的自動(dòng)控制器里,我們只說(shuō)了從內(nèi)存里取指令和數(shù)據(jù),而沒(méi)有說(shuō)這些指令和數(shù)據(jù)是如何寫(xiě)進(jìn)去的。其實(shí)寫(xiě)進(jìn)去的過(guò)程就是(機(jī)器語(yǔ)言)編程的過(guò)程。最簡(jiǎn)單的,你可以用撥動(dòng)開(kāi)關(guān)的方式,調(diào)整好要寫(xiě)入的位置,再調(diào)整好要寫(xiě)入的數(shù)值,把指令和數(shù)據(jù)一個(gè)字一個(gè)字地寫(xiě)入內(nèi)存。最初的計(jì)算機(jī)編程就是用類(lèi)似這樣的方式(打孔紙帶)編程的。(這個(gè)過(guò)程實(shí)在無(wú)聊,本文就不展示了,有興趣的話(huà)自己拿multisim玩玩就好~)

用助記符和一些宏來(lái)代替機(jī)器碼,這就是匯編語(yǔ)言。用C語(yǔ)言這種方式封裝了匯編語(yǔ)言的編程方法,就是面向過(guò)程編程。用C++\C# \Java這樣的語(yǔ)言封裝了面向過(guò)程的語(yǔ)言,就是面向?qū)ο蟮木幊谭椒āS胕f(..){…}代替JMP指令這種東西比較容易想象,但用"封裝繼承多態(tài)"這種飄渺的概念代替面向過(guò)程編程就有點(diǎn)困難了。我在另一篇文章《用C表達(dá)面向?qū)ο笳Z(yǔ)言的機(jī)制——C#版》中作了分析和總結(jié),現(xiàn)在終于算是從繼電器一路走到面向?qū)ο缶幊塘恕?/p>

總結(jié)

本系列文章只此兩篇就結(jié)束了。貌似太少算不上一個(gè)系列,不過(guò)管他呢,反正問(wèn)題寫(xiě)清楚就行了。如果有誰(shuí)想做個(gè)實(shí)用的CPU,不妨用VHDLSystemC也是用于硬件設(shè)計(jì)的,是用C++寫(xiě)的一個(gè)類(lèi)庫(kù)。我本科的時(shí)候用過(guò),也不錯(cuò)。

感謝博客園眾多園友推薦的好書(shū),寫(xiě)本篇之前惡補(bǔ)了一陣,受益匪淺!現(xiàn)和我讀的幾本書(shū)一起陳列出來(lái),方便查找。點(diǎn)擊推薦者即可跳轉(zhuǎn)到其博客上。

書(shū)名

作者

推薦者

《穿越計(jì)算機(jī)的迷霧》

李忠

BIT祝威

《編碼:隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言》(《編碼的奧秘》)

Charles Petzold

(伍衛(wèi)國(guó), 王宣政, 孫燕妮 譯)

armstronglaw, ClarkZhou, hywin, 天邊彩云, Create Chen, Florian

《計(jì)算機(jī)系統(tǒng)要素——從零開(kāi)始構(gòu)建現(xiàn)代計(jì)算機(jī)》

Noam Nisan, Shimon Schocken

(周維, 宋磊, 陳曦 譯)

吳飛

《CPU自制入門(mén)》

水頭一壽, 米澤遼, 藤田裕士

(趙謙 譯)

平如水

《CPU芯片邏輯設(shè)計(jì)技術(shù)》

朱子玉, 李亞民

吳飛

《30天自制操作系統(tǒng)》

川合秀實(shí)

(周自恒, 李黎明, 曾祥江, 張文旭 譯)

薛遺山

《Orange'S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》

于淵

BIT祝威

本文作為整理和總結(jié)性質(zhì)的文章,不求面面俱到,只為整理思路。想從燈泡開(kāi)始一點(diǎn)一點(diǎn)地了解計(jì)算機(jī)的構(gòu)成的話(huà),建議看《編碼的奧秘-隱匿在計(jì)算機(jī)背后的軟硬件語(yǔ)言》(這一本的中文翻譯也不錯(cuò))。

后續(xù)

了解了硬件的設(shè)計(jì)原理,又寫(xiě)過(guò)那么多的程序,下一步就該做個(gè)操作系統(tǒng)了。這次要寫(xiě)個(gè)真實(shí)可用的操作系統(tǒng)出來(lái),不必像研究CPU一樣只能弄個(gè)超簡(jiǎn)化的仿真模型玩了。再次感謝博客園眾多園友推薦的好書(shū),讀了這幾本書(shū)我才相信能在個(gè)把月內(nèi)做出一個(gè)有圖形界面的操作系統(tǒng)。如果再把網(wǎng)絡(luò)協(xié)議和瀏覽器整進(jìn)來(lái),豈不就可以順利暢游網(wǎng)絡(luò)?

總結(jié)

以上是生活随笔為你收集整理的继电器是如何成为CPU的(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。