计算机组成原理 3 运算器

2024-03-27 20:44

本文主要是介绍计算机组成原理 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个与门并发
  • 一级门延迟,生成所有相加数

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

横向
斜向

        

这篇关于计算机组成原理 3 运算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853330

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja