首先咱們先來點(diǎn)表面的虛的,說明一下計(jì)算機(jī)的構(gòu)成
計(jì)算機(jī)由集成電路(IC解总,Integrated Circuit)組成,計(jì)算機(jī)的硬件有三個(gè)基本要素宇葱,CPU是計(jì)算機(jī)的大腦,負(fù)責(zé)解釋往史、執(zhí)行程序仗颈。內(nèi)存中存放著程序(程序是指令和數(shù)據(jù)的集合,比如 a = 1 + 2,"+"操作是指令,1椎例、2是數(shù)據(jù))挨决。I/O是Input/Output(輸入/輸出)的縮寫,負(fù)責(zé)將計(jì)算機(jī)和外部設(shè)備(周邊設(shè)備)連接在一起订歪。一臺(tái)計(jì)算機(jī)脖祈,除了CPU、內(nèi)存刷晋、和I/O盖高,還需要若干輔助元件,驅(qū)動(dòng)CPU運(yùn)轉(zhuǎn)的時(shí)鐘信號(hào)
再看一下眼虱,從編寫好的代碼到運(yùn)行在計(jì)算機(jī)的過程
然后再看下CPU的構(gòu)成
CPU
既然數(shù)據(jù)的運(yùn)算是在CPU中進(jìn)行的喻奥,那么在CPU內(nèi)部就應(yīng)該有存儲(chǔ)數(shù)據(jù)的地方(比如運(yùn)算 1+ 1+ 1,先運(yùn)算1+1,把結(jié)果存起來捏悬,再進(jìn)行+1運(yùn)算)撞蚕。這種存儲(chǔ)數(shù)據(jù)的地方叫作“寄存器”,CPU和內(nèi)存是由許多晶體管組成的電子部件过牙,通常稱為IC (Integrated Circuit甥厦,集成電路)。從功能方面來看寇钉,如下圖矫渔,CPU的內(nèi)部由寄存器、控制器摧莽、運(yùn)算器和時(shí)鐘四個(gè)部分構(gòu)成庙洼,各部分之間由電流信號(hào)相互連通。
寄存器可用來暫存指令镊辕、數(shù)據(jù)等處理對(duì)象油够,可以將其看作是內(nèi)存的一種。根據(jù)種類的不同征懈,一個(gè)CPU內(nèi)部會(huì)有20~100個(gè)寄存器石咬。
控制器是計(jì)算機(jī)的控制中心,它決定了計(jì)算機(jī)運(yùn)行過程的自動(dòng)化卖哎;它不僅要保證程序的正確執(zhí)行鬼悠,而且要能夠處理異常事件比如把內(nèi)存上的指令删性、數(shù)據(jù)等讀入寄存器(運(yùn)算1+1+1的話,就把內(nèi)存中的1焕窝、1蹬挺、1讀到寄存器,怎么讀它掂?后面會(huì)詳細(xì)說)巴帮,并根據(jù)指令的執(zhí)行結(jié)果來控制整個(gè)計(jì)算機(jī)。
運(yùn)算器負(fù)責(zé)運(yùn)算從內(nèi)存讀入寄存器的數(shù)據(jù)(怎么運(yùn)算虐秋?看后面)榕茧。時(shí)鐘負(fù)責(zé)發(fā)出CPU開始計(jì)時(shí)的時(shí)鐘信號(hào)(怎么發(fā)?看后面)客给。不過用押,也有些計(jì)算機(jī)的時(shí)鐘位于CPU的外部,我知道的單片機(jī)好像都是外部的
了解了CPU的構(gòu)造后靶剑,大家對(duì)程序的運(yùn)行機(jī)制的理解是不是也加深了一些前域?程序啟動(dòng)后镜粤,根據(jù)時(shí)鐘產(chǎn)生的心跳驅(qū)動(dòng)控制器會(huì)從內(nèi)存中讀取指令和數(shù)據(jù)搀矫。通過對(duì)這些指令加以解釋和運(yùn)行刑峡,運(yùn)算器就會(huì)對(duì)數(shù)據(jù)進(jìn)行運(yùn)算,控制器根據(jù)該運(yùn)算結(jié)果來控制計(jì)算機(jī)阐污⌒莸樱看到“控制”一詞時(shí),大家可能會(huì)將事情想象得過于復(fù)雜笛辟,其實(shí)所謂的控制就是指數(shù)據(jù)運(yùn)算以外的處理(主要是數(shù)據(jù)輸入輸出的時(shí)機(jī)控制)功氨。比如內(nèi)存和磁盤等媒介的輸入輸出、鍵盤和鼠標(biāo)的輸入手幢、顯示器和打印機(jī)的輸出等捷凄,這些都是控制的內(nèi)容。
CPU中每個(gè)寄存器的功能都是不同的围来。用于運(yùn)算的數(shù)值放在累加寄存器(A寄存器也叫作“累加器”跺涤,是運(yùn)算的核心)中存儲(chǔ),表示內(nèi)存地址的數(shù)值則放在基址寄存器和變址寄存器中存儲(chǔ)监透。
看到這些桶错,只能說對(duì)代碼在計(jì)算機(jī)中是怎么跑起來的,有了一個(gè)簡單的認(rèn)識(shí)胀蛮,下面才是真正的理解院刁,有請(qǐng)硬菜出廠
硬菜來嘍
為了更好理解呢,咱們先用個(gè)實(shí)例開始一步一步的講解粪狼,在計(jì)算機(jī)是怎么運(yùn)算0011 + 0001 = 0100 的退腥,包括怎么加載到計(jì)算機(jī)內(nèi)存任岸,怎么運(yùn)算,怎么把結(jié)果存儲(chǔ)起來狡刘。 從這個(gè)點(diǎn)出發(fā)享潜,咱們一步一步的進(jìn)行解析,下面說的邏輯門颓帝,可以不用記住電路圖是怎么連接的,但一定知道有那么回事窝革,因?yàn)榧热粚懗鰜砹斯撼牵隙ㄊ怯杏玫模旅骈_始
繼電器
?首先咱們先來了解一下繼電器虐译,百度百科是這么介紹的:?繼電器(英文名稱:relay)是一種電控制器件瘪板,是當(dāng)輸入量(激勵(lì)量)的變化達(dá)到規(guī)定要求時(shí),在電氣輸出電路中使被控量發(fā)生預(yù)定的階躍變化的一種電器漆诽。它具有控制系統(tǒng)(又稱輸入回路)和被控制系統(tǒng)(又稱輸出回路)之間的互動(dòng)關(guān)系侮攀。通常應(yīng)用于自動(dòng)化的控制電路中,它實(shí)際上是用小電流去控制大電流運(yùn)作的一種“自動(dòng)開關(guān)”厢拭。故在電路中起著自動(dòng)調(diào)節(jié)兰英、安全保護(hù)、轉(zhuǎn)換電路等作用
下圖是實(shí)物供鸠,電子行業(yè)比較常見的外觀是這種的,在電路板上一個(gè)黑色或者藍(lán)色小盒子
那么實(shí)現(xiàn)原理是啥呢畦贸,首先得知道電生磁。纏繞在鐵棒上的線圈楞捂,通電后會(huì)產(chǎn)生磁性薄坏,如同一塊磁鐵一樣。如下圖所示寨闹,開關(guān)閉合胶坠,鐵棒和線圈就會(huì)變成一塊磁鐵,說到這里有沒有想到以前物理學(xué)的安培定則呢
在電生磁的基礎(chǔ)上繁堡,就能造出繼電器了沈善,原理如下:看下面左邊的圖,上面的電池和燈泡是斷開的椭蹄,紅色箭頭處指的是一個(gè)彈簧矮瘟,嘴邊的開關(guān)閉合時(shí),左邊的線圈會(huì)產(chǎn)生磁性塑娇,將上面的彈簧吸下來澈侠,這樣上面的電池就和燈泡連接起來了燈泡會(huì)亮起,,如右圖埋酬,所以繼電器就是個(gè)開關(guān)哨啃,也可以做到四兩撥千斤(如果上面的電池是100V烧栋,左邊的電池是5V)
與門
如果兩個(gè)繼電器串聯(lián),就是咱們所說的“與門” 拳球,只有當(dāng)兩個(gè)開關(guān)都閉合的時(shí)候审姓,燈泡才回有電流,才回亮起來祝峻,如下圖魔吐。(補(bǔ)充,下圖是兩個(gè)開關(guān)串聯(lián)莱找,可以是三個(gè)或者是四個(gè))
所以"與門"表如下
"與門"的表示符號(hào)為
或門
如果兩個(gè)繼電器并聯(lián)酬姆,就是咱們所說的“或門”?,只要有一個(gè)開關(guān)閉合的時(shí)候奥溺,燈泡就會(huì)有電流辞色,就會(huì)亮起來,如下圖
所以“或門”的對(duì)用關(guān)系如下
或門的表示符號(hào)是
非門
之前說的開關(guān)都是默認(rèn)是關(guān)著浮定,當(dāng)我輸入端有電流以后相满,開關(guān)閉合,相當(dāng)于我輸入1輸出就是1桦卒,還有一種就是立美,開關(guān)默認(rèn)閉合,當(dāng)我輸入端有電流以后(后面的圖中方灾,電池就用V代替)悯辙,開關(guān)斷開,如下圖迎吵,開關(guān)默認(rèn)是閉合的躲撰,燈泡也是兩的,當(dāng)我把線圈通電击费,會(huì)把彈簧吸下來拢蛋,燈泡回關(guān)。現(xiàn)象就是?我輸入1輸出是0蔫巩,這種連接方式的繼電器叫谆棱,反相器。
輸出和輸入相反圆仔,符號(hào)表示為
或非門
如下圖垃瞧,有兩個(gè)串聯(lián)的反相器組成的電路,默認(rèn)燈泡是亮的坪郭,只要有一個(gè)開關(guān)閉合个从,燈泡就會(huì)滅(或門是兩個(gè)燈泡都斷開時(shí),燈泡才會(huì)不亮,這個(gè)電路是和“或門”反著嗦锐,所以叫“或非門”)
或非門的輸入輸出對(duì)應(yīng)的表為:
符號(hào)表示為:
與非門
如下圖嫌松,有兩個(gè)并聯(lián)的反相器組成的電路,默認(rèn)燈泡是亮的奕污,當(dāng)兩個(gè)開關(guān)都閉合后萎羔,燈泡就會(huì)滅 (與門是兩個(gè)燈泡都閉合,燈泡才回亮碳默,這個(gè)電路是和“與門”反著贾陷,所以叫“與非門”)
對(duì)應(yīng)的輸入輸出表為
簡寫符號(hào)是:
總結(jié)規(guī)律:涉及到“與”的就是只有當(dāng)兩個(gè)都怎么樣,結(jié)果才怎么樣嘱根∷璺希“或”只要一個(gè)怎么樣,結(jié)果就怎么樣儿子。
加法運(yùn)算
基礎(chǔ)條件已經(jīng)具備瓦哎,開始講解0011 + 0001
咱們做十進(jìn)制加法時(shí)砸喻,會(huì)從最右邊的兩位相加柔逼,然后再倒數(shù)第二列的兩位相加,那計(jì)算機(jī)是怎么對(duì)兩個(gè)數(shù)進(jìn)行相加的呢割岛,其實(shí)和咱們運(yùn)算是一致的愉适,也是先從最右邊兩位數(shù)相加 1 + 1開始
不管是十進(jìn)制還是二進(jìn)制,咱們進(jìn)行運(yùn)算時(shí)癣漆,都是先兩位相加维咸,然后再繼續(xù),比如59+13惠爽,先9+3 = 12,進(jìn)1留2癌蓖,5+1 = 6,再把前面的進(jìn)位加上,6+1 = 7婚肆,也就是72租副。
不管是兩個(gè)幾位數(shù)的數(shù)進(jìn)行運(yùn)算,最終都會(huì)轉(zhuǎn)化兩個(gè)一位數(shù)的數(shù)進(jìn)行運(yùn)算较性。當(dāng)運(yùn)算的結(jié)果用僧,超過了當(dāng)前進(jìn)制能表達(dá)的最大數(shù)大诸,就會(huì)溢出(也就是進(jìn)位)倦逐,十進(jìn)制單個(gè)數(shù)能表達(dá)的最大的值就是9蟹地,單個(gè)二進(jìn)制數(shù)能表達(dá)的最大的值就是1哼鬓。十進(jìn)制的9+3 = 12故硅,結(jié)果已經(jīng)超過9所以進(jìn)1留2针余,1稱為進(jìn)位芯急,2稱為加法位
當(dāng)前位的運(yùn)算結(jié)果實(shí)際上是加法位豌蟋,比如上圖最右側(cè)兩位進(jìn)行運(yùn)算是9+3速和,你在下面寫的就是加法位2意蛀,因?yàn)檫M(jìn)位會(huì)參與到下一次運(yùn)算耸别,不在當(dāng)前位的結(jié)果中
二進(jìn)制也一樣,咱們用二進(jìn)制進(jìn)行加法時(shí)县钥,是逢二進(jìn)一 秀姐,所有可能出現(xiàn)的情況只有下面四種情況
0 + 0 = 00 ?->進(jìn)位是0,加法位是0
0 + 1 ?= 01 ? ->進(jìn)位是0若贮,加法位是1
1 + 0 ?= 01 ? ?->進(jìn)位是0省有,加法位是1
?1 + 1 ?= 10 ? ??->進(jìn)位是1,加法位是0
所以咱們用下面左邊的表來表示四種情況下相加的“加法位”谴麦。右邊的表蠢沿,表示四種情況下二進(jìn)制加法中的“進(jìn)位”
咱們需要設(shè)計(jì)一個(gè)電路,當(dāng)輸入二位二進(jìn)制時(shí)匾效,可以同時(shí)輸出加法位和進(jìn)位舷蟀,咱們發(fā)現(xiàn)“進(jìn)位”表的結(jié)果恰好和“與門”的輸出結(jié)果相同,加法位的表面哼,好像沒有相同的野宜,得重新設(shè)計(jì)一個(gè),所以就出現(xiàn)了下面的設(shè)計(jì)魔策,左邊是設(shè)計(jì)電路匈子,右邊是對(duì)應(yīng)的輸出結(jié)果,這樣的設(shè)計(jì)闯袒,輸入和輸出虎敦,就和加法的加數(shù)和加法位對(duì)應(yīng)的上了,
這個(gè)電路被叫做異或門政敢,其徙,特定的電器符號(hào)如下圖
異或門輸出的是加法位,與門輸出的是進(jìn)位喷户,兩個(gè)并聯(lián)起來唾那,就同時(shí)有進(jìn)位和加法位了。如下面左邊的圖片,電器表示符號(hào)是右邊的圖片摩骨。這其實(shí)就是一個(gè)2個(gè)二進(jìn)制相加的加法器了
哇通贞,好激動(dòng),兩個(gè)1位的二進(jìn)制數(shù)相加的電路已經(jīng)出來了恼五。計(jì)算機(jī)是沒有思想的昌罩,只能靠各種電路來搭建出想要的東西。
0011 + 0001 最右邊的1+1用上面的電路就可以出來了灾馒,加法位是0茎用,進(jìn)位是1也就是10,然后進(jìn)行倒數(shù)第二列的加法。“0 + 1 + 最右邊產(chǎn)生的進(jìn)位”轨功,因?yàn)榍懊孢\(yùn)算產(chǎn)生進(jìn)位了旭斥,所以現(xiàn)在三個(gè)數(shù)相加,剛才咱們的“半加器”只能輸入A古涧、B兩位垂券,進(jìn)行兩位相加,現(xiàn)在是三位羡滑,那就先兩位相加菇爪,把相加的結(jié)果再和另一位相加,設(shè)計(jì)電路如下柒昏,和咱們?cè)诩埳线M(jìn)行筆算的流程是一樣的凳宙,A、B代表上圖中倒數(shù)第二列要進(jìn)行相加的1职祷、0氏涩,1和0相加后,進(jìn)位是下圖紅色4所指的線有梆,然后將加法位(紅色數(shù)字2所指)和進(jìn)位再次進(jìn)行相加是尖,產(chǎn)生加法位(紅色箭頭1所指,這是最終的數(shù))淳梦,和進(jìn)位(紅色箭頭3所指)析砸,所以三個(gè)數(shù)相加昔字,會(huì)產(chǎn)生一個(gè)加法位爆袍,和兩個(gè)進(jìn)位。最終的進(jìn)位作郭,應(yīng)該是兩個(gè)進(jìn)位的和
但是你會(huì)發(fā)現(xiàn)不管咱們進(jìn)行十進(jìn)制計(jì)算還是為二進(jìn)制計(jì)算陨囊,二個(gè)進(jìn)位都不可能同時(shí)為1,比如我當(dāng)前列的兩個(gè)數(shù)相加夹攒,如果產(chǎn)生進(jìn)位蜘醋,那么剩下的加法位加上前一列產(chǎn)生的進(jìn)位,就不可能再產(chǎn)生進(jìn)位咏尝,可以自己驗(yàn)證一下压语。進(jìn)位只可能有一個(gè)是1,所以設(shè)計(jì)圖就如下所示
用簡單的符號(hào)表示如下圖
所以就0011 + 0001可以表示為下圖编检,每一列都單獨(dú)按照順序輸入到全加器中胎食。A端輸入分別是0011,B端輸入分別是0001允懂,到此我們就實(shí)現(xiàn)了加法器了厕怜,就可以算出0011 + 0001
八位加法器
為了后續(xù)方便講解,咱們都至少用一個(gè)字節(jié)來表示數(shù)字,一個(gè)字節(jié)是8位粥航,如果兩個(gè)八位二進(jìn)制數(shù)相加琅捏,咱們就得需要8個(gè)全加器串聯(lián),如下圖递雀。
如果你要進(jìn)行16位二進(jìn)制的加法柄延,那就串聯(lián)16個(gè),一個(gè)8位加法器需要用到144個(gè)繼電器缀程,不信你可以數(shù)數(shù)拦焚。如果做減法呢,原理差不多杠输,就是讀轉(zhuǎn)成補(bǔ)碼相加
封裝成芯片赎败,就是下圖樣子,這樣輸入可以更直觀
用簡單的電器符號(hào)表示就是
振蕩器
現(xiàn)在咱們有加法器了蠢甲,咱們的計(jì)算機(jī)可以算數(shù)了僵刮,他現(xiàn)在會(huì)做 0001+ 0011,但是 如果做(0001+0011)+0111怎么辦鹦牛,一種辦法就是用兩個(gè)累加器搞糕,第一個(gè)累加器的結(jié)果輸出到第二個(gè)累加器,但是不太現(xiàn)實(shí)曼追,因?yàn)槲胰绻磺€(gè)數(shù)相加窍仰,或者不確定的數(shù)相加,就沒法整了礼殊。還有一種辦法就是記住0001+0011的和驹吮,然后再+1,所以咱們接下來學(xué)習(xí)的是讓計(jì)算機(jī)有記憶力
咱們先來看一個(gè)有趣的電路晶伦,這個(gè)電路碟狞,開關(guān)閉合后會(huì)發(fā)生什么
開關(guān)閉合以后(如圖1),線圈通電婚陪,產(chǎn)生磁性族沃,把上面彈簧吸下來(如圖2),吸下來以后泌参,線圈斷電脆淹,磁性消失,彈簧又彈上去(如圖3)如此反復(fù) ~
如果彈簧上綁一個(gè)小錘子沽一,是不是就變成小學(xué)下課放學(xué)時(shí)的鈴鐺啦了 ~盖溺。我們稱這種電路為振蕩器
當(dāng)上圖中的振蕩器的開關(guān)閉合以后,線路中隨便一個(gè)點(diǎn)電壓就會(huì)變成下圖所示锯玛。比如說彈簧從即將斷開開始算起咐柜,再到即將斷開兼蜈,是0.05s,那么1s能循環(huán)20次拙友,我們把每秒震動(dòng)的次數(shù)成為頻率为狸,單位是Hz,也就是20Hz遗契》簦可以改變彈簧的粗細(xì),材質(zhì)來改變頻率
鎖存器
在看寄存器前牍蜂,咱們?cè)倏纯础盎蚍情T”的輸入輸出對(duì)應(yīng)關(guān)系漾根,只要有一個(gè)輸入是1的情況,輸出就是0(看到“或”就是“只要有一個(gè)”)鲫竞,如果忘了或非門怎么實(shí)現(xiàn)的辐怕,可以到上邊找找。然后咱們接下來看下面的電路从绘,下體中輸
出寄疏,又回到輸入,這種連接方式成為反饋僵井,也就是輸出的結(jié)果會(huì)影響到自己
咱們接下來看一下上圖中開關(guān)閉合陕截、斷開時(shí)候的各種狀態(tài)表現(xiàn)俺夕。
1豁遭、如下面第1張圖是電路最初始的狀態(tài),現(xiàn)在兩個(gè)開關(guān)都沒通電厉斟,1驻债、2處電壓是0乳规,所以3處是1。3處是1却汉,4處是0驯妄,所以輸出端5也是0荷并,燈泡不亮
2合砂、第2張圖,第一個(gè)開關(guān)閉合源织,1處電壓是0翩伪、2處電壓是1,所以3處是0谈息。3處是0缘屹,4處是0,所以輸出端5也是1侠仇,燈泡亮起來了轻姿,亮起來以后1處就變成了1犁珠,2處還是1,3處還是0互亮,雖然1處從最開始開關(guān)閉合時(shí)的0變?yōu)闊襞蔹c(diǎn)亮后的1犁享,但是輸出結(jié)果是不變的
3、第3張圖豹休,第一個(gè)開關(guān)有閉合變?yōu)閿嚅_炊昆,1處電壓是1、2處電壓是0威根,所以3處是0凤巨。3處是0,4處是0洛搀,所以輸出端5也是1敢茁,燈泡還是亮的,咦 ~神奇不留美,其實(shí)就是因?yàn)槭欠答侂娐芬鸬?/p>
4卷要、第4張圖,第二個(gè)開關(guān)閉合独榴,1處電壓是還是1僧叉、2處電壓是0,所以3處是0棺榔。3處是0瓶堕,4處是1,所以輸出端5是0症歇,燈泡滅了郎笆,滅了以后1處就變成了0,2處是0忘晤,3處變?yōu)?宛蚓,雖然1處從最開始1變?yōu)?,但是輸出結(jié)果是不變的
這種電路有啥作用呢设塔,就是記住你上次的操作凄吏,如果燈泡亮著,就說明你上一次操作的是閉合過上面的開關(guān)闰蛔,如果是滅的痕钢,要不就是一個(gè)開關(guān)也沒動(dòng)過,要不就是最后一次操作的是下面的開關(guān)序六。就和咱們的汽車任连,如果發(fā)動(dòng)機(jī)是啟動(dòng)的,說明你最后一次是順時(shí)針擰的鑰匙例诀,如果發(fā)動(dòng)機(jī)是熄火狀態(tài)随抠,要不就是沒碰過車裁着,要不最后一次就是逆時(shí)針擰過鑰匙(僅限非一鍵啟動(dòng)的車 ~)。這就相當(dāng)于給計(jì)算機(jī)添加了記憶力拱她,可以記住上次的事
將上面的圖跨算,變一下型就成下圖,只不過在紅色數(shù)字3處椭懊,引出了一個(gè) ~Q诸蚕,注意,下圖下面的S(set)是上圖的第一個(gè)開關(guān)氧猬,下圖的上面的開關(guān)R(reset)是上圖第二個(gè)開關(guān)背犯。為啥Q和~Q是相反的呢,可以驗(yàn)證一下~Q是由Set和Q或非的結(jié)果,Q是1時(shí)盅抚,不管set是啥漠魏,~Q都是0,Q是0時(shí)妄均,set肯定是0柱锹,所以~Q是1。??
輸入輸出對(duì)應(yīng)的表格如下?丰包。set打開禁熏,或者reset打開,或者都不打開邑彪,不能同時(shí)打開瞧毙,都關(guān)閉時(shí),會(huì)保持上一次的狀態(tài)(比如上面set開關(guān)打開寄症,燈泡亮了宙彪,閉合后,會(huì)保持之前的狀態(tài)有巧,還是亮的)
現(xiàn)在這個(gè)觸發(fā)器呢還是有點(diǎn)不完美释漆,就是只要set或者reset操作了,就會(huì)把對(duì)應(yīng)的狀態(tài)記下來篮迎,也就是Q會(huì)有相應(yīng)的變化男图。比如說要記開會(huì)的會(huì)議內(nèi)容,只記重點(diǎn)就行柑潦,不需要全記享言。所以咱們做成,需要記的時(shí)候渗鬼,才記。如下圖荧琼,多了兩個(gè)與門(都為1時(shí)才是1)譬胎,當(dāng)保持位為0時(shí)差牛,set和reset不管輸入啥,兩個(gè)與門輸出的都是0堰乔,如紅色數(shù)字1偏化、2所示,所以輸入到大腦的是0镐侯,那輸入的都是0侦讨,輸出就會(huì)保持上一次的不變。當(dāng)保持位置1苟翻,set和reset才有效
咱們說了set和reset不能同時(shí)為1,但是電路是允許這樣輸入的崇猫,所以咱們得避免一下沈条,防止人為出錯(cuò),改造如下圖诅炉,數(shù)據(jù)端輸入1蜡歹,就相當(dāng)于set是1,reset是0涕烧。數(shù)據(jù)端輸入0月而,就相當(dāng)于set是0,reset是1议纯。那之前輸入都是0的情況咋沒了景鼠,咱們想想,set和reset輸入都是0痹扇,輸出會(huì)保持不變铛漓,咱們保持位是0的時(shí)候,其輸出就是不變的鲫构,就可以代替都是0的情況了浓恶。這就好像是一條有門的通道,當(dāng)保持位是1時(shí)结笨,門才打開包晰,才能通過,保持位是0時(shí)炕吸,門是關(guān)著的伐憾,無法通過。這種帶開關(guān)的就叫"電平觸發(fā)的D型鎖存器"
上圖的鎖存器赫模,只有一個(gè)數(shù)據(jù)端树肃,所以只能保存1位二進(jìn)制數(shù),如果保存多個(gè)呢瀑罗,那就多用幾個(gè)胸嘴,把八個(gè)擺在一起雏掠,就變成8位的鎖存器了,如下圖劣像,右邊是乡话,簡化電氣圖
有了記憶力之后,咱們就可以用一個(gè)加法器耳奕,進(jìn)行多個(gè)數(shù)的相加了绑青,如下圖
開關(guān)處可以依次輸入好多個(gè)數(shù),每次輸入完屋群,把相加開關(guān)閉合一下闸婴,也就是把門打開一下,讓數(shù)據(jù)進(jìn)去,你會(huì)發(fā)現(xiàn)8位鎖存器谓晌,比之前的多了一個(gè)清零開關(guān)掠拳,之前的電路也可以做到清零,保持位置1纸肉,數(shù)據(jù)端輸入0就可以了溺欧,但是為了方便清零,又單獨(dú)接了條線柏肪,線接在哪呢绑改,如下圖敛滋,直接接在最初的reset端座哩,不受保持位影響
計(jì)數(shù)器
咱們已經(jīng)可以讓咱們的計(jì)算機(jī)進(jìn)行多個(gè)數(shù)的計(jì)算了龄寞,但是還不完美,每個(gè)數(shù)的運(yùn)算谬俄,都得手動(dòng)操作一下開關(guān)柏靶,然后萬一輸入錯(cuò)誤,那就得從頭開始了溃论。所以怎么繼續(xù)改造
之前說的電平觸發(fā)的D型鎖存器屎蜓,現(xiàn)在再說個(gè)邊沿觸發(fā)的D型鎖存器,電平觸發(fā)的是一道門,輸入1時(shí)钥勋,門打開炬转,??進(jìn)去了,邊沿觸發(fā)是兩道門算灸,打開兩道門??才能進(jìn)去扼劈,兩道門就是兩個(gè)電平觸發(fā)的D型鎖存器組成,如下圖左邊一個(gè)菲驴,右邊一個(gè)荐吵。
當(dāng)時(shí)鐘為0時(shí),左邊觸發(fā)器保持位為1,第一道門打開捍靠,數(shù)據(jù)端進(jìn)入到第一個(gè)鎖存器沐旨,當(dāng)時(shí)鐘為1時(shí)森逮,第一個(gè)鎖存器的保持位為0榨婆,門關(guān)上了,右邊的第二個(gè)鎖存器的保持位(紅色箭頭2處)處為1褒侧,第二道門打開良风,??就進(jìn)去了 ~ ,時(shí)鐘信號(hào)由0變1闷供,??分別經(jīng)過1烟央、2道門。這就是邊沿觸發(fā)的D型鎖存器
符號(hào)表示為
clk是用來輸入0~1變化的心跳歪脏,那這個(gè)心跳由誰來產(chǎn)生呢疑俭,就有之前說的振蕩器,加上振蕩器以后婿失,就變成下面這個(gè)樣子
輸入輸出的時(shí)序圖如下钞艇,也就是,時(shí)鐘信號(hào)變兩次(開兩扇門)豪硅,輸出才變1次(??才跑出來)哩照,下面這張圖,真正理解了邊沿觸發(fā)器才會(huì)看明白
然后根據(jù)輸入信號(hào)的變化懒浮,和clk的變化飘弧,可以看出是如下關(guān)系,用紅色箭頭指的“下降”和“上升”的位置砚著,就是指 數(shù)值 要變化了次伶,只有時(shí)鐘信號(hào)由0->1的瞬間,Q的輸出會(huì)變成的輸入的D一樣稽穆。時(shí)鐘信號(hào)由1->0再從0->1這算一個(gè)周期冠王。所以時(shí)鐘信號(hào)每變化一個(gè)周期(兩次),輸出才會(huì)變化一次
如果輸入的時(shí)鐘心跳頻率是20Hz秧骑,即每秒20次版确,那輸出端Q變化的頻率是減半,變成10Hz乎折,由于這個(gè)原因绒疗,這種電路稱為分頻器。如果連接好幾個(gè)骂澄,可以產(chǎn)生更多頻率的輸出吓蘑,因?yàn)閪Q和Q的反的,Q和輸入D是一樣的,所以~Q和和D是相反的磨镶。將輸出的~Q反向輸入到D就會(huì)讓D處于一直變化的狀態(tài)
心跳溃蔫、Q1、Q2琳猫、Q3輸出的頻率分別遞減為前者的一半伟叛,分別為20Hz、10Hz脐嫂、5Hz统刮、2.5Hz。如圖
把0账千、1標(biāo)上去之后就會(huì)發(fā)現(xiàn)了一個(gè)新奇玩意
把圖順時(shí)針先轉(zhuǎn)90度就是
剛才是一個(gè)震蕩器(心跳)+ 三個(gè)D型觸發(fā)器侥蒙,構(gòu)成了4位的二進(jìn)制數(shù)所能表達(dá)的數(shù),如果把8個(gè)觸發(fā)器連接到一起匀奏,就構(gòu)成了8位的計(jì)數(shù)器,如下圖娃善,如果你擔(dān)心傳遞把的觸發(fā)器论衍,會(huì)有延遲,別擔(dān)心会放,與更先進(jìn)沒有延遲的并行(同步)計(jì)數(shù)器
下面開始講內(nèi)存饲齐,咱們都知道,咱們的程序會(huì)被加載到內(nèi)存咧最,那內(nèi)存是由啥構(gòu)成的捂人,怎么訪問呢
內(nèi)存
首先,回顧一下矢沿,前面說的D型電平觸發(fā)器滥搭,當(dāng)寫操作端為1時(shí),Q才會(huì)變?yōu)閿?shù)據(jù)端捣鲸,否則不變化瑟匆。也就是寫操作端為1時(shí),會(huì)把數(shù)據(jù)端輸入的數(shù)據(jù)存儲(chǔ)起來了
簡化的符號(hào)是
如果把8個(gè)電平觸發(fā)器連起來栽惶,共用一個(gè)寫操作端愁溜,那就可以同時(shí)存8位,如圖
但是如何檢測(cè)外厂,我輸出的數(shù)據(jù)是啥呢冕象,當(dāng)然可以連上燈泡檢測(cè),8個(gè)輸出汁蝶,用一個(gè)燈泡得連8次才能全部檢驗(yàn)完渐扮。所以發(fā)明了另一個(gè)比較簡單的裝置论悴,這樣就不用拿著一個(gè)燈泡安裝,拆下墓律,再安裝
8-1選擇器
具體的實(shí)現(xiàn)是
輸入輸出對(duì)應(yīng)的就是
這樣只需要1個(gè)燈泡連接膀估,只操作那三個(gè)開關(guān)就可以實(shí)現(xiàn)挨個(gè)輸出對(duì)應(yīng)的結(jié)果,
接下來再看輸入耻讽,一種方法就是察纯,每個(gè)寫操作端加一個(gè)開關(guān),來決定當(dāng)前的鎖存器是否被選中,還有一種就是齐饮,只有一個(gè)選擇開關(guān)捐寥,然后判斷這個(gè)選擇開關(guān)作用到哪個(gè)鎖存器笤昨,于是就發(fā)明了 3-8譯碼器
數(shù)據(jù)輸入端的數(shù)據(jù)祖驱。由輸出端O(0-7八個(gè)腳)的哪個(gè)腳輸出,是有S0、S1瞒窒、S2決定的捺僻,上圖可以看出數(shù)據(jù)輸入端和每個(gè)“與門”相連,“與門”的特點(diǎn)是只要輸入端有1個(gè)是0崇裁,則輸出肯定是0匕坯,所以要想與門的輸出和數(shù)據(jù)輸入端一樣,則“與門”的其他三個(gè)輸入必須為1拔稳。咱們舉個(gè)例子葛峻,比如S0、S1巴比、S2對(duì)應(yīng)的是0术奖、1、0,那輸出端的哪個(gè)引腳和數(shù)據(jù)輸入端一樣轻绞, S0是0所以下圖用紅色箭頭指的線相關(guān)聯(lián)的“與門”輸出肯定是0采记,就排除了和S0直接連接的與門(紅色箭頭指的1、3政勃、5唧龄、7),S1是1,取反是0奸远,所以和S1取反連接的與門既棺,都會(huì)輸出0,所以下圖用綠色箭頭指的線相關(guān)聯(lián)的“與門”輸出肯定是0懒叛,就排除了和S1非們直接連接的與門(藍(lán)色箭頭指的0丸冕、1、4芍瑞、5)晨仑,S2是0所以下圖用藍(lán)色箭頭指的線相關(guān)聯(lián)的“與門”輸出肯定是0,就排除了和S2直接連接的與門(藍(lán)色箭頭指的4、5洪己、6妥凳、7)
所以還剩2,有可能答捕,咱們?cè)衮?yàn)證一下2是否和數(shù)據(jù)輸入端一直逝钥,看下圖,2引腳的輸出拱镐,是 S0取反艘款、S1、S2取反沃琅、數(shù)據(jù)輸入端決定的
S0取反哗咆、S1、S2取反對(duì)應(yīng)的是1益眉、1晌柬、1,所以輸出引腳2的輸出值,是由數(shù)據(jù)輸入端決定的
所有的情況都走一遍你會(huì)發(fā)現(xiàn)郭脂,結(jié)果是這樣的
然后就組裝了一個(gè)年碘。可以一邊存展鸡,同時(shí)可以看到存的值是啥的系統(tǒng),如果寫操作端置1屿衅,就是一邊存,接著把存的值顯示出來莹弊,如果寫操作端置0涤久,那么只顯示選中的地址存的值
然后這就是咱們常說的RAM(Random Access Memory)~簡化結(jié)構(gòu)為,之所以被稱為隨機(jī)訪問存儲(chǔ)器,是因?yàn)樽x寫操作很自由箱硕,我們只需要改變地址及相關(guān)的輸入拴竹,就可以從8個(gè)鎖存器中讀出或?qū)懭胄枰拇髷?shù)據(jù)
這個(gè)RAM可以存儲(chǔ)8位,要想存儲(chǔ)更多怎么辦,可以拼更大的,比如下圖
2-1選擇器,輸出會(huì)根據(jù)選擇端是0還是1來輸出A還是B
如果想要更大的,可以依次類推喂窟。咱們?cè)倩仡櫼幌录喊梗白龆鄠€(gè)數(shù)的加法時(shí),需要把每個(gè)加數(shù),比如50個(gè)數(shù)相加,依次從開關(guān)處輸入,每輸入完一個(gè)按一下“相加”把 "和" 存起來啦鸣,等待下一次相加,如下圖
雖然可以實(shí)現(xiàn)多個(gè)數(shù)相加来氧,但是還是得依靠人工把每個(gè)數(shù)用開關(guān)輸進(jìn)去诫给,萬一中途某個(gè)數(shù)輸錯(cuò)了香拉,那前功盡棄,所以繼續(xù)改進(jìn)中狂,咱們上面剛剛學(xué)習(xí)了RAM,可以隨表訪問某個(gè)地址讀寫凫碌,萬一某一個(gè)寫錯(cuò)了,可以直接訪問那個(gè)修改就可以了胃榕,
所以改進(jìn)一下盛险,第一步,先用控制面板(開關(guān))把加數(shù)挨個(gè)輸進(jìn)去勋又,萬一錯(cuò)了可以隨時(shí)改苦掘,如下圖,可以用地址選擇開關(guān)選擇要寫入的鎖存器
數(shù)據(jù)有了以后楔壤,就可以往加法器里自動(dòng)輸入進(jìn)行相加操作鹤啡,真昂起每震蕩一次,16位計(jì)數(shù)器就會(huì)從0000 0000 0000 0000 每次加1挺邀,直到 1111 1111 1111 1111 計(jì)數(shù)器的輸出作為RAM地址選擇段的輸入揉忘,就會(huì)依次選中每個(gè)地址,將咱們手動(dòng)輸入到RAM的數(shù)據(jù)依次輸出到加法器端铛。同時(shí),振蕩器也連接著鎖存器疲眷,同時(shí)會(huì)把加法器加完的數(shù)值鎖存起來禾蚕。
????????這樣就不怕輸入錯(cuò)了,到目前為止咱們已經(jīng)涉及到了累加器狂丝、內(nèi)存换淆、鎖存器、控制器几颜,但是還有些不足倍试,比如,我一共就有10個(gè)數(shù)相加蛋哭,加完怎么讓他停下來呢 ~ ? 县习,還有一個(gè)問題就是我想做 27h+A2h+18h =? 、1Fh + 89h = 谆趾?躁愿、33h+2Ah+55h =? 我就得先把27h、A2h沪蓬、18h輸入到RAM做完加法以后彤钟,再把1Fh、89h輸入進(jìn)去跷叉,再做加法逸雹,依次類推营搅,這是比較麻煩的,就和普通計(jì)算器一樣梆砸,不像電腦 ~剧防。
????????我們希望這個(gè)家伙可以更智能一點(diǎn),比如我輸進(jìn)去27h辫樱、A2h峭拘、18h、1Fh狮暑、89h鸡挠、33h、2Ah搬男、55h計(jì)算機(jī)能知道我前三個(gè)數(shù)是一組拣展,接下來的后2個(gè)數(shù)是一組,最后三個(gè)是一組缔逛,并且把每組的計(jì)算結(jié)果接著保存到RAM中备埃,方便我一會(huì)查看(當(dāng)組數(shù)是100組時(shí),如果不保存褐奴,很容易記錯(cuò))按脚,但是只靠輸入27h、A2h敦冬、18h辅搬、1Fh、89h脖旱、33h堪遂、2Ah、55h這幾個(gè)數(shù)萌庆,別說計(jì)算機(jī)溶褪,就是人也沒法確定你要干啥。
????????所以得附帶一些說明践险,告訴他我這個(gè)數(shù)是干啥的猿妈。比如告訴計(jì)算機(jī)27h是第一個(gè)加數(shù),A2h是這組運(yùn)算的第2個(gè)加數(shù)捏境,18h是第一組的最后一個(gè)加數(shù)于游,加完最后一個(gè)加數(shù)后,你得給我把"和"存起來垫言。第一個(gè)數(shù)27h需要的操作就是把他加載到累加器中贰剥,不需要計(jì)算,因?yàn)楝F(xiàn)在只有一個(gè)數(shù)筷频,第二個(gè)數(shù)A2h需要做的操作就是加載到累加器中并且進(jìn)行求和運(yùn)算蚌成,第三個(gè)數(shù)18h需要做的事是繼續(xù)和前兩個(gè)數(shù)的相加結(jié)果求和并且存起來前痘。然后累加器清零開始加載第二組的第一個(gè),以此類推担忧。當(dāng)做完第三組的時(shí)候芹缔,需要將停止計(jì)算。
首先如果咱們想把計(jì)算結(jié)果保存到RAM中瓶盛,那么咱們計(jì)算的結(jié)果最欠,應(yīng)該得連接到RAM,如下圖惩猫,鎖存器存儲(chǔ)的是計(jì)算結(jié)果芝硬,結(jié)果不僅輸入到加法器用來做接下來的運(yùn)算,而且還連接到了RAM方便把每組計(jì)算的最后結(jié)果存儲(chǔ)起來轧房。什么時(shí)候存呢拌阴,當(dāng)然是當(dāng)每組的最后一個(gè)加數(shù)加完,將RAM的W寫操作端置1奶镶,然后就存起來了
但是把每組計(jì)算的結(jié)果存哪里比較好迟赃,當(dāng)然是放在每組的最后面比較好,這樣每組的加數(shù)和相加的結(jié)果都存在一起厂镇。如下圖纤壁,方格里是具體要操作的數(shù),左邊0000h:代表在RAM中的地址
然后再給每個(gè)要進(jìn)行運(yùn)算的數(shù)做一個(gè)操作說明剪撬,
所以我要把每個(gè)加載到內(nèi)存的數(shù)摄乒,都做一個(gè)說明,讓計(jì)算機(jī)知道我這個(gè)數(shù)是干啥的残黑。怎么表示這個(gè)數(shù)是干啥的呢,所以數(shù)據(jù)的說明(操作碼)就·產(chǎn)生了斋否,根據(jù)上面的加法遇到的情況梨水,可以表示為加載、保存茵臭、加法疫诽、停止,并且還有對(duì)應(yīng)的代碼值旦委,如下圖奇徒,匯編語言的既視感有木有
所以咱們要做的就是,對(duì)每個(gè)輸入到RAM中的數(shù)據(jù)要做一個(gè)說明缨硝,說明他是用來做啥運(yùn)算的摩钙,剛開始發(fā)明了一種方式就是用兩個(gè)RAM,一個(gè)和之前一樣繼續(xù)存放咱們的數(shù)據(jù)查辩,另一個(gè)RAM存儲(chǔ)對(duì)這個(gè)數(shù)據(jù)的說明(操作碼),如下圖胖笛,左邊的RAM存儲(chǔ)著對(duì)第二個(gè)RAM同樣地址的數(shù)據(jù)的說明(也就是操作碼的簡寫),右邊是存放數(shù)據(jù)的RAM,
所以有兩個(gè)RAM的結(jié)構(gòu)圖如下网持,需要注意的是:
(1)16位計(jì)數(shù)器是一直工作的,所以還是從地址0000開始同時(shí)訪問兩個(gè)RAM
(2)當(dāng)紅色箭頭1輸出的代碼(操作碼长踊,后面圖中說的代碼指操作碼)是10h也就是Load時(shí)功舀,紅色箭頭2處的選擇器的輸入應(yīng)該選左邊也就是RAM的輸入,因?yàn)檫@是加法的第一個(gè)數(shù),不需要進(jìn)行運(yùn)算身弊。如果選右邊辟汰,會(huì)被上一次進(jìn)行的運(yùn)算結(jié)果干擾,上一次的運(yùn)行結(jié)果還在加法器中的右側(cè)輸入端
(3)當(dāng)紅色箭頭1輸出的代碼(數(shù)據(jù)的說明碼)是11h也就是Store時(shí)阱佛,需要將紅色箭頭3指的數(shù)據(jù)的RAM的寫操作端置1帖汞,這樣就會(huì)把運(yùn)算的結(jié)果寫到RAM中
咱們的加法器和鎖存器都是8位的,如何進(jìn)行16位的運(yùn)算呢瘫絮,比如76AB + 232C = 涨冀?,有一種辦法就是先低八位相加存起來麦萤,然后再高八位相加鹿鳖。AB + 2C,76 + 23,具體運(yùn)算如圖
當(dāng)然這是比較好的情況,因?yàn)榈桶宋幌嗉記]產(chǎn)生進(jìn)位壮莹,如果產(chǎn)生進(jìn)位了咱們還得處理翅帜。回想一下剛開始講的加法器命满,兩個(gè)數(shù)相加涝滴,產(chǎn)生進(jìn)位會(huì)有一個(gè)進(jìn)位標(biāo)志,會(huì)在下一位運(yùn)算時(shí)加進(jìn)去胶台,如下圖,這是 A +B自己每列相加產(chǎn)生的進(jìn)位會(huì)自己處理歼疮,但是咱們這次要做的事,把A + B產(chǎn)生的進(jìn)位诈唬,算到 C + D中去韩脏。但是思路是一樣的,第一次運(yùn)算有進(jìn)位以后铸磅,用一個(gè)鎖存器存起來赡矢,鎖存器的名字就叫“進(jìn)位鎖存器”吧。下次運(yùn)算時(shí)阅仔,把進(jìn)位鎖存器的值連接到進(jìn)位輸入吹散,參與第二次運(yùn)算。
但是這樣把一個(gè)16位的數(shù)拆成兩個(gè)8位還是不太靈活八酒。第一空民,輸入數(shù)據(jù)的流程必須是 輸入第一個(gè)加數(shù)->輸入第二個(gè)加數(shù)->預(yù)留出結(jié)果位。丘跌。袭景。唁桩。反復(fù)這樣,我如果要進(jìn)行的是32位的數(shù)相加耸棒,我的結(jié)果是分散在四個(gè)地方的荒澡,查看不方便,第二与殃,我前面運(yùn)算的結(jié)果单山,在后面的運(yùn)算中是想用也沒法用的
于是就將存放代碼(操作碼)的RAM優(yōu)化了一下,之前操作碼和數(shù)據(jù)的對(duì)應(yīng)關(guān)系是1對(duì)1幅疼,現(xiàn)在改為3對(duì)1米奸,如下圖,第一個(gè)代表要操作碼爽篷,是Load還是Add悴晰,還是Store,第二行和第三行代表數(shù)據(jù)在數(shù)據(jù)RAM中的地址
這樣就靈活了很多,我可以把從計(jì)數(shù)器還沒走到的位置逐工,或者已經(jīng)走過去的位置進(jìn)行讀寫操作假颇,比如進(jìn)行16位數(shù)的加法時(shí)赘那,結(jié)果可以這樣存括细,如下圖骏庸,我用左邊的代碼就可以實(shí)現(xiàn)右圖表示的將結(jié)果保存在相鄰的位置
既然RAM是可以隨意訪問不同位置的數(shù)據(jù),并且數(shù)據(jù)的RAM和操作碼的RAM不需要一一對(duì)應(yīng)袒啼,咱們就可以用一個(gè)RAM了哈扮,比如前半部分放操作碼,后半部分放數(shù)據(jù)蚓再,完美滑肉,這樣就出現(xiàn)了下面的結(jié)構(gòu)圖,咱們以上圖的運(yùn)算作為講解例子摘仅,(此時(shí)需要一個(gè)電路赦邻,就是心跳一下,紅色箭頭5指的鎖存器clk輸入為1, ?6实檀、7的 clk為0,第二下按声,6的為1膳犹, 5、7為0签则,第三下须床,7為1, 5渐裂、6為0豺旬。并且第三下之后讓2-1選擇器的sel取反钠惩,讓2-1的選擇器的輸入由紅色箭頭1變?yōu)榧t色箭頭2,然后再下一輪之前再變回來),首先讓2-1選擇器默認(rèn)是上端作為輸入族阅,計(jì)數(shù)器第一心跳輸出默認(rèn)是0000篓跛,然后從紅箭頭1出輸入到RAM,此時(shí)RAM地址0000出存的是10h,所以輸出的是10h(操作碼Load),此時(shí)紅色箭頭5把10保存下來了坦刀,計(jì)數(shù)器第二下心跳輸出默認(rèn)是0001愧沟,然后從紅箭頭1出輸入到RAM,此時(shí)RAM地址0001處存的是40h,所以輸出的是40h(代表數(shù)據(jù)的地址),此時(shí)紅色箭頭6把40h保存下來了鲤遥,計(jì)數(shù)器第三下心跳輸出默認(rèn)是0002沐寺,然后從紅箭頭1出輸入到RAM,此時(shí)RAM地址0002處存的是01h,所以輸出的是01h(代表數(shù)據(jù)的地址),此時(shí)紅色箭頭7把40h保存下來了,當(dāng)心跳第三次結(jié)束以后盖奈,2-1選擇器的輸入變?yōu)榧t色箭頭2混坞,也就是紅色箭頭6、7拼起來的16位地址钢坦,也就是加數(shù)的地址4001h究孕,進(jìn)入RAM以后,RAM把4001h地址處的數(shù)據(jù)ABh輸出出來场钉,然后進(jìn)入之前電路圖中所示的累加器的鎖存器蚊俺,累加器后面的鎖存器的輸出,會(huì)連接到紅色箭頭3所示逛万,當(dāng)遇到11h的操作碼時(shí)泳猬,RAM的w端置1。大體思路就是這樣宇植,有些具體的小的結(jié)構(gòu)沒體現(xiàn)得封,可以嘗試做一下
是不是已經(jīng)看得頭大了,沒事再忍忍指郁,還有最后一次優(yōu)化就講完了 ~
咱們?cè)賮碚f說跳轉(zhuǎn)Jump忙上,比如咱們要做乘法,A7h x 1Ch,也就是把A7h重復(fù)加1C次闲坎,如果單個(gè)輸入疫粥,就太費(fèi)時(shí)間了。如果咱們有跳轉(zhuǎn)腰懂,就好了梗逮,只寫A7h?+A7h,執(zhí)行完再跳到開始處繼續(xù)執(zhí)行绣溜。咱們的操作碼和數(shù)據(jù)都是放到RAM中的慷彤,比如想要跳轉(zhuǎn)到A地址,說白了就是讓訪問RAM的地址A,那么訪問RAM哪的地址底哗,是計(jì)數(shù)器決定的岁诉,所以出發(fā)點(diǎn)是,需要的時(shí)候修改計(jì)數(shù)器輸出的值跋选,可以通過16位計(jì)數(shù)器的D型邊沿觸發(fā)器的預(yù)置(Pre)和清零(Clr)輸入來實(shí)現(xiàn)涕癣,清零之前有提及,預(yù)置的原理一樣野建,就是直接連接線到輸出附近
說白了就是属划,當(dāng)置位信號(hào)(下面會(huì)說到這個(gè)置位信號(hào))為1時(shí),輸入是啥候生,Q端輸出就是啥同眯,所以當(dāng)遇到跳轉(zhuǎn)指令時(shí),將置位信號(hào)變?yōu)?唯鸭,輸入端輸入跳轉(zhuǎn)指令后面的地址须蜗,這樣RAM的輸入就是跳轉(zhuǎn)指令后面的地址,輸出就是RAM中跳轉(zhuǎn)指令后面的地址的值,這樣就多了一個(gè)跳轉(zhuǎn)指令 Jump(操作碼是30h)
所以電路中的計(jì)數(shù)器目溉,就多了一個(gè)置位功能明肮,為了隨時(shí)改變計(jì)數(shù)器的值,如下圖
現(xiàn)在還有一個(gè)問題就是缭付,怎么讓跳轉(zhuǎn)指令停下來柿估,我重復(fù)1Ch次以后,需要停下來陷猫,這樣得需要一個(gè)停下來的標(biāo)志位秫舌,這個(gè)標(biāo)志位就叫0標(biāo)志位,他也是個(gè)鎖存器绣檬,我們?cè)诩臃ㄆ魃线B接上這個(gè)鎖存器足陨,如圖,當(dāng)加法器輸出的每位都是0時(shí)娇未,或非門輸出是1墨缘,也就是零標(biāo)志位是1
比如重復(fù)1C次,想要做的就是零抬,每重復(fù)完一次镊讼,1C就減1,當(dāng)時(shí)0的時(shí)候平夜,上圖的加法器就輸出0了狠毯,然后跳轉(zhuǎn)標(biāo)志位就變1了,變已以后褥芒,咱們就不強(qiáng)制改變計(jì)數(shù)器的值了,咱們做呢 ~首先,我們可以在強(qiáng)制干預(yù)計(jì)數(shù)器的那個(gè)邊沿觸發(fā)器置位那里?“與”?一個(gè)取反的0標(biāo)志位后再輸入到置位锰扶,0標(biāo)志位默認(rèn)是0献酗,取反后是1,所以不干預(yù)操作置位坷牛,當(dāng)0標(biāo)志位是時(shí)罕偎,置位會(huì)失效
如下圖這是A7 x 1的運(yùn)算,左邊是數(shù)據(jù)京闰,右邊是操作碼和地址
接下來就是怎么在1Ch次后颜及,加法器輸出為0(加法器輸出為0,零標(biāo)志位就是1)蹂楣,咱們得在跳轉(zhuǎn)前俏站,專門做一個(gè)操作,就是讓1C減1痊土,1003h的地址里就是1C肄扎,和001E地址的FFH相加,實(shí)際上是減1操作了赁酝,然后存到1003h犯祠,然后重復(fù)操作,最后加法器就變成0了(實(shí)驗(yàn)一下 1C + FF = 0001 1100 + 1111 1111 = ? ?0001 1011 = 1B)?
最開始講了加法器酌呆,這里講了RAM(內(nèi)存)那一個(gè)簡單的小計(jì)算機(jī)是不是就出來了衡载,如下圖,只需要把需要加的數(shù),依次從開關(guān)處輸入隙袁,沒輸入完一個(gè)按一下“相加”把和存起來痰娱,等待下一次相加
用來累加多個(gè)數(shù)的鎖存器稱作累加器
現(xiàn)在再來看文章剛開始說的CPU構(gòu)成的部分如下圖,現(xiàn)在就應(yīng)該很清楚了吧藤乙,
寄存器就是鎖存器猜揪,來存儲(chǔ)數(shù)據(jù)
控制器就是邊沿觸發(fā)器的串聯(lián)分頻產(chǎn)生的,用來產(chǎn)生計(jì)數(shù)
運(yùn)算器就是上面說的加法器
時(shí)鐘就是說的那個(gè)鈴鐺電路
Bug的由來
接下來是自己的一些理解(不保證是對(duì)的)
CPU架構(gòu)
用10h代表Load的意思坛梁,用11h代表保存的意思而姐,這個(gè)值不是適用于所有的計(jì)算機(jī),不同的CPU划咐,可能用不同的值代表拴念、不同的CPU電路的設(shè)計(jì)也可能不一樣,這就延伸出一個(gè)知識(shí)點(diǎn)褐缠,架構(gòu)
架構(gòu)是也可以說是指令集架構(gòu)政鼠,是指令集的實(shí)現(xiàn)或者可以簡單理解成指令集的另一種叫法,arm架構(gòu)就是指使用arm指令集的處理器队魏。那什么是指令集呢公般?指令集是存儲(chǔ)在CPU內(nèi)部万搔,對(duì)CPU運(yùn)算進(jìn)行指導(dǎo)和優(yōu)化的硬程序,CPU的運(yùn)行執(zhí)行的就是指令集,目前市面上的CPU分類主要分有兩大陣營官帘,
X86
intel瞬雹、AMD為首的復(fù)雜指令集CPU,Intel刽虹、AMD的CPU是X86架構(gòu)的(Intel早期的處理器名稱是以數(shù)字來表示酗捌,并以“86”作為結(jié)尾,包括Intel 8086涌哲、80186胖缤、80286、80386阀圾、80486哪廓、80586、奔騰系列等等稍刀,因此其架構(gòu)被稱為“x86”)
ARM
IBM撩独、ARM為首的精簡指令集CPU。IBM公司的CPU是PowerPC架構(gòu)账月,ARM公司是ARM架構(gòu)综膀。
ARM處理器具有低成本、相對(duì)的高性能和低耗電的特性局齿,ARM的高性價(jià)比和低耗能剧劝,非常適用于移動(dòng)通信領(lǐng)域,所以在移動(dòng)市場(chǎng)比英特爾更具優(yōu)勢(shì)抓歼。
那么復(fù)雜指令集和精簡指令集的區(qū)別在哪呢讥此,個(gè)人感覺就是咱們今天學(xué)習(xí)的電路的設(shè)計(jì),布局的區(qū)別
之前看到一個(gè)而比較形象的例子谣妻,自己又改造了一下,例如?泡1杯檸檬水
復(fù)雜指令集: 1萄喳、去泡一杯檸檬水 ? ?2、爺蹋半,泡好了 ? (相當(dāng)于復(fù)雜指令里有泡檸檬水這個(gè) "操作碼")
精簡指令集:1他巨、去泡一杯檸檬水????2、找杯子???? 3减江、找檸檬 ?????4染突、倒上水???? 5、 放檸檬????6辈灼、泡好了份企。(簡潔指令里,沒有泡檸檬這個(gè) “操作碼”,只能按順序執(zhí)行小步)
顯然復(fù)雜指令速度快效率高巡莹,但是如果吩咐去泡杯百香果水司志,那復(fù)雜指令還得有一個(gè)泡百香果水的操作碼甜紫,然后又一堆和之前重復(fù)的電路,但是俐芯,簡介指令棵介,只需要把找檸檬替換成找百香果
X86(復(fù)雜指令)性能很牛,電路多并且設(shè)計(jì)復(fù)雜吧史,所以發(fā)熱量比較大,需要主動(dòng)散熱唠雕;一般用于個(gè)人電腦贸营、大型服務(wù)器等
ARM(精簡指令)相對(duì)高性能,但是和X86還有些差距岩睁,有點(diǎn)就是低功耗钞脂,高性價(jià)比
單核、多核處理器(個(gè)人理解)
什么叫單核什么叫多核捕儒,可以簡單的理解為1個(gè)累加器(也可能是一個(gè)運(yùn)算模塊)和多個(gè)累加器(運(yùn)算模塊)的區(qū)別冰啃,為啥會(huì)有多核,因?yàn)閱蝹€(gè)累加器的處理能力遇到了瓶頸刘莹,也就是沒法再快了阎毅。為啥沒法再快了,我覺得是因?yàn)橐粋€(gè)時(shí)鐘心跳需要涉及到好多模塊(控制電路点弯、內(nèi)存、累加器)的配合來完成一條指令的運(yùn)算,如果時(shí)鐘頻率無限的加快名挥,就會(huì)造成配合不好霜大,下一個(gè)時(shí)鐘心跳已經(jīng)開始,結(jié)果上次的運(yùn)算還沒完成捡絮,造成運(yùn)算錯(cuò)誤熬芜。所以就得有兩套電路來進(jìn)行運(yùn)算