布尔代数和基本逻辑电路
布尔代数
关于0和1的一套数学运算体系起源于1850年前后英国数学家乔治·布尔的工作,因此称为布尔代数。 0和1分别代表逻辑值“假”和“真 通过逻辑关系可以构建基于0和1的布尔代数运算 最基本的运算有:与(AND)、或(OR)、非(NOT),运算符分别为“·”(“^”)、“+”(“v”)、“ ̄”(“﹁”)
一位逻辑门电路
可通过逻辑门电路来实现逻辑运算*三种基本门电路:与门、或门、非门。 其他门电路可以由三种基本门电路组合形成(如异或门电路)。
n位逻辑门电路
对于n位逻辑运算,只要重复使用n个相同的门电路即可 例如,若A=An-1An-2…A1A0,B=Bn-1Bn-2…B1B0,则与运算F=A·B,实际上是按位想与,即Fi=Ai·Bi(0<=i<=n-1) 假定逻辑值位数为n,则按位与、按或与、按位取反、按位异或的逻辑符号如图所示。
组合逻辑部件
根据电路是否具有存储功能,讲逻辑电路划分为两种类型 组合逻辑电路:没有存储功能,其输出仅依赖于当前输入。 时序逻辑电路:具有存储功能,其输出不仅依赖于当前输入,还依赖于存储单元的当前状态。 可以利用基本逻辑门电路构成一些具有特定功能的组合逻辑部件(功能部件) 如译码器、编码器、多路选择器、加法器等。 实现一个功能部件的过程 用一个真值表描述功能部件的输入和输出之间的关系。 根据真值表确定逻辑表达式。 根据逻辑表达式实现逻辑电路。
多路选择器
最简单的多路选择器(MUX)是二路选择器 有两个输入端A和B,一个输出端F,并有一个控制端S,其功能是:当S为0时,F=A;当S为1时,F=B。 k路选择器应有k路输入,因而控制端S的位数应是【log2k】 例如,三路或四路选择器,S有两位;5~8路选择器,S有3位。
无符号数加法器
一位加法器(全加器)
一位加法器称为全加器 两个加数称为A和B,低位进位为Cin,和为F,向高位的进位为Cout。
化简后,逻辑表达式如下
n位加法器
n位加法器可用n个全加法器实现
n位带标志加法器
n位加法器无法用于两个n位带符号整数(补码)相加,无法判断是否溢出 程序中经常需要比较大小,通过(在加法器中)做减法得到的标志信息来判断。
整数加减运算和ALU
n位整数加/减运算器
算术逻辑部件(ALU)
进行基本算术运算与逻辑运算 无符号整数加、减。 带符号整数加、减。 与、或、非、异或等逻辑运算。 核心电路是带标志加法器 输出除和/差等,还有标志信息 有一个操作控制端(ALUop),用来决定ALU所执行的处理功能。ALUop的位数k决定了操作的种类,例如,当位数k为3时,ALU最多只有2^3=8种操作。
从C语言表达式到逻辑电路
C语言支持的基本数据类型
从C表达式到运算类指令
C语言程序中的基本数据类型、基本运算类型
基本数据类型
-
无符号数(二进制位串)、带符号整数(补码)
-
浮点数(IEEE 754标准)
-
位串、字符(串)(ASCII码)、
基本运算类型
-
算数(+ - * / % > < >= <= == !=)
-
按位(| & ~ ^)
-
逻辑(|| && !)
-
移位(<< >>)
-
扩展和截断
从运算类指令到运算电路
计算机如何实现高级语言程序中的运算
从运算类指令到运算电路
-
y==(x>>2)+k转化为以下指令序列 sarw $2,%ax ;x>>2 addw %bx,%ax ;(x>>2)+k
计算机直接执行指令来完成运算
-
控制器对指令进行译码,产生控制信号送运算电路。
操作数在运算电脑中运算
-
sarw $2,%ax :将操作数“2”和“R[ax]”送移位器运算。 addw %bx,%ax :将R[ax]和R[bx]送整数加减器中运算。
数据的运算
高级语言程序中涉及的运算(以C语言为例) 整数算术运算、浮点数算术运算 按位、逻辑、移位、位扩展和位截断等运算 指令集中涉及到的运算 涉及到的定点数运算
-
算术运算
-
带符号整数:取负/符号扩展/加/减/乘/除/算术移位
-
无符号整数:0扩展/加/减/乘/除/逻辑左移/逻辑右移
-
-
逻辑运算
-
逻辑操作:与/或/非/…
-
涉及到的浮点数运算:加、减。乘、除 指令中的运算操作在运算电路中进行 基本运算部件ALU、通用寄存器组,以及其他部件
C语言中的各类运算
C语言程序中涉及的运算
算术运算(最基本的运算) 无符号数、带符号整数、浮点数的加减乘除求余等
按位运算 用途
-
对位串实现“掩码”(mask)操作或相应的其他处理(主要用于对多媒体数据或状态/控制信息进行处理)
操作
-
按位或:“|”
-
按位与:“&”
-
按位取反:“~”
-
按位异或:“^”
如何从数据y中提取低位字节,并使高字节为0? 可用“&”实现掩码操作:y & 0x00FF 例如,当y=0x0B2C时,得到结果为:0x002C
移位运算 用途
-
提取部分信息
-
扩大或缩小2、4、8…倍
操作
-
左移:x<<k;右移:x>>k
-
从运算符无法区分逻辑位移还是算术位移,由x的类型确定
-
若x为无符号数:逻辑左(右)移 高(低)位移出,低(高)位补0,可能溢出!
-
若x为带符号整数;算术左移、算术右移 左移:高位移出,低位补0.可能溢出!
逻辑运算 用途
-
用于关系表达式的运算 例如,if(x>y and i<100)then ……中的”and“运算
操作
-
”||“表示”OR“运算
-
”&&“表示”AND“运算 例如,if((x>y)&&(i<100))then……
-
”!“表示”NOT“运算
与按位运算的区别
-
符号表示不同:& ~ &&;| ~||;……
-
运算过程不同:按位 ~ 整体
-
结果类型不同:位串 ~ 逻辑值
位扩展和位截断运算 用途
-
类型转换时可能需要数据扩展或截断
操作
-
没有专门操作运算符,根据类型转换前、后数据长短确定是扩展还是截断
-
扩展:短转长 无符号数:0扩展(前面补0) 带符号整数:符号扩展(前面补符)
-
截断:长转短 强行将高位丢弃,故可能发生”溢出“
加减运算生成的标志信息
整数加、减运算
C语言程序中的整数有 带符号整数,如char、short、int、long型等 无符号整数,如unsigned char、unsigned short、unsigned等 指针、地位等通常被说明为无符号整数、因而在进行指针或地址运算时,需要进行无符号整数的加、减运算 无符号整数和带符号整数的加、减运算电路完全一样,这个运算电路称为整数加减运算部件,基于带标志加法器实现 计算机中的加法器,因为只有n位,所以是一种模2^n运算系统!