【文章內(nèi)容簡介】
度,其中操作碼占用 16 位指令字的高 4 位。所有的指令碼都很容易譯碼。對(duì)兩個(gè)寄存器的指令, d 選擇目的寄存器, :r 選擇源寄存器, 4 位可以尋址 16 個(gè)寄存器,這種指令格式包括 ADD, SUB, AND, OR。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 r r r r d d d d 對(duì)于僅需要一個(gè)寄存器的指令, d 用來尋址目標(biāo)寄存器。這種指令格式包括 LD, LSL, LSR 指令。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 d d d d 對(duì)于立即數(shù)指令 ,指令中間 8 位是 8 位常數(shù),其中 H 代表常數(shù)的高四位,L 代表常數(shù) 的低四位, d 用來尋址目的寄存器。這種指令格式包括 MOV, SD。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 L L L L H H H H d d d d 指令編碼 確定了指令的格式,就可以對(duì)指令進(jìn)行編碼,這樣指令就有唯一的身份識(shí)別。 指令編碼結(jié)果如表 2 所示。 表 2 指令編碼 指令類型 指令機(jī)器碼 ADD 0001 0000 r r r r d d d d SUB 0010 0000 r r r r d d d d AND 0011 0000 r r r r d d d d OR 0100 0000 r r r r d d d d LSL 0101 0000 0000 d d d d LSR 0110 0000 0000 d d d d MOV 0111 LLLL HHHH d d d d ST 1000 0000 0000 d d d d LD 1001 0000 0000 d d d d SLEEP 1011 0000 0000 0000 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 8 指令時(shí)序分析 RISC 與流水線 指令的執(zhí)行分成兩個(gè)階段:取指階段和執(zhí)行階段。在取指階段,指令機(jī)器碼被取到指令寄存器,控制單元通過譯碼知道這是個(gè)什么樣的指令,需要執(zhí)行什 么樣的操作,需要什么操作數(shù);在執(zhí)行階段當(dāng)前指令以及 取指完畢, 上一條 指令被執(zhí)行。這樣按順序第 1 條指令執(zhí)行完再取第 2 條指令,第 2 條執(zhí)行完在取第 3條指令的順序執(zhí)行方式執(zhí)行一條指令最少需要兩個(gè)時(shí)鐘周期,如果執(zhí)行 10 條指令那么就得需要 10 個(gè)時(shí)鐘周期,顯然這樣指令的執(zhí)行效率不高。為了解決這個(gè)問題,本次設(shè)計(jì)中引入了流水線 (pipeline)操作。 8 位 CPU 采用兩級(jí)流水 線 技術(shù),指 令的流水線可以用圖 24 來簡單的示意: 圖 24 流水線指令執(zhí)行 由圖可以看出,盡管每條指令的完成需要兩個(gè)周期的時(shí)間,但是在流水線結(jié)構(gòu)中,當(dāng)前指令的取值周期和上一條指令的執(zhí)行周期在時(shí)間上是重疊的,對(duì)于這種并行操作,從平均角度來看,相當(dāng)于一個(gè)周期內(nèi)完成一條指令,因此可以大大提高指令的運(yùn)行速度 [15]。 RISC架構(gòu)的處理器,每條指令有固定的長度,指令格式只有簡單的幾種,指令功能不交叉,尋址方式也簡單,所以更加有利于實(shí)現(xiàn)流水結(jié)構(gòu)。 為了降低執(zhí)行每條指令所需時(shí)鐘數(shù),本文也采用兩級(jí)流水,其功能分別定義為:第一級(jí) ,取指;第二級(jí),時(shí)鐘前半周期控制器譯碼、發(fā)出控制信號(hào),時(shí)鐘后半周期進(jìn)行對(duì)寄存器堆 TRAM進(jìn)行讀操作、 ALU計(jì)算。這樣,很顯然也能降低執(zhí)行指令所需的時(shí)鐘數(shù),取指、執(zhí)行只用了一個(gè)時(shí)鐘。在時(shí)鐘上升沿 PC產(chǎn)生進(jìn)入PCRAM的地址,由于 PCRAM 有反應(yīng)時(shí)間,經(jīng)過一段很短的時(shí)間讀出指令,在下一個(gè)時(shí)鐘上升沿到來時(shí),指令寄存器鎖存指令,然后開始對(duì)指令進(jìn)行譯碼,并產(chǎn)生操作數(shù)、目的存儲(chǔ)器/寄存器地址、寫信號(hào)及各種控制信號(hào)。 程序計(jì)數(shù)器與流水線 程序計(jì)數(shù)器( PC)是程序中尋址取得指令的特殊單元。正是靠 PC的移動(dòng),CPU才能一條一條的執(zhí)行指令。同時(shí),程序計(jì)數(shù)器也是和流水線密切相關(guān)的單元。在程序開始執(zhí)行前, CPU將它的起始地址送入 PC,當(dāng)指令執(zhí)行時(shí), CPU 將自動(dòng)修改 PC 的內(nèi)容,所以 PC中的內(nèi)容總是下一條指令的地址。由于指令通常是順序執(zhí)行的,所以修改的過程通常只是簡單的 PC加 1。表 2說明了在引入流水線后 PC的具體工作情況: 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 9 表 3 指令執(zhí)行中 PC 值的變化情況 時(shí)鐘周期 Reset 周期 1 周期 2 周期 3 周期 4 PC 0 1 2 3 4 第一條指令 讀取指令 0 執(zhí)行指令 0 第二條指令 讀取指令 1 執(zhí)行指令 1 第三條指令 讀取指令 2 執(zhí)行指令 2 表 3 表明,在系統(tǒng)復(fù)位時(shí), PC 內(nèi)的值清 0,第一個(gè)時(shí)鐘周期,指令寄存器取 PC 為 0 的地址的指令,同時(shí) PC 的值加 1;第二個(gè)時(shí)鐘周期,執(zhí)行 0 地址的指令,同時(shí)讀取地址 1 的指令,同時(shí) PC 的值加 1;第三個(gè)時(shí)鐘周期,重復(fù)這樣的過程。這樣可以得到結(jié)論:如果當(dāng)前 CPU 正在執(zhí)行的是第 N 條指令,那么指令寄存器正在讀取的是 N+1 條指令,此時(shí) PC 的值應(yīng)該是 N+2。 CPU 整體結(jié)構(gòu)即設(shè)計(jì)思想 在設(shè)計(jì) CPU 之前整個(gè)結(jié)構(gòu)的特性及由哪些模塊組成,這些模塊之間的 互連關(guān)系以及整個(gè) CPU 的最后輸出信號(hào)等都是要事先定義好的 .。 CPU 的外部引腳規(guī)劃 從 CPU 外部看整個(gè)輸入輸出如圖 25 圖 25 CPU 外部引腳信號(hào) 該 CPU 有 5 個(gè)輸入引腳, 1 個(gè)結(jié)果輸出端口以及一個(gè)運(yùn)算溢出信號(hào)。系統(tǒng)的時(shí)鐘信號(hào)將直接驅(qū)動(dòng)驅(qū)動(dòng)整個(gè) CPU。 WR 信號(hào)是系統(tǒng)的異步指令輸入信號(hào),高電平有效。當(dāng) WR 信號(hào)有效時(shí),整個(gè) CPU 進(jìn)入指令輸入狀態(tài),當(dāng) WR 低 電平時(shí)CPU 進(jìn)入指令讀取并完成指令操作的狀態(tài),當(dāng) CPU 完成全部輸入指令時(shí)進(jìn)入停機(jī)狀態(tài),此時(shí) Start 信號(hào)重新啟動(dòng) CPU,使其進(jìn)入等待狀態(tài)。 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 10 CPU 的整體框圖 系統(tǒng)的頂層結(jié)構(gòu)模塊圖如圖 26 圖 26 系統(tǒng)的頂層結(jié)構(gòu)模塊圖 該模塊包含了系統(tǒng)的主要模塊及它們之間的連接關(guān)系。圖中的一個(gè)一個(gè)的模塊代表了各個(gè)功能模塊,將在下面的章節(jié)中分別做詳細(xì)的設(shè)計(jì)說明。每個(gè)模塊都將按照 EDA設(shè)計(jì)中自下而上的設(shè)計(jì)原則分別獨(dú)立設(shè)計(jì)。有些模塊是比較簡單的像指令寄存器 (IR),有些模塊則是比較難的像 ALU模塊和控制單元模塊。 在設(shè)計(jì)微處理器的功能模塊之前,需要決定如何邏輯實(shí)現(xiàn)和處理器鎖存數(shù)據(jù)。 微處理器中有兩種不同的邏輯元件: ( 1) ALU、 MUX、 CONCROL單元的元件都是組合邏輯電路。它們的輸出僅僅依賴于當(dāng)前的輸入狀態(tài),沒有內(nèi)部存儲(chǔ)功能; ( 2) 寄存器堆、臨時(shí)寄存器都是狀態(tài)單元,它的輸出不僅依賴于輸入,還有其自身內(nèi)部的狀態(tài)。時(shí)鐘用來決定狀態(tài)何時(shí)被寫入,一個(gè)狀態(tài)可以在任意時(shí)刻讀取。 微處理器的時(shí)鐘采用邊沿觸發(fā)的方式,整個(gè)系統(tǒng)采用單時(shí)鐘電路,即提供一個(gè)系統(tǒng)時(shí)鐘,每當(dāng)時(shí)鐘邊沿到來的時(shí)候,向狀態(tài)單元寫入數(shù)據(jù)。 整個(gè)系統(tǒng)可以分為兩個(gè)單元 :取指單元,執(zhí)行單元。取指單元負(fù)責(zé)取下條指令,執(zhí)行單元負(fù)責(zé)執(zhí)行當(dāng)前指令。取指單元和執(zhí)行單元共同構(gòu)成了 CPU 的微控制單元。取指單元的第一個(gè)模 塊是程序計(jì)數(shù)器 (PC), PC 中是下條要執(zhí)行的指令的地址,它是指向程序存儲(chǔ)器單元 (PROM)來尋址指令的??刂颇K是對(duì)從指令寄存器 (IR)送出指令進(jìn)行譯碼從而發(fā)出適當(dāng)?shù)目刂菩盘?hào)執(zhí)行程序的。 系統(tǒng)中包括了很多寄存器的設(shè)計(jì)包括指令寄存器 (IR),程序計(jì)數(shù)器 (PC),這些寄存器大都在我們頂層可見的模塊的內(nèi)部,系統(tǒng)的工作也可以看作就是數(shù)據(jù)在這些寄存器之間的“遷移”,也即寄存器內(nèi)容的遷移。微處理器的功能就是體山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 11 現(xiàn)在這些這些數(shù)據(jù)是如何傳遞的,在傳遞前的處理是如何處理的,所有這一系列寄存器數(shù)據(jù)之間的遷移轉(zhuǎn)換就組成了微處理器。 CPU 結(jié)構(gòu)的層次劃分 正確合理的劃分系統(tǒng)是所有數(shù)字系統(tǒng)設(shè)計(jì)成功的關(guān)鍵。子系統(tǒng)的劃分過程就是把總體任務(wù)劃分程若干分任務(wù)的過程。本設(shè)計(jì)將 CPU 分解為兩大子系統(tǒng):數(shù)據(jù)通路和控制通路。這種劃分將 CPU 的運(yùn)算、執(zhí)行單元與控制部件分離開,是非常合理、自然的。數(shù)據(jù)通路和控制通路這兩大部分又可以細(xì)化為更小的模塊,ALU 模塊(算術(shù)邏輯單元)、 PC_RAM 模塊(程序存儲(chǔ)器)和 IR(指令寄存器)、TRAM(寄存器堆)屬于數(shù)據(jù)通路部分 , ALU 內(nèi)部又包含更小的模塊(加、減、與、或、移位模塊);控制模塊屬于控制通路部分, 其中控制模塊又由 FSM(狀態(tài)機(jī))和 CONTROL( 控制器)構(gòu)成。具體的模塊功能實(shí)現(xiàn)將在下面兩章中詳細(xì)介紹。 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 12 第三章 CPU 數(shù)據(jù)通路設(shè)計(jì) 從這一章開始將詳細(xì)介紹整 個(gè) CPU 的 細(xì)化設(shè)計(jì)模塊。通過上一章對(duì) CPU 的結(jié)構(gòu)劃分,已 經(jīng)知道 CPU 的整個(gè)設(shè)計(jì)分為兩個(gè)部分:數(shù)據(jù)通路和控制單元。在這一章中將細(xì)分?jǐn)?shù)據(jù)通路模塊,數(shù)據(jù)通路是 CPU 中 的執(zhí)行部件,數(shù)據(jù)傳輸、存儲(chǔ)、處理都是在數(shù)據(jù)通路中完成的。在整個(gè) CPU 的結(jié)構(gòu)框圖中,除了控制單元部分,其余部分都是數(shù)據(jù)通路部分,包括程序計(jì) 數(shù)器 PC、程序存儲(chǔ)器 PC_RAM、指令寄存器 IR、寄存器堆 TRAM、數(shù)據(jù)選擇器 ALUMUX 和算術(shù)與邏輯單元 ALU。 設(shè)計(jì)數(shù)據(jù)通路,有兩種不同的設(shè)計(jì)方案。第一種是在所有需要傳送數(shù)據(jù)的部件創(chuàng)建一條直接通路,采用多路選擇器或者緩沖器為那些有多個(gè)數(shù)據(jù)源的寄存器從多個(gè)可能的輸入中選擇一個(gè),這種方案適用于規(guī)模比較小的微處理器設(shè)計(jì)。另一種方案是在微處理器內(nèi)部創(chuàng)建一條總線,并且在各個(gè)部件之間使用總線傳數(shù)據(jù)。本設(shè)計(jì)采用的是第一種方案的設(shè)計(jì)方法。下面將一一介紹數(shù)據(jù)通路的各個(gè)模塊功能及其實(shí)現(xiàn)。 程序計(jì)數(shù)器模塊 PC 程序計(jì) 數(shù)器 (PC)作為指向指令地址“指針”,決定著下一條要執(zhí)行的指令。正是有了 PC 的移動(dòng)和變化, CPU 才能按一定的順序或預(yù)想的情況進(jìn)行指令的執(zhí)行。程序計(jì)數(shù)器 PC 中存放指令存儲(chǔ)器的地址,當(dāng)一條指令被執(zhí)行時(shí),程序計(jì)數(shù)器存放下一條指令的地址。在正常工作的條件下,控制信號(hào)選擇 PC+1 作為下一個(gè) PC 的值輸出;當(dāng)執(zhí)行 JMP 指令時(shí),選擇來自指令中的跳轉(zhuǎn)地址決定新的 PC值,但是在本次設(shè)計(jì)中沒有涉及到。 圖 31 PC 模塊外部接口信號(hào) 圖 31 所示是從外部看的 PC 模塊的接口。其中輸出的 PC 是 8BitS 寬的,因此 PC 模塊可以尋 址獨(dú)立的 256 個(gè)單元。 PC_OUT 地址輸出信號(hào)是直接與程序存儲(chǔ)器 PCRAM 相連的。 PC_INC 控制信號(hào)來自控制單元,若 PC_INC 有效則 PC將執(zhí)行加 1 操作。 EN 信號(hào)是程序計(jì)數(shù)器 PC 的使能控制信號(hào),只有當(dāng)該信號(hào)有效時(shí) PC 的相應(yīng)才能操作才能執(zhí)行。 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 13 程序存儲(chǔ)器 PC_RAM 程序存儲(chǔ)器是存儲(chǔ)微處理器程序,即能執(zhí)行特定功能的一組指令組合。圖32 顯示了程序存儲(chǔ)器的結(jié)構(gòu)圖。 圖 32 程序存儲(chǔ)器示意圖 在設(shè)計(jì)程序存儲(chǔ)器模塊時(shí),本文是自行設(shè)計(jì)寄存器堆型的存儲(chǔ)器,直接使用一個(gè)數(shù)組存放二進(jìn)制數(shù)據(jù),通過 VHDL 編寫一個(gè)一定長度的數(shù)組實(shí)現(xiàn)。因?yàn)槌绦蛴?jì)數(shù)器可以尋址到 256條指令,所以程序存儲(chǔ)器也必需可以至少存放 128 條 16 位的指令 ,這樣只需申請(qǐng)一個(gè)變量 Ram,有 256個(gè)元素 ,每個(gè)元素 16 位即可。第一個(gè)數(shù)組元素下標(biāo)表示存貯器的 0 號(hào)地址,第二個(gè)數(shù)組元素下標(biāo)表示 1 號(hào)地址 ,以此類推至第 256個(gè)數(shù)組元素的下標(biāo) ,即 11111111 號(hào)存貯器地址。 程序存儲(chǔ)器是一個(gè)可讀可寫的模塊,其輸入端口接入外圍程序和地址輸入端口,由 WR 異步控制其讀寫狀態(tài), WR 高電平有效。當(dāng) WR 有效時(shí),程序存儲(chǔ)器為寫狀態(tài),即將輸入程序 存入其輸入地址對(duì)應(yīng)的存儲(chǔ)單元中 , 即執(zhí)行操作 ram(conv_integer(waddr)) = wdata;當(dāng) WR 為低電平時(shí),程序存儲(chǔ)器處于讀狀態(tài),其將程序計(jì)數(shù)器輸出地址 PC_OUT上 對(duì)應(yīng)的存儲(chǔ)單元中的指令輸出,即執(zhí)行操作 instruction = ram(conv_integer(pc_in))。這樣就可以通過存貯器數(shù)組元素和輸入地址間的相互賦值實(shí)現(xiàn)“讀存儲(chǔ)器”,“寫存儲(chǔ)器”,既簡單又容易實(shí)現(xiàn)。 圖 33 程序存儲(chǔ)器外部接口信號(hào) 程序存儲(chǔ)器模塊的外部接口信號(hào)如圖 33 所示,其中讀狀態(tài)地址 來自 PC 模塊,輸出指令直接送往指令寄存器模塊,寫狀態(tài)地址來自 CPU 輸入地址,寫入指令存儲(chǔ)到對(duì)應(yīng)地址單元中。 山東大學(xué)威海分校畢業(yè)設(shè)計(jì)(論文) 14 指令寄存器模塊 指令寄存器在時(shí)鐘上升沿鎖入從程序存儲(chǔ)器 PC_RAM中讀取的指令,并保持到時(shí)鐘的下一個(gè)上升沿,一條指令的執(zhí)行從指令寄存器鎖入指令開始。所以指令寄存器的作用是暫時(shí)存放取到的指