没有合适的资源?快使用搜索试试~ 我知道了~
report3 - 多周期MIPS1
需积分: 0 0 下载量 64 浏览量
2022-08-03
17:56:06
上传
评论
收藏 839KB PDF 举报
温馨提示
试读
15页
增加了指令(具体指令在第五章讲解)实现了模块化测试和整合仿真测试,并且通过了最终的测试代码结构清晰,每个函数有清晰易懂的注释;文件结构干净整洁实验报告清晰易懂,
资源详情
资源评论
资源推荐
多周期MIPS设计 实验报告
17307130178 宁晨然
1. 实验概述
本次实验完成了多周期MIPS设计,实现了多周期处理器的微体系结构。多周期体系结构意味着,时间
周期不再受最长时间指令限制,而是分段为多个模块,根据状态机图转换状态,实现多个周期的运转。
难点在于整个模块的状态机图,以及每个指令对应的状态。组件基本与单周期类似。
实验使用的是verilog硬件设计语言。
2. 实验展示
实验完成MIPS多周期处理器的设计,并且增加了指令,修改代码、修改状态机图,并且最终通过了测
试。
2.1 实验亮点
本人认为该实验可以达到A水平,在此列出本次实验作业的亮点:
实现了MIPS多周期处理器的设计
增加了指令(具体指令在第五章讲解)
实现了模块化测试和整合仿真测试,并且通过了最终的测试
代码结构清晰,每个函数有清晰易懂的注释;文件结构干净整洁
实验报告清晰易懂,涵盖要点、提纲挈领
2.2 实验原理
上图是多周期mips设计的模样,整个多周期处理器的构成由两个板块构成:
MIPS主部件:主要部件由控制通路和数据通路组成,数据通路根据寄存器和储存器中的数据以及
控制信号完成指令,控制通路负责根据指令调整控。
mem:合并了dmem和imem,与单周期类似。
2.3 实验结果
实验成功通过了测试文件。仿真结果如下,均符合正确性。
3. 实验代码讲解
先简单介绍本次实验的步骤:
第一步:复用单周期mips的构件,重新搭建新的多周期框架
第二步:修改dmem和imem,用mem合并两者功能
第三步:修改controller和top文件,实现多周期基本框架
第四步:实现单元测试,单独对各种模块进行测试,测试无误后再整合文件
第五步:实现整合测试,使用test_bench对整个mips的top文件进行测试,测试文件为memfile
第六步:添加指令,重复测试流程
下面先简单介绍文件结构。本单元部分介绍代码如何实现和原理,指令的讲解在第五章实验指令详解。
3.1 datapath
数据通路由操作元件和状态元件组合而成。通过分散方式或总线方式连接而成,进行数据存储、处理、
传送的路径。下面先分板块讲解。
所有数据通路需要调用的元件均写在 components.v 文件中,便于测试和管理
所有元件均进行了代码标注,清晰易懂
下面解释很多元件使用了homework2中的代码,实现了功能复用。
由于大部分与之前相同,所以不予赘述
components主要实现的功能部件有:
寄存器文件 register file
左移2
带符号扩展、零扩展
寄存器
多路选择器
ALU
// 3. Register file
// 2 read 1 write
module regfile(
input clk, wen,
input [4:0] address1,address2,address3,
input [31:0] wdata,
output [31:0] rd1,rd2
);
// 32 32-bit registers
reg [63:0] rf [31:0];
integer i;
// initialization
initial
begin
for(i=0;i<64;i=i+1)
rf[i] = 32'b0;
end
// write 1
always @(posedge clk)
begin
if( wen && (address3!=0)) // write and register 0 cannot be changed
rf[address3] <= wdata;
end
// read two at same time
assign rd1 = (address1!=0) ? rf[address1] : 0;
assign rd2 = (address2!=0) ? rf[address2] : 0;
endmodule
// 4. others
module sl2(input [31:0] a,
output [31:0] y);
assign y = {a[29:0], 2'b00}; // shift left by 2
endmodule
module signext(input [15:0] a,
output [31:0] y);
assign y = {{16{a[15]}}, a}; // signed extender
endmodule
module zeroext(input [15:0] a,
output [31:0] y); // zero extender
assign y = {16'b0, a};
endmodule
剩余14页未读,继续阅读
LauraKuang
- 粉丝: 19
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0