第 5 章 CPU 和 ALU 目录 本章包括下面一些主要内容 : 5. 简介...5-2 5.2 指令的一般格式... 5-4 5.3 中央处理单元 (CPU)... 5-4 5.4 指令时钟... 5-4 5.5 算术逻辑单元 (ALU)... 5-5 5.6 状态寄存器... 5-6 5.7 OPTION_REG 寄存器... 5-8 5.8 电源控制寄存器... 5-9 5.9 设计技巧... 5-0 5.0 相关应用笔记... 5-5. 版本历史... 5-2 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5- 页
PICmicro 中档单片机系列 5. 简介 中央处理单元 (CPU) 通过执行程序存储器中的信息 ( 指令 ) 来控制器件的运行 其中许多指令是对数据存储器进行操作 对数据存储器的操作需要使用算术逻辑单元 (ALU) 除了执行算术和逻辑操作外,ALU 还控制状态位 ( 在状态寄存器中 ) 一些指令的执行结果会根据结果的状态而改变状态位 CPU 的机器码如表 5- 中所示 (MPASM TM 用来产生这些机器码的指令助记符也列在表中 ) DS35A_CN 第 5-2 页 24 Microchip Technology Inc.
第 5 章 CPU 和 ALU 表 5-: 中档系列单片机指令集 助记符, 操作数 针对字节的数据寄存器操作 ADDWF ANDWF CLRF CLRW COMF DECF DECFS INCF INCFS IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF f - f - 针对位的数据寄存器操作 BCF BSF BTFSC BTFSS f, b f, b f, b f, b 立即数操作和控制操作 ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW XORLW 注 - - - - 描述 W 加 f W 和 f 与运算 f 清零 W 清零 f 取反 f 减 f 减, 为 0 则跳转 f 增 f 增, 为 0 则跳转 W 和 f 或运算 f 送到 d W 送到 f 空操作 f 循环左移 f 循环右移 f 减去 W f 半字节交换 W 和 f 异或运算 清除 f 的 bit b 置 f 的 bit b 测试 f 的 bit b, 为 0 则跳转测试 f 的 bit b, 为 则跳转 立即数加 W 立即数和 W 与运算调用子程序清除看门狗定时器跳转立即数和 W 或运算立即数送到 W 中断返回立即数送到 W 的子程序返回子程序返回进入休眠状态立即数减 W 立即数和 W 异或运算 周期 (2) (2) (2) (2) 2 2 2 2 2 最高位 0 0 0 0 0 0 4 位宽指令字 0 0 0 0 0 0 0 0 0 bb 0bb 0bb bb x 0 0 xx 0xx 0x lfff 0xxx lfff 0xx0 bfff bfff bfffbfff 最低位 xxxx 0 0 影响的状态位 C,DC, C C C,DC, C,DC, TO,PD TO,PD C,DC, 备注,2,2 2,2,2,2,3,2,2,3,2,2 : 当 I/O 寄存器用自身内容修改自己时 ( 如 MOVF PORTB, ), 使用的值是引脚上的当前值 例如, 某个设置成输入的引脚, 其数据锁存器中的值为, 但此时被外部器件拉为低电平, 执行指令后, 数据锁存器的值变为 0 2: 如果预分频器分配给 Timer0 模块, 对 TMR0 寄存器执行该指令 ( 且适用时 d=) 时, 将清零预分频器 3: 改写程序计数器 (PC) 或条件测试为真时, 需要 2 个周期执行指令, 第二个周期执行空操作指令 NOP,2,2,2,2,2,2,2 3 3 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5-3 页
PICmicro 中档单片机系列 5.2 指令的一般格式 中档系列单片机的指令有四种一般格式, 如图 5- 所示 指令的操作码从 3 位到 6 位不等 这种可变长度的操作码组成了 35 条指令 图 5-: 指令的一般格式 针对字节的数据寄存器操作 3 8 7 6 0 操作码 d f ( 数据寄存器地址 ) d = 0 表示目标寄存器是 W d = 表示目标寄存器是 f f = 7 位数据寄存器地址 针对位的数据寄存器操作 3 0 9 7 6 0 操作码 b ( 位 #) f ( 寄存器地址 ) b = 3 位位地址 f = 7 位数据寄存器地址 立即数操作和控制操作 一般 3 8 7 0 操作数 ( 立即数 ) = 8 位立即值 CALL 和 GOTO 指令 3 0 0 操作数 ( 立即数 ) = 位立即值 5.3 中央处理单元 (CPU) 5.4 指令时钟 CPU 被视为器件的 大脑, 它负责获取正确的执行指令 译码并且执行该指令 CPU 有时和 ALU 配合工作来完成指令的执行 ( 如算术或逻辑操作 ) CPU 控制程序存储器的地址总线 数据存储器的地址总线以及对堆栈进行存取 每个指令周期 (TCY) 由 4 个时钟节拍 (Q-Q4) 构成 时钟节拍和器件振荡周期 (Tosc) 相同 在各个时钟节拍分别对指令的译码 读取 处理和写操作等进行计时 / 标示 下图表明了时钟节拍和指令周期之间的关系 组成指令周期 (Tcy) 的 4 个时钟节拍归纳如下 : Q: 指令的译码周期或强制性空操作 Q2: 指令的读数据周期或空操作 Q3: 处理数据 Q4: 指令的写数据周期或空操作每条指令都有具体的时钟节拍操作 图 5-2: 时钟节拍活动 Q Q2 Q3 Q4 Q Q2 Q3 Q4 Q Q2 Q3 Q4 Tosc TCY TCY2 TCY3 DS35A_CN 第 5-4 页 24 Microchip Technology Inc.
第 5 章 CPU 和 ALU 5.5 算术逻辑单元 (ALU) PICmicro 单片机包含一个 8 位 ALU 和一个 8 位工作寄存器 ALU 是一个通用的算术逻辑单元, 它对工作寄存器和数据寄存器中的数据进行算术和布尔运算 图 5-3: ALU 和 W 寄存器的操作 8 位立即数 ( 来自指令字 ) 数据寄存器 W 寄存器 8 ALU 8 8 d 位, 或来自指令中 d = 0 或 d = 立即数指令 8 8 8 位寄存器值特殊功能 ( 来自指令中的直接地址寄存器或间接地址 ) (SFR) 和通用 RAM (GPR) ALU 是 8 位宽, 能够进行加 减 移位和逻辑操作 除非特别指明, 算术运算一般是以 2 的补码形式进行 在 2 个操作数的指令中, 典型情况下, 其中一个操作数是在工作寄存器 (W 寄存器 ) 中, 另一个操作数放在一个数据寄存器中或是一个立即数 在单操作数指令中, 操作数放在 W 寄存器中或某个数据寄存器中 W 寄存器是一个 8 位宽 用于 ALU 运算的工作寄存器, 它是一个不可寻址的寄存器 根据所执行的指令,ALU 可以影响状态寄存器中的进位标志位 C 辅助进位标志位 DC 和全零标志位 在减法操作中,C 和 DC 位就分别作为借位和辅助借位之反 例如指令 SUBLW 和 SUBWF 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5-5 页
PICmicro 中档单片机系列 5.6 状态寄存器 状态寄存器 ( 如图 5- 所示 ) 含有 ALU 的算术运算结果状态 复位状态及数据存储区的选择位 因为数据存储区的选择是由状态寄存器控制的, 所以各存储区里都有状态寄存器的映射 而且, 这些映射在每个存储区的相对位置 ( 偏移位置 ) 都相同 ( 见第 6 章 存储器构成 中图 6-5: 寄存器映射 ) 状态寄存器和其它寄存器一样, 可以作为任何指令的目标寄存器 如果状态寄存器作为一条指令的目标寄存器, 而这条指令又影响 DC 或 C 标志位, 那么这三个标志位的状态不能由指令直接写入 这些标志位的状态要根据器件逻辑操作的结果来置 或清零 此外, 不能对 TO 和 PD 位进行写操作, 所以当执行一条把状态寄存器作为目标寄存器的指令后, 状态寄存器的结果可能和预想的不一样 例如, 指令 CLRF STATUS 将状态寄存器的高 3 位清零, 将 标志位置 操作后状态寄存器的结果为 0u uuu (u 表示未变化 ) 因此, 建议仅使用位操作指令 BCF BSF 或传送指令 MOVWF 来改变状态寄存器, 因为这些指令不影响该寄存器中的 C 或 DC 标志位 关于其它不影响任何状态位的指令, 请见表 5- 注 : 注 2: 一些器件不需要 IRP 和 RP 位 (STATUS<7:6>) 本章 (CPU 和 ALU) 未使用这些位, 应该将这些位保持为零 不建议将这些位作为通用读 / 写位, 因为这可能会影响代码对未来产品的向上兼容性 在减法运算中, C 和 DC 位分别作为借位和辅助借位之反 DS35A_CN 第 5-6 页 24 Microchip Technology Inc.
第 5 章 CPU 和 ALU 寄存器 5-: 状态寄存器 R/W-0 R/W-0 R/W-0 R- R- R/W-x R/W-x R/W-x IRP RP RP0 TO PD DC C bit 7 bit 0 bit 7 IRP: 寄存器组选择位 ( 用于间接寻址 ) : 选择 Ban 2, Ban3 (h - FFh) 0: 选择 Ban 0, Ban (h - FFh) 对于只有 Ban0 和 Ban 的器件, 保留 IRP 位, 且应始终保持为 0 bit 6:5 RP:RP0: 寄存器组选择位 ( 用于直接寻址 ) :Ban 3 (80h - FFh) 0:Ban 2 (h - 7Fh) 0:Ban (80h - FFh) :Ban 0 (h - 7Fh) 每组 28 个字节 对于只有 Ban 0 和 Ban 的器件, 保留 IRP 位, 且应始终保持为 0 bit 4 TO: 超时位 = 上电 执行 CLRWDT 或 SLEEP 指令后 0 = 发生看门狗定时器超时 bit 3 PD: 低功耗标志位 = 上电或执行 CLRWDT 指令后 0 = 执行 SLEEP 指令后 bit 2 : 零标志位 = 算术或逻辑运算结果为 0 0 = 算术或逻辑运算结果不为 0 bit DC: 辅助进位 / 借位标志位 (ADDWF ADDLW SUBLW 和 SUBWF 指令 )( 借位的极性是相反的 ) = 结果的低 4 位向高 4 位进位 / 低 4 位向高 4 位无借位 0 = 结果的低 4 位没有向高 4 位进位 / 低 4 位向高 4 位借位 bit 0 C: 进位 / 借位标志位 (ADDWF ADDLW SUBLW 和 SUBWF 指令 ) = 结果的最高位有进位 / 最高位无借位 0 = 结果的最高位无进位 / 最高位有借位 注 : 借位的极性是相反的 减法指令通过加上第二个操作数 2 的补码来实现 对于移位指令 (RRF 和 RLF), C 位值来自源寄存器的最高位或最低位 图注 R = 可读位 W = 可写位 U = 未用位, 读为 0 -n = 上电复位时的值 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5-7 页
PICmicro 中档单片机系列 5.7 OPTION_REG 寄存器 OPTION_REG 寄存器是可读写寄存器, 它包含配置 TMR0/WDT 的预分频器 外部 INT 中断 TMR0 和 PORTB 弱上拉的各个控制位 寄存器 5-2: OPTION_REG 寄存器 R/W- R/W- R/W- R/W- R/W- R/W- R/W- R/W- RBPU INTEDG T0CS T0SE PSA PS2 PS PS0 bit 7 bit 0 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2-0 RBPU:PORTB 上拉使能位 = 禁止 PORTB 上拉 0 = 按各个端口锁存器值使能 PORTB 上拉 INTEDG: 中断触发边沿选择位 = INT 引脚的上升沿触发中断 0 = INT 引脚的下降沿触发中断 T0CS:TMR0 时钟源选择位 = T0CKI 引脚上的外部时钟 0 = 内部指令周期时钟 (CLKOUT) T0SE:TMR0 计数边沿选择位 = T0CKI 引脚上的下降沿递增 0 = T0CKI 引脚上的上升沿递增 PSA: 预分频器分配位 = 预分频器分配给 WDT 0 = 预分频器分配给 Timer0 模块 PS2:PS0: 预分频比选择位 位值 TMR0 比率 WDT 比率 0 0 0 0 : 2 : 4 : 8 : 6 : 32 : 64 : 28 : 256 : : 2 : 4 : 8 : 6 : 32 : 64 : 28 图注 R = 可读位 W = 可写位 U = 未用位, 读为 0 -n = 上电复位时的值 注 : 如果需要 TMR0 寄存器得到 : 的预分频值, 可以把预分频器分配给看门狗定时器 WDT ( 即 PSA=) DS35A_CN 第 5-8 页 24 Microchip Technology Inc.
第 5 章 CPU 和 ALU 5.8 电源控制寄存器 利用电源控制 (PCON) 寄存器中的标志位和 TO 及 PD 位, 用户可以区别各种不同的器件复位 注 : 注 2: BOR 在上电复位时的值是未知的 它必须由用户软件置位, 并在以后复位时检查该位是否为零, 可判断有无欠压发生 如果禁用欠压电路 ( 通过清除配置字里的 BODEN 位 ), 则不必关心 BOR 状态位, 也没必要预测 建议在检测到上电复位时, 将 POR 位清零, 以便检测后续的上电复位 寄存器 5-3: 电源控制寄存器 R-u U-0 U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 MPEEN PER POR BOR bit 7 bit 0 bit 7 MPEEN: 存储器奇偶校验错误状态位该位反映 MPEEN 配置位的值 bit 6:3 未用位 : 读为 0 bit 2 bit bit 0 PER: 存储器奇偶校验错误复位状态位 = 没有错误发生 0 = 发生程序存储器取奇偶校验错误 ( 在上电复位后必须用软件置 ) POR: 上电复位状态位 = 未发生上电复位 0 = 发生上电复位 ( 上电复位后, 由软件置 ) BOR: 欠压复位状态位 = 未发生欠压复位 0 = 发生欠压复位 ( 欠压复位后, 由软件置 ) 图注 R = 可读位 W = 可写位 U = 未用位, 读为 0 -n = 上电复位时的值 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5-9 页
PICmicro 中档单片机系列 5.9 设计技巧 问 : 我的程序算法好象工作不正确 答 :. 指令的目标寄存器可能被指定为 W 寄存器 (d=0), 而不是数据寄存器 (d = ) 2. 可能没有正确选择寄存器组选择位 (RP:RP0 或 IRP) 而且如果使用了中断的话, 在退出中断处理时, 可能没有正确恢复寄存器组选择位 问 2: 我不能修改状态寄存器的标志位 答 2: 如果一条影响 DC 或 C 位的指令的目标寄存器是状态寄存器, 会禁止对这些位进行直接写操作 这些位是根据器件的逻辑操作结果来置位或清零 因此, 要修改状态寄存器里的这些位, 建议使用指令 BCF 和 BSF DS35A_CN 第 5-0 页 24 Microchip Technology Inc.
第 5 章 CPU 和 ALU 5.0 相关应用笔记 本部分列出了与本章内容相关的应用笔记 这些应用笔记并非都是专门针对中档单片机系列而写的 ( 即有些针对低档系列, 有些针对高档系列 ), 但是其概念是相近的, 通过适当修改并受到一定限制, 即可使用 目前与 CPU 和 ALU 相关的应用笔记有 : 标题 应用笔记 # Fixed Point Routines AN67 IEEE 754 Compliant Floating Point Routines AN575 Digital Signal Processing with the PIC6C74 AN66 Math Utility Routines AN544 Implementing IIR Digital Filters AN540 Implementation of Fast Fourier Transforms AN542 Tone Generation AN543 Servo Control of a DC Brushless Motor AN532 Implementation of the Data Encryption Standard using the PIC7C42 AN583 PIC6C5X / PIC6CXX Utility Math Routines AN526 Real Time Operating System for PIC6/7 AN585 5 CPU 和 ALU 24 Microchip Technology Inc. DS35A_CN 第 5- 页
PICmicro 中档单片机系列 5. 版本历史版本 A 这是描述 CPU 和 ALU 的初始发行版 DS35A_CN 第 5-2 页 24 Microchip Technology Inc.