自己写CPU第九阶段(5)——实现负载存储指令2(改变运行阶段)
我们会继续上传新书《自己动手写CPU》。今天是第42篇。我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事。不好意思哈。
开展晒书评送书活动,在 q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" target="_blank" style="position:static; display:inline; color:rgb(51,102,153); text-decoration:none">亚马逊 q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quotes_f" target="_blank" style="position:static; display:inline; color:rgb(0,0,240); text-decoration:none">自己动手写CPU
9.3.2 改动运行阶段
1、改动EX模块
在运行阶段的EX模块会计算载入存储的目的地址。參考图9-19可知,EX模块会添加部分接口,如表9-3所看到的。
改动运行阶段的EX模块例如以下。
完整代码位于本书附带光盘Code\Chapter9_1文件夹下的ex.v文件。
module ex( ...... //新增输入接口inst_i,其值就是当前处于运行阶段的指令
input wire[`RegBus] inst_i, ...... //以下新增的几个输出接口是为载入、存储指令准备的
output wire[`AluOpBus] aluop_o,
output wire[`RegBus] mem_addr_o,
output wire[`RegBus] reg2_o, ......
); ...... //aluop_o会传递到訪存阶段,届时将利用其确定载入、存储类型
assign aluop_o = aluop_i; //mem_addr_o会传递到訪存阶段,是载入、存储指令相应的存储器地址,此处的reg1_i
//就是载入、存储指令中地址为base的通用寄存器的值。inst_i[15:0]就是指令中的
//offset。通过mem_addr_o的计算。读者也能够明确为何要在译码阶段ID模块新增输
//出接口inst_o
assign mem_addr_o = reg1_i + {{16{inst_i[15]}},inst_i[15:0]}; //reg2_i是存储指令要存储的数据,或者lwl、lwr指令要载入到的目的寄存器的原始值,
//将该值通过reg2_o接口传递到訪存阶段
assign reg2_o = reg2_i; ......
2、改动EX/MEM模块
參考图9-19可知,EX/MEM模块会添加部分接口,用于将EX模块新增的输出传递到訪存阶段,添加的接口描写叙述如表9-4所看到的。
改动运行阶段的EX/MEM模块例如以下。仅仅是一个简单的传递操作。当流水线的运行阶段没有被暂停时。将来自运行阶段EX模块的输出传递到訪存阶段。完整代码请參考本书附带光盘Code\Chapter9_1文件夹下的ex_mem.v文件。
module ex_mem( ...... //为实现载入、存储指令而加入的输入接口
input wire[`AluOpBus] ex_aluop,
input wire[`RegBus] ex_mem_addr,
input wire[`RegBus] ex_reg2, ...... //为实现载入、存储指令而加入的输出接口
output reg[`AluOpBus] mem_aluop,
output reg[`RegBus] mem_mem_addr,
output reg[`RegBus] mem_reg2, ......
); always @ (posedge clk) begin
if(rst == `RstEnable) begin
......
mem_aluop <= `EXE_NOP_OP;
mem_mem_addr <= `ZeroWord;
mem_reg2 <= `ZeroWord;
end else if(stall[3] == `Stop && stall[4] == `NoStop) begin
......
mem_aluop <= `EXE_NOP_OP;
mem_mem_addr <= `ZeroWord;
mem_reg2 <= `ZeroWord;
end else if(stall[3] == `NoStop) begin
......
mem_aluop <= ex_aluop;
mem_mem_addr <= ex_mem_addr;
mem_reg2 <= ex_reg2;
end else begin
......
end
end endmodule
下一阶段将改变内存访问。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
自己写CPU第九阶段(5)——实现负载存储指令2(改变运行阶段)的更多相关文章
- 自己写CPU第九阶段(3)——加载存储指令说明2(swl、swr)
我们会继续上传新书<q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quot ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- 自己动手写CPU之第九阶段(4)——载入存储指令实现思路
将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
- 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
- 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...
- 自己写CPU第四阶段(2)——验证该第一指令ori实现效果
我们会继续上传新书<自己写CPU>(未公布),今天是12片,四篇 书名又之前的<自己动手写处理器>改为<自己动手写CPU> 4.3 验证OpenMIPS实现效果 4 ...
随机推荐
- 定制XP引导屏幕背景图像和替换windows这句话
(一)带滚动条界面变化 1.制作640*480位图,4位置16肤色,尺寸小于200Kb. 2.位图名boot.bmp,并将其复制到C:/windows根文件夹 3.更改boot.ini档.我的电脑/属 ...
- i++与++i哪个效率更高
简单的比较前缀自增运算符和后缀自增运算符的效率是片面的, 因为存在很多因素影响这个问题的答案. 首先考虑内建数据类型的情况: 如果自增运算表达式的结果没有被使用, 而是仅仅简单地用于增加一元操作数, ...
- Eclipse扩展安装插件方式
Eclipse安装插件经常使用的是直接安装的方式,就是将插件中包含的plugins和features文件夹中的内容直接复制到了Eclipse的plugins和features文件夹内,这样很容易导致插 ...
- MyEclipse10.0 集成 SVN
一:下载服务端和client工具 服务端安装工具:Setup-Subversion-1.6.5.msi client安装工具:TortoiseSVN 下载地址:http://subclipse.t ...
- nova-compute[5410]: OSError: [Errno 13] Permission denied: '图像路径'
前几天有 openstack-Nova 创建虚拟机拨弄了一下,结果重新启动后的今天 nova boot 创建虚拟机实例有错误,创建虚拟机出状况 他们是 error 视图 openstack 服务状态 ...
- EntityFramework:状态变化与方法的关系
一.约定 OnModelCreated 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreated 中不支持 3.正则表达式在 O ...
- Matlab图像处理系列4———傅立叶变换和反变换的图像
注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...
- mysql中国的内容php网页乱码问题
1.更改mysql编码在数据库 character_set_server=utf8 init_connect='SET NAMES utf8' 加入这两行 2.又第一次启动mysql数据库 版权声明: ...
- SOA、REST 和六边形架构
SOA.REST 和六边形架构 上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(S ...
- Oracle在rownum使用结果集排序
Oracle在rownum使用结果集排序 对于 Oracle 的 rownum 问题,非常多资料都说不支持>,>=,=,between...and,仅仅能用以上符号(<.< ...