<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 16位CPU怎么做,DIY大神給你支支招兒

          16位CPU怎么做,DIY大神給你支支招兒

          作者: 時(shí)間:2019-03-19 來源:電子工程世界 收藏

            如何制作一個(gè)簡單的16位,首先我們要明確是做什么的,想必各位都比我清楚,百度的資料也很全……

          本文引用地址:http://www.ex-cimer.com/article/201903/398604.htm

            如果想要制作一個(gè),首先得明白下計(jì)算機(jī)的組成結(jié)構(gòu)(或者計(jì)算機(jī)的替代品,因?yàn)椴⒉皇侵挥杏?jì)算機(jī)有CPU,現(xiàn)在的電子產(chǎn)品都很先進(jìn),很多設(shè)備例如手機(jī)、洗衣機(jī)甚至電 視和你家的汽車上面都得裝一個(gè)CPU),數(shù)字電路基礎(chǔ),還最好有點(diǎn)編程的基礎(chǔ)(當(dāng)然,沒有也沒關(guān)系,這些知識(shí)都很容易獲得,各種書上面都會(huì)提到,并且在接下來的過程中我會(huì)提到這些知識(shí))

            我們要實(shí)現(xiàn)的是一個(gè)指令集的CPU,并且我們最后要自己為這個(gè)CPU設(shè)計(jì)指令并且編碼。

            首先我們來聽個(gè)故事,關(guān)于CPU的誕生的故事:

            日本客戶希望英特爾幫助他們?cè)O(shè)計(jì)和生產(chǎn)八種專用集成電路芯片,用于實(shí)現(xiàn)桌面計(jì)算器。英特爾的工程師發(fā)現(xiàn)這樣做有兩個(gè)很大的問題。第一,英特爾已經(jīng)在全力開發(fā) 三種內(nèi)存芯片了,沒有人力再設(shè)計(jì)八種新的芯片。第二,用八種芯片實(shí)現(xiàn)計(jì)算器,將大大超出預(yù)算成本。英特爾的一個(gè)名叫Ted Hoff 的工程師仔細(xì)分析了日本同行的設(shè)計(jì),他發(fā)現(xiàn)了一個(gè)現(xiàn)象。這八塊芯片各實(shí)現(xiàn)一種特定的功能。當(dāng)用戶使用計(jì)算器時(shí),這些功能并不是同時(shí)都需要的。比如,如果用戶需要計(jì)算100個(gè)數(shù)的和,他會(huì)重復(fù)地輸入一個(gè)數(shù),再做一次加法,一共做100次,最后再打印出來。負(fù)責(zé)輸入、加法和打印的電路并不同時(shí)工作。 這樣,當(dāng)一塊芯片在工作時(shí),其他芯片可能是空閑的。

            Hoff有了一個(gè)想法:為什么不能用一塊通用的芯片加上程序來實(shí)現(xiàn)幾塊芯片的功能呢?當(dāng)需要某種功能時(shí),只需要把實(shí)現(xiàn)該功能的一段程序代碼(稱為子程序)加載到通用芯片上,其功能與專用芯片會(huì)完全一樣。

            經(jīng)過幾天的思考后,霍夫畫出了計(jì)算器的新的體系結(jié)構(gòu)圖,其中包含4塊芯片:一塊通用處理器芯片,實(shí)現(xiàn)所有的計(jì)算和控制功能;一塊可讀寫內(nèi)存(RAM)芯片, 用來存放數(shù)據(jù);一塊只讀內(nèi)存(ROM)芯片,用來存放程序;一塊輸入輸出芯片,實(shí)現(xiàn)鍵入數(shù)據(jù)和操作命令、打印結(jié)果等等功能。

            看完這個(gè)故事后,可以總結(jié):CPU是一種用來代替專用集成電路的器件(這只是我的理解,不同人有不同理解,這個(gè)就智者見智了,我在接下來的例子中也會(huì)說明我的想法)。

            然后考慮如下這個(gè)例子:

            例1-1:

            mov eax,0

            repeat:inc eax

            jmp repeat

            例1-2:

            int main()

            {

            unsigned int i = 0;

            while(1)

            i++;

           ?。?/p>

            例1-3:

          16位CPU怎么做,DIY大神給你支支招兒

            可以看到,以上三個(gè)例子都產(chǎn)生了一個(gè)從0不斷增加的序列,而且前兩個(gè)例子會(huì)一直加到溢出又從0開始(這個(gè)取決于計(jì)算機(jī)的字長也就是多少位的CPU,eax是 32位寄存器所以必然是加到4294967295然后回0,而后面那個(gè)c程序則看不同編譯器和不同平臺(tái)不一樣),后面那個(gè)例子則看你用的是什么樣的加法器和多少個(gè)D觸發(fā)器

            那問題就來了,我假設(shè)要一個(gè)遞減的序列怎么辦呢?前兩個(gè)例子很好解釋,我直接改代碼不就得了:

            例2-1:

            mov eax,0

            repeat:dec eax

            jmp repeat

            例2-2:

            int main()

            {

            unsigned int i = 0;

            while(1)

            i--;

           ?。?/p>

            你只需要輕輕敲擊鍵盤,修改了代碼之后,它就會(huì)如你所愿的執(zhí)行。

            但是后面那個(gè)例子怎么辦呢?可能你已經(jīng)想到辦法了:如例2-3所示。

            例2-3:

          16位CPU怎么做,DIY大神給你支支招兒

            問題就來了,你在鍵盤上敲兩下可不能改變實(shí)際電路!上面(例1-3)中是個(gè)加法器,但是跑到這里卻變成了減法器(例2-3)!

            這樣的話,你就得再做一個(gè)電路,一個(gè)用來算加法,一個(gè)用來算減法,可是兩個(gè)電路代表你得用更多的電路和芯片,你花的錢就得更多,要是你不能同時(shí)使用這兩個(gè)電路你就花了兩份錢卻只干了一件事!

            這個(gè)問題能被解決嗎?答案是能!

            請(qǐng)看例3:

          16位CPU怎么做,DIY大神給你支支招兒

            這個(gè)例子中使用了一個(gè)加法器一個(gè)減法器,沒比上面的電路省(顯然……難道你想用減法器做加法器的功能?不可能吧!當(dāng)然,加上一個(gè)負(fù)數(shù)的補(bǔ)碼確實(shí)就是減去 一個(gè)數(shù),但是這里先不考慮這種問題),多了一組多路器,少了一組D觸發(fā)器。總的來說,優(yōu)勢還是明顯的(兩塊電路板和一塊電路板的差別)。

            而sel信號(hào)就是用來選擇的(0是遞增,1是遞減)。

            如果我們把sel信號(hào)看做“程序”的話,這個(gè)電路就像一個(gè)“CPU”能根據(jù)“程序”執(zhí)行不同的“操作”,這樣的話,通過“程序”(sel信號(hào)),這個(gè)電路就能夠?qū)崿F(xiàn)復(fù)用。

            根據(jù)上面的結(jié)論,我認(rèn)為(僅僅是個(gè)人認(rèn)為啊~):程序就是硬件電路的延伸!

            而CPU的基本思想,我認(rèn)為就是這樣的。

            接下來我們就分析CPU的結(jié)構(gòu)和各個(gè)部件,然后實(shí)現(xiàn)這個(gè)CPU。

            什么是單周期CPU,什么是多周期CPU,什么是,什么是CISC

            首先大家得有時(shí)鐘的概念:這個(gè)問題不好解釋 啊。。。。。??梢岳斫鉃榧依锩娴臋C(jī)械鐘,上上電池之后就會(huì)滴答滴答走,而它“滴答滴答”的速度就是頻率,滴答一下用的時(shí)間就是周期,而人的工作,下班, 吃飯和學(xué)習(xí)娛樂都是按照時(shí)鐘的指示來進(jìn)行的(熬夜的網(wǎng)癮少年不算),一般來說,時(shí)鐘信號(hào)都是由晶體振蕩器產(chǎn)生的,0101交替的信號(hào)(低電平和高電平)。

            數(shù)字電路都需要一個(gè)“時(shí)鐘”來驅(qū)動(dòng),就像演奏交響樂的時(shí)候需要一個(gè)指揮家在前面指揮一樣,所有的人都會(huì)跟著指揮的拍子來演奏,就像數(shù)字電路中所有的部件都會(huì)跟著時(shí)鐘節(jié)拍工作一樣。

            如下是一個(gè)理想的時(shí)鐘信號(hào):(注意是理想的)。

          16位CPU怎么做,DIY大神給你支支招兒

            當(dāng)然,實(shí)際的時(shí)鐘信號(hào)可能遠(yuǎn)沒有這么理想,可能上升沿是斜的,而且占空比也可能不是50%,有抖動(dòng),有偏移(相對(duì)于兩個(gè)器件),可能因?yàn)閷?dǎo)線的寄生電容效應(yīng)變得走形。

            上面那段如果沒聽懂也沒關(guān)系~~~反正就是告訴你,實(shí)際的時(shí)鐘信號(hào)測出來肯定沒這么標(biāo)準(zhǔn)。

            而 cpu的工作頻率,是外頻與倍頻的積(cpu究竟怎么算頻率,其實(shí)這個(gè)我也不太清楚呵呵),因?yàn)閏pu是通過外部的晶振產(chǎn)生一個(gè)時(shí)鐘信號(hào),然后再通過內(nèi)部 的電路(鎖相環(huán)),倍頻至需要的頻率。當(dāng)然,有人問,為什么要這么麻煩呢?直接在電路外邊做個(gè)時(shí)鐘晶振能產(chǎn)生那么高的時(shí)鐘信號(hào)就可以了嘛,這個(gè)是可以的, 在某些簡單的系統(tǒng)上(例如51單片姬)就是這樣的,但是計(jì)算姬的cpu比較復(fù)雜,因?yàn)橐恍┰蛩员仨氁龅絚pu內(nèi)。

            下面簡單說一下CPU的兩種指令集:CISC和。

            說下我的看法(個(gè)人看法,如有錯(cuò)誤還請(qǐng)高手指正):

            RISC是Reduced Instruction Set Computer,精簡指令集計(jì)算機(jī),典型例子是MIPS處理器。

            CISC 是Complex Instruction Set Compute,復(fù)雜指令集計(jì)算機(jī),典型例子是x86系列處理器(當(dāng)然現(xiàn)在的x86指令還是當(dāng)初cisc的指令,但是實(shí)際處理器的結(jié)構(gòu)都已經(jīng)變成了 risc結(jié)構(gòu)了,risc的結(jié)構(gòu)實(shí)現(xiàn)流水線等特性比較容易,在計(jì)算機(jī)前的你如果用的是intel某系列的處理器,則它使用的指令集看上去還是像cisc的 指令,但是實(shí)際上你的cpu的結(jié)構(gòu)已經(jīng)是risc的了)。

            一般CISC的處理器需要用微指令配合運(yùn)行,而RISC全部是通過硬連線實(shí)現(xiàn)的, 也就是說,當(dāng)cisc的處理器在執(zhí)行你的程序前,還得先從另外一個(gè)rom里面讀出一些數(shù)據(jù)來“指導(dǎo)”處理器怎么處理你的命令,所以cisc效率比較低,而 risc是完全通過部件和部件之間的連接實(shí)現(xiàn)某種功能,極大的提高了工作效率,而且為流水線結(jié)構(gòu)的出現(xiàn)提供了基礎(chǔ)。cisc的寄存器數(shù)量較少,指令能夠?qū)? 現(xiàn)一些比較特殊的功能,例如8086的一些寄存器:

            ax,bx,cx,dx,si,di等;段寄存器有:cs,ds,es,ss等。相對(duì)的指令功能比較特殊,例如xlat將bx中的值作為基地址,al中的值作為偏移,在內(nèi)存中尋址到的數(shù)據(jù)送到al當(dāng)中(以ds為段寄存器)

            而risc的處理器則通用寄存器比較多,而指令的功能可以稍微弱一點(diǎn),例如:

            以nios嵌入式處理器來說明,nios處理器有32個(gè)通用寄存器(r0~r31),而指令功能相對(duì)x86的弱一些,而且x86進(jìn)行內(nèi)存訪問是直接使用mov指令,nios處理器讀內(nèi)存用的是load,寫內(nèi)存用的是store,

            二者響應(yīng)中斷的方式也不一樣,舉一個(gè)典型的例子,x86的處理器將中斷向量表放在了內(nèi)存的最低地址(0-1023,每個(gè)中斷向量占四個(gè)字節(jié)),能容納256 個(gè)中斷(以實(shí)模式的8086舉例)響應(yīng)中斷時(shí),將中斷號(hào)對(duì)應(yīng)的地址上的cs和ip的值裝入到cs和ip寄存器而將原來的地址保存,并且保存狀態(tài)寄存器然后 進(jìn)入中斷處理,而risc則擁有一個(gè)共同的中斷響應(yīng)函數(shù),這個(gè)函數(shù)會(huì)根據(jù)中斷號(hào)找到程序向系統(tǒng)注冊(cè)的函數(shù)的地址,并且調(diào)用這個(gè)函數(shù)。一般來說而是用的 cisc指令的長度是不定的,例如x86的xor ax,bx對(duì)應(yīng)機(jī)器碼是0x31d8、而push ax是0x50、pop cx是0x59。而risc的指令確是定長的,例如32位。


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: CPU RISC

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();