嚴(yán)海洲
摘要:在MIPS CPU設(shè)計(jì)原理的基礎(chǔ)上,通過Verilog硬件描述語言編程、使用Xilinx FPGA開發(fā)板的調(diào)試和仿真工具Vivado,實(shí)現(xiàn)基于FPGA的MIPS單周期處理器。最終下載到Nexys4-DDR平臺上,通過ChipScope工具抓取運(yùn)行過程中產(chǎn)生的波形進(jìn)行驗(yàn)證。
關(guān)鍵詞:MIPS;硬件描述語言 ; Vivado ;單周期處理器
中圖分類號:TP311? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)19-0005-04
本文旨在使讀者理解和掌握基于FPGA的MIPS單周期處理器的設(shè)計(jì)和實(shí)現(xiàn)。我們要在了解MIPS CPU設(shè)計(jì)原理的基礎(chǔ)上,掌握Verilog硬件描述語言編程、Xilinx FPGA開發(fā)板(Nexys4-DDR)的調(diào)試和仿真工具(Vivado? 2014.4)。過程大致分為用Vivado設(shè)計(jì)套件創(chuàng)建工程、編寫 Verilog 代碼、仿真測試和下載驗(yàn)證等四部分。
1 用Vivado設(shè)計(jì)套件創(chuàng)建工程
1.1 關(guān)于Vivado設(shè)計(jì)套件
Vivado設(shè)計(jì)套件是FPGA廠商賽靈思Xilinx公司2012年發(fā)布的集成設(shè)計(jì)環(huán)境,以提升生產(chǎn)力、縮短產(chǎn)品上市時(shí)間、實(shí)現(xiàn)可編程系統(tǒng)集成等目標(biāo)。Vivado設(shè)計(jì)套件可實(shí)現(xiàn)FPGA部分的設(shè)計(jì)和開發(fā),管腳和時(shí)序的約束,編譯和仿真,實(shí)現(xiàn)RTL 到比特流的設(shè)計(jì)流程。包括高度集成的設(shè)計(jì)環(huán)境和新一代從系統(tǒng)級到IC級的工具,全新的系統(tǒng)級設(shè)計(jì)的中心思想是基于知識產(chǎn)權(quán)(IP)核的設(shè)計(jì),Vivado工具把各類可編程技術(shù)結(jié)合在一起,能夠擴(kuò)展多達(dá)1億個(gè)等效ASIC門的設(shè)計(jì)。這些均建立在共享的可擴(kuò)展數(shù)據(jù)模型和通用調(diào)試環(huán)境基礎(chǔ)上,可以讓用戶更快地實(shí)現(xiàn)設(shè)計(jì)收斂。
1.2 新工程的創(chuàng)建和設(shè)置
打開 Vivado設(shè)計(jì)套件(本文使用的是Vivado 2014.4)新建工程,輸入工程名和存儲路徑如圖1所示。然后選擇FPGA型號、綜合和仿真工具、推薦描述語言(Verilog)等配置如圖2所示。
1.3 添加Verilog 模塊
如圖3所示,右鍵點(diǎn)擊 Hierarchy 窗口,選擇 Add Copy of Source ,添加已有的Verilog模塊,例如 Register file,Sign Extend,Data Memory,Instruction Memory,ALU 模塊。并重新定義Top 層模塊和 Control。
2 編寫 Verilog 代碼
2.1 關(guān)于Verilog HDL
Verilog HDL(常簡稱為Verilog)是一種硬件描述語言,以文本形式來描述數(shù)字系統(tǒng)硬件的結(jié)構(gòu)和行為的語言,用它可以表示邏輯電路圖、邏輯表達(dá)式,還可以表示數(shù)字邏輯系統(tǒng)所完成的邏輯功能。Verilog HDL和VHDL是目前業(yè)界最常用的兩種硬件描述語言,這兩種HDL均為IEEE標(biāo)準(zhǔn)。
2.2 MIPS 單周期處理器原理概要
單周期CPU是指一條指令在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行完畢,然后開始執(zhí)行下一條指令。時(shí)鐘周期一般也稱振蕩周期。 單周期處理器的設(shè)計(jì),關(guān)鍵是確定數(shù)據(jù)路徑以及確定哪些操作需要時(shí)鐘,哪些不需要時(shí)鐘。例如對于 Data Memory 讀和寫就需要區(qū)別對待。將計(jì)算好的數(shù)據(jù)寫到 Data Memory 需要一個(gè)時(shí)鐘周期來完成。而讀 Memory 的操作,意味著將讀到的數(shù)據(jù)寫入到 Register file,如果讀 Memory 和寫 Register 都需要一個(gè)時(shí)鐘周期,那就無法實(shí)現(xiàn)單周期的處理器。所以 Data Memory寫操作采用時(shí)序邏輯,而讀操作采用組合邏輯,本文采用的就是這種方式。當(dāng)然,還有其他方式來解決多周期修改成單周期,例如采用快慢兩個(gè)時(shí)鐘的方法等。
2.3 編輯 control 模塊和Top 層模塊
根據(jù)上述設(shè)計(jì)思路,編輯 control 模塊如圖4;編輯Top層模塊如圖5,將各個(gè)模塊互聯(lián)起來。
2.4 系統(tǒng)時(shí)鐘的設(shè)置
設(shè)計(jì)的系統(tǒng)時(shí)鐘暫定為 32MHz,外部時(shí)鐘是 100MHz,需要添加一個(gè)時(shí)鐘生成器進(jìn)行分頻處理,得到32MHz。利用Core Generator來生成時(shí)鐘,右鍵選中 Hierarchy 窗口,選擇 New Source,左側(cè)框中選擇 IP,右側(cè)輸入文件名,如圖6所示。選擇 IP Core 類型,這里使用 Clocking Wizard,如圖7所示。然后配置 DCM 時(shí)鐘參數(shù),在 Top 模塊中調(diào)用 Clk_gen 模塊。
3 仿真測試
整個(gè)處理器設(shè)計(jì)基本完成,接下來編輯 testbench 文件,進(jìn)行行為級的仿真。
3.1 系統(tǒng)的初始化
1)初始化 data memory、instruction memory 和 register 三大存儲模塊,這里僅以初始化 instruction memory 為例說明,其他類推即可。該 memory 用于存儲二進(jìn)制代碼,如圖8顯示。Verilog中調(diào)用了系統(tǒng)任務(wù)$readmemh,將Instruction文件中的數(shù)據(jù)讀入到InstMem數(shù)組中。
2)編寫Top層的testbench文件如圖9。右鍵選中Hierachy窗口,選擇new source,如圖10所示,定義 file name為Top_tb,在左側(cè)欄中選擇 Verilog Test Fixture,點(diǎn)擊 Next,選擇Top模塊,自動(dòng)生成 Top_tb 測試文件。添加時(shí)鐘激勵(lì),初始化其他輸入信號。
3.2 仿真與觀察
1)調(diào)用Vivado自帶的仿真工具進(jìn)行仿真如圖11,雙擊 Simulate Behavioral Model。添加 register 模塊中的 regfile 寄存器數(shù)組到波形窗口,觀察各個(gè)寄存器的變化情況,如圖12所示。