1、8051算术逻辑运算单元设计第1章 绪 论1.1 研究背景随着超大规模集成电路技术的发展,芯片规模己从万门集成发展到现在的百万门、千万门集成;设计周期从以前的18个月缩短到目前的6个月甚至更短,因此IC设计的复杂度大大上升,设计的任务更艰巨。同时IC制造的特征尺寸已达到0.1微米,芯片集成度已至G规模,可以将整个系统集成到一个芯片,因此今天的IC正向SOC的方向转变。另外,IC的更新换代加快,设计升级的周期缩短,以前的单元库远远不能满足复杂电路对设计的要求,IC设计的开发已成为集成芯片市场扩大的“瓶颈”。在这种IC的几何尺寸变得越来越小、集成密度越来越高、集成的功能越来越强、开发周期越来越短的
2、情况下,开发可重复利用的基本电路功能模块的方法,即IP应运而生。简单地说,IP是指在电子设计中预先开发的用于SOC设计的可复用的功能模块,系统设计者进行一个复杂设计的过程很像以前构造一块PCB一样,从市场上采购IP功能模块,然后在一块芯片上有效集成,从而构成一个功能强大的系统,即SOC。IP(Intellectual Property)是目前电子技术中的一个新技术,其含义是知识产权。它为SOC的设计提供了有效的途径,是SOC的技术支撑。在国家高技术研究发展的863计划中,SOC作为微电子重大专项已列入了信息技术领域的重大专项启动项目中,在若干关键IP核的开发、软硬件协同设计、IP复用、VDSM
3、设计、新工艺新器件等方面都布置了预研性课题。其中IP核的设计和制造是SOC技术中最为关键的部分,CPU的IP核是构成SOC技术的核心,开发出具有自主知识产权的CPU IP核对我国在电子设计技术方面跟上世界先进的步伐,提高信息产业在世界上的核心竞争力和效益具有重大意义。在国内,基于SOC的CPU设计研究很少有人涉足。虽然市场上应用较为广泛的微控制器、嵌入式处理器、计算机中的CPU等都有了很成熟的产品,但这些产品主要靠从国外引进,技术基础比较薄弱。中芯微系统公司生产出我国第一个具有自主知识产权的实用化32位嵌入式CPU芯片“方舟一号”,这表明我国的RISC CPU设计在嵌入式领域达到了先进水平。我
4、国信息产业从此告别了无“芯”的时代。这是我国在CPU设计走出的第一步。虽然取得了很大的成绩,但是也应看到与国际先进水平还有一定的差距。在国外,SOC的IP核研究发展速度极快,技术也日趋成熟。对于CPU的研究设计更是领先于国内几十年。而且CPU的处理能力提升很快,由8位、16位升级到32位、64位,掌上电脑、PDA、电脑手机、电脑汽车等新产品层出不穷,产业规模日益壮大。而基于FPGA的CPU设计及实现技术更被许多高等学院列为重点研究项目,也取得了很大的研究成果。现在实验室正从事家电产品的研发,把片上系统应用到家电产品中,这样可以降低成本、减小体积和功耗,同时还具有很好的保密性。由于实验室以前都是
5、基于MCS51产品的开发,所以开发MCS51的IP核具有很好的应用前景。1.2 研究内容及设计目标本文主要研究如何在熟悉FPGA设计的基础上,利用Verilog HDL(硬件描述语言)编码实现MCS51算术逻辑运算单元的所有功能,并利用仿真工具对所实现的运算器进行仿真验证和综合。课题的设计目标为利用编码实现MCS51算术逻辑运算单元,并对所设计的单元进行行为仿真、功能仿真以及综合验证,同时对设计单元进行针对性的测试,以证明其健壮性和实用性。第2章 定点运算器研究现状定点运算器部件主要包括:加法器、乘法器和除法器。本章将对乘法器和除法器设计的相关技术以及国内外研究状况进行详细介绍,而为了便于后续
6、章节的具体说明,加法器设计的技术将在后面应用时介绍。2.1 乘法器设计的研究现状乘法器是定点处理器的主要组成部分,其速度是影响CPU速度的关键因素。同时,乘法器也是数字信号处理(DSP)、系统级芯片(SOC)的关键部件。在最新的处理器中,乘法器除了直接作为运算部件外,还用于加速地址转换、数组寻址和其他整数操作。随着科研生产对运算速度要求的提高,对乘法器性能的要求也在不断地提升。BOOTH算法、WALLACE树、CLA等技术的出现也使得乘法器设计的技术日益成熟。而不同的应用背景又要求在不同的算法和实现之间进行选择,权衡电路规模和性能,达到特定条件下的最优设计。1. 乘法器的体系结构所有的乘法器都
7、有同样的处理过程,首先生成部分积,然后把这些部分积相加得到乘积。不同的乘法算法之间的差别在于它们是怎样产生部分积,然后怎么样把这些部分积相加得到最终的乘积。在这些方案之间选择是一个对性能和实现代价的取舍过程。最简单的方法是使用一个如图2.1所示的迭代结构逐个把一系列的部分积相加。在这个结构中,每一个时钟周期产生一个部分积,然后把不同的时钟周期产生的部分积累加得到最终结果,这个结构中的部分积产生的电路一般用与门构成,乘数有多少位就产生多少个部分积。这个结构中的部分积累加电路由一个移位器和一个累加器构成,通过移位器把以前周期累加的结果移位,然后用累加器把当前周期产生的部分积和移位后的以前周期累加的
8、结果累加。由于这个结构每次只能产生和累计一个部分积,并且部分积的个数就等于操作数的个数,所以使用这个结果得到的部分积的周期数比较多,但是由于实现起来比较简单,所以每个周期所需要的时间少,比较容易得到高的频率。如果乘法器是作为系统的一个部件并且整个系统使用同样的时钟信号,那么乘法器的频率就受制于系统的其他部分,这时只剩下实现电路简单这个优点了,高的时钟频率就没法表现出来。图2.1 迭代式乘法器的结构由于乘法器单独使用的概率很小,很多情况下都是作为大系统的一个部件,因此首先需要减少一次乘法所需要的周期数。最直接的方法就是在图2.1中设置多套部分积生成电路和加法器,在一个周期中并行的产生多个部分积,
9、然后把这些部分积串行的和以前周期累加的结果相加,具体的结构如图2.2所示。实际上,这个结构就是对上一结构的迭代过程进行部分展开,所以它需要更多的硬件资源,它也会在一个周期内产生更多的延时。图2.2 部分展开的迭代式的乘法器结构如果合适的选择迭代展开的规模,使乘法器的频率和整个系统的频率相匹配,这样可以在不降低整个系统频率的前提下,提高乘法器的性能,从而提高整个系统的性能,惟一的代价就是多增加部分积的生成和加法器电路。把上面的迭代展开思想发挥到极致就是在并行产生所有的部分积,然后把这些部分积串行的相加。这个过程可以在一个周期内完成,这样就把整个乘法过程所需要的周期数减少到1。由于部分积的产生过程
10、是并行,而部分积的累加过程是串行的,所以一次乘法所需要的时间大致上和部分积的个数成正比。由于这一系列串行的相加过程会产生很长的延时才能完成,使乘法器只能运行在很低的频率上,从而降低系统的性能,成为提高系统频率的瓶颈。解决这个问题的关键在于提高部分积的累加速度,既然所有的部分积都是并行产生的,那么它们的相加过程也是可以同时进行的。图2.3 树形的加法器阵列事实上可以不增加硬件代价,只是改变加法器之间的连接状态,设法在同一时刻把尽可能多的部分积相加。具体的实现结构如图2.3所示的树形结构。使用树形加法器阵列就可以把N个部分积累加过程的时间复杂度从N降低到lgN,当N值比较大时,效果就相当明显了。2
11、. 部分积的生成采用上文所述的任意结构,都首先需要产生部分积。最简单的方法是对一个N位的操作数生成N个部分积。这样的部分积产生电路实现简单、性能高,只要把被乘数和乘数的各个位进行与操作就可以了。但是由于乘法器的速度很大程度上是由部分积累加部分决定的,而部分积累加部分的硬件规模和执行速度很大程度上受部分积个数的影响,所以减少部分积的个数是提高乘法器性能的有效方法。Booth在1951年提出的一种编码方法(Booth编码)可以把部分积的个数减少一半。在最初的Booth编码中把两位乘数编为一组,然后根据编码后的值生成部分积,这里的部分积属于集合0,M,2M,3M,M是被乘数。这样的实现方案可以把部分
12、积的个数减少一半,但是在部分积的生成过程中需要加法器来得到被乘数的三倍。为了得到被乘数的三倍,不可避免的要使用加法器,由于加法器需要把进位信息从最低位传递到最高位,所以部分积的生成速度就下降了。为了克服这个障碍,就要避免使用到三倍的被乘数。通过修改对乘数的编码,改进的Booth算法可以把部分积的个数减小一半的同时,避免使用三倍的被乘数。改进的Booth算法的编码原则如图2.4所示。最高位 32位的乘数 最低位000图2.4 改进的Booth算法的编码原则在改进的Booth算法中,乘数被编成相互交叠的三位组。把最初的Booth算法中三倍的被乘数看作四倍的被乘数减去一倍的被乘数。使部分积的范围属于
13、集合0,M,2M,4M,-M,其中M表示被乘数。通过修改Booth算法的规则,4M可以划分到与它相邻的位的二位组,考虑到权重的原因变为M和-M,可以划分到与它相邻的低位的三位组,考虑到权重的原因变为-M,最终部分积属于集合0,M,2M,-M,-2M,在这个部分积的集合中,2M只要通过对被乘数的移位就可以得到,至于-M和-2M,根据补码的定义,只要对M和2M的各位取反然后在最低位加1就可以了。考虑到加1的过程要用到加法器,我们把它留到部分积累加的过程进行,在部分积产生阶段只作取反的过程。具体的乘数三位组和部分积的关系如表2.1所示。表2.1 改进BOOTH算法的部分积产生的规则乘数的位片断部分积
14、000+0001+被乘数010+被乘数011+两倍的被乘数100-两倍的被乘数101-被乘数110-被乘数111-0对于32位数的乘法,改进的Booth算法把部分积的个数从32个减少到17个。在上面提到的Booth算法中,乘数的编码每次移2位。我们称之为2位的Booth算法。进一步发展Booth算法的思想,可以每次移位的位数大于2,从而进一步减少部分积的个数。更高位的Booth算法可以把部分积的个数进一步减少,但是由于部分积集合的扩大,得到部分积的复杂度也越来越大,甚至会出现部分积的产生过程需要用到乘法器的现象。解决的办法就是用冗余的方法来表示部分积,这样所有的部分积都可以快速的生成。在不同的
15、场合,可以根据具体的需要选择使用全冗余方式或者部分冗余方式。3. 部分积的累加在前面提到的所有乘法器的结构中,部分积的求和对乘法器性能的影响都是至关重要的。长期以来人们对完成部分积求和的加法器阵列进行了深入的研究。其中树形结构是研究的重点。在早期的实现中,都是使用进位传递加法器(CPA)来构造加法器阵列,由于需要逐位的将进位信息从最低位传递到缓高位,所以CPA的速度都比较慢。Wallace在1964年提出Wallace树的思想,在Wallace的结构中使用保留进位加法器(CSA)代替CPA,仅在最后一步才需要一个完整的CPA。但是Wallace树在各个CSA之间的连接不规整,所以实现复杂,不容
16、易实现布局布线。为了解决这个问题,人们在性能和实现上作了折衷,提出了一些连接关系比较简单但是性能略差的连接结构。Zuras和McAllister提出的ZM树。Zhi-Jian MOU和Francis JUTAND在1990年提出了OS树(Overturned-Stairs Trees)。这些结构的优点在于可以对几乎所有的N都达到最优的效果,其中N表示要相加的部分积的个数。同时它们的连接结构有利于布局的规整性和紧凑性。另一方面,考虑到同一计数器不同输入端口和输出端口之间的延时不一样,Weuiberger在1981年提出了4-2压缩器(4-2Comnreesnr)。4-2压缩器可以把4位相同权重的
17、输入转换成2位输出,除此之外还各有一个内部的输入和输出线。Takagi和Santoro使用这种压缩器构建了比Wallace树结构规整的二元树。Song和De Micheli把4-2压缩器进一步发展为9-2压缩器(9-2 Compressor)。在使用不同的计数器构建不同结构的部分积累加阵列的难点在于,同一计数器的不同输入输出的路径具有不同的延时。需要合理的安排这些路径间的连接才能获得好的性能。图2.5所示是一些典型的部分器累加阵列的连接模式,其中“”表示2个部分积。图2.5 不同加法阵列中加法器间的连接关系2.2 除法器设计的研究现状除法是计算机中较难实现的基本操作。早期的计算机中实现了乘法部
18、件,然后使用乘法算法(Multiplicative Algorithms)通过软件来模拟实现除法功能。即使在实现了除法部件的计算机中,除法的执行效率也远远落后于其他基本运算。在Intel Pentium IV采用的NetBurst微结构中,定点部分加法操作只需要半个周期,移位操作需要4个周期,乘法操作需要14个周期,而除法操作需要60个周期。出现这种状况的原因除了除法本身的复杂性外,还与人们普遍认为除法是不频繁的操作,因此对它的实现并不是很重视有关。但是在当前的许多应用中,对除法效率的忽视己经导致系统整体性能的下降。经典的除法算法可以大致分为5类:数字循环算法(Digit Recurrence
19、)、函数迭代算法(Functional Iteration)、高阶除法算法(Very High Radix)、查表法算法(Table Look-Up)和变延时算法(Variable Latency)。1. 数字循环算法数字循环是最简单、运用最广泛的一类算法,以减法为基本的操作,在每一次迭代中求固定位数的商。这类算法的特点是实现简单、占用面积小,但是延时大,在最早的Resorting方法中,每次尝试在余数中减去除数,然后判断得到的结果,如结果为正就上商1,否则上商0并且恢复余数,即在结果中再加上除数,最后移位进行下一次迭代。Resorting方法一次迭代的框图如图2.6所示。图2.6 Resor
20、ting方法一次迭代框图在这种方法中一次迭代需要2次加法运算。这样增加了不必要的延时,Non-resorting方法把恢复余数的那次加法延迟到下一次迭代中和减法合并,这样在每次迭代中根据上一次上商的结果进行操作,如果上次商为l,这次迭代用余数减去除数。否则用余数加上除数,然后和resorting方法一样得到本次迭代的商。Non-resorting方法一次迭代的框图如图2.7所示。图2.7 Non-resorting方法一次迭代框图采用Non-resorting方法一次迭代只需要一次加法运算,但是在迭代结束后如果最后一次得到的余数是负数需要把这个数加上除数,得到真正的余数。无论是Non-reso
21、rting方法还是resorting方法一次都只能得到一位商。在50年代末60年代初,Robertson(1958)、Tocher(l956)和MacSorley(1961)先后独立提出SRT算法。经过长期的研究,这个算法成为许多当前其他算法的基础。2. 函数迭代算法随着乘法技术的发展,特别是Wallace提出的快速组合乘法器后,出现了以乘法作为基本操作的函数迭代算法。该方法能够在每次迭代中使商的正确位数加倍,从而更快的求得商。虽然需要的迭代数少,但是每次迭代需要的时间会增大。如果为了减少器件数而重复使用己经存在的乘法运算单元,那么还会使乘法部件的性能降低。这类算法主要有Newton-Raph
22、son和Goldschmidt算法。3. 高阶除法算法高阶除法是数字循环算法的一个分支,随着阶数的增加,商选择逻辑,除数的倍数生成变得相当复杂。使每次迭代时间和占用面积超出可接受的范围。高阶除法使用乘法器求除数的倍数。使用查找表得到除数倒数的估计值,一次可以尝试求两位以上的商。Wong和Flynn提出的一种算法每次处理m位数字,可以使余数减少m-2位,从而在n/(m-2)次迭代后得到n位除法的商。4. 查表法算法查表法可以用来帮助函数迭代法和高阶法得到较精确的初始值。当仅需低精度的商的时候,可以直接使用查找表来得到结果。产生最初的估计值的方法有直接估计法和线性估计法。 直接估计法是直接在查找表
23、中找到估计值,优点是不需要算术操作,速度快。缺点是增加估计值的精度,查找表的大小呈指数增长,因此需要在估计值的精度和查找表的大小间进行取舍。 线性估计法又名多项式估计,为了估计1/b的值,选择线性函数:P(b)=-C1*b+C0,在查找表中得到C0和C1的值,然后通过一次乘加运算得到所需的结果。5. 变延时算法数字循环和高阶除法每次求固定位数的商,函数迭代法每次求的商的位数是上一次的两倍,但是他们都在确定的周期数内结束。变延时算法所需的周期数是随着操作数而变化的。这类算法的基础是执行一次迭代时对于不同的操作数所需的时间是不同的。DEC Alpha 211 64使用了这类技术,平均每次迭代求得2
24、、4位商。Williams和Horowitz改进了SRT算法,使用了self-timing和动态逻辑的方法,对于不同的操作数采用不同的延时。Richardson提出了以空间换时间的方法,考虑到程序的重现性,一次操作可能在不久后再次用到。所以每次运算完后把结果和操作数保存在结果缓存中,下一次执行操作时先查找结果缓存,如果找到了就直接得到结果,否则再通过运算得到。如果除法运算使用的是先得到除数的倒数,然后乘以被除数算法的话,可以只保存除数的倒数,然后下一次遇到相同除数的除法操作时,直接经过一次乘法操作就可以得到结果了。这样比同时匹配被除数和除数的概率要大的多。以上这些算法,本质上可以进一步归结为两
25、类,以减法为基本操作的算法和以乘法为基本操作的算法。 以减法为基本操作的算法,虽然完成一次除法所需要的周期数比较长。但是实现比较简单,只需要一个加法器就可以完成。 以乘法为基本操作的算法完成一次除法的周期数可以减少,但是需要乘法器来实现,结构上复杂很多,同时每个周期的延时也增加很多。第3章 8051算术逻辑运算器功能介绍3.1 8051运算器的主要任务8051运算器的主要功能有如下5点: 完成算术运算。 完成逻辑运算。 完成位操作运算。 数据中转与处理。 利用程序状态字PSW记忆运算器运行的某些当前状态。其中算术逻辑单元(ALU)是运算器的核心部件。算术逻辑单元(ALU)完成算术和逻辑运算。运
26、算器有两个输入信号,它们或者来自于累加器或者来自数据总线,运算结果(Z信号)仍通过数据总线送回到累加器ACC中,乘除法指令需分解成多步微操作才能完成,故乘除法指令是8051单片机指令系统中执行时间最长的两条指令。除算术逻辑运算外,ALU还可进行与、或、非、异或、移位、半字交换等逻辑运算。ALU除了给出运算结果外,还要有另外一路输出信号,这是一组状态信号,例如,运行后结果溢出、进位等,用程序状态字寄存器(PSW)的某些位来表示,PSW又称为标志寄存器F(FLAG),其中的各个标志位可以用1或0来表示状态,供用户随时查询。3.2 运算器的相关指令及其功能1. 程序状态字MCS51系列单片机内部的特
27、殊功能寄存器PSW是一个表示程序执行状态的寄存器,即某些指令的执行会对其产生影响,通过检测PSW可获得程序执行的某些状态信息。PSW的格式如下。D7D6D5D4D3D2D1D0CYACF0RS1RS0OVP各位的含义如下。 CY(PSW.7):进位标志。做加、减运算有进位或借位时CY=1,否则CY=0。移位操作可将“1”或“0”移入该位。 AC(PSW.6):辅助进位标志。做运算时若D3向D4有进位或借位则AC=1,否则AC=0,AC主要用于BCD码运算。 F0(PSW.5):用户标志位。这一位可由用户根据需要为其赋以含义。 RS1和RS0(PSW.4、PSW.3):这两位的值组合在一起可以用
28、来选择当前工作寄存器是四组工作寄存器中的哪一组。 OV(PSW.2):溢出标志。运算结果超出-128至+127范围时OV=1。否则OV=0。 (PSW.1):没有含义,用户可把其作为位地址用。 P(PSW.0):奇偶校验位。累加器A中“1”的个数是奇数时P=1,否则P=0。2. 算术运算指令(1)加法指令加法指令分为不带进位加和带进位加两种。 不带进位的加:ADD A,B;AA+B;加法指令中的操作数可以是无符号数、带符号数(用补码表示)或BCD码,计算机在做加法运算时,对它们采取的规则都是一样的;此外,加法指令影响标志寄存器的PSW的CY、AC、OV和P。 带进位的加:ADDC A,B;AA
29、+B+CY(其中CY为程序状态字PSW的最高位)。带进位的加对标志位的影响与不带进位的加法指令相同。(2)减法指令减法指令如下:SUBB A,B; AA-B-CY(其中CY为程序状态字PSW的最高位)MCS-51系统的减法指令只有带借位减,由于该减法操作必须减去CY,所以在不需要CY参加运算时应该把CY清零。减法指令对标志位的影响与加法指令相同。标志位OV的判断标准是:同符号两数相减不产生溢出,符号相异的两数相减有可能产生溢出,正数减去负数得负数或负数减去正数得正数,不符合常理,则一定溢出。加1指令如下:INC A; AA+1;减1指令如下:DEC A; AA-1;加1、减1指令除对累加器操作
30、时对标志P位有影响外,对其余标志位均无影响。乘法指令如下:MUL AB;指令使A和B的内容相乘(无符号数相乘),分成高8位和低8位输出。乘法指令影响到标志位的CY、OV和P。该指令执行后CY=0。若乘积的有效位不超过8位,则OV=0,否则OV=1。除法指令如下:DIV AB;指令将两数作无符号除法,相除后将商和余数分别表示。这条指令也影响到标志位的CY、OV和P。若执行前B=0,OV=1,说明除数为0,除法无意义,该指令对CY和P的影响与乘法指令相同。十进制调整指令如下:DA A;人们习惯于使用十进制数,故有时需要用BCD码进行运算。当两个BCD数相加时,应在加法指令后,紧跟一条DA指令,以便
31、对结果进行调整。指令进行的具体操作是:若结果的低四位大于9或标志AC=1时,作加6调整;若结果的高四位大于9或CY=1(包括由于低四位调整引起的结果),高四位也作加6调整。十进制调整指令只影响标志位CY,若CY=1,表示和已超过或等于十进制数99。3. 逻辑运算指令(1)逻辑与运算指令逻辑与运算指令如下:ANL A,B; AAB;(2)逻辑或运算指令逻辑或运算指令如下:ORL A,B; AAB;(3)逻辑异或运算指令逻辑异或运算指令如下:XRL A,B; 异或运算的逻辑关系是:参与操作的两个数相同时结果为“0”,否则为“1”。(4)清零指令清零指令如下:CPL A; A0;逻辑运算指令中涉及的指令除对标志位P有影响外,其余指令对任何标志位均无影响。4. 移位及半字交换指令(1)循环左移指令循环左移指令如下:RL A; 指令功能是:A中内容左移一位,D7循环回D0。(2)循环右移指令循环右移指令如下:RR A; 指令功能是:A中内容右移一位,D0循环回D7。(3)带进位循环左移指令带进位循环左移指令如下:RLC A;指令功能是:A中内容左移一位,D7进入CY,原CY内容循环回D0。(4)带进位循环右移指令带进
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1