用凡科做的网站要钱吗,开发一款网络游戏需要多少钱,设计彩票网站开发,附近室内装修公司电话【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介
算术逻辑单元#xff08;Arithmetic Logic Unit#xff0c;简称 ALU#xff09;是计算机中…【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介
算术逻辑单元Arithmetic Logic Unit简称 ALU是计算机中央处理器CPU的核心组成部分之一负责执行各种算术和逻辑运算。在本设计中ALU模块具有两个作用一是对所有运算指令操作数的处理二是对跳转指令地址的处理。
2.顶层设计 3.内部结构
ALU模块包含两个加法器分别称之为运算加法器和地址加法器运算加法器在本设计中具有多重用途如下
执行加法运算本设计中包含一个33bit33bit的全加器含最低位进位执行减法运算根据规则减去一个数等于加上这个数的取反再加一执行无符号比较运算根据规则小数减大数需要向高位借位执行有符号比较运算根据规则补码变换为移码后单调性不变再应用3无符号比较运算 考虑到在执行条件跳转指令时既需要ALU执行比较运算也即加法运算同时又需要计算地址偏移一个加法器显然是不夠的因此ALU内部还包含一个20bit20bit的加法器用于地址的运算。此加法器为20bit加法器位宽相对较小不经过其它复用逻辑直接运算可为执行加载存储指令的地址的送出提供一定的时序裕量。 ALU内部包含两个移位电路分别是逻辑左移和逻辑右移。为了节省资源算术右移并没有单独再使用一个移位器而是通过同时调用逻辑左移和逻辑右移来实现。如下图 ALU内部包含一个异或电路用来执行异或指令同时也用于判断两个操作数rs1和rs2是否相等异或逻辑的输出后接了一级和0比较的比较器。如下图 ALU内部包含一个逻辑与电路和一个逻辑或电路用于执行与、或等逻辑指令。考虑到与、或逻辑相对比较简单为了时序上的优化所以CSR相关的指令并没使用ALU。如下图 4.端口说明
序号端口位宽方向说明1idu2alu_op4输入ALU的操作码来自指令译码单元2idu2alu_rs132输入运算的第一操作数来自指令译码单元3idu2alu_rs232输入运算的第二操作数来自指令译码单元4alu2idu_res32输出数值运算的结果送给指令译码单元5alu2idu_cmp1输出比较运算的结果送给指令译码单元6idu2alu_addr120输入地址运算的第一操作数7idu2alu_addr220输入地址运算的第二操作数8idu2alu_addro20输出地址运算的输出结果
5.操作码说明
操作码指令功能数值结果比较结果指令4‘b0000add算术运算加法res rs1 rs2----add, addi, auipc4’b1000sub算术运算减法res rs1 - rs2----sub4’b0001sll逻辑运算左移res rs1 rs2[4:0]----sll, slli4‘b1010slt比较运算有符号小于----cmp rs1 rs2 ? 1’b1 : 1’b0slt, slti4’b0011sltu比较运算无符号小于----cmp rs1 rs2 ? 1’b1 : 1’b0sltu, sltiu4’b0100xor逻辑运算异或res rs1 ^ rs2----xor, xori4’b0101srl逻辑运算逻辑右移res rs1 rs2[4:0]----srl, srli4’b1101sra逻辑运算算术右移res rs1 rs2[4:0]----sra, srai4’b0110or逻辑运算或res rs1 | rs2----or, ori4’b0111and逻辑运算与res rs1 rs2----and, andi4‘b0100beq条件转移相等跳转----cmp rs1 rs2?1’b1:1’b0beq4‘b0100bne条件转移不等跳转----cmp rs1 rs2?1’b1:1’b0bne4’b1010blt条件转移有符号小于跳转----cmp rs1 rs2?1’b1:1’b0blt4’b0011bltu条件转移无符号小于跳转----cmp rs1 rs2?1’b1:1’b0bltu4’b1010bge条件转移有符号大于等于跳转----cmp rs1 rs2?1’b1:1’b0bge4’b0011bgeu条件转移无符号大于等于跳转----cmp rs1 rs2?1’b1:1’b0bgeu
注1操作码的定义基本沿用了指令集中的操作码指令译码器可以直接从指令中提取操作码减少指令译码器的译码逻辑电路。2在执行auipc指令时由于是32位运算且执行此指令时ALU加法器并未工作借用了ALU中运算加法器。6.设计代码
// -------------------------------------------------------------------------------------------------
// Copyright 2024 Kearn Chen, kearn.chenaliyun.com
//
// Licensed under the Apache License, Version 2.0 (the License);
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an AS IS BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
// Description :
// 1. Arithmetic and Logic Unit
// -------------------------------------------------------------------------------------------------module k0a_core_alu (input wire [3:0] idu2alu_op ,input wire [31:0] idu2alu_rs1 ,input wire [31:0] idu2alu_rs2 ,output wire [31:0] alu2idu_res ,output wire alu2idu_cmp ,input wire [19:0] idu2alu_addr1 ,input wire [19:0] idu2alu_addr2 ,output wire [19:0] alu2idu_addro
);wire op_add idu2alu_op[2:0] 3b000;
wire op_sll idu2alu_op[2:0] 3b001;
wire op_slt idu2alu_op[2:0] 3b010;
wire op_sltu idu2alu_op[2:0] 3b011;
wire op_xor idu2alu_op[2:0] 3b100;
wire op_srl idu2alu_op[2:0] 3b101;
wire op_or idu2alu_op[2:0] 3b110;
wire op_and idu2alu_op[2:0] 3b111;wire [31:0] alu_and idu2alu_rs1 idu2alu_rs2;
wire [31:0] alu_or idu2alu_rs1 | idu2alu_rs2;
wire [31:0] alu_xor idu2alu_rs1 ^ idu2alu_rs2;wire [31:0] alu_inv idu2alu_rs2 ^ {32{idu2alu_op[3]}};wire [32:0] alu_in1 {1b0, op_slt ^ idu2alu_rs1[31], idu2alu_rs1[30:0]};
wire [32:0] alu_in2 {idu2alu_op[3], op_slt ^ alu_inv[31], alu_inv[30:0]};wire [32:0] alu_add alu_in1 alu_in2 idu2alu_op[3];wire [31:0] alu_srs idu2alu_op[3] ? {{31{idu2alu_rs1[31]}}, 1b0} : idu2alu_rs1;wire [31:0] alu_sll alu_srs alu_inv[4:0];
wire [31:0] alu_srl idu2alu_rs1 idu2alu_rs2[4:0];
wire [31:0] alu_sra {32{idu2alu_op[3]}} alu_sll | alu_srl;wire alu_zero alu_add[31:0] 32d0;wire alu_slt (op_slt | op_sltu) alu_add[32];assign alu2idu_res {32{op_add}} alu_add[31:0] | {32{op_and}} alu_and |{32{op_xor}} alu_xor | {32{op_or }} alu_or |{32{op_sll}} alu_sll | {32{op_srl}} alu_sra |{31d0, alu_slt};assign alu2idu_cmp op_add alu_zero | alu_slt;assign alu2idu_addro idu2alu_addr1 idu2alu_addr2;endmodule7.总结
本文介绍了RISC-V架构所需的基本算术和逻辑运算的ALU实现。通过不同的操作码可以执行多种运算支持处理器的指令集执行。得益于较为规整的RISCV指令集ALU的op操作码的定义和指令集的定义基本一致避免了指令译码器先译码再编码的过程操作码可直接从指令中提取简化了逻辑优化了时序和面积多功能复用的运算加法器通过一个加法器实现了加法、减法、无符号、有符号比较等多种运算的统一避免了逻辑功能的重复与浪费算术右移逻辑复用同时复用了逻辑左移和逻辑右移避免了再使用一个移位器进一步压缩了面积。