# 2.4 算术逻辑单元ALU ## 一、ALU概述 ### 1.1 什么是ALU **ALU(Arithmetic Logic Unit)**: - 算术逻辑单元 - CPU的核心部件 - 执行算术运算和逻辑运算 ### 1.2 ALU的功能 **算术运算**: - 加法、减法 - 乘法、除法 - 增量、减量 - 求补 **逻辑运算**: - 与(AND) - 或(OR) - 非(NOT) - 异或(XOR) **移位运算**: - 左移 - 右移 **比较运算**: - 等于 - 大于 - 小于 --- ## 二、ALU的结构 ### 2.1 ALU的基本结构 ``` A(操作数1) │ ▼ ┌─────────────┐ │ │ │ ALU │ │ │ └─────────────┘ │ ▼ F(结果) │ ┌─────┴─────┐ │ │ 标志寄存器 移位器 ``` **输入**: - A:操作数1 - B:操作数2 - S:操作选择信号 **输出**: - F:运算结果 - 标志:状态信息 ### 2.2 ALU的核心部件 **算术运算部件**: - 加法器 - 减法器(用加法器实现) - 乘法器 - 除法器 **逻辑运算部件**: - 与门 - 或门 - 非门 - 异或门 **移位器**: - 左移 - 右移 - 循环移位 --- ## 三、加法器 ### 3.1 半加器 **功能**: - 两个1位二进制数相加 - 不考虑低位进位 **真值表**: | A | B | S | C | |---|---|---|---| | 0 | 0 | 0 | 0 | | 0 | 1 | 1 | 0 | | 1 | 0 | 1 | 0 | | 1 | 1 | 0 | 1 | **逻辑表达式**: ``` S = A ⊕ B C = A · B ``` ### 3.2 全加器 **功能**: - 两个1位二进制数加低位进位 - 产生和与进位 **输入**: - A、B:两个1位二进制数 - C_in:低位进位 **输出**: - S:和 - C_out:高位进位 **真值表**: | A | B | C_in | S | C_out | |---|---|------|---|-------| | 0 | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 1 | 0 | | 0 | 1 | 0 | 1 | 0 | | 0 | 1 | 1 | 0 | 1 | | 1 | 0 | 0 | 1 | 0 | | 1 | 0 | 1 | 0 | 1 | | 1 | 1 | 0 | 0 | 1 | | 1 | 1 | 1 | 1 | 1 | **逻辑表达式**: ``` S = A ⊕ B ⊕ C_in C_out = A·B + (A ⊕ B)·C_in = A·B + A·C_in + B·C_in ``` ### 3.3 串行加法器 **结构**: - 1个全加器 - 逐位相加 **特点**: - 结构简单 - 速度慢 - n位加法需要n个时钟周期 ### 3.4 并行加法器 **结构**: - n个全加器并行 - 同时相加 **问题**: - 进位需要逐级传递 - 进位延迟 **进位传递时间**: - 最坏情况:n级进位 - 延迟:n × t_carry ### 3.5 超前进位加法器(CLA) **思想**: - 提前计算进位 - 并行产生各级进位 **进位生成(Generate)**: ``` G_i = A_i · B_i ``` - 当A_i和B_i都为1时,产生进位 **进位传递(Propagate)**: ``` P_i = A_i ⊕ B_i ``` - 当A_i和B_i有一个为1时,传递进位 **进位公式**: ``` C_1 = G_0 + P_0·C_0 C_2 = G_1 + P_1·C_1 = G_1 + P_1·G_0 + P_1·P_0·C_0 C_3 = G_2 + P_2·C_2 = G_2 + P_2·G_1 + P_2·P_1·G_0 + P_2·P_1·P_0·C_0 ... ``` **特点**: - 进位延迟小(2-3级门延迟) - 硬件复杂度高 - 用于高速运算 ### 3.6 加法器组(Group Carry) **思想**: - 将n位分成若干组 - 组内用CLA - 组间用串行或CLA **例子**:16位加法器 - 分成4组,每组4位 - 组内CLA - 组间CLA --- ## 四、标志寄存器 ### 4.1 标志位的含义 **ZF(Zero Flag)**: - 零标志 - 结果为0时置1 **SF(Sign Flag)**: - 符号标志 - 结果为负时置1(最高位) **CF(Carry Flag)**: - 进位/借位标志 - 无符号运算溢出 **OF(Overflow Flag)**: - 溢出标志 - 有符号运算溢出 **PF(Parity Flag)**: - 奇偶标志 - 结果低8位中1的个数为偶数时置1 **AF(Auxiliary Carry Flag)**: - 辅助进位标志 - 低4位向高4位进位 ### 4.2 标志位的生成 **ZF**: ``` ZF = F_{n-1} · F_{n-2} · ... · F_0 ``` **SF**: ``` SF = F_{n-1} ``` **CF**: ``` CF = C_out(无符号加法) = C_out ⊕ C_in(减法) ``` **OF**: ``` OF = C_{n-1} ⊕ C_{n-2} ``` - 最高位进位 ⊕ 次高位进位 --- ## 五、ALU的实现 ### 5.1 1位ALU **功能**: - 与、或、加 **结构**: ``` A ──┬── AND ──┐ │ │ B ──┼── OR ───┼── MUX ── F │ │ └── ADD ──┘ │ C_out ``` **控制信号**: - 00:与 - 01:或 - 10:加 ### 5.2 n位ALU **结构**: - n个1位ALU级联 - 共享控制信号 - 进位链连接 **改进**: - 使用CLA加速进位 - 增加减法功能 - 增加比较功能 ### 5.3 ALU的功能扩展 **减法**: ``` A - B = A + (-B) = A + B̄ + 1 ``` **比较**: - A - B,判断标志位 - ZF=1:A=B - SF=0且OF=0:A>B - SF=1或OF=1:A