计算机组成原理 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

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

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