1. 程式人生 > >【verilog】單週期MIPS CPU設計

【verilog】單週期MIPS CPU設計

一、    實驗要求

設計一個單週期MIPS CPU,依據給定過的指令集,設計核心的控制訊號。依據給定的資料通路和控制單元訊號進行設計。

二、    實驗內容

1.資料通路設計:mips指令格式只有三種:

1)R型別  從暫存器堆中取出兩個運算元,計算結果寫回暫存器堆

2)I型別  用一個16位的立即數作為一個源運算元

3)J型別  用一個26位的立即數作為跳轉的目標地址

根據以上三種類型可以設計相應的資料通路。基本原理如下

下面是實現之後的效果

2.相應模組設計

首先明確應該有哪些主要功能模組

邏輯電路:控制單元,選擇器,ALU,符號位擴充套件單元,branch加法器等

時序電路:PC暫存器,指令/資料儲存器,暫存器檔案

對應的主要程式碼如下:

(1)top模組對各部分的例化:

下面是具體的主要模組的實現

(2)控制單元

module controlunit(

 input [5:0] opcode,

 input [5:0] funct,          //本實驗只考慮add所以暫時用不到這個欄位

 

 output reg mem_write,

 output reg mem_toreg,

 output reg branch,

 output reg alu_src,

 output reg reg_dst,

 output reg reg_write,

 output reg [2:0] alu_op,

 output reg jump

 

 );

 

 
[email protected]
(*) case(opcode) 6'b000000: //add begin reg_dst=1; alu_src=0; mem_toreg=0; reg_write=1; mem_write=0; branch=0; alu_op=3'b001; jump=0; end 6'b001000: //addi begin reg_dst=0; alu_src=1; mem_toreg=0; reg_write=1; mem_write=0; branch=0; alu_op=3'b001; jump=0; end 6'b100011: //lw begin reg_dst=0; alu_src=1; mem_toreg=1; reg_write=1; mem_write=0; branch=0; alu_op=3'b001; jump=0; end 6'b101011: //sw begin reg_dst=0; alu_src=1; mem_toreg=0; reg_write=0; mem_write=1; branch=0; alu_op=2'b001; jump=0; end 6'b000010: //jump begin reg_dst=1; alu_src=0; mem_toreg=0; reg_write=0; mem_write=0; branch=1; alu_op=2'b001; jump=1; end 6'b000111: //bgtz begin reg_dst=1; alu_src=0; mem_toreg=0; reg_write=0; mem_write=0; branch=1; alu_op=2'b001; jump=0; end default: begin reg_dst=1; alu_src=0; mem_toreg=0; reg_write=1; mem_write=0; branch=0; alu_op=2'b10; end endcase endmodule

(3)符號位擴充套件單元

module signextension(num_in,num_out);

 input wire[15:0] num_in;

 output reg[31:0] num_out;

 initial begin

   num_out = 0;

 end

 always @(num_in) begin

      num_out<= {{16{num_in[15]}},num_in[15:0]};

  end

 

endmodule

(4)branch加法器模組

       這裡不進行左移操作,與至指令暫存器的設定相關,本實驗中指令集暫存器每次讀取32位資料,所以不需要像8位那樣進行左移。

(5)pc自增模組

(6)選擇器

這裡是32位的,還有5位的型號,原理一致較為簡單,此不贅述

(7)列一下關於兩個ram的介面

                    

(8)ALU,regfile參見前面幾次實驗,這裡不作分析

三、    實驗驗證

1.編寫coe檔案

根據實驗的要求以及個人設計的情況,測試程式碼如下:

(主要是因為pc暫存器指向的地址是32位而不是8位,所以做了修改,無關演算法)

MEMORY_INITIALIZATION_RADIX=16;

MEMORY_INITIALIZATION_VECTOR=

20080000,

200d0014,

8dad0000,

200b0015,

8d6b0000,

200c0015,

8d8c0001,

ad0b0000,

ad0c0001,

21a9fffe,

8d0b0000,

8d0c0001,

016c5020,

ad0a0002,

21080001,

2129ffff,

1d20fff9,

08000011;

測試資料:

MEMORY_INITIALIZATION_RADIX=10;

MEMORY_INITIALIZATION_VECTOR=

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,3,3;

2.模擬測試

這裡主要是對pc的跳轉進行分析,發現跳轉無誤,我們進入到ram裡觀察執行的情況,下面是dataram:

正好儲存了斐波那契數列的前二十個數,符合要求。

四、    分析和總結

本實驗實現了一個單週期mipscpu,實現了addi、add、lw、sw、bgtz、j六條指令。

實驗的關鍵在於弄清楚cpu以及每條指令的資料通路,還有相應的控制訊號的具體賦值。

在具體實現的時候,最為重要的的是確保指令的跳轉正確,在此基礎上對各個指令的執行debug就輕而易舉。

需要注意的是,在例項化的時候各個對應的介面較為繁雜,應當注意不要出錯,命名簡單易懂。


相關推薦

verilog週期MIPS CPU設計

一、    實驗要求設計一個單週期MIPS CPU,依據給定過的指令集,設計核心的控制訊號。依據給定的資料通路和控制單元訊號進行設計。二、    實驗內容1.資料通路設計:mips指令格式只有三種:1)R型別  從暫存器堆中取出兩個運算元,計算結果寫回暫存器堆2)I型別  用

Verilog實現週期CPU(部分MIPS指令集的指令)

這學期比較忙,很久沒發部落格了,先附上原始碼,等過完期末再補全博文 原始碼連結:https://github.com/AlexZhang267/Single-Cycle-CPU 注:我是在編輯器中寫的,用Icarus Verilog編譯執行的,沒用vivad

廣州網站建設公司頁網站如何設計?技巧在這裡

  在眾多的網站中,也有著很多的單頁面網站,為什麼要做這些單頁網站呢?原因就是單頁網站導航方式簡單,使用者不易迷路,只需上下滾動。單頁網站內容更專注,資訊傳遞更清晰,更有針對性。單頁網站幾乎可以在全平臺裝置上流暢瀏覽,滾動和滑動瀏覽替代了點選。那麼,單頁面網站應該如何設計?廣東鋒火廣州網站建設公司告訴你!

設計模式例模式的七種寫法

相關文章 面試的時候,問到許多年輕的Android開發他所會的設計模式是什麼,基本上都會提到單例模式,但是對單例模式也是一知半解,在Android開發中我們經常會運用單例模式,所以我們還是要更瞭解單例模式才對。 定義:保證一個類僅有一個例項,並提供一個訪

nexys3verilog設計——拆彈遊戲

設計說明書——拆彈遊戲   一.       設計背景拆彈遊戲,現有一個定時炸彈,設有一個計時器,如果不能在限定時間內找出唯一的密碼,會發生爆炸,若在規定時間內完成,則相當於炸彈被拆除。二.使用說明接通電路,計時器自動開始計時,顯示在數碼管上。利用八個開關輸入二進位制數(從左

python設計模式

動作 font 初始 記錄 sta pan dash sicp rgs 1. 定義 目的——讓類創建的對象,在系統中只有唯一的實例。 每一次執行新建對象操作,返回的都是同一個對象。 2. __new__ 方法   使用 classna

P3371 模板源最短路徑

logs alt front 最短路徑 ios num return struct 有向圖 題目描述 如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。 輸入輸出格式 輸入格式: 第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數

C#例模式&lt;機房重構&gt;

機房 .sh 不能 是否 gist 應用 調用方法 單例模式 sender 前言 在機房重構之前。我們學習了設計模式。在這次重構中,我們的任務就是將這些模式,加入到機房的重構中去。如今先來解決一個最簡單的問題——窗口的超生。 假設不加以限

周期CPU設計

cpu 點贊 ever ref 測試 操作數 將在 寄存器 知識庫 終於有點時間了,恰好多周期的設計也已經完成,其實只想寫寫多周期的,無奈單周期補上才好,哈哈哈~ —————+—————黃金分割線—————+————— 首先要理解什麽叫單周期CPU(與後面多周期CPU對

轉載片機的背後

想象 qpi 直接 依然 大腦 ati 含義 平時 二進制位 我們來思考一個問題,當我們在編程器中把一條指令寫進單片機內部,然後取下單片機,單片機就可以執行這條指令,那麽這條指令一定保存在單片機的某個地方,並且這個地方在單片機掉電後依然可以保持這條指令不會丟失,這是個什麽地

20171109Luogu P3371 模板源最短路徑--SPFA

else 輸入 所有 rom scanf node 時空 void edge 題目描述 如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。 輸入輸出格式 輸入格式: 第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數、出發點的編號。 接

python全棧開發補充例模式的四種方式

實現 創建 初始 user 它的 pooled asa args 三種 一、什麽是單例模式 保證一個類只有一個實例,並提供一個訪問它的全局訪問點 二、優點 對唯一實例的受控訪問 單利相當於全局變量,但防止了命名空間被汙染 與單利模式功能相似的概念:全局變量、靜態變量

總結遊戲框架與架構設計(Unity為例)

單機 業務 github 事件 概念 lec 集合 架構模式 wid 使用框架開發遊戲 優點:耦合性低,重用性高,部署快,可維護性高,方便管理。提高開發效率,降低開發難度 缺點:增加了系統結構和實現的復雜性,需要額外花費精力維護,不適合小型程序,易影響運行效率 常見

轉載關於generate用法的總結Verilog

case分支 intro 技術分享 結構 類型 img ora 做了 alt http://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html Abtract generate語句允許細化時間(Elabora

程序語言的常見設計錯誤(1) - 片面追求短小

body 缺陷 優化 簡單 code 不知道 返回 技巧 兩種 我經常以自己寫“非常短小”的代碼為豪。有一些人聽了之後很贊賞,然後說他也很喜歡寫短小的代碼,接著就開始說 C 語言其實有很多巧妙的設計,可以讓代碼變得非常短小。然後我才發現,這些人所謂的“短小”跟我所說的“短小

程序語言的常見設計錯誤(2) - 試圖容納世界

常見錯誤 rip 不一定 list 哪裏 code pre asc cti 之前的一篇文章裏,我談到了程序語言設計的一個常見錯誤傾向:片面追求短小,它導致了一系列的歷史性的設計錯誤。今天我來談一下另外一種錯誤的傾向,這種傾向也導致了很多錯誤,並且繼續在導致錯誤的產生。 今天

kafka節點多broker配置

kafka broker 1.在進入多個broker設置之前,首先啟動ZooKeeper服務器/usr/local/zookeeper/bin/zkServer.sh start2.復制kafka的server.properties文件cd /usr/local/kafka/config/ cp -a

MySQL基礎入門學習9無限級分類表設計

父親 連接 參照物 insert gpo 平板電視 生活電器 type mysql 比如: 圖書/小說、文學.../四大名著、戲曲.../... 理論上可以設計很多張表; 但是隨著分類逐步增多,這些表的數目不可能無限擴展; 所以對於無限級分類表一般我們采用如下形式(通過自身

數論2016中國大學生程序設計競賽 - 網絡選拔賽 A. A water problem (大整數取模)

判斷 eight ron lin 大學生 con while php bubuko 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5832 題意:兩個星球,一個星球一年只有137天,一個星球一年只有73天 輸入N(爆炸後第N

STLHDU58422016中國大學生程序設計競賽 - 網絡選拔賽 K. Lweb and String (set)(水~~~)

using 試用 字母 個數 urn 答案 def ret cde 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5842 水題,可以用來練習STL中的set 題目大意:給你一串字符串,字符串中的某個字母可以替換為一個數字