自己动手写CPU_step5_移动指令

移动操作指令

`define EXE_MOVN        6'b001011   //不等于0转移   if rt != 0 then rs -> rd
`define EXE_MOVZ        6'b001010   //等于0转移     if rt == 0 then rs -> rd
`define EXE_MFHI        6'b010000   //  hi -> rd
`define EXE_MFLO        6'b010010   //  lo -> rd
`define EXE_MTHI        6'b010001   //  rs -> hi
`define EXE_MTLO        6'b010011   //  rs -> lo

这些指令都是R型指令,即指令类型由FUNC字段决定,而OP操作码字段全0。

上面的MOVN和MOVZ指令和前篇的R型指令基本一致,只是多了判断条件。

下面的四条指令都涉及HILO寄存器,该寄存器用于保存乘法运算和除法运算的结果。

HILO寄存器实现

//特殊寄存器组,用于存储乘法的高32位和低32位或除法的商和余数
module hilo_reg(input                       clk,input                       rst,//写端口input                       hi_wren_i,input [`RegDataBus]         hi_reg_i,input                       lo_wren_i,input [`RegDataBus]         lo_reg_i,output reg [`RegDataBus]    hi_reg_o,output reg [`RegDataBus]    lo_reg_o);reg [`RegDataBus]   HI;reg [`RegDataBus]   LO;always @ (posedge clk) beginif (rst) beginHI      <=  32'd0;end else if (hi_wren_i) beginHI     <=   hi_reg_i;end else beginHI      <=  HI;endendalways @ (posedge clk) beginif (rst) beginLO      <=  32'd0;end else if (lo_wren_i) beginLO      <=   lo_reg_i;end else beginLO      <=  LO;endendalways @ (*) beginif (rst) beginhi_reg_o    <=  32'd0;end else if (hi_wren_i) beginhi_reg_o    <=  hi_reg_i;end else beginhi_reg_o    <=  32'd0;endendalways @ (*) beginif (rst) beginlo_reg_o    <=  32'd0;end else if (lo_wren_i) beginlo_reg_o    <=  lo_reg_i;end else beginlo_reg_o    <=  32'd0;endendendmodule

该模块的输入与MEM_WB模块相连,输出接到EX模块。


数据相关问题

新加入的指令可能产生数据冲突:

mthi        reg1 => hi        IF        ID        EX        MEM        WB

mthi        reg2 => hi                   IF         ID         EX            MEM        WB

mthi        reg3 => hi                                IF         ID             EX            MEM        WB

mfhi        hi     => rd                                             IF             ID             EX            MEM     WB  如果安正常的执行顺序,mfhi指令的EX阶段使用的hi寄存器值是第一条指令的结果,但是,这和我们实际需要的结果不同,我们需要的hi寄存器值应该是上一条指令产生的结果。所以,这里存在数据冲突,其实和之前译码部分的冲突是一个道理,这里我们也还是使用旁路技术解决这个冲突。即如果需要HILO寄存器的值,先判断有没有MEM阶段来的值,再判断有没有WB阶段来的值,如果都没有的话就是正常获取HILO寄存器的值,也即没有冲突。


EX阶段实现

//执行阶段,根据译码阶段得到的操作码和操作数进行运算,得到结果
module ex(input                       rst,input [`AluOpBus]           aluop,input [`RegDataBus]         reg1,input [`RegDataBus]         reg2,input                       reg_wb_i,input [`RegAddrBus]         reg_wb_addr_i,output reg                  reg_wb_o,output reg [`RegAddrBus]    reg_wb_addr_o,output reg [`RegDataBus]    reg_wb_data,    //写回数据到目的寄存器//HILO寄存器input [`RegDataBus]         hi_reg_i,       //读取HI寄存器数据input [`RegDataBus]         lo_reg_i,       //读取LO寄存器数据output reg [`RegDataBus]    hi_reg_o,       //写入HI寄存器数据output reg [`RegDataBus]    lo_reg_o,       //写入LO寄存器数据output reg                  hi_wren,        //HI寄存器写使能        output reg                  lo_wren,        //LO寄存器写使能        //  HILO寄存器旁路                          input [`RegDataBus]         wb_hi_i,input [`RegDataBus]         wb_lo_i,input                       wb_hi_wren_i,  //有指令写HI,从写回阶段给出旁路(隔一条指令)input                       wb_lo_wren_i,  //有指令写LO,从写回阶段给出旁路(隔一条指令)input [`RegDataBus]         mem_hi_i,input [`RegDataBus]         mem_lo_i,input                       mem_hi_wren_i,  //有指令写HI,从访存阶段给出旁路(上一条指令)input                       mem_lo_wren_i  //有指令写LO,从访存阶段给出旁路(上一条指令));always @ (*) beginif (rst) beginreg_wb_o        <= 1'd0;reg_wb_addr_o   <= 5'd0;reg_wb_data     <= 32'd0;hi_reg_o        <= 32'd0;lo_reg_o        <= 32'd0;hi_wren         <= 1'b0;lo_wren         <= 1'b0;end else beginreg_wb_o        <= reg_wb_i;reg_wb_addr_o   <= reg_wb_addr_i;reg_wb_data     <= 32'd0;hi_wren         <= 1'b0;lo_wren         <= 1'b0;hi_reg_o        <= 32'd0;lo_reg_o        <= 32'd0;case (aluop) `EXE_ORI_OP,`EXE_OR_FUNC:       beginreg_wb_data      <=  reg1 | reg2;end`EXE_ANDI_OP,`EXE_AND_FUNC:     beginreg_wb_data     <=  reg1 & reg2;end`EXE_XORI_OP,`EXE_XOR_FUNC:     beginreg_wb_data     <=  reg1 ^ reg2;end`EXE_LUI_OP:                    beginreg_wb_data     <=  {reg2[15:0],reg2[31:16]};end`EXE_NOR_FUNC:                  beginreg_wb_data     <=  ~(reg1 | reg2);end`EXE_SLL_FUNC,`EXE_SLLV_FUNC:   beginreg_wb_data     <=  reg2 << reg1[4:0];end`EXE_SRL_FUNC,`EXE_SRLV_FUNC:   beginreg_wb_data     <=  reg2 >> reg1[4:0];end`EXE_SRA_FUNC,`EXE_SRAV_FUNC:   begin       //算术移位也可以直接使用>>>reg_wb_data     <=  ({32{reg2[31]}} << (6'd32 - {1'b0,reg1[4:0]})) | reg2 >> reg1[4:0];end`EXE_MOVN_FUNC,`EXE_MOVZ_FUNC:  beginreg_wb_data     <=  reg1;end`EXE_MFHI_FUNC:                 beginif (mem_hi_wren_i) begin            //访存阶段数据旁路reg_wb_data     <=  mem_hi_i;end else if (wb_hi_wren_i) begin    //写回阶段数据旁路reg_wb_data     <=  wb_hi_i;end else beginreg_wb_data     <=  hi_reg_i;   //正常读取HI寄存器endend`EXE_MFLO_FUNC:                 beginif (mem_lo_wren_i) begin            //旁路reg_wb_data     <=  mem_lo_i;end else if (wb_lo_wren_i) begin    //旁路reg_wb_data     <=  wb_lo_i;end else begin                      //正常读取LO寄存器reg_wb_data     <=  lo_reg_i;endend`EXE_MTHI_FUNC:                 beginhi_wren         <=  1'b1;hi_reg_o        <=  reg1;lo_reg_o        <=  lo_reg_i;end`EXE_MTLO_FUNC:                 beginlo_wren         <=  1'b1;lo_reg_o        <=  reg1;hi_reg_o        <=  hi_reg_i;enddefault:                        beginreg_wb_o        <= 1'd0;reg_wb_addr_o   <= 5'd0;reg_wb_data     <= 32'd0;hi_reg_o        <= 32'd0;lo_reg_o        <= 32'd0;hi_wren         <= 1'b0;lo_wren         <= 1'b0;endendcaseendendendmodule

模块修改

在EX_MEM、MEM、MEM_WB模块中添加由对应的HILO寄存器的值和写使能信号传导至HILO寄存器。最后修改顶层模块,将MEM阶段、WB阶段以及HILO寄存器的输出值都连接到EX的输入即可。


仿真结果

本次仿真使用了16条指令:

3c010000:LUI        将立即数低位扩展至reg1        reg1:00000000

3c02ffff:    LUI        将立即数低位扩展至reg2        reg2:ffff0000
3c030505:LUI        将立即数低位扩展至reg3        reg3:05050000
3c040000:LUI        将立即数低位扩展至reg4        reg4:00000000
0041200a:MOVZ   if (reg1==0) reg4 = reg2          reg4:ffff0000
0061200b:MOVN   if (reg1!=0) reg4 = reg3          reg4:ffff0000
0062200b:MOVN   if (reg2!=0) reg4 = reg3           reg4:05050000
0043200a:MOVZ   if (reg3!=0) reg4 = reg2           reg4:05050000
00000011:MTHI     reg0(全0) => hi                        hi:00000000
00400011:MTHI     reg2         => hi                        hi:ffff0000
00600011:MTHI     reg3         => hi                        hi:05050000
00002010:MFHI     hi             => reg4                    reg4:05050000
00600013:MTLO    reg3        => lo                        lo:05050000
00400013:MTLO    reg2        => lo                        lo:ffff0000
00200013:MTLO    reg1        => lo                        lo:00000000
00002012:MFLO    lo            => reg4                    reg4:00000000

上述指令可以测试是否消除数据相关。

仿真结果可知,所有指令的运行结果都与预期的一致。

验证了CPU设计的正确性。

下一步计划实现算数运算指令!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523574.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库

828华为云征文&#xff5c;华为云Flexus X实例docker部署harbor镜像仓库 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定不要错…

使用豆包 MarsCode 编程助手,兑换 4090 显卡!

关于豆包 MarsCode 编程助手 豆包 MarsCode 编程助手是一个智能化的编程工具&#xff0c;通过与 AI 的对话&#xff0c;用户可以轻松获取编程建议、解决问题并提高编程效率。无论您是编程新手还是经验丰富的开发者&#xff0c;MarsCode 都能为您提供极具价值的帮助。 点击直达…

查询电脑上已经连接的wifi密码

首先在电脑屏幕的右下角找到自己的wifi图标&#xff0c;右键wifi的图标&#xff0c;点击打开“网络和Internet设置” 进入设置后左侧先点击WLAN&#xff0c;然后在右侧找到并点击网络和共享中心 在网络和共享中心中点击连接后面&#xff0c;WLAN的名称 在WLAN状态中点击无线…

【ruoyi框架】开箱即用的管理系统框架

目录 1.简介 2.快速开始 2.1.仓库 2.2.环境初始化 3.使用介绍 3.1.权限与组件 3.2.开发与测试 1.简介 管理系统是当前软件市场上最常见的软件&#xff0c;管理系统在功能和界面上都有大量通用的点。 功能上通用的点包括但不限于&#xff1a; 角色、权限管理菜单管理鉴…

六西格玛项目:从定义问题到控制成果,全程无忧——张驰咨询

什么是六西格玛项目 六西格玛项目是一种旨在通过改善企业质量流程管理&#xff0c;以“零缺陷”的完美商业追求&#xff0c;带动质量大幅提高、成本大幅度降低&#xff0c;最终实现企业财务成效的提升与企业竞争力的突破的管理策略。它由摩托罗拉公司的工程师比尔史密斯于1986…

【学习AI-相关路程-工具使用-自我学习-jetson收集数据-图片采集-训练前准备-基础样例 (5)】

【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-图片识别-使用模型检测图片-基础样例 &#xff08;5&#xff09;】 1 -前言2 -环境说明3 -先行了解&#xff08;1&#xff09;整理流程了解&#xff08;2&#xff09;了解模型-MobileNet1、MobileNetV2 的主要特性&am…

idea一键自动化部署项目

文章目录 前言一、 IDEA插件安装1. 首先下载 Alibaba Cloud Toolkit 插件2. 插件下载完成后重启IDEA 二、SpringBoot项目准备1. pom.xml 文件2. controller3. 启动类 三、SpringBoot项目jar包部署1. Alibaba Cloud Toolkit 插件服务器配置2. 主机 IP、用户名、密码 点击测试链接…

51单片机.之i2c读写eproom

1、i2c读写eeproom 通过uart发送数据&#xff0c;单片机接收数据后&#xff0c;显示到lcd&#xff0c;并写到eeprom保存。每次开机时&#xff0c;读取eeprom保存的数据&#xff0c;显示到 lcd。 程序框架 1、i2c驱动时序 2、uart中断收发数据 3、eeprom读写驱动 4、lcd驱动 5…

动手学深度学习(pytorch)学习记录19-参数管理[学习记录]

文章目录 参数访问目标参数一次性访问所有参数从嵌套块收集参数 参数初始化内置初始化自定义初始化 参数绑定延后初始化 本节内容&#xff1a; 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b; 参数初始化&#xff1b; 在不同模型组件间共享参数&#xff1b; 延后初始…

第二证券:大牛股突发,停牌不超3天,此前22个涨停!

*ST富润晚间公告称&#xff0c;公司股票8月2日至9月3日已累计18个交易日涨停&#xff0c;股价涨幅为100.89%&#xff0c;股价不坚定较大&#xff0c;投资者较为重视。为保护投资者利益&#xff0c;公司姑息股票交易状况进行核对。经申请&#xff0c;公司股票自2024年9月4日开市…

给大模型加上“记忆”,深入探索 Mem0 项目

背景介绍 在之前的软件应用中&#xff0c;我们总会在应用中保留大量的用户历史操作记录&#xff0c;方便用户下次使用时可以快速查看和复用&#xff0c;甚至基于这些用户记录可以为用户提供个性化的服务。而这些记录往往都保存在传统的结构化或非结构化数据库中。 在大模型的…

JAVA毕业设计168—基于Java+Springboot+vue3的高校就业管理系统(源代码+数据库+14000字论文+开题+PPT)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的高校就业管理系统(源代码数据库14000字论文开题PPT)169 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、企业、管理员三种角色 …

shopify独立站分别有哪几类?难点在哪?

对于刚开独立站的业内人士来说&#xff0c;今天的文章将向您介绍Shopify店铺的类型以及运营店铺的难点。这使您可以更好地计划销售哪些产品以及如何运营。 ✅Shopify 类型 综合商店&#xff1a;又称全能商店 这种类型通常采用直销模式。卖家不需要提供自己的产品。您可以选择…

git 配置、下载、提交、更新、冲突解决学习

目录 一. 安装教程 二. git配置 1. 查看git配置参数 2. 设置邮箱和用户名 3. SSH配置 4. 配置git远程库公钥 5. 编码设置 三. git 提交流程 1. 整体操作流程图 2. Git仓库包含5个区域 3. 下载、提交、更新命令 3.1. 下载 3.2. 提交 3.3. 更新&#xff08;两种方式…

前端框架有哪些?

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

游戏应用|空地模型实景融合,还原《黑神话:悟空》游戏场景

古色斑驳&#xff0c;巍峨险峻&#xff0c;是历史的低语&#xff0c;诉说着千百年的沧桑与辉煌&#xff1b;飞檐翘角&#xff0c;雕梁画栋&#xff0c;凝聚着时代的文明与智慧。在数字化浪潮下&#xff0c;我们利用实景三维技术&#xff0c;翻开了中华古建筑这本伟大的史诗。 P…

基于物联网的低成本便携式传感器节点用于火灾和空气污染的检测与报警

目录 摘要 引言 材料和方法 传感器节点 IoT 微控制器 颗粒物传感器 环境和气体传感器 MQTT代理 Node-Red监控平台 系统结构 数据存储 工作描述 实验结果 讨论 结论 致谢 参考文献 这篇论文的标题是《Low-cost IoT-based Portable Sensor Node for Fire and Air…

【算法每日一练及解题思路】计算以空格隔开的字符串的最后一个单词的长度

【算法每日一练及解题思路】计算以空格隔开的字符串的最后一个单词的长度 一、题目&#xff1a;计算以空格隔开的字符串的最后一个单词的长度 二、举例&#xff1a; 输入&#xff1a;hello nowcoder 输出&#xff1a;8 说明&#xff1a;最后一个单词为nowcoder&#xff0c;长…

【超详细】Linux开发环境搭建指南 | Ubuntu

文章目录 虚拟机安装对比Virtual Box 下载ubuntu 操作系统下载Virtual Box 安装安装ubuntu设置中文语言共享文件夹设置添加输入法安装步骤&#xff0c;参考官方教程 安装 vscode解决主机不能通过ssh连接宿主机网络连接几种网络连接区别主机和宿主机相互 ping通 网络代理 虚拟机…

AI 网关基于 IP 地理位置,增强 Prompt 修饰能力

作者&#xff1a;沈鑫糠&#xff0c;来自昆仑数智瑞道云团队&#xff0c;专注于云原生领域产品研发和相关技术。 前言 什么是 Prompt Engineering 提示词工程&#xff08;Prompt Engineering&#xff09;&#xff0c;也被称为上下文提示&#xff08;In-Context Prompting&am…