1 jr指令分析

instruction op rs rt rd shamt func
jr 000000 rs 00000 00000 00000 001000

举例:jr $31
功能:PC <- ($31)

这是个跳转指令,将指定寄存器的值,放入PC中,是无条件跳转

我们需要

  1. 更新PC,加一个多路选择器,实现+4PC <- (reg)两种选择
  2. 增加控制信号Jrn,标识jr指令

2 新的数据通路

3 器件修改

  1. 控制器,控制信号输出Jrn标识jr指令
  2. PC,增加输入信号jr和输入数据32位寄存器值

控制信号:

instruction op func ALUop RegWrite Sftmd Jrn
jr 000000 001000 1111 0 0 1

4 代码实现

4.1 PC

增加了输入信号和输入数据,更改了原来的pcNew的名称为pcOrigin,增加了多路选择器。

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/11/12 20:31:59
// Design Name:
// Module Name: pc_1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module pc_1(input clk,input rst_n,// pc datainput [31:0] pcOrigin,  // The PC value is from pcOld.input [31:0] JrPC,   // jr instruction,from reg files.// pc controlinput Jrn,   // jr instruction.output [31:0] pcOld);reg [31:0] pc = 0;
assign pcOld = pc;wire [31:0] pcSelect; // new pc dataassign pcSelect = (Jrn == 0) ? (pcOrigin + 4): JrPC;// Update PC register
always @(posedge clk)
beginif(rst_n == 1) // Xilinx 官方推荐:reset 高电平有效beginpc <= 0;endelsebeginpc <= pcSelect;end
endendmodule

4.2 control

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/11/14 22:30:48
// Design Name:
// Module Name: control_1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module control_1(input [5:0] op,input [5:0] func,output reg RegWrite,output reg Sftmd,    // indicate the instruction is sll/srl/sraoutput reg [3:0] ALUop,output reg Jrn   // jr instruction);always @(*)
beginif(op == 6'b0)begincase (func)6'b100000:  // addbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0000;Jrn <= 0;end6'b100001:  // addubeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0001;Jrn <= 0;end6'b100010:  // subbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0010;Jrn <= 0;end6'b100011:  // sububeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0011;Jrn <= 0;end6'b100100:  // andbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0100;Jrn <= 0;end6'b100101:  // orbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0101;Jrn <= 0;end6'b100110:  // xorbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0110;Jrn <= 0;end6'b100111:  // norbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b0111;Jrn <= 0;end6'b101010:  // sltbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b1000;Jrn <= 0;end6'b101011:  // sltubeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b1001;Jrn <= 0;end6'b000100:  // sllvbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b1010;Jrn <= 0;end6'b000110:  // srlvbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b1011;Jrn <= 0;end6'b000111:  // sravbeginRegWrite <= 1;Sftmd <= 0;ALUop <= 4'b1100;Jrn <= 0;end6'b000000:  // sllbeginRegWrite <= 1;Sftmd <= 1;ALUop <= 4'b1010;Jrn <= 0;end6'b000010:  // srlbeginRegWrite <= 1;Sftmd <= 1;ALUop <= 4'b1011;Jrn <= 0;end6'b000011:  // srabeginRegWrite <= 1;Sftmd <= 1;ALUop <= 4'b1100;Jrn <= 0;end6'b001000:beginRegWrite <= 0;Sftmd <= 0;ALUop <= 4'b1111;Jrn <= 1;enddefault:beginRegWrite <= 0;Sftmd <= 0;ALUop <= 4'b1111;Jrn <= 0;endendcaseendelsebeginRegWrite <= 0;Sftmd <= 0;ALUop <= 4'b1111;Jrn <= 0;end
endendmodule

4.3 datapath

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/11/27 11:41:34
// Design Name:
// Module Name: datapath_1
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 仅仅实现了几个简单的R类指令的最简单的数据通路,不与外界交互
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module datapath_1(input clk,input rst_n,output [31:0] result // 测试syntheses,没有输出的模块是恐怖的);/******** PC ********/// pc_1 Inputs
wire  Jrn;
wire  [31:0]  JrPC;// pc_1 Outputs
wire  [31:0]  pcOld;pc_1  u_pc_1 (.clk                     ( clk     ),.rst_n                   ( rst_n   ),.pcOrigin                ( pcOld   ),.JrPC                    ( JrPC    ),.Jrn                     ( Jrn     ),.pcOld                   ( pcOld   ));/******** Instruction ROM ********/// blk_mem_gen_0 Inputs
// wire  [13:0]  addra  = pcOld[15:2];// blk_mem_gen_0 Outputs // instructions
wire  [31:0]  instruction;blk_mem_gen_0  u_blk_mem_gen_0 (.clka                    ( clk    ),.addra                   ( pcOld[15:2]   ),.douta                   ( instruction   ));/******** Reg Files ********/// reg_files_1 Inputs
wire  [31:0]  ALUresult;/// wire   [4:0]  rA = instruction[25:21];
/// wire   [4:0]  rB = instruction[20:16];
/// wire   [4:0]  rW = instruction[15:11];
/// wire   [31:0]  writeData = ALUresult;
wire   RegWrite;// reg_files_1 Outputs
wire  [31:0]  A;    // rs
wire  [31:0]  B;    // rt
assign JrPC = A;reg_files_1  u_reg_files_1 (.clk                     ( clk         ),.rst_n                   ( rst_n       ),.rA                      ( instruction[25:21]          ),.rB                      ( instruction[20:16]          ),.rW                      ( instruction[15:11]          ),.writeData               ( ALUresult   ),.RegWrite                ( RegWrite    ),.A                       ( A           ),.B                       ( B           ));/******** ALU ********/// ALU_1 Inputs
// wire   [31:0]  A;
// wire   [31:0]  B;
wire   [3:0]  ALUop;
wire   Sftmd;// ALU_1 Outputs
// wire  [31:0]  ALUresult = writeData; // 【不能用!传输方向不对】ALU_1  u_ALU_1 (.A                       ( A           ),.B                       ( B           ),.shamt                   ( instruction[10:6]),.ALUop                   ( ALUop       ),.Sftmd                   ( Sftmd       ),.ALUresult               ( ALUresult   ));/******** controler ********/// control_1 Inputs
// wire   [5:0]  op = instruction[31:26];
// wire   [5:0]  func = instruction[5:0];// control_1 Outputs
// wire  RegWrite
// wire  [3:0]  ALUop;control_1  u_control_1 (.op                      ( instruction[31:26]         ),.func                    ( instruction[5:0]       ),.RegWrite                ( RegWrite   ),.Sftmd                   ( Sftmd      ),.ALUop                   ( ALUop      ),.Jrn                     ( Jrn        ));assign result = ALUresult;endmodule

5 测试

可以观察到跳变了。

nop
add $1,$2,$3    # $1 = 2 + 3 = 5
addu $2,$4,$1   # $2 = 4 + 5 = 9
sub $4,$2,$1    # $4 = 9 - 5 = 4
subu $5,$4,$3   # $5 = 4 - 3 = 1and $6,$7,$8  # $6 = 0111 and 1000 = 0
or $7,$6,$8     # $7 = 0 or 1000 = 8
xor $7,$6,$8    # $7 = 0000 xor 1000 = 1000 = 8
nor $8,$7,$6    # $8 = not (1000 or 0) = 11111111111110111slt $10,$11,$12 # $10 = 11 < 12 = 1        # 应该用负数验证,以后再说
sltu $10,$12,$11    # $10 = 12 > 11 = 0# sllv $12,$5,$13   # $12 = 1101 << 1 = 1101_0 = 1A    【注意此处的倒置问题! sllv rd,rt,rs】
# srlv $12,$5,$13   # $12 = 1101 >> 1 = 110 = 6
# srav $14,$5,$15   # $14 = 1111 >>> 1 = 111  = 7 应该用负数验证,以后再说# 上面3条是错误的!我们应该改的不是使用,而是内部运算逻辑
# 对于使用者来说,逻辑就是 $13 << $5
# 而实际的编码是 rt = $13,rs = $5,这与一般的指令不一样
# 因此,我们在ALU运算中 rt--B,rs--A,应该是 【B << A】,而不是 A >> B。
sllv $12,$13,$5 # $12 = 1101 << 1 = 1101_0 = 1A
srlv $12,$13,$5 # $12 = 1101 >> 1 = 110 = 6
srav $14,$15,$5 # $14 = 1111 >>> 1 = 111  = 7 应该用负数验证,以后再说sll $16,$17,2  # $16 = 1_0001 << 2 = 100_0100 = 44
srl $16,$18,2   # $16 = 1_0010 >> 2 = 0100 = 4
sra $16,$19,2   # 应该用负数验证,以后再说 $16 = 4jr $16    # PC = 4

编码

memory_initialization_radix = 16;
memory_initialization_vector =
00000000,
00430820,
00811021,
00412022,
00832823,
00e83024,
00c83825,
00c83826,
00e64027,
016c502a,
018b502b,
00ad6004,
00ad6006,
00af7007,
00118080,
00128082,
00138083,
02000008;

测试完成。

【计算机系统设计】实践笔记(3)改进数据通路:jr指令分析与实现相关推荐

  1. 高校计算机专业实践教学改革研究,民族高校计算机专业实践教学改革

    <民族高校计算机专业实践教学改革>由会员分享,可在线阅读,更多相关<民族高校计算机专业实践教学改革(5页珍藏版)>请在装配图网上搜索. 1.民族高校计算机专业实践教学改革民族高 ...

  2. 实验五 JR指令设计实验【计算机组成原理】

    实验五 JR指令设计实验[计算机组成原理] 前言 推荐 实验五 JR指令设计实验 一.实验目的 二.实验环境 三.实验原理 四.实验任务 五.实验思考 参考 实验五 代码 修改代码 define IF ...

  3. 【计算机系统设计】实践笔记(3)改进数据通路:移位R型指令分析

    0 回顾 前面的内容中,第一类R型指令分析,我们完成了一类R型指令的设计,完成了其数据通路,构建了相应的部件,并且完成了从ROM中取指,成功进行了基本的功能仿真,进行了综合和实现,但是没有完成综合和实 ...

  4. 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)

    待办事项 时钟频率高,取指周期长,远大于执行周期,如何处理? 不可综合逻辑的处理 接上一篇 [计算机系统设计]实践笔记(2)数据通路构建:第一类R型指令分析(1) 8.2 ALU运算器 `timesc ...

  5. 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)

    0 回顾 上一次实践笔记(0)我们实现了一个最简单的,能够每个上升沿+4的PC. 我们最需要关注的就是器件功能的独立性,避免内外功能混杂,同时一定要注意脑中有电路(RTL级描述的抽象电路而不是实际的门 ...

  6. 【Computer Organization笔记16】大实验任务详细说明:支持指令流水的计算机系统设计与实现

    本次笔记内容: P31 计算机组成原理(31) P32 计算机组成原理(32) 我的计组笔记汇总:计算机组原理成笔记 视频地址:计算机组成原理 清华大学刘卫东 全58讲 国家精品课程 1080P 更完 ...

  7. 计算机组成原理学习笔记第6章中央处理器CPU 6.2——数据通路DataPath

    有诗云:苔花如米小,也学牡丹开.--袁枚 本篇笔记整理:Code_流苏(CSDN) Last(在此处点击使用,直达文末) First (在文末点击使用,返回文章首部) 目录 0.思维导图 1.数据通路 ...

  8. 大学计算机课笔记,浙江大学计算机专业课辅导班笔记

    浙江大学计算机专业课辅导班笔记 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 浙江大学计算机专业课辅导班笔记 计算机组成复习提纲计 ...

  9. 《逻辑与计算机设计基础(原书第5版)》——1.2 计算机系统设计的抽象层次...

    1.2 计算机系统设计的抽象层次 正如莫格里奇(Moggridge是IDEO公司的共同创办人,他设计了世界上第一台笔记本电脑-译者注)所说的那样,设计就是一个理解问题的所有相关限制,并找到能平衡这些限 ...

最新文章

  1. Boost.PolyCollection 性能测试
  2. 正则表达式—leetcode10
  3. orion算法被解密了
  4. SQL常用语句|创建表,设置主键......
  5. java随机生成1到33数组,JAVA 生成随机数数组
  6. IDC、刘润:企业如何通过数字化转型,驱动业务发展?附98页PPT
  7. 原有ui项目调用qml_从0开始写前端UI框架:概述
  8. mac docker mysql_Mac操作系统上使用Docker创建MySQL主从数据库
  9. Java中的Object类的toString()方法,equals()方法
  10. sonar 配置sonarqube分析unity中的C# 代码
  11. 定义blob类型_MySQL 数据类型
  12. 优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作(建议收藏)
  13. 大学计算机课程教学建议,计算机应用基础课程教学的建议
  14. 【开源工程】VirtualDub
  15. python自动化看什么书_python自动化测试书籍
  16. [Vue.js] 一篇超级长的笔记,给《Vue.js 实战》划个重点
  17. C#winform TreeView编程
  18. CTF Web入门 命令执行 笔记
  19. Kaggle课程 — 机器学习进阶 Intermediate Machine Learning
  20. (10.2.3.5)用windows体验sketch--为设计师准备的MAC OS安装指南

热门文章

  1. ASP.NET WebAPi之断点续传下载(上)
  2. IOS开发之Swift学习笔记
  3. C#--序列化与反序列化
  4. 是雏还是鹰mdash;mdash;编程规范之代码注释
  5. ASP.NET Web 服务、企业服务和 .NET Remoting 的性能
  6. 网络验证php接口逆向,一个专利查错的逆向(网络验证)
  7. 山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...
  8. php如何导入数据,““php中如何将execl的数据导入到数据库中
  9. php 后退按钮事件,php – 后退按钮的会话问题
  10. java type 类型,java中的泛型类型与Type接口