微处理器设计2 刘鹏 liupeng@zju.edu.cn College of ISEE Zhejiang University Source: 补充讲义 2018/12/2 Spring 2018 ZDMC – Lec. #24
10.3 微处理器设计示例EC-1 指令集-1 五个8bits指令 Opcode=3bits, 000,001和010三个编码没有定义, nop 1) 指令IN A输入一个8比特的数值,并存储到累加器A中; 2) 指令OUT A将累加器A中的数值拷贝到输出端口; 3) 指令DEC A把累加器A中的数值减1后再存入到累加器A中; 4) 指令JNZ(Jump Not Zero)测试A中的数值是否为0,假如为0,这个指令什么也不做,假如不为0,则将指令中的后四位,即aaaa(表示跳转地址)加载到寄存器PC中; 5) 指令HALT通过使CPU停止在halt状态从而停止微处理器的运行,直到系统复位跳出halt状态。 2018/12/2 Spring 2018 ZDMC – Lec. #24
数据通路-1 指令集中操作的数据通路 (1)执行指令周期中的取指操作,并递增PC值或 者加载新的PC值; (2)存储器; (3)实现指令集中所有指令的操作。 2018/12/2 Spring 2018 ZDMC – Lec. #24
数据通路-1 一个PC寄存器,4比特,+递增单元 一个IR寄存器,8比特 一个具有16个存储单元的8位程序存储器 一个8比特的累加器A,+递减单元 指令IN A,累加器A的输入来自于数据输入端口 指令DEC A,累加器A的输入来自于递减单元的输出 指令OUT A,无需特别的数据通路的操作,累加器的输出直接连接到 数据输出端口 指令JNZ A,需要一个8比特的OR门连接到累加器的所有输出上,来测 试条件A是否不等于0。IR寄存器的低4位数据加载到PC寄存器中 指令HALT,不需要任何额外的操作 2018/12/2 Spring 2018 ZDMC – Lec. #24
控制信号 数据通路中的控制字主要有5个 给控制单元提供一个状态反馈信号 即IRload,PCload,INmux,Aload和JNZmux。 Aneq0 为了保持设计的简洁,程序存储器设计在数据通路 2018/12/2 Spring 2018 ZDMC – Lec. #24
控制单元 控制单元的状态图 状态START(000)作为初始复位状态 在FETCH状态 在DECODE状态 指令JNZ A需要额外的时钟周期完成 PC加载新地址在下一个时钟沿发生 在FETCH状态 控制IRload信号有效 将PC寄存器指向的程序加载到IR寄存器 然后PC寄存器中的内容递增1后 信号PCload将新PC加载到PC寄存器中 在DECODE状态 测试IR寄存器的高三位 即IR_7-5解码 跳转到对应的状态 2018/12/2 Spring 2018 ZDMC – Lec. #24
五个指令的执行状态 指令IN A操作 指令DEC A 指令JNZ 到HALT状态 设置INmux信号为1来选择输入信号为外部端口 设置Aload信号为1来加载输入信号到累加器A 注意,为了输入指令能够读取到正确的输入值,输入数据需要在微处理器复位之 前就设置好 而且,由于INPUT状态不需要等待一个类似于回车键的信号,因此,即使有多个 数据输入,也只能有一个数据会被读入进来 指令DEC A 需要设置INmux信号为0、Aload信号为1 以使递减单元的输出被连接到累加器并加载进来 指令JNZ 使JNZmux信号有效以将IR寄存器中的低4位地址信号加载到PC寄存器 状态反馈信号Aneq0=1时,控制信号PCload信号被设置为有效 到HALT状态 将会无条件的停留在HALT状态 微处理器看上去像停止操作一样 2018/12/2 Spring 2018 ZDMC – Lec. #24
状态图 次态表、实现表,激励方程 2018/12/2 Spring 2018 ZDMC – Lec. #24
状态控制 控制信号 2018/12/2 Spring 2018 ZDMC – Lec. #24
控制单元 完整控制电路 2018/12/2 Spring 2018 ZDMC – Lec. #24
完整电路 数据通路电路与控制单元电路信号连接 2018/12/2 Spring 2018 ZDMC – Lec. #24
示例汇编程序 测试程序 手工编译 输入一个数据,将此数据进行递减直至0。 程序必须在数据通路和微处理器实现之前,加载到存储器中去 指令JNZ,最右边4位表示当检测条件为真时程序跳转的地址。 假设第一个指令IN A存储在程序存储器的地址为0000, 指令JNZ将跳转到第二个指令OUT A(在程序存储器中的地址是0001) JNZ指令的最后四位操作数被设置为0001。 由于指令JNZ的操作码为110,所以综合起来指令JNZ完整的编码是11000001。 2018/12/2
硬件电路实现 完整的计算机 微处理器,存储器、输入和输出设备。 八个拨码开关作为输入设备,2个七段数码管作为输出设备。 一个LED来显示是否已经结束工作,一个按钮作为复位按钮。 较高频率(如25MHz)的时钟分频后变成4Hz,作为微处理 器的时钟。 2018/12/2 Spring 2018 ZDMC – Lec. #24
10.5 微码型微处理器设计 CPU主要包括运算器和控制器两个部分,由总线 连接在一起 CPU内部信号种类 数据信号 地址信号 控制信号 2018/12/2 Spring 2018 ZDMC – Lec. #24
总线设计 数据总线和地址总线 IO接口部分 处理 8 位数据的 CPU,至少有 8 位的数据总线 12 位的地址总线,一共可访问 4KB 代码和数据 每一个连接在总线上的部件需要用一组三态缓冲器来 控制其是否向总线输出数据 每个部件所需的三态缓冲个数和这个部件的位数对应 IO接口部分 对每一个 IO 通道直接采用一个带三态缓冲控制的 8 位 寄存器连接到数据总线上 2018/12/2 Spring 2018 ZDMC – Lec. #24
寄存器设计 A 寄存器,即累加器 Accumulator T 寄存器,即临时寄存器(Temporary Instruction) ALU 数据来源 之一,保存ALU计算结果 T 寄存器,即临时寄存器(Temporary Instruction) ALU 数据来源 之一,也是MD 寄存器(Memory Data) B 寄存器,通用寄存器(General-Purpose Register) 用户可任意使用 IR 寄存器,即指令寄存器(Instruction Register) PC 寄存器,即程序计数器(Program Counter) MA 寄存器,即内存地址寄存器(Memory Address) 2018/12/2 Spring 2018 ZDMC – Lec. #24
ALU 组合电路 ,完成 CPU 内的算术和逻辑运算 算术运算主要包括:加、减、乘、除 逻辑运算主要包括:与、或、非、异或等 指令数有限的情况下无需实现所有的算术和逻辑 运算 减法、乘法→加法 与、非→其他逻辑运算 2018/12/2 Spring 2018 ZDMC – Lec. #24
控制器 Control Unit 时序电路 , CPU 设计中的最后一个环节 实现方式 (1)微代码(Micro Code)方式 优点:灵活,定制能力强 缺点:速度相对较慢 ,访问ROM比直接运行门电路慢 (2)硬布线(Hard Wired)方式 优点:速度快,因为无需访问 ROM 缺点:门电路比较复杂 70, 80, 90 年代的 CPU 90 年代以后的 RISC 型 CPU 2018/12/2 Spring 2018 ZDMC – Lec. #24
I/O &存储器部分设计 I/O,即输入输出(Input/Output)功能 存储器部分 设计宗旨:尽可能简单可行 直接使用 RAM 和 ROM 芯片 需要考虑存储架构 2018/12/2 Spring 2018 ZDMC – Lec. #24
Nibbler 4 Bit CPU Nibbler 是一个 4 位的 CPU,用标准 7400 系列逻辑芯片 组建,包括计数器、寄存器、缓冲器和门电路等 ,控制 器实现采用的是微代码方式 。 规格 4 位定制 CPU 12 位寻址, 4K 地址空间大小 哈佛体系结构—独立的程序和数据存储空间 2.46 MHz 时钟速度,每条指令 2 个时钟=123 万个指令/秒 在 CPU 数据和控制通道中使用 13 个 7400 系列芯片 2 个 28C16 EEPROMS 用于存储产生内部控制信号的微代码 4K x 4 SRAM (CY7C168A) 28C64 EEPROM 存储程序 4 个按键输入 16 x 2 字符 LCD 显示器 1 个音频扬声器 5V 电源,大约 100 mA 电流 2018/12/2 Spring 2018 ZDMC – Lec. #24
体系结构 哈佛架构 load-store 设计 程序和数据地址都为 12 位宽 支持多达 32 个不同 的 I/O 设备 数据总线 4 位宽 程序总线 8 位宽 4 位的指令操作码 4 位的直接操作数 或目标地址的高位 load-store 设计 数据可以在“A”和 RAM 中的内存位置 之间移动 程序和数据地址都为 12 位宽 支持多达 32 个不同 的 I/O 设备 程序计数器(PC)提供程序 ROM 的地址。程序字节与其他状态位相结合,为微码 ROM 提供地址。这些 ROM 在适当的时间生成内部控制信号,用于 CPU 中其他芯片所需的置数(load)、使能(enable)和递增(increment)。每个 ROM 输出 16 个总控制信号中的 8 个。程序字节(program byte)也用于构造 RAM 和跳转(jump)目标的地址,以及将立即数放在数据总线上。 2018/12/2 Spring 2018 ZDMC – Lec. #24
Schematic 原理图 除了 RAM 和 ROM 之外,所有芯片都是常见的 7400 系列的器件。大部分使用了7400HCT 逻辑系列的器件,这样可以提供与常规 7400LS 系列器件类似的速度,而功耗更低。 2018/12/2 Spring 2018 ZDMC – Lec. #24
局限性 没有地址译码器 程序 ROM 占用了所有的程序地址空间,RAM 占用了所有的数据地址空间 I/O 外围设备不是内存映射的 没有地址寄存器 不支持任何形式的间接寻址 不支持硬件控制的堆栈 2018/12/2 Spring 2018 ZDMC – Lec. #24
程序数据 原理图上中间右边是程序 ROM (28C64) 当前正在执行的程序指令的地址存储在程序计数 器(PC)中 8KX8 的 EEPROM 地址线的 A12 输入脚未使用 程序存储器 ROM所有 8 个 I/O 线都被使用 当前正在执行的程序指令的地址存储在程序计数 器(PC)中 3 个 4 位计数器 74HCT163串接在一起构成 12 位的逻 辑寄存器 2018/12/2 Spring 2018 ZDMC – Lec. #24
控制与微码 原理图的左上方 指令操作码、 ALU 标志和相位组合形成两个微码 ROM(28C16)的 7 位地址 8 位寄存器 74HCT377 :取指寄存器(Fetch) 高 4 位保存当前指令的操作码 低 4 位保存指令或地址的数据 4 位标志寄存器 74HCT173 存储ALU 标志(Flags) :进位(carry)、零(zero) 双 D 触发器 74HCT74 同步复位信号 相位比特 指令操作码、 ALU 标志和相位组合形成两个微码 ROM(28C16)的 7 位地址 两个 ROM 的输出构成了协调所有其它芯片行为所需 的 16 个控制信号 2018/12/2 Spring 2018 ZDMC – Lec. #24
ALU 数据通道 原理图的左下方 ALU:74LS181 累加器寄存器“A”:74HCT173 对其两个输入执行任一常见得算术或逻辑运算 2018/12/2 Spring 2018 ZDMC – Lec. #24
Carry-In and Carry Flag 进位输入和进位标志 ALU 的进位输入(carry-in bit)是微码提供的控 制信号 进位标志不会反馈到 ALU 中,影响后面的计算 如果进位标志确实连接到 ALU 的进位输入比特, 那么程序在执行任何单半字节相加之前都需要清 除它,这比多个半字节相加更为常见。 2018/12/2 Spring 2018 ZDMC – Lec. #24
RAM 随机存取存储器 原理图的底部中间 RAM 芯片 CY7C168A 4Kx4 SRAM I/O 线连接到数据总线,地址来自取指寄存器 (Fetch)的操作数(作为高 4 位)和程序 ROM 字节(低 8 位) CLK 信号与/CSRAM 控制信号相或,输出连接到 RAM 的芯片选择输入端/CS CLK 信号与/CSRAM 控制信号相或,输出连接到 RAM 的芯片选择输入端/CS。这意味着 RAM 将只在每个时钟周期的后半部分使能,而且只有在微码专门使能它时才被使能。这是当写使能信号/WE 和 RAM 地址可能尚未有效时,在时钟周期的上半部分防止错误写入 RAM 的简单方法。 2018/12/2 Spring 2018 ZDMC – Lec. #24
输入输出端口 原理图的右下方 IN0 : 4 位总线驱动器 74HCT125 OUT : 4 位寄存器 74HCT173 输出有上拉电阻的四个按键的状态 OUT : 4 位寄存器 74HCT173 OUT1 连接到 16×2 字符的 LCD显示器的数据总线 databus[4..7] OUT0 将两条线连接到 LCD,用于控制 LCD 数据传输所需的 RS 和 E 信号 OUT0 的另外两条线,一条连接到 LED 上,另一条连接到一 个扬声器 74HCT173 有两个置数使能输入/G1 和/G2,并且两者 必须都是低才能将数据加载到芯片。 2018/12/2 Spring 2018 ZDMC – Lec. #24
总线驱动 原理图中心底部 8 位驱动 74HCT244 一半用于将 ALU 结果驱动到数据总线上 另一半用于将操作数从取指寄存器驱动到数据总线上 2018/12/2 Spring 2018 ZDMC – Lec. #24
组合反馈环路 ALU 输出有一个组合反馈环路,通过总线驱动器 B,返回到 ALU 的 B 输入端 反馈环路问题可在微码中修复 如果 ALU 功能被设置为类似 A+B,而总线驱动 B 使能, 那么会产生反馈问题 ALU 功能被设置为 A,也可以创建反馈环路,只是输 入 B 上的值是逻辑无关的 反馈环路问题可在微码中修复 使用 0000 输出替代原来的 ALU 功能选择 1111 从理论上讲,从不同逻辑家族或不同制造商生产的 74LS181 可能具有不同的内部逻辑,微码为基础的修复可能不起作用。如果在构建一个 Nibbler 克隆版并碰到这个问题,在数据总线和ALU 的 B 输入之间可以放置一个像 74HCT7541 的施密特触发缓冲器。 根据芯片数据手册中获取的 SN74LS181 的内部逻辑的知识 2018/12/2 Spring 2018 ZDMC – Lec. #24
微码和指令集 CPU 指令的两种类型:立即数、可寻址 指令编码 Nibbler 指令集和微码 ADDI JZ(零则跳转) 注意一些 ALU 控制信号与某些指令无关,并且以灰色显示,并标记为“dc”,表示不用关心(don’t care)。 2018/12/2 Spring 2018 ZDMC – Lec. #24
指令集 4 位指令操作码,最多有 16 个不同的指令 跳转指令:JMP、JC、JNC、JZ、JNZ LD、ST LIT OUT IN 从数据空间(RAM)加载一个半字节到累加器,或从累加 器存储一个半字节到数据空间 LIT 加载一个立即数半字节值到累加器 OUT 从累加器中存储半字节到 16 个输出端口中的一个 IN 从 16 个输入端口中加载半字节到累加器中 2018/12/2 Spring 2018 ZDMC – Lec. #24
指令集 ADDI ADDM CMPI CMPM NORI NORM 加半字节立即数值到累加器中 将数据空间中的半字节加到累加器中 将一半字节立即数与累加器进行比较 CMPM 将数据空间中的半字节与累加器进行比较 NORI 执行与立即数的 NOR NORM 执行与数据空间值的 NOR 2018/12/2 Spring 2018 ZDMC – Lec. #24
合成指令 那些不包括在表里的指令可以根据现有指令合成 无法合成的通用指令是 ANDM 和 SUBM NOT: NORI #0 ORI x: NORI x; NORI #0 ORM x: NORM x; NORI #0 ANDI x: NORI #0; NORI ~x SUBI: ADDI (~x+1) 无法合成的通用指令是 ANDM 和 SUBM 数据空间中的专用位置可以用于保存数据空间值的补码 在许多情况下, 通过一些思考可以完全消除对这 些合成指令的需要 2018/12/2 Spring 2018 ZDMC – Lec. #24
软件工具 Microcode Builder 微代码生成器 Assembler 汇编器 Simulator 仿真器 为两个微代码 ROM 的内容生成两个二进制文件 Assembler 汇编器 使用符号命名指令名称和分支标记 Simulator 仿真器 基于 GUI 图形的工具模拟 CPU 的数据和控制路径 2018/12/2 Spring 2018 ZDMC – Lec. #24