我们会继续上传新书《自己动手写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》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃參与吧。活动时间:2014-9-11至2014-10-30

9.3.2 改动运行阶段

1、改动EX模块

在运行阶段的EX模块会计算载入存储的目的地址。參考图9-19可知,EX模块会添加部分接口,如表9-3所看到的。

改动运行阶段的EX模块例如以下。

完整代码位于本书附带光盘Code\Chapter9_1文件夹下的ex.v文件。

  1. module ex(
  2.  
  3. ......
  4.  
  5. //新增输入接口inst_i,其值就是当前处于运行阶段的指令
  6. input wire[`RegBus] inst_i,
  7.  
  8. ......
  9.  
  10. //以下新增的几个输出接口是为载入、存储指令准备的
  11. output wire[`AluOpBus] aluop_o,
  12. output wire[`RegBus] mem_addr_o,
  13. output wire[`RegBus] reg2_o,
  14.  
  15. ......
  16. );
  17.  
  18. ......
  19.  
  20. //aluop_o会传递到訪存阶段,届时将利用其确定载入、存储类型
  21. assign aluop_o = aluop_i;
  22.  
  23. //mem_addr_o会传递到訪存阶段,是载入、存储指令相应的存储器地址,此处的reg1_i
  24. //就是载入、存储指令中地址为base的通用寄存器的值。inst_i[15:0]就是指令中的
  25. //offset。通过mem_addr_o的计算。读者也能够明确为何要在译码阶段ID模块新增输
  26. //出接口inst_o
  27. assign mem_addr_o = reg1_i + {{16{inst_i[15]}},inst_i[15:0]};
  28.  
  29. //reg2_i是存储指令要存储的数据,或者lwl、lwr指令要载入到的目的寄存器的原始值,
  30. //将该值通过reg2_o接口传递到訪存阶段
  31. assign reg2_o = reg2_i;
  32.  
  33. ......

2、改动EX/MEM模块

參考图9-19可知,EX/MEM模块会添加部分接口,用于将EX模块新增的输出传递到訪存阶段,添加的接口描写叙述如表9-4所看到的。

改动运行阶段的EX/MEM模块例如以下。仅仅是一个简单的传递操作。当流水线的运行阶段没有被暂停时。将来自运行阶段EX模块的输出传递到訪存阶段。完整代码请參考本书附带光盘Code\Chapter9_1文件夹下的ex_mem.v文件。

  1. module ex_mem(
  2.  
  3. ......
  4.  
  5. //为实现载入、存储指令而加入的输入接口
  6. input wire[`AluOpBus] ex_aluop,
  7. input wire[`RegBus] ex_mem_addr,
  8. input wire[`RegBus] ex_reg2,
  9.  
  10. ......
  11.  
  12. //为实现载入、存储指令而加入的输出接口
  13. output reg[`AluOpBus] mem_aluop,
  14. output reg[`RegBus] mem_mem_addr,
  15. output reg[`RegBus] mem_reg2,
  16.  
  17. ......
  18. );
  19.  
  20. always @ (posedge clk) begin
  21. if(rst == `RstEnable) begin
  22. ......
  23. mem_aluop <= `EXE_NOP_OP;
  24. mem_mem_addr <= `ZeroWord;
  25. mem_reg2 <= `ZeroWord;
  26. end else if(stall[3] == `Stop && stall[4] == `NoStop) begin
  27. ......
  28. mem_aluop <= `EXE_NOP_OP;
  29. mem_mem_addr <= `ZeroWord;
  30. mem_reg2 <= `ZeroWord;
  31. end else if(stall[3] == `NoStop) begin
  32. ......
  33. mem_aluop <= ex_aluop;
  34. mem_mem_addr <= ex_mem_addr;
  35. mem_reg2 <= ex_reg2;
  36. end else begin
  37. ......
  38. end
  39. end
  40.  
  41. endmodule

下一阶段将改变内存访问。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

自己写CPU第九阶段(5)——实现负载存储指令2(改变运行阶段)的更多相关文章

  1. 自己写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 ...

  2. 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

  3. 自己动手写CPU之第九阶段(4)——载入存储指令实现思路

    将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

  4. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

    将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

  5. 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...

  6. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  7. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

  8. 自己动手写CPU之第六阶段(2)——移动操作指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...

  9. 自己写CPU第四阶段(2)——验证该第一指令ori实现效果

    我们会继续上传新书<自己写CPU>(未公布),今天是12片,四篇 书名又之前的<自己动手写处理器>改为<自己动手写CPU> 4.3 验证OpenMIPS实现效果 4 ...

随机推荐

  1. poj1083 思考题

    http://poj.org/problem?id=1083 Description The famous ACM (Advanced Computer Maker) Company has rent ...

  2. 左右GNU Linux企业加密文件系统 eCryptfs简介

    /*********************************************************************  * Author  : Samson  * Date   ...

  3. java多线程学习(一)

    一.操作系统线程和进程的概念 线程是指进程中的一个运行单元,这个过程中也可调度实体. 线程与进程的差别: (1)地址空间:线程为进程内的一个运行单元.进程至少有一个线程(进程的主线程):进程的全部线程 ...

  4. GridView网格线都设置

    如今,做网上商店的商品陈列,我想用网络格布局,但总认为空好看.所以我想给它一个净加格线.但是,我遇到了一个问题,网络格布局其实很easy,是集GridView布局和背景颜色adapter布局设置背景颜 ...

  5. 第8章 装饰模式(Decorator Pattern)

    原文 第8章 装饰模式(Decorator Pattern) 概述: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. ...

  6. C语言字符串函数大全

    C语言字符串函数大全 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include ...

  7. elasticsearch的rest搜索--- 总述

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 一.针对这次装B 的解释  因为现在又 ...

  8. 前端学习笔记(zepto或jquery)——对li标签的相关操作(五)

    对li标签的相关操作——has与find的差异性 demo代码: <ul> <li><p>1</p></li> <li>2< ...

  9. SQLServer 使用 @@ERROR

    原文:SQLServer 使用 @@ERROR 使用 @@ERROR 如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0:如果此语句产生错误,则 @@ERROR ...

  10. HTML5多图片拖拽上传带进度条

    前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...