当前位置: 首页 > news >正文

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。

💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 2017.4以上版本软件的PC机。

💎本章所采用的指令为LoongArch之LA32R版


Ⅰ前置知识

0x00 立即数扩展模块Ext

立即数扩展模块(Ext)是一种在计算机体系结构中使用的技术,用于增加处理器的能力以支持更大范围的立即数操作。

立即数是指直接出现在指令中的常数值,例如在一个加法指令中,可以直接将两个寄存器的值相加,也可以将其中一个寄存器的值与一个立即数相加。立即数扩展模块的目的是为了扩展处理器对立即数的支持范围。

通常情况下,计算机体系结构规定了立即数的位数和取值范围。例如,一个处理器可能只支持8位的立即数,并且只能表示-128到127之间的值。这限制了在指令中可以使用的立即数的范围,可能导致无法执行某些需要更大范围立即数的操作。

立即数扩展模块通过增加额外的硬件逻辑来解决这个问题。它可以扩展处理器对立即数的位数,使得更大范围的立即数可以被支持。例如,它可以增加立即数的位数从8位扩展到16位,从而允许表示更大的值。

通过使用立即数扩展模块,处理器可以更灵活地处理更大范围的立即数操作,从而增加了指令集的功能和灵活性。这对于一些需要处理大范围立即数的应用程序非常有益。

本章介绍的立即数扩展模块的参考电路框图如下:

 该模块的功能及引脚信号说明如下:

信号名称功能说明
Datain32位的数据输入信号
Extop扩展方式选择信号
Dataout32位的数据输出信号

该模块的参考电路结构如下图所示:

0x01 32位算术逻辑运算单元(ALU)

ALU,全称为算术逻辑单元(Arithmetic Logic Unit),是计算机中一个非常重要的组件。ALU负责执行各种算术和逻辑运算,这些运算包括加法、减法、乘法、除法以及与、或、非等逻辑操作。

ALU通常是CPU中的一个核心部分,它接收输入的数据并根据指令执行相应的运算。在执行算术运算时,ALU会将两个输入值进行相应的操作,然后将结果输出。例如,当执行加法操作时,ALU会将两个输入的数值相加,并将结果返回。

除了算术运算,ALU还能执行逻辑运算。逻辑运算是基于布尔代数的操作,常见的有与、或、非等操作。通过逻辑运算,可以对输入的数据进行比特级别的操作和判断。

ALU的设计可以根据不同的需求进行优化。一些ALU还可能支持浮点运算、位移操作、条件判断等功能。因此,ALU的具体实现方式可能会有所不同,但其核心目标始终是执行各种算术和逻辑运算。

32位算术逻辑运算单元模块的参考电路框图如下:

 该模块的功能及引脚信号说明如下:

信号名称

功能说明

a, b

两个32位的数据输入

op

运算类型选择输入

AddResult

运算结果输出

Zero

0标志位输出。运算结果AddResult为0时,Zero=1;否则Zero=0

Ⅱ. Verilog实现 

0x00 立即数扩展模块Ext

本章所设计的立即数扩展模块实现下表所示的4种方式的立即数扩展与拼接操作,以得到一个新的32位数。

Extop

功能

说明

0

Dataout←SignExtend(DataIn[21:10])

把DataIn[21:10]进行符号位扩展

1

Dataout←SignExtend(DataIn[25:10] || 2’b0)

把DataIn[25:10]低位补2bit0后,进行符号位扩展

2

Dataout←DataIn[24:5] || 12’b0

把DataIn[24:5]低位补12bit0

3

Dataout←SignExtend(DataIn[9:0] || DataIn[25:10] || 2’b0)

把DataIn[9:0]和 DataIn[25:10] 进行拼接,然后低位补2个0,再进行符号位扩展

设计代码:

module Ext (input [31:0] DataIn,input [1:0] Extop,output reg [31:0] Dataout
);always @(*) begincase (Extop)2'b00: Dataout = {{20{DataIn[21]}}, DataIn[21:10]};2'b01: Dataout = {{14{DataIn[25]}} , {DataIn[25:10], 2'b0}}  ;2'b10: Dataout = {DataIn[24:5], 12'b0};2'b11: Dataout = {{4{DataIn[25]}}, DataIn[9:0] , {DataIn[25:10] , 2'b0}};default: Dataout = 0;endcase
endendmodule

  在Vivado中点击”RTL ANALYSIS->Open Elaborated Design”,可以查看综合得到的逻辑电路,如图所示:

仿真代码:

module simExt(   );reg [31:0]Datain;reg[1:0]ExtOp;wire [31:0]Dataout;Ext uu(Datain,ExtOp,Dataout);//   initial begin
//    Datain=32'b0010_1111_0000_1010_0101_1111_1010_0001;#40;
//   endinitial beginExtOp=0;Datain=32'b000000_1010_000000000111_00000_00001;#100;//12位立即数addi.w $r1,$r0,7 //r2<--(+7)ExtOp=0;Datain=32'b000000_1010_111111111001_00000_00010;#100;//12位立即数addi.w $r2,$r0,-7 //r2<--(-7)ExtOp=1;Datain=32'b010110_1111111111111111_00001_00010;#100;//16位立即数beq $r1,$r2,-1//pc<--pc-4ExtOp=1;Datain=32'b011000_0000000000000001_00001_00010;#100;//16位立即数blt $r1,$r2,1//pc<--pc+4ExtOp=2;Datain=32'b0001010_00000000000000000001_00011;#100;//20位立即数lui12 $r3,1 //r3<--4094ExtOp=3;Datain=32'b010100_0000000000000010_0000000000;#100;//26位立即数b //pc<--pc+8ExtOp=3;Datain=32'b010100_1111111111111110_1111111111;#100;//26位立即数b //pc<--pc-8end
endmodule

测试结果:

🚩 注:

如果按照vivado默认的进制,得到的波形图不方便观察:

 所以我们可以在Radix中调整为有符号的十进制,方法如下图:

 0x01 32位算术逻辑运算单元(ALU)

本章设计的32位算术逻辑运算单元(ALU)具有以下功能:

要求ALU带“0状态”位Zero输出。即:当运算结果为0时,Zero=1;否则,Zero=0。

功能编号

功能

说明

0

AddResult =a+b

加法

1

AddResult =a-b

减法

2

AddResult =a⋀b

3

AddResult =a⋁b

4

AddResult =

或非

5

a<b时AddResult =1

A和B是带符号数,进行带符号数比较

6

a<b时AddResult =1

A和B是无符号数,进行无符号数比较

7

AddResult =b

直通

设计代码:

module alu (input [31:0] a, b,input [2:0] op,output reg zero,output reg [31:0] result
);always @(*) begincase (op)3'b000: result = a + b; // Add3'b001: result = a - b; // Subtract3'b010: result = a & b; // Bitwise AND3'b011: result = a | b; // Bitwise OR3'b100: result = ~(a | b); // Bitwise NOR//3'b101: result = (a < b) ? 32'h00000001 : 32'h00000000; // Signed comparison3'b101:beginif(a[31] > b[31])result = 1;else if(a[31] < b[31])result = 0;elseif(a[31] == 0)if(a[30:0] < b[30:0])result = 1;elseresult = 0;elseif(a[30:0] > b[30:0])result = 1;elseresult = 0;end3'b110:beginif(a < b)result = 1;elseresult = 0;endendcase
end
// Set zero flag
always @(result) beginzero = (result == 32'h00000000) ? 1'b1 : 1'b0;
endendmodule

  在Vivado中点击”RTL ANALYSIS->Open Elaborated Design”,可以查看综合得到的逻辑电路,如图所示: 

仿真代码:

module sim_aluLA32(   );reg [31:0] a,b;reg [2:0] op;wire [31:0] result;wire zero;//aluLA32 u1(a,b,op,result,zero);//aluLA32 u2(.a(a),.b(b),.op(op),.AddResult(AddResult),.Zero(Zero));alu dut (.a(a), .b(b), .op(op), .zero(zero), .result(result));always begina = 80;b = 95;op = 0; #100;op = 1; #100;a = -100;b =-95;op = 5; #100;op = 6; #100;a = 32'h12345678; b = 32'h0000ffff;op = 2; #100;op = 3; #100;op = 7; #100;endinitial beginend
endmodule

仿真结果:

 🚩注:

在编写有符号数和无符号数时,要注意不同:

 END


📝 因为作者的能力有限,所以文章可能会存在一些错误和不准确之处,恳请大家指出!

相关文章:

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 201…...

Python实现数据结构的基础操作

目录 一、列表&#xff08;List&#xff09; 二、字典&#xff08;Dictionary&#xff09; 三、集合&#xff08;Set&#xff09; 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念&#xff0c;它用于存储和组织数据以便有效地进行操作。Python作为一种…...

20230624----重返学习-vue-响应式处理思路-仿源码

day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架&#xff0c;就是把一套全面的框架设计体系&#xff0c;拆分成为多个框架&#xff0c;项目中需要用到那些需求&#xff0c;再导入对应的框架&#xff0c;以此来保证…...

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…...

【C++】通讯录的基本实现,附有源码分享

目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …...

UI 自动化测试 —— selenium的简单介绍和使用

selenium 是 web 应用中基于 UI 的自动化测试框架&#xff0c;支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试&#xff1f; 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...

mybatisPlus中apply的使用以进行联表等复杂sql语句

在 MyBatis-Plus 中&#xff0c;apply() 方法可以用于添加任意的 SQL 片段&#xff0c;包括联表查询。因此&#xff0c;你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段&#xff0c;而不受 MyBatis-Plu…...

自学Python技术的方法

目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言&#xff0c;被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建&#xff0c;并且其简洁、易读的语法以及丰富的标…...

python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串

前言 Python网络爬虫是利用Python编写的程序&#xff0c;通过自动化地访问网页、解析html或json数据&#xff0c;并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法&#xff1a; 变量和数据类型&#xff1a;学习如何声明变量以及…...

linux mail -s发送邮件异常解决

异常&#xff1a; Error initializing NSS: Unknown error -8015. "/root/dead.letter" 11/301 . . . message not sent. 出现此问题&#xff0c;大概率是和证书相关。如果没有安装证书&#xff0c;请先安装&#xff1a; 1&#xff0c;下载 yum -y install mailx …...

Netty核心技术七--Google Protobuf

1.编码和解码的基本介绍 编写网络应用程序时&#xff0c;因为数据在网络中传输的都是二进制字节码数据&#xff0c;在发送数据时就需要编码&#xff0c;接收数据时就需要解码 codec(编解码器) 的组成部分有两个&#xff1a;decoder(解码器)和encoder(编码器)。encoder 负责把…...

【Docker】Docker常用命令总结

文章目录 一、帮助命令二、镜像命令三、容器命令四、常用的其他命令 在开发过程中&#xff0c;经常涉及到 docker 的相关操作&#xff0c;本文对常用的指令进行汇总。 一、帮助命令 docker version # 显示docker版本信息 docker info # 显示docker系统信息&#xff…...

React 对比class与Effect Hook优化响应式数据更新监听,感受useEffect真正的强大

还是之前写过的一个组件 import React from "react"export default class index extends React.Component{constructor(props){super(props);this.state {name: "小猫猫"}}componentDidMount ()>{document.title this.state.name;}componentDidUpda…...

AWS Lambda 介绍

计算服务的演进 EC2------Container-------Lambda 虚拟机---容器--------------serverless无服务器架构 什么是AWS Lambda&#xff1f; AWS lambda的核心是事件驱动&#xff0c;驱动可能来自&#xff0c;Alexa,SNS&#xff0c;DynamoDB&#xff0c;S3&#xff0c;Kinesis等&…...

linux之权限管理

目录 1.一.基本小语句 2.文件权限操作chmod 1.一.基本小语句 ls - a 查看此文件夹所有和隐藏内容 ls - l 查看此文件夹权限 chown 改变文所有者 2.文件权限操作chmod chmod 参数 文件名 文件的权限主要针对三类对象进行定义   owner 属主, u:针对前三个部分的权限修改   …...

【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

上一节课&#xff0c;我们主要介绍了策略模式的原理和实现&#xff0c;以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天&#xff0c;我们结合“给文件排序”这样一个具体的例子&#xff0c;来详细讲一讲策略模式的设计意图和应用场景。 除此之外&…...

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢&#xff1f;下面我们看一下样例&#xff1a; int div() {int a, b;cin >&g…...

数据结构练习题1:基本概念

练习题1&#xff1a;基本概念 1 抽象数据类型概念分析2. 逻辑结构与存储结构概念分析3.综合选择题4.综合判断题5.时间复杂度相关习题6 时间复杂度计算方法&#xff08;一、二、三层循环&#xff09; 1 抽象数据类型概念分析 1.可以用&#xff08;抽象数据类型&#xff09;定义…...

如何消除Msxml2.XMLHTTP组件的缓存

之前使用这个组件&#xff0c;是每隔十分钟取数据&#xff0c;没有遇到这个缓存问题&#xff0c; 这次使用它是频繁访问接口&#xff0c;就出现了一直不变的问题。觉得是缓存没有清除的问题。 网上搜了一些方案。最好的方案就是给url地址末尾给一个随机参数。用于让组件觉得是…...

深入理解Java虚拟机jvm-运行时数据区域(基于OpenJDK12)

运行时数据区域 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...