<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大神給你支支招兒

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

            要理解這些概念需要一點時間。

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

            一個的基本結(jié)構(gòu)以及必要組件

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

            這個例子引用自DE2開發(fā)板套件帶的光盤上的Lab Exercise 9,我們從圖中可以看到,一個包含了通用寄存器組R0~R7,一個ALU(算術(shù)邏輯單元),指令寄存器IR,控制器(一般這部分是一個有限狀態(tài)機或 者是用微指令實現(xiàn)),還有就是數(shù)據(jù)通路(圖中的連線)。當然真正的不可能只包含這么一點點組件,這是一個模型CPU,也就是說只是說明CPU的原 理,真正復雜的CPU要涉及到很多復雜的結(jié)構(gòu)和時序,例如虛擬模式需要使用一些特殊的寄存器、為了支持分頁需要使用頁表寄存器等,為了加速內(nèi)存的訪問需要 使用TLB,加速數(shù)據(jù)和指令的訪問而使用data cache和instruction cache等等。。。。。當然,那都是后面該考慮的,所以我們先從這個簡單的部分開始講起。

            例子中能實現(xiàn)如下指令:

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

            mv指令將Ry的數(shù)據(jù)轉(zhuǎn)移到Rx中,mvi將立即數(shù)D轉(zhuǎn)移到Rx當中,add將Rx和Ry的和放到Rx中,sub同上,不過執(zhí)行的是減法。

            首先來說明mv指令是如何執(zhí)行的:mv指令將Ry的值移入Rx寄存器當中,這兩個寄存器都是由一組D觸發(fā)器構(gòu)成,而D觸發(fā)器的個數(shù)取決于寄存器的寬度,就像 32位機、64位機這樣,那他們的寄存器使用的D觸發(fā)器的個數(shù)就是不一樣的。當執(zhí)行mv rx,ry時,中間的多路器(圖中最大的那個multiplexer)選通Ry,讓Ry寄存器驅(qū)動總線,這個時候Bus上的信號就是Ry的值;然后再看到 R0~R7上分別有R0in~R7in信號,這個信號是使能信號,當這個信號有效時,在上升沿此觸發(fā)器會將din的數(shù)據(jù)輸入,所以說到這里大家一定想到 了,這個時候Rx觸發(fā)器上的Din信號就會變?yōu)橛行?,這樣過了一個時鐘周期后Ry的值就被送到了Rx當中。

            與mv指令類似,mvi指令也將一個數(shù)據(jù)送入Rx當中,只不過這次的數(shù)據(jù)存在指令當中,是立即數(shù),所以Rx的Din信號會變?yōu)橛行?,而多路器會選擇IR中的數(shù)據(jù),因為mvi指令的立即數(shù)存在指令當中。并且進行一定處理,例如擴展等。

            add 指令會讓多路器先選擇Rx,然后Ain信號有效,這樣一個時鐘周期后,Rx數(shù)據(jù)被送入Alu的A寄存器當中,這時多路器選擇Ry,addsub信號為 add以指示ALU進行加法操作,Gin有效讓G寄存器存放運算結(jié)果,然后再過一個時鐘周期G當中的數(shù)據(jù)就是Rx與Ry的和,這時多路器再選擇 Gin,Rx的Din有效,過了一個時鐘周期后數(shù)據(jù)就被存放到Rx當中了。

            sub的過程與add差不多,不過addsub信號是sub指示ALU進行減法。

            我做的CPU模型

            下面我就將我做的CPU模型的RTL網(wǎng)表發(fā)出來,代碼我會上傳的,但是這個還只能進行仿真,因為設計 的時候理念有問題,出現(xiàn)了異步設計,而且出現(xiàn)了將狀態(tài)機的輸出作為另一個器件的時鐘端的錯誤,所以這個模型只能用于仿真。我用的synplify pro綜合出的RTL,而狀態(tài)轉(zhuǎn)移圖是用的Quartus的FSM Viewer截下來的。

            首先是整個系統(tǒng)的概覽:

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

            這個比上面的那個簡單模型復雜多了吧!但是別擔心,其實這個只是上面的那個CPU變得稍微復雜了一點,這個和上面那個不同的地方還有:這個CPU是一個多周期CPU而上面的Lab Exercise是一個單周期的CPU

            下圖是程序計數(shù)器(PC),也就是常見x86處理器里面的ip(instruction poiniter):

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

            紅色部分就是pc了,后面是一個三態(tài)橋,連接到了總線上面,這里的數(shù)據(jù)有時候是要送到地址總線,用于尋內(nèi)存中的數(shù)據(jù),以便完成Instruction Fetch過程。有時候又要送到通用寄存器的數(shù)據(jù)端,用于將pc的值送到其他寄存器。

            下面這個是IR(Instruction Register),這個是多周期處理器的典型特征,因為處理器在第一個周期里面將機器碼從內(nèi)存取出,然后存放到這個寄存器里面,后面的幾個狀態(tài)都是通過這個寄存器里面的數(shù)據(jù)作為指示執(zhí)行操作的。

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

            下面介紹一下ALU,ALU是Arithmetic Logic Unit,即算術(shù)邏輯單元,這個裝置的作用是進行算術(shù)操作和邏輯操作。典型的算術(shù)操作例

            如:1+1=2,11x23=253,而典型的邏輯操作例如:1 and 1=1,0 or 0 = 0,1<<3=8這種屬于邏輯操作。

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

            而從圖中大家也看得到,ALU的輸出用一根很長的線連接到了后面,參考整個CPU的圖的話,會發(fā)現(xiàn)這些線連到了通用寄存器上面,這是為了讓運算的結(jié)果存放回 去,例如你用add eax,1的時候,eax的值被加上1然后放回eax,所以ALU的運算結(jié)果要用反饋送回到通用寄存器,而ALU的輸入也應該有通用寄存器的輸出。

            下面再介紹ADDRMUX:

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

            這個部件是用來選擇地址的,右邊的輸出是CPU的地址總線,而CPU的地址總線就已經(jīng)送出CPU了(也就是你能夠在芯片的外表上看到引腳了),CPU的地址總線是送到存儲器的地址端的,而現(xiàn)代的計算機系統(tǒng)實際上是相當復雜的,所以其實你家的計算機上CPU是通過北橋芯片訪問內(nèi)存的(當然也有將內(nèi)存控制器做到 CPU里面的)左邊是地址的來源,地址的來源即有通用寄存器,也有程序計數(shù)器,還有一個是直接從IR里面送出,這是因為有的立即數(shù)里面也包含內(nèi)存地址信息。

            最后介紹通用寄存器:

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

            通用寄存器的作用就是用來保存中間值或者用于運算,例如

            add eax,2

            相當于eax+2然后送回eax。

            最后介紹一下狀態(tài)機,這個部分就是CPU的“靈魂”,如果說有了上面那些部件CPU有了一副“軀體”的話,這一部分就是CPU的“靈魂”了:

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


          關鍵詞: CPU RISC

          評論


          相關推薦

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

          關閉
          看屁屁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); })();