




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于FPGA的16位RISC_CPU設(shè)計一課題的來由和設(shè)計環(huán)境介紹通過學(xué)習(xí)夏宇聞教授的Verilog數(shù)字系統(tǒng)設(shè)計教程的學(xué)習(xí),想自己動腦筋設(shè)計一個比較簡單的CPU,一方面熟悉了解基于FPGA開發(fā)的一些基本流程,另一方面能夠進一步加深自己計算機基礎(chǔ)理論的學(xué)習(xí),并在此基礎(chǔ)上以后能夠進行更高層次的設(shè)計。本文中的CPU是通過Altera QuartusII9.0,Modelsim6.4環(huán)境下用Verilog語言進行仿真。這個16位的CPU是在Verilog數(shù)字系統(tǒng)設(shè)計教程中的CPU模型通過修改得到的。本文所有的程序代碼和測試文件詳見:。二RISC_CPU結(jié)構(gòu)RISC_CPU 是一個復(fù)雜的數(shù)字邏輯電路,但
2、是其基本部件 的邏輯并不復(fù)雜,可以將其分成8個基本部件來考慮:時鐘發(fā)生器,指令寄存器,累加器,算術(shù)邏輯運算單元,數(shù)據(jù)控制器,狀態(tài)控制器,程序計數(shù)器,地址多路器。各部件的連接關(guān)系見圖1。其中時鐘發(fā)生器利用外來時鐘信號進行分頻生成一系列時鐘信號,送往其它部件用作時鐘信號。各部件之間的相互操作關(guān)系則由狀態(tài)控制器來控制。clkrstalu_enafetchclkload_irrstdata7.0opc_iraddr15.0clkload_accrstdata7.0accum_out7.0alu_clkdata7.0accum7.0opcode3.0zeroalu_out7.0clkfetchrsten
3、aclkenazeroopcode3.0datactl_enahaltinc_pcload_accload_irload_pcrdwrdata_enain7.0data7.0fetchir_addr11.0pc_addr11.0addr11.0clkloadrstir_addr11.0pc_addr11.0CLKSOURCE:m_CLKSOURCEaccum:m_accumadr:m_adrclkresethaltrdwrfetchaddr11.0opcode3.0ir_addr11.0pc_addr11.0data7.0counter:m_countermachine:m_machineal
4、u:m_alumachinectl:m_machinectlirregister:m_irregisterdatactl:m_datactl 圖1 RISC_CPU中各部件的相互連接關(guān)系1. 時鐘發(fā)生器時鐘發(fā)生器CLKSOURCE利用外來時鐘信號clk生成一系列時鐘信號alu_clk,fetch,并送往cpu的其它部件。其中,fetch是控制信號,clk的6分頻信號。當(dāng)fetch高電平時,使clk能觸發(fā)cpu控制器開始執(zhí)行一條指令;同時fetch信號還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk信號還用作指令寄存器,累加器,狀態(tài)控制器的時鐘信號。圖2為時鐘發(fā)生器原理圖。時鐘發(fā)生器的波形如圖3
5、所示。 圖2 時鐘發(fā)生器 圖3 時鐘發(fā)生器波形2.指令寄存器指令寄存器是用于寄存指令的寄存器,如圖4所示。 圖4 指令寄存器結(jié)構(gòu)指令寄存器的觸發(fā)信號時clk,在clk的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入16位的寄存器中,但并不是每個clk的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因為數(shù)據(jù)總線上有時傳輸指令,有時傳輸數(shù)據(jù)。什么時候寄存,什么時候不寄存由CPU狀態(tài)控制器的load_ir信號控制。load_ir信號通過load_ir口輸入到指令寄存器,復(fù)位后,指令寄存器被清為零。每條指令為16位。高4位是操作碼,低12位是地址(cpu的地址總線為12位,尋址空間為4K字節(jié))。本設(shè)計的數(shù)據(jù)總線為16位,所
6、以取指令只要一次就可以了。3.累加器累加器用于存放當(dāng)前的結(jié)果,它也是雙目運算中的一個數(shù)據(jù)來源(如圖5)。復(fù)位后,累加器的值是零。當(dāng)累加器通過load_acc信號時,在clk時鐘跳變沿時就受到來自于數(shù)據(jù)總線的數(shù)據(jù)。圖5 累加器結(jié)構(gòu)4.算術(shù)運算器算術(shù)邏輯運算單元如圖6所示,它根據(jù)輸入的16種不同的操作碼分別進行加減乘,與或非等基本操作運算,利用這幾種基本運算可以實現(xiàn)很多種其它運算以及邏輯判斷等操作。圖6 算術(shù)運算器結(jié)構(gòu)5.數(shù)據(jù)控制器 數(shù)據(jù)控制器如圖7所示,其作用是控制累加器的數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時傳送數(shù)據(jù)的公共通道,不同情況下傳送不同的內(nèi)容。有時要傳輸指令,有時要傳送RAM區(qū)或接口的數(shù)
7、據(jù)。累加器的數(shù)據(jù)只有在需要往RAM區(qū)域或端口寫時才允許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。所以任何部件往總線上輸出數(shù)據(jù)時,都需要一控制信號。而此控制信號的啟停則由cpu狀態(tài)控制器輸出各信號控制決定。數(shù)據(jù)控制器何時輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號data_ena決定。圖7 數(shù)據(jù)控制器結(jié)構(gòu)6.地址多路器地址多路器如圖8所示,它用于選擇輸出的地址是PC地址還是數(shù)據(jù)/端口地址。每個指令周期的前3個時鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址,后3個時鐘周期用于RAM或端口的讀寫,該地址有指令給出。地址的選擇輸出信號由時鐘信號的6分頻fetch提供。圖8 地址多路器結(jié)構(gòu)
8、7.程序計數(shù)器 程序計數(shù)器如圖9所示。它用于提供指令地址,以便讀取指令。指令按地址順序存放在存儲器中。有兩種途徑可形成指令地址;其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的地址。下面就來詳細說明PC地址是如何建立的。圖9 程序計數(shù)器結(jié)構(gòu)復(fù)位后,指令指針為零,即每次CPU重新啟動將從ROM的零地址開始讀取指令并執(zhí)行,每條指令執(zhí)行完,指向下一個指令。如果正在執(zhí)行的指令是跳轉(zhuǎn)語句,這時CPU狀態(tài)控制器將會輸出load_pc信號,通過load口進入程序計數(shù)器,程序計數(shù)器(pc_addr)將裝入目標(biāo)地址(ir_addr0)。8.狀態(tài)控制器狀態(tài)控制器如圖10
9、所示。圖10 狀態(tài)控制器狀態(tài)機控制器接收復(fù)位信號rst,當(dāng)rst有效時,通過信號ena使其為零,輸入到狀態(tài)機中,以停止?fàn)顟B(tài)機的工作。狀態(tài)機是cpu的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。cpu何時進行指令來讀寫I/O端口及RAM區(qū)等操作,都是由狀態(tài)機來控制的。狀態(tài)機的當(dāng)前狀態(tài),由變量state記錄,state的值就是當(dāng)前這個指令周期中已過的時鐘數(shù)。指令周期是有6個時鐘周期組成,每個時鐘周期都要完成固定的操作,即(1)第0個時鐘,cpu狀態(tài)控制器的輸出rd,data_ctl和load_ir為高電平,inc_pc從0變?yōu)?故pc加1,ROM送來的指令代碼寄存在指令寄存器中。(2)
10、第1個時鐘空操作(3)第2個時鐘。若操作符為HLT,則輸出信號HLT為高。如果操作符不為HLT,除了PC增1外,其他各控制線輸出為零。(4)第3個時鐘,若操作符為AND,ADD, XOR, LDA, NOT, MUL, SUB ,OR, RL, RR, POP, PUSH,讀取相應(yīng)地址的數(shù)據(jù);若為STO,輸出累加器數(shù)據(jù)。(5)第4個時鐘,若操作符為AND,ADD等算術(shù)運算,算術(shù)運算器就進行相應(yīng)的運算;若操作符為LDA,就把數(shù)據(jù)通過算術(shù)運算符送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC加1,否則保持原值;若為JMP,鎖存目標(biāo)地址;若為STO,將數(shù)據(jù)寫入地址處。(6)第5個時鐘
11、空操作三RISC_CPU操作和時序一個微機系統(tǒng)為了完成自身的功能,需要CPU執(zhí)行許多操作。以下是RISC的主操作:(1) 系統(tǒng)的復(fù)位和啟動操作(2) 總線讀操作(3) 總線寫操作下面詳細介紹每個操作,即系統(tǒng)的復(fù)位與啟動,總線的讀寫等操作。1.系統(tǒng)的復(fù)位和啟動操作RISC的復(fù)位和啟動操作是通過reset引腳的信號觸發(fā)執(zhí)行。當(dāng)rst信號一進入高電平,RISCC_CPU就會結(jié)束先行操作,并且只要reset停留在高電平狀態(tài),cpu就維持在復(fù)位狀態(tài)。在復(fù)位狀態(tài),cpu各個內(nèi)部寄存器都被設(shè)有初值,全部為零。數(shù)據(jù)總線為高阻態(tài),地址總線為000H,所有控制信號均為無效狀態(tài),reset回到低電平后,接著到來的第
12、一個fetch上升沿獎啟動RISC_CPU開始工作,從ROM的000處開始讀取指令并執(zhí)行相應(yīng)操作,波形見圖11,虛線標(biāo)志處為RISC_CPU啟動工作的時刻。圖11 RISC_CPU的復(fù)位和啟動操作波形2.總線的讀操作每個指令周期的前02個時鐘周期用于讀指令;第2.5個周期處,存儲器或端口地址就輸入到地址總線上;第35個時鐘周期,都信號rd有效,數(shù)據(jù)送到數(shù)據(jù)總線上,以便累加器鎖存,或參與算術(shù),邏輯運算。圖12為CPU從存儲器或端口讀取數(shù)據(jù)的時序。圖12 RISC_CPU從存儲器或端口讀取數(shù)據(jù)的時序3.總線寫操作每個指令周期的第2.5個時鐘周期處,寫的地址就建立了;第3個時鐘周期輸出數(shù)據(jù);第4個時
13、鐘周期輸出寫信號;至第5個時鐘結(jié)束,數(shù)據(jù)無效。圖13為CPU對存儲器或端口寫數(shù)據(jù)的時序。圖13 RISC_CPU四RISC_CPU尋址方式和指令系統(tǒng)RISC_CPU的指令格式一律為:高4位為指令,第12位為地址,它的指令系統(tǒng)由16條指令組成。(1) HLT:停機操作。該操作將會空一個指令周期,即6個時鐘周期(2) SKZ:為跳過下一條語句,該操作為先判斷當(dāng)前alu中的結(jié)果是否為零,若是零就跳過下一條語句,否則繼續(xù)執(zhí)行。(3) ADD相加:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相加,結(jié)果仍返回累加器中。(4) SUB 相減:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相減,結(jié)果
14、仍返回累加器中。(5) MUL 相乘:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相乘,結(jié)果仍返回累加器中。(6) OR 或:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相或,結(jié)果仍返回累加器中。(7) AND 與:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相與,結(jié)果仍返回累加器中。(8) XOR 異或:該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相異或,結(jié)果仍返回累加器中。 (9) NOT 非:該操作將地址所指的存儲器或端口的數(shù)據(jù)相加,結(jié)果仍返 回累加器中。(10) STO寫數(shù)據(jù):該操作將累加器的數(shù)據(jù)放入指令中給出的地址。(11) LDA 讀數(shù)據(jù):該操作將累加器的數(shù)
15、據(jù)放入累加器。 (12) RL 左移:該操作將地址所指的存儲器或端口的數(shù)據(jù)向左移動一位, 結(jié)果仍返回累加器中。 (13) RR 右移:該操作將地址所指的存儲器或端口的數(shù)據(jù)向右移動一位,結(jié)果仍返回累加器中。 (14) JMP 無條件跳轉(zhuǎn):該操作將跳轉(zhuǎn)至指令給出的目標(biāo)地址,繼續(xù)運行。(15) POP 出棧 :該操作是將累加器中的數(shù)據(jù)放入堆棧寄存器中。(16) PUSH 進棧:該操作是將堆棧寄存器中的數(shù)據(jù)放入到累加器中。RISC_CPU是16位微處理器,一律采用直接尋址方式,即數(shù)據(jù)總是放在存儲器中,尋址單元的地址由指令直接給出。這是最簡單的尋址方式。五RISC_CPU模塊的調(diào)試1.RISC_CPU模
16、塊的前仿真為了對所設(shè)計的RISC_CPU模塊進行驗證,需要把RISC_CPU包裝在一個模式下,這樣其內(nèi)部連線就隱藏起來,從系統(tǒng)的角度看顯得簡潔,見圖14.還需要建立一些必要的外部模型,例如儲存程序用的ROM模型,存儲數(shù)據(jù)用的RAM模型和地址譯碼器等。這些模型都可以用Verilog HDL描述。由于不需要圖14 RISC_CPU及其外圍電路綜合成具體的電路,只要保證功能和接口信號正確就能用于仿真。也就是說,用虛擬器件來代替真實的器件對所設(shè)計的RISC_CPU模塊進行驗證,檢查各條指令是否執(zhí)行正確,與外圍電路的數(shù)據(jù)交換是否正常。這種模型是很容易編寫的,可在下面的仿真中來代替真實的器件,用于驗證RI
17、SC_CPU模塊是否能正確的運行裝入ROM和RAM的程序。在RISC_CPU的電路圖上加上這些外圍電路把有關(guān)的電路接通,如圖14所示,這根用真實的電路器件調(diào)試情況很類似。可以編寫調(diào)試的仿真測試程序cuptop.v,用于對以上所設(shè)計的RISC_CPU進行仿真測試。2.RISC_CPU模塊的綜合在對所設(shè)計的RISC_CPU模型進行驗證后,如沒有發(fā)現(xiàn)問題就可以開始做下一步的工作即綜合,綜合工作往往要分階段來進行,這樣便于發(fā)現(xiàn)問題。所謂分階段是指:第一階段:先對構(gòu)成RISC_CPU模型的各個子模塊,如狀態(tài)控制機模塊,指令寄存器模塊,算是邏輯運算單元模塊等,分別加以綜合以檢查其可綜合性。綜合后及時進行后
18、仿真,這樣便于及時發(fā)現(xiàn)錯誤,及時該進。第二階段:把要綜合的模塊從仿真測試信號模塊和虛擬外圍電路模塊中分離出來,組成一個獨立的模塊,其中包含可所有需要綜合的模塊。然后給這個大模塊起一個名字。要綜合的只是RISC_CPU,并不包含虛擬外圍電路,可以給這一模塊起一個名字,例如稱它為RSIC_CHIP模塊。第三階段:把需要的綜合的模塊加載到綜合器,本文檔所使用的是quartusII綜合工具,選定的FPGA是Altera的cycloneII。3.RISC_CPU模塊的優(yōu)化和布局布線選定元件庫后就可以對所設(shè)計的RISC_CPU模型進行綜合,綜合工具是吧Verilog RTL代碼通過綜合工具,產(chǎn)生一系列由現(xiàn)存元件的邏輯網(wǎng)表組成的文件。在綜合工具上通過選
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 腮腺腫瘤CT診斷
- 常用的避孕方法及護理
- 駕駛員管理辦法
- 企業(yè)五一假期前安全教育
- 病人透析護理指南
- 2025年杭州西湖區(qū)市場監(jiān)督管理局招聘考試筆試試題(含答案)
- 送別教學(xué)課件
- 真心英雄教學(xué)課件
- scratch編程教學(xué)課件
- 認識蔬菜教學(xué)課件
- 山東青島市李滄區(qū)2023-2024學(xué)年七年級下學(xué)期期末考試英語試題
- 遭遇暴徒的應(yīng)急預(yù)案及流程
- 《城市排水管渠數(shù)字化檢測與評估技術(shù)規(guī)程》
- 醫(yī)保基金監(jiān)管培訓(xùn)課件
- 穿越華裾-中華服飾之美智慧樹知到期末考試答案2024年
- 咳喘疾病中氣道重塑的機制及治療靶點研究
- 藥店人際關(guān)系建設(shè)與溝通技巧培訓(xùn)
- 機電安裝質(zhì)量檢測報告
- 30道醫(yī)院眼科醫(yī)生崗位高頻面試問題附考察點及參考回答
- 北師大版數(shù)學(xué)小學(xué)二年級下冊期末無紙筆化檢測題
- 利盟ms823dn維修手冊
評論
0/150
提交評論