计算机组成原理 3 运算器

定点补码加/减法运算

        补码加减法的实现

        补码加法 [X Y] = [X] [Y]
        和的补码 = 补码的和
        补码减法 [X−Y] = [X] [−Y] = [X] −[Y]
        差的补码 = 补码的差
        求补公式 [−Y] = [ [Y] ]
        对 [Y] 逐位取反 , 再在最低位加 1

                溢出检查(OF)

                        方法1

                                溢出逻辑: 正正得负  负负得正

                                设两数符号位为 f_0 \ \ \ f_1 ,和数符号位f_s

                                Overflow = \overline{f_0}\ \overline{f_1}f_s + f_0 f_1 \overline{f_s}

                        方法2

                                符号位进位位C_f,最高位进位位C_n

                                Overflow = C_f \oplus C_n

                        方法3——双符号位

                                双符号位的最高位永远是正确符号

                                Overflow = f_1 \oplus f_2

                二进制加法运算 

                        先考虑一位加法,然后构成加法链。

                        一位加法:S = X\oplus Y

                        一位全加器:S = X_i \oplus Y_i \oplus C_{i-1}C_{i+1} = X_iY_i + (X_i + Y_i)C_{i-1}

                        n位加法器:n个一位加法器串联,低位的进位输出连接到高位的进位输入。

                加法器的改造 

                        引入运算控制位Sub,Sub = 0 时作加法,Sub = 1时作减法,此时送入[-Y]补。

                        Input = Y_i \oplus Sub

                        标志寄存器 

                                存放运算标志的寄存器,每个标志对应标志寄存器中的一个标志位。

                        IA-32中的EFLAGS寄存器     (MIPS 无标志寄存器):

                                ZF(结果为零)        SF(结果为负数)

                                CF(进位/借位)      OF(有符号溢出)

                        并行加法器

                                串行加法器高位运算需要等待低位运算,延迟过高,因此想要改成并行。

                                关键在于解决进位C_i对低位运算的依赖。

                        进位链

                                S_i = X_i\oplus Y_i \oplus C_{i-1}

                                C_i = X_i Y_i + (X_i \oplus Y_i)C_{i-1}

                            设G_i = X_i Y_i(进位生成函数),P_i = X_i \oplus Y_i(进位传递函数)

                            则C_i= G_i + P_iC_{i-1}

                                由递推式C_i= G_i + P_iC_{i-1}可以提前得到进位表达式,使得每一位全加器的进位输入不再依赖前一个全加器。

                                C_1 = G_1 + P_1C_0

                                C_2 = G_2 + P_2 C_1 = G_2 + P_2(G_1 + P_1C_0) = G_2 + P_2G_1 + P_2P_1C_0

                                ......

                                C_n = G_n + P_nG_{n-1} + P_nP_{n-1}G_{n-2} +... \ + P_nP_{n-1}P_{n-2}...P_1C_0 

  •                                 进位输出仅与最低位进位输入C_0有关
  •                                 位数越长,进位链电路复杂度越高
  •                                 通常按照4位一组进行分组运算

定点乘法运算 

        实现思路

  •         执行乘法运算子程序实现乘法运算(软件实现):零成本、RISCV32-I指令集
  •         利用加法器多次累加实现乘法运算:原码、补码一位乘法,成本低
  •         设置专用乘法器实现乘法运算:成本高

        二进制手算乘法 

        由此可以想到阵列乘法:即先计算相加数,然后逐列相加。用到了很多的全加器,成本高,但换来了效率。

        从这种横向进位模式想到,实际上进行的就是:相加➡移位➡相加➡移位......的过程。数学表达出来是这样:

        由此可以推出原码乘法 

        原码乘法

累加后 逻辑右移
n 次加法
符号位单独计算
流程图
核心运算
  • 累加= + 0 或 = + X,分支合并​​​​​​​为累加 ∑ = +YnX
  • 逻辑右移  = ∑ / 2
减少寄存器访问
 ∑ = (∑ +YnX)/2
先移位再锁存,简化电路,提升速率
运算计数控制
简单状态机控制,计数器比较

         硬件实现:

        但由于机器内采用补码存储,原码乘法实际上没有什么实际意义 ,但可以通过原码乘法稍作转换推出补码乘法运算方法。

        补码乘法

可以推出:[X  *  Y]补 = [X]补 * 0.Y1Y2…Yn – Y0[X]补  (Y0为符号位)

进一步有:[X  *  Y]补 = [X]补 * [ Y1 - Y0 + (Y2 - Y1)2^-1 + (Y3 - Y2)2^-2+…+(0-Yn)2^-n ] 

可以看出和原码乘法形式非常类似,因此可以改进原码乘法来实现。​​​​​​​

n+1 次加法, n 算术右移
符号位参与运算, 不需单独计算符号位

        硬件实现:

        阵列乘法

         再回看阵列乘法

  • 符号单独运算:直接异或
  • 绝对值相乘:仅需考虑数值部分的计算
  • R=X*Y

        1 × 1 = 1

        1 × 0 = 0

        0 × 1 = 0

        0 × 0 = 0

  • 与门实现一位乘法
  • 25个与门并发
  • 一级门延迟,生成所有相加数

         不同的进位方式延迟不同,主要有横向进位、斜向进位两种。

横向
斜向

        

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

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

相关文章

【Entity Framework】Code First 数据批注

【Entity Framework】Code First 数据批注 文章目录 【Entity Framework】Code First 数据批注一、概述二、模型二、键Key三、组合键四、外键-ForeigKey第一种:指定导航属性,会自动生成外键,命名规则为:“对象名称_主键名“第二种…

用c++实现猴子偷桃、Fibonacci数列

4.1.2 猴子吃桃 【问题】一只猴子摘了很多桃子,每天吃现有桃子的一半多一个,到第10天时只有一个桃子,问原有桃子多少个? 【想法】设an表示第n天桃子的个数,猴子吃桃问题存在如下递推式: 【算法实现】由于每天的桃子…

vue2 export default写法,computed、methods的使用

<template><div><h2>{{nameAll}}</h2><h2>{{method}}</h2><h2>{{tt()}}</h2><h2>{{firstName}}</h2><h2>更新后赋值数据&#xff1a;{{lastName}}</h2><h2>赋值数据:{{writeValue}}</h2>…

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

网页版短信平台软件开发要点|手机短信系统搭建建设

开发网页版短信平台软件时&#xff0c;需要考虑以下关键要点&#xff0c;以确保平台功能完喂、性能稳定和用户体验良好&#xff1a; 用户管理&#xff1a;实现用户注册、登录、Q:290615413权限管理等功能&#xff0c;确保用户信息安全可控。 短信发送功能&#xff1a;集成短信…

Flutter开发之下标

Flutter开发之下标 在iOS开发中使用下标就很方便&#xff0c;本文主要是记录一下Flutter中系统自带的下标&#xff0c;还可以通过对应的方法编写自己的下标。 在Objective-C中的下标 关键字Subscript。 NSArray - (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx A…

EFI Driver Model(下)-SCSI 驱动设计

1、SCSI简介 SCSI是Small Computer System Interface&#xff08;小型计算机系统接口&#xff09;的缩写&#xff0c;使用50针接口&#xff0c;外观和普通硬盘接口有些相似。SCSI硬盘和普通IDE硬盘相比有很多优点&#xff1a;接口速度快&#xff0c;并且由于主要用于服务器&…

通往荣耀之路! 在 The Sandbox 中种植树木,拯救真正的森林

The Sandbox 团队祝你国际森林日快乐&#xff01; 我们相信&#xff0c;在创造一个更美好、更包容、更友善的地球的过程中&#xff0c;我们每个人都有责任采取具有影响力和目的性的行动。这就是为什么我们平台的核心支柱是利用元宇宙来推动公益事业。 国际森林日是我们践行这一…

数据分析之POWER Piovt透视表分析与KPI设置

将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份&#xff0c;鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份&#xff0c;借助month的函数双击日期 选择月份这列----按列排序-----选择月…

2024年目前阿里云服务器一个月收费价格表多少钱?

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

Django开发复盘

一、URL 对于一个不会写正则表达式的蒟蒻来说&#xff0c;在urls.py中就只能傻傻的写死名字&#xff0c;但是即便这样&#xff0c;还会有很多相对路径和绝对路径的问题&#xff08;相对ip端口的路径&#xff09;&#xff0c;因为我们网页中涉及到页面跳转&#xff0c;涉及到发送…

机器学习复习手册

机器学习的要素 基本概念 泛化&#xff1a; The ability to predict accurately the target for new examples that differ from those used in the training set is known as generalization.监督学习&#xff1a;The training data comprises examples of the input variab…