在计算机科学中,每个用于数据存取的基本单位,在进行数字的加法计算时,都被赋予一个独一的序号,是产生数的和的装置,即为地址加法器。
65nm工艺下32位PC加法器的设计与应用介绍了针对数字信号处理器设计的一 种应用于地址生成单元和算术移位部件的加法器电路—PC加法器(Psum一 Cout加法器),它可以根据不同应用添加求和选择电路或者求和电路,以实现所需功能。在65nm工艺下为减小漏流功耗,采用全静态CMOS电路。结果表明,在0.9V、65unr工艺下进行电路模拟,地址生成单元中加法器和选择电路合并后传播时间为345Ps,算术移位部件中和输出传播时间为340Ps,饱和位传播时间为28Ps。1
PC加法器结构加法器由P/G产生单元、前缀单元和进位产生单元组成。为实现带进位输入的加法,对Sklansky结构的最低位进行改造:将cin和A[0]、B[0]作为一组,生成第一位的进位输出,加数的其余位则两位一组生成一级进位。1
加法器电路设计该加法器设计采用全静态CMOS电路,它具有很多优点,如抗噪声能力强、速度快、功耗低、对器件参数的变化不敏感、易于设计等。设计采用了偏斜逻辑门。所谓偏斜逻辑门就是在某个门中,把P管和n管的比例设的不均衡,如果关心电路中某个门的上位速度就把P管的尺寸加大成n管的倍数,反之亦成立。这种做法可以明显提高加法器的速度,而且由于电路中的不对称逻辑门,可以减少静态功能,进而减小整体的功耗延时积。1
加法器在地址产生部件中的应用地址产生单元处于高性能处理器的关键路径上,其运算速度直接影响到处理器的速度。进行地址运算时,需进行加或减运算,其运算结果要通过选择模块对寻址的基地址和线性寻址的地址结果进行选择。在控制信号比找到至少一级门然时的前提下,可以将加法器的求和部分与选择模块合并,从而减少关键路径的延时。
由于加法器输出的低13位的时序紧张,而高19位的输出时序较松,则针对低13位的进位输出做专门优化,使之达到时序要求。在优化时,只需对低13位电路的R5、R6、R7级以及最后添加的反相器进行优化,多采用偏斜门逻辑。在对R7级优化时,要均衡Cout输出正反信号的负载。1
加法器在算术移位部件中的应用算术移位部件主要负责分支跳转及复杂移位运算操作,其需要一款带胞和位判断的加法器,结合加法器结构和XOR电路,再加之胞和位判断电路,可以得到所需加法器。
选择XOR门电路实现此加法器和输出的原因如下:Cout处于加法器的关键路径,用XOR门Cout的反信号,从而减少Cout的负载;在具有相同延时、相同负载的前提下,选择电路的功耗大于XOR门电路的功耗。基本延时和功耗的考虑,选择XOR门实现和输出更为合理。1
VHDL实现8086IP核的设计介绍了8086的内部结构和工作原理,其中包括执行单元、总线接口单元、算术逻辑单元、寄存器组和地址加法器。使用VHDL实现了IP核的设计,并使用Modelsim进行了仿真,仿真结果表明IP核可以正常工作。2
8086内部结构和工作原理8086是英特尔于1978年推出了首枚16位微处理器,有29000只晶体管,速度可分为5MHz、8MHz、10MHz,内部数据总线(处理器内部传输数据的总线)、外部数据总线(处理器外部传输数据的总线)均为16 位,地址总线为20 位,可寻址1MB内存,为双列直插式封装,有40根引脚,电源为5V。
8086从功能上分执行单元EU(Execution Unit),和总线接口单元BIU(Bus Interface Unit)。执行单元的功能就是负责指令的执行,由8个16位通用寄存器 (AX,CX,DX,BX,SP,BP,SI,DI),1个16位标志寄存器(FLAGS),1个16位暂存寄存器 ,1个16位算术逻辑单元ALU及EU控制电路组成。
总线接口单元的功能是负责与存储器,I/O端口传送数据, 由4个16位段寄存器 (CS,DS,SS,ES),1个16位的指令指针寄存器IP,1个与EU通信的内部暂存器,1个指令队列,1个计算20位物理地址的加法器及总线控制电路构成。8086 的指令队列为6个字节,会在执行指令的同时,从内存中取指令,取来的指令就放在指令队列中。EU单元每次都是从指令队列的前部取指令,然后在本单元中执行指令,这样CPU执行完一条指令就可以立即执行下一条指令,不需要从内存取指令,然后再执行,从而提高效率。8086的内部寄存器都是16位的,所以需要一个附加的部件来根据16位寄存器提供的信息来计算出20位的物理地址,地址加法器就是用来完成这个作用的。计算方法为:将代码段寄存器CS的内容左移4位,然后再与IP的内容相加得到最终的物理地址。2
总线接口部件和执行部件之间不是同步工作的,但两者的动作仍然是有管理原则的,体现于以下几个方面:
1) 每当指令队列中有2个空字节时,总线接口部件就会自动把指令取到指令队列中。
2) 当执行部件请求总线接口部件访问总线时,总线接口部件正在将某个指令取到指令队列中去,这时,总线接口部件将首先完成这个取指令的总线周期,然后再去响应执行部件发出的访问总线的请求。
3) 当指令队列已满,而且执行部件对总线又没有总线访问请求,则总线接口部件进入空闲状态。
4) 在执行转移指令,调用指令和返回指令时,指令队列中的原有内容会被制动清除,总线接口部件会接着往指令队列中装入另一个程序段中的指令。
当复位信号来时,CPU内部的部件都初始化,段寄存器被设为0XFFFF,其他寄存器都被设为0,指令队列被清空,总线接口部件开始读取指令(指令的地址由段寄存器和指令指针通过地址加法器相加给出,为 0XFFFF0),送往指令队列,然后指令执行部件可以不停地从指令队列读取指令,开始解释执行指令,周而复始地进行下去。在整个过程中执行部件和总线接口部件以一种并行方式工作。如果指令执行所需要的数据以及最后的结果都不需要访问I/O部件或存储器,则EU的工作将和BIU的取指令工作并行,这样就可以节省时间开销,提高了工作效率。2
设计使用VHDL,采用层次化,模块化的方式来设计整个系统。由讨论的内容知道CPU作为最外层模块(记做MAIN),它包含了ALU,EU,BIU和寄存器组,还有指令队列,地址加法器。EU的实现为ECC(execute control circuit),BIU的实现为IOCC(I/O control circuit),指令队列的实现为FIFO(first in first out)即队列,其中地址加法器包含在IOCC 中。为了验证CPU,设计了TOP模块,RAM,ROM,AL模块,用于测试MAIN模块,相当于用这些模块组建了一个简单的电脑主板。AL模块的作用是 :地址锁存。由于8086采用的是数据和地址复用总线,所以总线上不能同时出现数据和地址信号。当出现数据信号是,地址信号已经消失了,所以在把存储器模块需要的地址和数据信号传给存储器模块时 ,要对地址信号进行锁存 ,同时锁存的还有BHE信号(bus highenable)。BHE用来控制对于字节还是字的读写操作。程序的接口如下:2
library ieee;
use ieee.std_logic_1164.all;
entity Al isport(AlAddrIn:in std_logic_vector(19 downto 0);
AlAddrOut:out std_logic_vector(19 downto 0);
AlBhebin:in std_logic;
AlBhebOut:out std_logic;
Alls:in std_logic;
Alle:in std_logic);
end Al;
CPU的作用抽象地说,其实就是数据处理,所以从这个角度来说,ALU是整个CPU的核心,虽然它不是最复杂的部件。ALU完成运算功能,运算包括算数运算和逻辑运算。算数运算包括加法和减法操作。逻辑运算包括AND, OR,NOT,XOR。这些基本上都是二元操作符,所以ALU的接口需要定义两个参与运算的操作数(ALUP1 和 ALUP2),同还要定义进行的是何种操作(ALUOP)以区分不同的操作。8086是16位的CPU,但处于兼容地考虑,同时也实现了8位的指令,所以我们要在实现中定义接口信号ALUBYTE来区分进行的是字节还是字操作。在8086中有带进位的加法操作,所以在接口中要有CARRY信号的输入(即 ALUCI信号)。其他还包含的信号有:ALURES, ALUC, ALUZ等,程序接口如下:2
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Alu ISPORT(AluP1:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
AluP2:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
AluOp:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
AluByte:IN STD_LOGIC;
AluCi:IN STD_LOGIC;
AluA:OUT STD_LOGIC;
AluC:OUT STD_LOGIC;
AluO:OUT STD_LOGIC;
AluP:OUT STD_LOGIC;
AluS:OUT STD_LOGIC;
AluZ:OUT STD_LOGIC;
AluRes:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END Alu;
IOCC模块负责与存储器,I/O端口之间传送数据。在最小模式下,要负责产生相应的读写时序图。在实现读写时序时,一些信号需要在一个时钟周期内不同的时刻改变,所以需要延时。在仿真的时候,可以使用AFTER语句进行延时,但 AFTER语句是不可综合的,这里采用双时钟的方法,低频的时钟信号作为总线周期的时钟,高频的时钟信号用作计数 ,这样在不同的计数时刻就可以改变要改变的信号。
ECC出于简单考虑采用直接组合电路的方式进行译码,采用状态机的方式,根据不同指令功能 ,产生控制信号 ,在时钟的控制下,执行相应的动作,给出一段小的程序进行测试:
MOV AX,1000
MOV CX,2000
INC AX
XCHG AX,CX
ADD AX,CX
HLT2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所