【计算机系统设计】实践笔记(3)改进数据通路:jr指令分析与实现
1 jr指令分析
instruction | op | rs | rt | rd | shamt | func |
---|---|---|---|---|---|---|
jr | 000000 | rs | 00000 | 00000 | 00000 | 001000 |
举例:jr $31
功能:PC <- ($31)
这是个跳转指令,将指定寄存器的值,放入PC中,是无条件跳转。
我们需要
- 更新PC,加一个多路选择器,实现
+4
和PC <- (reg)
两种选择 - 增加控制信号
Jrn
,标识jr
指令
2 新的数据通路
3 器件修改
- 控制器,控制信号输出
Jrn
标识jr
指令 - 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指令分析与实现相关推荐
- 高校计算机专业实践教学改革研究,民族高校计算机专业实践教学改革
<民族高校计算机专业实践教学改革>由会员分享,可在线阅读,更多相关<民族高校计算机专业实践教学改革(5页珍藏版)>请在装配图网上搜索. 1.民族高校计算机专业实践教学改革民族高 ...
- 实验五 JR指令设计实验【计算机组成原理】
实验五 JR指令设计实验[计算机组成原理] 前言 推荐 实验五 JR指令设计实验 一.实验目的 二.实验环境 三.实验原理 四.实验任务 五.实验思考 参考 实验五 代码 修改代码 define IF ...
- 【计算机系统设计】实践笔记(3)改进数据通路:移位R型指令分析
0 回顾 前面的内容中,第一类R型指令分析,我们完成了一类R型指令的设计,完成了其数据通路,构建了相应的部件,并且完成了从ROM中取指,成功进行了基本的功能仿真,进行了综合和实现,但是没有完成综合和实 ...
- 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)
待办事项 时钟频率高,取指周期长,远大于执行周期,如何处理? 不可综合逻辑的处理 接上一篇 [计算机系统设计]实践笔记(2)数据通路构建:第一类R型指令分析(1) 8.2 ALU运算器 `timesc ...
- 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)
0 回顾 上一次实践笔记(0)我们实现了一个最简单的,能够每个上升沿+4的PC. 我们最需要关注的就是器件功能的独立性,避免内外功能混杂,同时一定要注意脑中有电路(RTL级描述的抽象电路而不是实际的门 ...
- 【Computer Organization笔记16】大实验任务详细说明:支持指令流水的计算机系统设计与实现
本次笔记内容: P31 计算机组成原理(31) P32 计算机组成原理(32) 我的计组笔记汇总:计算机组原理成笔记 视频地址:计算机组成原理 清华大学刘卫东 全58讲 国家精品课程 1080P 更完 ...
- 计算机组成原理学习笔记第6章中央处理器CPU 6.2——数据通路DataPath
有诗云:苔花如米小,也学牡丹开.--袁枚 本篇笔记整理:Code_流苏(CSDN) Last(在此处点击使用,直达文末) First (在文末点击使用,返回文章首部) 目录 0.思维导图 1.数据通路 ...
- 大学计算机课笔记,浙江大学计算机专业课辅导班笔记
浙江大学计算机专业课辅导班笔记 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 浙江大学计算机专业课辅导班笔记 计算机组成复习提纲计 ...
- 《逻辑与计算机设计基础(原书第5版)》——1.2 计算机系统设计的抽象层次...
1.2 计算机系统设计的抽象层次 正如莫格里奇(Moggridge是IDEO公司的共同创办人,他设计了世界上第一台笔记本电脑-译者注)所说的那样,设计就是一个理解问题的所有相关限制,并找到能平衡这些限 ...
最新文章
- Boost.PolyCollection 性能测试
- 正则表达式—leetcode10
- orion算法被解密了
- SQL常用语句|创建表,设置主键......
- java随机生成1到33数组,JAVA 生成随机数数组
- IDC、刘润:企业如何通过数字化转型,驱动业务发展?附98页PPT
- 原有ui项目调用qml_从0开始写前端UI框架:概述
- mac docker mysql_Mac操作系统上使用Docker创建MySQL主从数据库
- Java中的Object类的toString()方法,equals()方法
- sonar 配置sonarqube分析unity中的C# 代码
- 定义blob类型_MySQL 数据类型
- 优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作(建议收藏)
- 大学计算机课程教学建议,计算机应用基础课程教学的建议
- 【开源工程】VirtualDub
- python自动化看什么书_python自动化测试书籍
- [Vue.js] 一篇超级长的笔记,给《Vue.js 实战》划个重点
- C#winform TreeView编程
- CTF Web入门 命令执行 笔记
- Kaggle课程 — 机器学习进阶 Intermediate Machine Learning
- (10.2.3.5)用windows体验sketch--为设计师准备的MAC OS安装指南
热门文章
- ASP.NET WebAPi之断点续传下载(上)
- IOS开发之Swift学习笔记
- C#--序列化与反序列化
- 是雏还是鹰mdash;mdash;编程规范之代码注释
- ASP.NET Web 服务、企业服务和 .NET Remoting 的性能
- 网络验证php接口逆向,一个专利查错的逆向(网络验证)
- 山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...
- php如何导入数据,““php中如何将execl的数据导入到数据库中
- php 后退按钮事件,php – 后退按钮的会话问题
- java type 类型,java中的泛型类型与Type接口