基于 RICS

您所在的位置:网站首页 riscv指令对应的代码 基于 RICS

基于 RICS

2023-10-03 10:52| 来源: 网络整理| 查看: 265

文章目录 一、概述二、原理图2.1 ALU2.1.1 ALU 操作控制信号生成部件2.1.2 ALU 逻辑计算部件2.1.3 ALU 整体逻辑 2.2 寄存器2.2.1 Reg 整体逻辑 2.3 存储器2.3.1 Mem 整体逻辑 2.4 多路选择器2.4.1 ALU_Asrc2.4.2 ALU_Bsrc2.4.3 ALU 和 MEM 之间的多路选择器 2.5 PC2.5.1 next_pc 下指令逻辑部件2.5.2 pc_reg 指令寄存器 2.6 取指器2.6.1 取值逻辑部件 2.7 译码器2.7.1 译码逻辑部件 2.8 立即数扩展器2.8.1 立即数扩展逻辑 三、源码地址

一、概述

  整个 CPU 设计使用 Verilog 语言进行开发,使用 Vivado 进行集成开发,开发板为 PYNQ Z2,要实现的九条指令包括:add,slt,sltu,ori,lui,lw,sw,beq,jal ,在这篇博文里会首先对系统中的各个逻辑部件的功能和输入输出进行一个简单的介绍。

  相关文章:基于 RICS-V 架构的单周期处理器设计(含所有格式指令)—— 控制信号选取及代码结构分析

  博客内所有文章均为 原创,所有示意图均为 原创,若转载请附原文链接。

二、原理图 2.1 ALU 2.1.1 ALU 操作控制信号生成部件

alu_ctr

部件功能:将输入的 ALUctr 转化为 SUBctr 和 SIGctr 以及 OPctr 控制信号;SUBctr :控制 ALU 执行加法计算还是减法计算,SUBctr = 1 时做减法,SUBctr = 0 时做加法;SIGctr :控制 ALU 是执行 “带符号整数比较小于置 1” 还是 “无符号整数比较小于置 1” ,当 SIGctr = 1 时执行 “带符号整数比较小于置 1” ,SIGctr = 0 时执行 “无符号整数比较小于置 1” ;OPctr :控制选择哪种运算的结果作为 Result 输出,因为所实现的 9 条指令只涉及加、按位或、操作数 B 选择和小于置 1 这四种运算,所以 OPctr 需要两位; 2.1.2 ALU 逻辑计算部件

alu

部件功能:根据 ALUctr 部件提供的控制信号对输入数据执行不同的算数或逻辑操作;regA_i 和 regB_i :ALU 的 A 端口和 B 端口的数据输入;op_ctr | sig_ctr | sub_ctr :分别对应 ALUctr 提供的 OPctr 、SIGctr 和 SUBctr 控制信号;res_o :输出 ALU 运算结果;zero :零标志,当 res_o = 0 时 zero = 1 否则 zero = 0; 2.1.3 ALU 整体逻辑

alu_top

部件功能 :整个 ALU 的功能即根据外部提供的控制信号和输入的数据执行不同的操作,并将运算后的结果输出;部件输入 :regA_i 和 regB_i 分别对应 ALU 的 A 端口和 B 端口数据输入,alu_ctr 对应 ALU 控制信号(四位);部件输出 :res_o 为 ALU 运算后的结果,zero 为用于判断运算结果是否为零的零标志位; 2.2 寄存器 2.2.1 Reg 整体逻辑

reg_file

部件功能 :寄存器用于 CPU 中数据的暂存;部件输入 :ra rb rw 分别为寄存器 Ra 和 Rb 读取地址以及 Rw 写入地址,bus_w 为需要写入的数据,clk 为系统时钟,reg_wr 为寄存器写使能,rst_n 为置零位;部件输出 :bus_a 和 bus_b 分别为通过输入地址 ra 和 rb 从寄存器中读取的数据; 2.3 存储器 2.3.1 Mem 整体逻辑

data_mem

部件功能 :数据存储器,CPU 可从存储器中读取指定地址处的数据,也可将数据写入到指定地址处;部件输入 :addr 为读取和写入数据的地址,clk 为时钟周期,data_in 是要写入到存储器中的数据,mem_wr 为存储器写使能,rst_n 为置零位;部件输出 :data_out 为根据输入的 addr 地址从存储器中读出的数据; 2.4 多路选择器 2.4.1 ALU_Asrc

alu_asrc

部件功能 :ALU 的 A 端口输入数据的多路选择器,当 alu_asrc = 0 时选择寄存器 A 端口输出数据,当 alu_asrc = 1 时选择 PC ;部件输入 :alu_asrc 为选择信号,bus_a 为寄存器 A 端口输出数据,pc 为程序计数器 pc 中的 pc 数据;部件输出 :bus_ao 为根据 alu_asrc 控制信号选择的输入 ALU A 端口的数据; 2.4.2 ALU_Bsrc

alu_bsrc

部件功能 :ALU 的 B 端口输入数据的多路选择器,当 alu_bsrc = 0 时选择寄存器 B 端口输出数据,当 alu_bsrc = 1 时选择常量值 4 ,当 alu_bsrc = 2 时选择立即数扩展器输出的数据;部件输入 :alu_bsrc 为选择信号,bus_b 为寄存器 B 端口输出数据,imm 为立即数扩展器扩展后输出的数据;部件输出 :bus_bo 为根据 alu_bsrc 控制信号选择的输入 ALU B 端口的数据; 2.4.3 ALU 和 MEM 之间的多路选择器 该多路选择器暂时使用 三目运算 实现;部件功能 :选择写入寄存器的数据,当 mem_to_reg = 0 时选择当前周期 ALU 运算后的结果作为下周期写入寄存器的数据,当 mem_to_reg = 1 时选择数据存储器输出的数据作为下周期写入寄存器的数据;部件输入 :bus_w 为 ALU 运算后的结果,data_out 为数据存储器输出的数据;部件输出 :bus_wo 为下周期写入寄存器的数据; 2.5 PC 2.5.1 next_pc 下指令逻辑部件

next_pc

部件功能 :根据输入的控制信号以及数据计算下一条指令的地址;部件输入 :branch 表示当前指令是否是分支指令,ce 为置零位,imm 为立即数扩展,jump 表示当前指令是否是无条件跳转指令,pc 为当前周期的程序计数器也既当前正在执行的指令的地址,zero 表示 ALU 运算后的结果是否为零;部件输出 :next_pc 为下一条指令的地址; 2.5.2 pc_reg 指令寄存器

pc_reg

部件功能 :根据输入的时钟周期和下指令地址控制整个系统的时钟周期,并在下个周期开始时将当前指令地址更新为前周期的下指令地址;部件输入 :clk 系统的时钟周期,next_pc 为下条指令的地址,rst_n 为置零位;部件输出 :cur_pc 为当前周期需要执行指令的地址; 2.6 取指器 2.6.1 取值逻辑部件

inst_rom

部件功能 :根据输入的地址取出相应的指令后输出;部件输入 :addr 为指令地址,ce 为置零位;部件输出 :inst 为 addr 地址所对应的指令; 2.7 译码器 2.7.1 译码逻辑部件

id

部件功能 :根据输入的指令对指令进行译码并将译码后的控制信号输出;部件输入 :inst_i 为待译码的指令,rst_n 为置零位;部件输出 :指令译码后各部件对应的控制信号; 2.8 立即数扩展器 2.8.1 立即数扩展逻辑

ie

部件功能 :根据 ExtOp 控制信号对输入的指令中的立即数进行扩展;部件输入 :ext_op 为立即数扩展控制信号,instr 为待扩展立即数的指令;部件输出 :imm 为扩展后的立即数; 三、源码地址

   https://github.com/TIYangFan/CPU-Design-Based-on-RISC-V (如果可以帮到你,请帮忙 Star ~)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3