【单周期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位,从而允许表示更大的值。
通过使用立即数扩展模块,处理器可以更灵活地处理更大范围的立即数操作,从而增加了指令集的功能和灵活性。这对于一些需要处理大范围立即数的应用程序非常有益。
本章介绍的立即数扩展模块的参考电路框图如下:

该模块的功能及引脚信号说明如下:
| 信号名称 | 功能说明 |
| Datain | 32位的数据输入信号 |
| Extop | 扩展方式选择信号 |
| Dataout | 32位的数据输出信号 |
该模块的参考电路结构如下图所示:

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)
前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 201…...
Python实现数据结构的基础操作
目录 一、列表(List) 二、字典(Dictionary) 三、集合(Set) 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念,它用于存储和组织数据以便有效地进行操作。Python作为一种…...
20230624----重返学习-vue-响应式处理思路-仿源码
day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架,就是把一套全面的框架设计体系,拆分成为多个框架,项目中需要用到那些需求,再导入对应的框架,以此来保证…...
【MongoDB】三、使用Java连接MongoDB
【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse,创建Java Project项目,命名为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 的自动化测试框架,支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试? 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...
mybatisPlus中apply的使用以进行联表等复杂sql语句
在 MyBatis-Plus 中,apply() 方法可以用于添加任意的 SQL 片段,包括联表查询。因此,你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段,而不受 MyBatis-Plu…...
自学Python技术的方法
目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言,被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建,并且其简洁、易读的语法以及丰富的标…...
python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串
前言 Python网络爬虫是利用Python编写的程序,通过自动化地访问网页、解析html或json数据,并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法: 变量和数据类型:学习如何声明变量以及…...
linux mail -s发送邮件异常解决
异常: Error initializing NSS: Unknown error -8015. "/root/dead.letter" 11/301 . . . message not sent. 出现此问题,大概率是和证书相关。如果没有安装证书,请先安装: 1,下载 yum -y install mailx …...
Netty核心技术七--Google Protobuf
1.编码和解码的基本介绍 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码 codec(编解码器) 的组成部分有两个:decoder(解码器)和encoder(编码器)。encoder 负责把…...
【Docker】Docker常用命令总结
文章目录 一、帮助命令二、镜像命令三、容器命令四、常用的其他命令 在开发过程中,经常涉及到 docker 的相关操作,本文对常用的指令进行汇总。 一、帮助命令 docker version # 显示docker版本信息 docker info # 显示docker系统信息ÿ…...
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? AWS lambda的核心是事件驱动,驱动可能来自,Alexa,SNS,DynamoDB,S3,Kinesis等&…...
linux之权限管理
目录 1.一.基本小语句 2.文件权限操作chmod 1.一.基本小语句 ls - a 查看此文件夹所有和隐藏内容 ls - l 查看此文件夹权限 chown 改变文所有者 2.文件权限操作chmod chmod 参数 文件名 文件的权限主要针对三类对象进行定义 owner 属主, u:针对前三个部分的权限修改 …...
【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?
上一节课,我们主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天,我们结合“给文件排序”这样一个具体的例子,来详细讲一讲策略模式的设计意图和应用场景。 除此之外&…...
【C++】auto_ptr为何被唾弃?以及其他智能指针的学习
搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢?下面我们看一下样例: int div() {int a, b;cin >&g…...
数据结构练习题1:基本概念
练习题1:基本概念 1 抽象数据类型概念分析2. 逻辑结构与存储结构概念分析3.综合选择题4.综合判断题5.时间复杂度相关习题6 时间复杂度计算方法(一、二、三层循环) 1 抽象数据类型概念分析 1.可以用(抽象数据类型)定义…...
如何消除Msxml2.XMLHTTP组件的缓存
之前使用这个组件,是每隔十分钟取数据,没有遇到这个缓存问题, 这次使用它是频繁访问接口,就出现了一直不变的问题。觉得是缓存没有清除的问题。 网上搜了一些方案。最好的方案就是给url地址末尾给一个随机参数。用于让组件觉得是…...
深入理解Java虚拟机jvm-运行时数据区域(基于OpenJDK12)
运行时数据区域 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的…...
API认证机制全解析:从概念到实践的进阶指南
API认证机制全解析:从概念到实践的进阶指南 【免费下载链接】public-api-lists A collective list of free APIs for use in software and web development 🚀 (Clone of https://github.com/public-apis/public-apis) 项目地址: https://gitcode.com/…...
三步打造专业简历:Magic Resume 全场景使用指南
三步打造专业简历:Magic Resume 全场景使用指南 【免费下载链接】magic-resume free online AI resume editor 项目地址: https://gitcode.com/GitHub_Trending/ma/magic-resume 项目定位:重新定义简历创作体验 「Magic Resume」是一款基于「Nex…...
实战复盘:我是如何用一张‘图片’拿下upload-labs Pass-13/14的(附完整命令与避坑点)
从图片马到实战突破:Upload-Labs Pass-13/14的深度攻防手记 那天深夜的咖啡杯旁,我盯着upload-labs靶场第13关的界面出神——这已经是本周第三次尝试突破"内容检测白名单"的双重防御了。作为一名刚入行半年的安全研究员,我深知文件…...
机器学习100天中文版:10个核心算法原理与代码实践
机器学习100天中文版:10个核心算法原理与代码实践 【免费下载链接】100-Days-of-ML-Code-Chinese-Version Chinese Translation for Machine Learning Infographics 项目地址: https://gitcode.com/gh_mirrors/10/100-Days-of-ML-Code-Chinese-Version 想要快…...
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI企业内网部署:内网穿透方案与安全访问配置
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI企业内网部署:内网穿透方案与安全访问配置 最近帮几个团队部署了通义千问的轻量级模型,发现一个挺普遍的需求:模型明明部署在公司内网的服务器上跑得好好的,但开发、测试或者远程协作的同事…...
【书生·浦语】internlm2-chat-1.8b实战教程:Ollama模型热切换与多版本管理
【书生浦语】internlm2-chat-1.8b实战教程:Ollama模型热切换与多版本管理 1. 快速了解InternLM2-1.8B模型 InternLM2-1.8B是第二代书生浦语系列中的轻量级模型,虽然只有18亿参数,但能力相当出色。这个模型特别适合想要快速上手AI应用的个人…...
SecGPT-14B镜像免配置:Docker一键拉起Chainlit安全问答界面
SecGPT-14B镜像免配置:Docker一键拉起Chainlit安全问答界面 1. 引言:让安全专家拥有一个“懂行”的AI助手 想象一下,当你面对海量的安全日志、复杂的攻击链分析,或者需要快速评估一个新漏洞的风险时,身边能有一个随时…...
金仓数据库在MySQL迁移中的技术观察:高兼容性与平滑替代路径实践
金仓数据库在MySQL迁移中的技术观察:高兼容性与平滑替代路径实践 2023年底,MySQL 5.7正式停止官方维护支持——这一曾被广泛应用于中小企业核心系统的开源数据库,悄然进入生命周期尾声。对开发者而言,这不仅是版本迭代的常规提示…...
iOS开发必看:彻底解决CUICatalog警告的3种实战方案(附代码)
iOS开发实战:根治CUICatalog警告的深度解决方案 每次编译运行项目时,控制台突然冒出一堆[framework] CUICatalog: Invalid asset name supplied: 警告,就像代码里藏着一群捣蛋鬼。这些警告不仅干扰调试信息,还可能掩盖真正需要关注…...
Anaconda创建虚拟环境总失败?可能是这个隐藏参数在作怪(附避坑指南)
Anaconda虚拟环境创建失败的深度排查与网络优化指南 当你满怀期待地输入conda create -n myenv python3.8命令,却看到刺眼的CondaHTTPError: HTTP 000 CONNECTION FAILED报错时,那种挫败感我深有体会。作为长期使用Anaconda进行多项目管理的数据科学家&a…...
