计算机组成原理 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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr