[处理器芯片]-5 超标量CPU实现之ALU

ALU(Arithmetic Logic Unit,算术逻辑单元),是CPU执行单元中最主要的组成部分。

1 主要功能

算术运算:执行加法、减法、乘法和除法等算术运算。

逻辑运算:执行与、或、非、异或等逻辑运算。

移位运算:执行逻辑左移、逻辑右移、算术右移等移位运算。

比较运算:执行大小比较等比较运算。

超标量CPU中的加法器、减法器、乘法器、除法器和移位器在硬件实现中,依赖于组合逻辑和时序逻辑的设计。加法器通过基本的半加器和全加器实现,减法器利用二进制补码和加法实现,移位器则通过简单的位操作实现,乘法器可以采用Booth算法或阵列乘法器,除法器则通过顺序减法和移位实现。通过这些基础电路的优化和组合,超标量CPU能够高效执行复杂的算术操作。

2 加法器(Adder)

加法器是用于执行二进制加法的基本电路。常见的加法器包括半加器、全加器和多位加法器(如行波进位加法器、先行进位加法器)。

1)半加器(Half Adder)

半加器用于两个单比特的加法:输入两个单比特 `A` 和 `B`,输出和 `Sum` 和进位 `Carry`

逻辑实现。

module HalfAdder(input A, B, output Sum, Carry);

    assign Sum = A ^ B;   // 异或运算

    assign Carry = A & B; // 与运算

endmodule

2)全加器(Full Adder)

全加器用于两个单比特和前一位进位的加法:输入两个单比特 `A` 和 `B`,前一位进位 `Cin`,输出和 `Sum` 和进位 `Cout`。

逻辑实现

module FullAdder(input A, B, Cin, output Sum, Cout);

    assign Sum = A ^ B ^ Cin;             // 异或运算

    assign Cout = (A & B) | (Cin & (A ^ B)); // 与或运算

endmodule

3)多位加法器(Ripple Carry Adder)

行波进位加法器是由多个全加器级联而成:输入两个多比特二进制数 `A` 和 `B`,输出和 `Sum` 和进位 `Cout`

逻辑实现

module RippleCarryAdder #(parameter WIDTH = 8)(input [WIDTH-1:0] A, B, output [WIDTH-1:0] Sum, output Cout);

    wire [WIDTH:0] Carry; // 进位链

    assign Carry[0] = 0;

    

    genvar i;

    generate

        for (i = 0; i < WIDTH; i = i + 1) begin: add_bit

            FullAdder FA (.A(A[i]), .B(B[i]), .Cin(Carry[i]), .Sum(Sum[i]), .Cout(Carry[i+1]));

        end

    endgenerate

    

    assign Cout = Carry[WIDTH];

endmodule

3 减法器(Subtractor)

减法可以通过加法实现,使用二进制补码进行减法操作,即:`A - B` 可以表示为 `A + (~B + 1)`。

4位减法器逻辑实现

module Subtractor #(parameter WIDTH = 4)(input [WIDTH-1:0] A, B, output [WIDTH-1:0] Diff);

    wire [WIDTH-1:0] B_complement;

    assign B_complement = ~B + 1; // 计算B的补码

    RippleCarryAdder #(WIDTH) RCA (.A(A), .B(B_complement), .Sum(Diff), .Cout());

endmodule

4 乘法器(Multiplier)

乘法器用于执行二进制乘法,现代乘法器通常由部分积生成器(Partial Product Generator)、部分积压缩器(Partial Product Compressor)和最终加法器(Final Adder)构成。

工作原理

乘法运算单元是处理器中的关键组件之一,基本原理是将被乘数(Multiplicand)和乘数(Multiplier)分解成若干部分积(Partial Products),然后将这些部分积进行累加得到最终的乘积。乘法运算单元可以采用不同类型的乘法器,如布尔乘法器、串行乘法器、并行乘法器等,具体选择取决于性能和面积的要求。

主要组件

3.1)部分积生成器

部分积生成器的任务是根据乘数的每一位生成对应的部分积。每一个部分积是被乘数与乘数某一位的乘积。

例如,对于 4 位乘数和被乘数:

- 乘数 `B`:\( B_3B_2B_1B_0 \)

- 被乘数 `A`:\( A_3A_2A_1A_0 \)

生成的部分积为:

- 第 0 位:`P_0 = B_0 * A`

- 第 1 位:`P_1 = B_1 * A << 1`

- 第 2 位:`P_2 = B_2 * A << 2`

- 第 3 位:`P_3 = B_3 * A << 3`

Booth 算法

Booth 算法进行乘法操作可以有效减少部分积生成的位数,从而减少计算量,其基本思想是利用乘数的位模式,将部分积中连续的1和0序列合并为一个更大的值或更小的值,以减少需要执行的加法和移位操作。

1)Booth 编码:对乘数进行 Booth 编码,将每两位乘数转换为一个 Booth 编码值,可以是0、1或-1。

2)循环运算:从最低位开始,对每两位乘数进行 Booth 编码并执行相应的加法和移位操作,生成部分积的一部分。

3)部分积累加:每次循环产生的部分积通过累加器累加,最终得到完整的部分积。

实现示例

输入:被乘数A = 1010 (十进制:10)

      乘数B = 0110 (十进制:6)

Booth 编码:0101 (十进制:5)

           1100 (十进制:-4)

循环运算:

1)A 的最低位为 0,保持部分积不变。

2)A 的第二低位为 1,部分积左移一位并加上 B。

   部分积:00000000

          + 0110

          --------

          00000110

3)A 的第三低位为 1,部分积左移一位并加上 B。

   部分积:00000110

          + 0110

          --------

          00010000 (此时部分积的低4位即为结果)

部分积 P = 0001 0000 (十进制:16)

基于Booth算法的乘法器逻辑实现

module BoothMultiplier #(parameter WIDTH = 4)(input [WIDTH-1:0] A, B, output [2*WIDTH-1:0] Product);

    reg [2*WIDTH-1:0] P;

    reg [WIDTH-1:0] Q;

    reg Q_1;

    integer i;

    always @(A or B) begin

        P = 0;

        Q = B;

        Q_1 = 0;

        for (i = 0; i < WIDTH; i = i + 1) begin

            case ({Q[0], Q_1})

                2'b01: P = P + (A << i);

                2'b10: P = P - (A << i);

                default: ;

            endcase

            Q_1 = Q[0];

            Q = Q >> 1;

        end

    end

    assign Product = P;

endmodule

3.2)部分积压缩器

部分积压缩器用于减少部分积的层数,将得到的部分积需要按权值错位相加,以得到最终的乘积结果。这个过程通常通过树型结构的加法器实现,可以采用Wallace树、Dadda树等,需要确保加法过程中的进位被正确传递。

Wallace 树压缩

Wallace树是一种常见的部分积压缩器,利用全加器和半加器将部分积逐层压缩。

逻辑实现

module WallaceTree(input [3:0] A, input [3:0] B, output [7:0] Product);

    wire [15:0] partial_products;

    // 生成部分积

    assign partial_products[3:0] = A & {4{B[0]}};

    assign partial_products[7:4] = A & {4{B[1]}};

    assign partial_products[11:8] = A & {4{B[2]}};

    assign partial_products[15:12] = A & {4{B[3]}};

    // 声明中间结果

    wire [7:0] sum1, sum2, sum3, carry1, carry2, carry3;

    // 第一级压缩

    assign sum1 = {partial_products[3:1], 1'b0} + partial_products[7:4];

    assign carry1 = {4'b0, partial_products[11:8]} + {4'b0, partial_products[15:12]};

    // 第二级压缩

    assign sum2 = {carry1[3:1], 1'b0} + sum1[7:4];

    assign carry2 = carry1[7:4] + sum1[3:0];

    // 最后一级压缩

    assign sum3 = sum2 + carry2;

    assign carry3 = {carry2[3:1], 1'b0};

    // 最终加法

    assign Product = sum3 + carry3;

endmodule

3.3)最终加法器(Final Adder)

最终加法器用于将压缩后的部分积进行累加,得到最终的乘积,常见的加法可以参照第一章节内容,包括行波进位加法器和先行进位加法器。

结果输出,将最终的乘积结果存储在结果寄存器中,以便后续的使用或传输。

逻辑实现

module FinalAdder(input [7:0] sum, input [7:0] carry, output [7:0] Product);

    assign Product = sum + carry;

endmodule

4位乘法器实现示例

module Multiplier4Bit(input [3:0] A, B, output [7:0] Product);

    wire [3:0] P0, P1, P2, P3;

    // 部分积生成

    assign P0 = B[0] ? A : 4'b0000;

    assign P1 = B[1] ? (A << 1) : 4'b0000;

    assign P2 = B[2] ? (A << 2) : 4'b0000;

    assign P3 = B[3] ? (A << 3) : 4'b0000;

    // 部分积压缩(Wallace Tree)

    wire [7:0] sum1, sum2, sum3, carry1, carry2, carry3;

    assign {carry1, sum1} = {4'b0, P0} + {2'b0, P1, 2'b0};

    assign {carry2, sum2} = {4'b0, P2, 4'b0} + {4'b0, P3};

    assign {carry3, sum3} = sum1 + carry1;

    // 最终加法

    assign Product = sum3 + carry2;

endmodule

5 除法器(Divider)

除法器用于执行二进制除法。常见的方法包括恢复余数法和非恢复余数法。

恢复余数法:通过顺序减法和移位实现:

逻辑实现

module RestoringDivider #(parameter WIDTH = 4)(input [WIDTH-1:0] Dividend, Divisor, output [WIDTH-1:0] Quotient, Remainder);

    reg [2*WIDTH-1:0] A, Q, M;

    integer i;

    always @(Dividend or Divisor) begin

        A = 0;

        Q = Dividend;

        M = Divisor << WIDTH;

        

        for (i = 0; i < WIDTH; i = i + 1) begin

            A = (A << 1) | Q[WIDTH-1];

            Q = Q << 1;

            A = A - M;

            if (A[2*WIDTH-1]) begin

                Q[0] = 0;

                A = A + M;

            end else begin

                Q[0] = 1;

            end

        end

    end

    assign Quotient = Q[WIDTH-1:0];

    assign Remainder = A[WIDTH-1:0];

endmodule

6 移位器(Shifter)

移位器用于执行二进制数的移位操作(左移和右移),可以是逻辑移位、算术移位或循环移位。

逻辑移位器:逻辑左移和右移逻辑实现

module LogicalShifter #(parameter WIDTH = 8)(input [WIDTH-1:0] A, input [2:0] Shift, output [WIDTH-1:0] Result);

    assign Result = (Shift[2]) ? {8'b0, A[WIDTH-1:8]} :

                    (Shift[1]) ? {4'b0, A[WIDTH-1:4]} :

                    (Shift[0]) ? {2'b0, A[WIDTH-1:2]} :

                    A;

Endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态路由实验—OSPF

动态路由协议实验-------OSPF 链路状态路由选择协议又被称为最短路径优先协议&#xff0c;它基SPF&#xff08;shortest path first &#xff09;算法 实验要求&#xff1a;各个PC之间能够互通 1.四台PC配置如下 PC1 PC2 PC3 PC4 2.配置各个交换机的口子的IP R1 <HUAWE…

Room注解无效原因

在Android项目中&#xff0c;如果父模块使用Kotlin&#xff0c;而子模块用Java编写&#xff0c;并且在子模块中使用了Room库&#xff0c;那么你会发现需要使用kapt而不是annotationProcessor来处理Room注解。这里有几个原因和背景知识&#xff1a; 1. 项目配置的影响 父模块的…

spiderfoot一键扫描IP信息(KALI工具系列九)

目录 1、KALI LINUX简介 2、spiderfoot工具简介 3、在KALI中使用spiderfoot 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 web访问 4.2 扫描并进行DNS解析 4.3 全面扫描 5、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多…

YOLOv8+PyQt:实时检测(摄像头、视频)

1.YOLO&#xff1a;CPU实时检测&#xff08;摄像头、视频&#xff09;https://blog.csdn.net/qq_45445740/article/details/106557451 2.YOLOv8PyQt&#xff0c;实现摄像头或视频的实时检测 需要安装 PySide6 和 ultralytics pip install PySide6 pip install ultralyticsfr…

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎&#xff0c;使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档&#xff0c;并支持条件语句、循环语句和变量等控制结构&…

如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索

作者&#xff1a;来自 Elastic Carlos Delgado kNN 是什么&#xff1f; 语义搜索&#xff08;semantic search&#xff09;是相关性排名的强大工具。 它使你不仅可以使用关键字&#xff0c;还可以考虑文档和查询的实际含义。 语义搜索基于向量搜索&#xff08;vector search&…

Angular Ivy:新渲染引擎的性能提升与优化

Angular Ivy是Angular 9及更高版本中引入的默认渲染引擎&#xff0c;它取代了以前的View Engine。Ivy的目标是提高Angular的性能、减少包大小和提高开发者的生产力。 1. AOT编译的改进&#xff1a; 在Ivy中&#xff0c;Angular使用了更早的AOT&#xff08;Ahead-of-Time&…

在AnolisOS8.9系统安装docker-compose

在AnolisOS8.9系统安装docker-compose 下载docker-compose之前请先确保docker已经安装完&#xff0c;教程可以参考 在阿里Anolis OS 8.9龙蜥操作系统安装docker 下载最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大数据工具之HIVE-参数调优,调度乱码(二)

一、调度乱码 在利用HUE工具,搭建WORKFLOW流程的过程中,如果直接执行hivesql数据正常,不会出现乱码现象,如果利用WORKFLOW搭建的流程,进行数据的拉取,会出现数据中文乱码现象,这些乱码主要是由于select 中的硬编码中文导致出现的现象 具体现象如下: select case when …

百度 提前批 国际化广告部 (深圳-机器学习/数据挖掘/自然语言处理工程师) 一面+二面面经

文章目录 0、面试情况1、一面1.1、简历上的项目介绍了个遍1.2、dbscan原理1.3、为什么梯度的负方向就是损失函数下降最快的方向&#xff1f;1.4、bn原理&#xff0c;为什么bn能解决过拟合&#xff0c;1.5、auc原理&#xff0c;为什么ctr或你的广告推荐里用auc指标&#xff1f;1…

TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器

TG5032CGN TCXO / VC-TCXO是一款应用广泛的晶振&#xff0c;具有超高稳定性&#xff0c;CMOS输出和使用晶体基振的削波正弦波输出形式。且有低相位噪声优势&#xff0c;是温补晶体振荡器(TCXO)和压控晶体振荡器(VCXO)结合的产物&#xff0c;具有TCXO和VCXO的共同优点&#xff0…

后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件

1、pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代码如下&#xff1a; /*** 企业列表--导出*/GetMapping(value "/downloadTenantL…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

SpringCloud系列(26)--OpenFeign超时控制

前言&#xff1a;在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务&#xff0c;因为消费侧和服务侧是两个不同的微服务&#xff0c;这样可能会出现超时的现象&#xff0c;例如服务侧需要3秒处理任何才能返回结果&#xff0c;但消费侧可能2秒就断开连接了&#xff0c…

【深度学习】2.单层感知机

目标&#xff1a; 实现一个简单的二分类模型的训练过程&#xff0c;通过模拟数据集进行训练和优化&#xff0c;训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集&#xff0c;包括特征矩阵data_x和对应的标签数据data_y。标签…

加密与安全_AES RSA 密钥对生成及PEM格式的代码实现

文章目录 RSA&#xff08;非对称&#xff09;和AES&#xff08;对称&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三种填充模式一、RSA填充模式二、常见的RSA填充模式组合三…

新业务 新市场 | 灵途科技新品亮相马来西亚亚洲防务展

5月6日&#xff0c;灵途科技携新品模组与武汉长盈通光电&#xff08;股票代码&#xff1a;688143&#xff09;携手参加第18届马来西亚亚洲防务展。首次亮相海外&#xff0c;灵途科技便收获全球客户的广泛关注&#xff0c;为公司海外市场开拓打下坚实基础。 灵途科技与长盈通共同…

Dbs封装_连接池

1.Dbs封装 每一个数据库都对应着一个dao 每个dao势必存在公共部分 我们需要将公共部分抽取出来 封装成一个工具类 保留个性化代码即可 我们的工具类一般命名为xxxs 比如Strings 就是字符串相关的工具类 而工具类 我们将其放置于util包中我们以是否有<T>区分泛型方法和非泛…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…

计算机SCI期刊,IF=8+,专业性强,潜力新刊!

一、期刊名称 Journal of Big data 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;8.1 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1990 三、期刊征稿范围 《大数据杂志》发表了关于…