RISC |
您所在的位置:网站首页 › riscv单周期处理器 › RISC |
指令和控制器
数据通路在上一篇文章中已经讲解了,接下来就是另一部分:控制器和指令。 1.指令首先说明一下我准备设计的这一款单周期处理器支持的指令: 1.基本R型指令add,sub(加减),sll,srl,sra(移位),and,or,xor(逻辑运算) R型指令:主要就是一些基本的寄存器中数据过ALU的操作,相对容易。 2.基本I型指令和load指令addi,subi(立即数加减),slli,srai,srli(立即数移位),andi,ori,xor(立即数逻辑运算) load指令 基本I型指令:上面的R型改成寄存器与立即数之间操作就行,相对好实现一些。 主要是load指令,访存取数指令,这个相对特殊需要注意。 3.s型存储指令store 只有将数据存储到内存中的指令。 4.jalr指令(jalr实际上是I型)由于这个指令相对一般I型有所不同,单独处理 5.J型指令jal 直接跳转指令 6.B型指令beq,bne,blt,bge 主要是一些条件跳转类指令。 2.控制器控制器实质:解析每条指令,给数据通路基于相应的控制信号,使数据通路可以按照指定的指令流动起来(自己的理解) 首先需要知道数据通路中那些位置都需要控制信号? 首先看RTL图,可以看出输入只有一个,就是指令,输出则是各种控制信号。 上图给出了所需要的控制信号,我会依次讲解的。 1.RegWrite(寄存器写控制信号)大致意思就是这条语句是否向寄存器中写入数据,我们回顾之前RISC-V指令集的知识,可以知道R型,I型,load指令,jal,jalr指令都需要向寄存器写入数值,具体可以看之前博客。 所以这个信号的判断标准就是判断改指令类型是否是上述类型,判断方法也很简单,就是判断每条指令的opcode是否为对应值。 2.ALUSrc(是否有立即数信号)与上面分析方法一致,我们知道在RISC-V中有立即数的指令类型有:I型,s型,load指令。(对于jal,jalr其实也有立即数,但是我们这里不考虑因为它是直接在pc操作) 判断方法与上面一致,判断指令opcode是否为上面对应值 3.MemWrite(是否向内存中写入数据)这个更好判断,我们知道RISC-V中只有S型指令需要向内存中写入数据,因此只用判断指令opcode是否为S型指令。 4.MemtoReg(是否从内存中读取数据)与上面一致,我们知道只有load指令需要读内存,因此,只用判断指令opcode是否为load指令。 5.beq,bne,blt,bge,jal,jalr(指令判断)如果对RISC-V指令结构熟悉的话,相信很好判断的。不做说明了。 6.ALUoperation和ALUop事实上这两个是可以一起理解的。我们可以换位思考,假如我们是数据通路,面对各种类型的R型和I型指令,又该如何识别到底是移位操作还是算术操作那?着实际上就是通过fun3和fun7来控制的。具体如果实现可以参考代码。 代码链接:verilog单周期处理器(目前无流水线)(risc-v)-硬件开发文档类资源-CSDN文库 总结我自己的理解:如果看到这里都没有什么太大的问题,这就说明整体框架已经有了,没有什么大的问题了。接下来就是各个模块的设计和一些优化算法以及如果实现5级流水的细节问题了。接下来我也会写一些重要模块如寄存器堆,桶型移位器,超前进位加法器等等,期待大家的关注。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |