EDA:quartus II 13. 1
平台:CycloneV:5CSEMA5F31C6
阅读“《自己设计制作CPU与单片机》 ---- 姜咏江”
粗略过渡到门级的一片笔记:[D-VII] (数)晶体管2逻辑门2寄存器s。个人笔记中的文字表达极差。读书后为此次整数加减法器练习的quartus II 工程保存地址:to_addsuber。32位限位浮点数加减法器笔记保存地址:to_faddsub。
2015.06.13
一个全加法器能够处理“加数(a)”、“被加数(b)”以及“来自低位的进位(l2c)”从而得到正确的“和(s)”和“向高位的进位(c2h)”。如果得到一位全加法器,那么可以由一位全加法器得到n位加法器。
分析1位全加法器cadder1的功能:
根据cadder1的真值表可得1位全加法器两输出的逻辑函数式:
s = !a·!b·l2c + !a·b·!l2c + a·!b·!l2c +a·b·l2c
c2h = !a·b·l2c + a·!b·l2c + a·b·!l2c + a·b·l2c
仔细想想3个二进制位相加就可以很容易记住cadder1的逻辑函数式子。
根据cadder1的逻辑表达式绘制出cadder1对应的电路描述图:
Figure 1. cadder1电路描述图
cadder1的功能仿真图形:
Figure 2. cadder1功能仿真图形
利用cadder1(的封装)可以得到n位2进制数的加法器。以4位加法器为例,绘制出其电路描述图:
Figure 3. cadder4电路描述图
当用cadder4做加法时,最低位inst的l2c可一直设置为0,最高位inst3的c2h为向更高位的进位。cadder4的功能仿真图为:
Figure 4. cadder4功能仿真图
当两数之和超过4位能够表示的范围(16)时,向更高位进位的c2h位为1。两数之和的结果为5位,c2h位为最高位。利用cadder4(的封装)可以得到n位的加法器。
2015.06.15
以前在计算机课上听老师说过计算机内的减法被转换成加法来完成计算(对怎么转换的毫无概念)。这个过程需要用某个理论规定来支撑(见“第十章机器表示数和运算”),作者的限位数对称制规定能够让减法转换为加法:一个限位数a减去另外一个限位数b等于a加上b的对称码。b的对称码等于其反码加1。根据反码的定义,一个二进制数的反码刚好是对其每位进行取反运算后得到的数。对二进制数每位取反可以用异或逻辑来完成。用cadder4的封装,那么一个8位的加减法器caddsub8可以用以下电路图来描述:
Figure 5. caddsub8电路描述图
两个相同的二进制数进行异或运算后的结果为此二进制的反码。图中的异或门跟相连的总线数目一样(为了绘图方便,quartusII提供的机制)。sub为1时得到b[7..0]的反码,同时当sub= 1时,就得到了b[7..0]的对称码,将减法转换成了加法。
caddsub8电路的功能仿真:
Figure 6. caddsub8仿真图
当sub为1时caddsub8完成a[7:0]– b[7:0];当sub为0时caddsub8完成a[7:0]+ b[7:0]。利用caddsub8(的封装)可以得到n位加减法器。在完成这些运算的过程中,像8Fh+ 8Fh = 11Eh则超出了caddsub8能表示数的范围而得到不正确的结果,这种现象被称为溢出。一旦发生溢出,就得不到正确的结果。
溢出的判断方法跟设计加减法器的理论机制有关。根据作者限位数对称制理论,只有在“同号两数相加或异号两数相减,结果符号与第一个数不同”时溢出。
按照判断溢出的描述列真值表,发现真值表描述的电路比书上的要复杂(可能还需化简之类的),就直接斗了一下这两种情况(斗的方法应该在真值表之前),得到了跟书上一样的电路描述图。
Figure 7. 判断溢出的电路描述图
将判断溢出的电路加到caddsub8的仿真文件中,得到的仿真图如下:
Figure 8. 溢出判断仿真图
在未产生溢出的情况下,caddsub8的运算结果(s)是正确的;如果产生溢出运算结果就不对了,需要给溢出的部分扩充位数。
2015.06.17
针对于n(如8)位二进制数的加减法的溢出,可以将这n位二进制数扩位到16位(实际扩到n+1位就可以解决溢出问题,之所以扩位成2n位是因为可用一个n位加减法器来扩位后的2n位二进制数,具体的做法是先计算低n位,再根据低n位的进位计算高n位)。
根据限位数对称制,当一个二进制数为负数时,扩位补1(顶码);当一个二进制数为正数时,扩位补0。
作加法时,计算低n位时最低位不需要进位(l2c输入为0);作减法时,计算低n位时l2c和sub为1以取得减数的对称码;计算高n位时,要加上计算低n位时产生的进位(c2h)。根据这个粗略的描述用真值表体现出分段加减法器的功能:
Figure 9. 加减法分段计算真值表
由真值表得到l2c的逻辑表达式:l2c= !w·sub + w·!sub·c2h + w·sub·c2h = !w·sub + w·c2h(!sub + sub) = !w·sub + w·c2h。由此逻辑表达式绘出电路描述图:
Figure 10. 分段加减法器控制电路描述图
原来的8位加减法器需要改动最低位的进位处的标号,使之和l2c相连:
Figure 11. 加减法器电路描述图
以上2图结合溢出判断电路的功能仿真图如下,7以8fh+ 8fh示例:
Figure 12. 8f + 8f示例
根据限位数对称制,8f为负数,对其进行扩位时高位补1。8fh+ 8fh = ff8fh + ff8fh –> 先计算低8位,8fh+ 8fh = 1eh,向高位进1-->结合低8位进位计算高8位,ffh+ ffh + 1h = ff1eh,ff1eh对应的真实值为-00e2。手动计算8fh+ 8fh -->-71h – 71h = -e2。scaddsub8分段处理溢出问题成功。
以2位二进制为例。
Figure13. 2位二进制作和
两位二进制数的两两之和的结果都是集合内的元素。当结果为3位时,低两位也是集合内的元素,且包含除最大的二进制数。
Figure14. 对二进制集合进行规定
将集合中的数按对半分,值较大(最高位为1的所有二进制数)的一半数用来表示负数,如图所示。除了5.1中注色部分,其余的运算结果都正确。标色部分为就是前面提到的溢出,需要用扩位的方法将结果计算正确。
经5.2中的规定后,负数和正数的个数一样多。按照绝对值从小到大的顺序对应它们:-01---- 00;-10 ---- 01。负数的绝对值比其所对应的正数的绝对值大1。
将正数和表示负数的数按照各自代表的真实值的绝对值从小到大的顺序排对应它们:00– 11;01 – 10。它们的关系是互为反码(每位取反)。
所以,由一个负数求表示它的二进制数的操作为:负数绝对值减1取反(或者负数绝对值的反码加1)。如-10的表示数为~(10-1)=10或者~10 + 1 = 10。
这些规律适合n进制数。
2015.07.07
国际标准化组织ISO已经给出了单精度IEEE754标准。作者根据限位数的原理想出了限位浮点数的表示。一个32位的限位数浮点数的表示如下。
Figure1. 32位限位浮点数表示
尾数小数点前不带数字。如在浮点数.011bx 2(00000001b)中,00000001b表示阶码,011b表示尾码。阶码和尾码的最高位为1时表示其为负,为0时表示其为正。在浮点数.011bx 2(00000001b)中,阶码和尾数都为正,表示的真实值为其本身(.11b= 1 x 2-1 + 1 x 2-2 = 0.75);在浮点数.111x 2(10000001b)中,阶码和尾数最高位都为1,它们表示的真实值是一个负数,尾数表示的负数为-(1.000b– .111b) = -.001b(或由.111b取反加1得来),阶码表示的负数为-01111111b(-127),那么.111x 2(10000001b)表示的浮点数的真实值为-.001bx 2-01111111b(将小数点左移127位,尾数为24位,这个数表示的就是0了)。
在限位浮点数阶码相同的情况下,限位浮点数的加减法就是尾数的加减法。如.011x 2(00000001b) - .001 x 2(00000001b) = .010 x 2(00000001b)。对于阶码不同的限位浮点数,需要将其阶码化为相同后再作尾数的加减法从而得到结果,且将较小的阶码转化为较大的阶码。如.011x 2(00000001b) - .01 x 2(00000000b)= .011 x 2(00000001b) - .001x 2(00000001b) = .010 x 2(00000001b)。(对于正数来说,左移小数点即在尾数前添加0来完成增大阶码的目的;对于负数来说,左移小数点即在尾数前添加1来完成增大阶码的目的。正数添0、负数添1跟限位数对称制理论相关联。)
Figure2. 限位浮点数需要的模块
先根据分析(主要由书的作者)来斗限位浮点数所需的各个功能模块,如果到最后差某个模块后再分析。
2015.07.08
对于两个十进制数m,n来说,m– n > 0时则表明m大于n,反之则表示m小于n。根据限位浮点数的表示,阶码乃书中的限位数理论思想的产物,限位数二进制下的两数a[n-1..0],b[n-1..0]相减得到结果的正负能够说明两个数的大小么?根据限位数理论,a[n-1..0]– b[n-1..0] = a – b + 2n(a,b分别为a[n-1..0],b[n-1..0]的简写)。a和b的取值分为以下几种情况。
Figure3. 限位数二进制的减法
除了发生溢出的2种情况,能够根据限位数减法得到结果的正负来判断2限位数的大小。根据此要求斗一个减法器出来判断2个8位限位数(阶码)大小(能够处理溢出情况)。
8位的减法器suber8在工程文件suber8.bdf中(由to_addsuber中的caddsub8(符合限位数加减法规律)改造而来:将最低位恒设为1,再将减数各位取反后输入加法单元中,去掉做加法时的溢出判断)。suber8减法器功能仿真如下图。
Figure4. suber8功能仿真
在suber8发生溢出的时候结果不正确。会发生溢出有2两种情况:a>0>b及b>0>a。
2015.07.09
在suber8没有发生溢出的情况下,suber8得出的差最高位为1时表明此差为负数,则需要对此数各位取反加1得其绝对值;当suber8得出的差的最高位为0时表明此差为正数,不需要取反加1的操作。符合此功能的描述的电路在to_mdivider工程下的to_abv8.bdf文件中。
尾数移位
尾数右移的位数由两限位浮点数阶码差的绝对值sub决定。(阶码较小所对应的)尾数要向右移sub位。阶码共8位,其表示的范围为-128 ~ 127。sub的最大值为255,故而尾数最多可被移位255位(尾数一共只有24位,移位24位后直接取24位尾数即可)。
移位时高位的补位值
尾数为负时,尾数向右移位时高位补1(如.1011向右移动两位后变为.111011);尾数为正时,尾数向右移位时高位补0(如.0011向右移动两位后变为.000011)。
尾数移位分析
sub值为多少就将尾数右移多少位,同时给空出的高位补位。可以通过译码器完成sub所对应的值,给高位所补值需要看尾数的正负。
24位译码器电路描述图
24位译码器的输入为sub,第sub根线上有输出(对于译码器,可列举较少的位如4位列其真值表得其逻辑表达式,然后推广到8位或者见书中14.10章节)。因为只有前24(0 ~ 23)对尾数移位有意义,故而将24 ~ 255的sub值都归为第25种情形(只要不是前24种情况就是后面的232种情况)。24位译码器在工程下的sdc24.bdf文件中。sdc24的功能仿真图如下。
Figure5. sr24功能仿真图
高位补码电路描述图
将24位译码器电路描述图封装,将其添加到sr24.bdf文件中。当尾数为负数时,移位后空出的高位补1,移位超过24位后尾数全为1;反之补0,移位超过24位后尾数全为0。通过判断尾数的最高位和移位位数得到最多的24位补位值。根据尾数最高位和移位是否超过24位来斗出书上的补位电路描述图(亦可根据此两位直接列其真值表而得到对应的最简逻辑表达式)。此部分电路描述图被包含在sr24.bdf文件中。
移位补位电路描述图
当接收到译码器sdc24输出的移位值k后,让高24 – k位与输出的低24 – k位。同时用补位值补高位空出的k位。此部分电路描述图被斗在sr24.bdf中。可见,硬件电路各个元件之间的连线众多,使用时将其连通(很多连线之间连通关系为互斥)。sr24电路的功能仿真如下图。
Figure6. sr24功能仿真图
图中这些值的移位都是正确的。
24位尾数的加减法可由cadder4组合而来,并为其加上溢出判断电路描述。24位尾数的加减法器在工程下的ocaddsub24.bdf文件中。用的还是限位数指导思想。ocaddsub24功能仿真图如下。
Figure7. ocaddsub24功能仿真图
图中列举的a,b的值所做的加减法是正确的(of= 1时为溢出情况,结果不正确)。
2015.07.10
按照“限位浮点数加减法器数据流程和对应的功能模块”分析图,已将所有的模块斗了出来。现在将这些模块都拖到to_faddsub32.bdf中,按照分析图将32位限位浮点数的加减法器to_faddsub32斗出来。
两个浮点数是整个设计的输入,将高8位视作阶码,低24位视作尾码;将阶码送入8位减法器suber8中,输出两阶码差及溢出标志(减法器发生溢出时结果不再正确,此标志用来在后面选择阶码较小的尾数)。整个描述如下图。
Figure8. 限位浮点数阶码大小判断
根据求绝对值电路的设计,直接将两浮点数阶码差输入到求绝对值电路to_adv8即可(可以不将c2h作为输出引脚)。如果阶码差无溢出则可直接对其求绝对值,如果阶码差溢出(fdof = 1)则计算结果不正确,只对应2种情况fa[31..24]> 0 > fb[31..24]或fb[31..24]> 0 > fa[31..24]。且发生溢出时,移位一定超过24位。求阶码差绝对值过程描述如下图。
Figure9. 求阶码差的绝对值
在求两浮点数阶码差的过程中,如果无溢出(fdof= 0)则可直接根据差值(fds[7..0])的最高位来判断两个浮点数的大小(fds[7]= 0时,fa[31..24] >=fb[31..24];fds[7]= 1时,fa[31..24] <fb[31..24]),然后将阶码较小的浮点数的尾数送入尾数右移器sr24中即可。此部分电路描述图如下。
Figure10. 选择阶码较小的尾数进入右移器
限位数浮点进行fa[31..0]– fb[31..0]的操作。只要限位浮点数的尾数被送进sr24器件则表明此限位浮点数的尾数经过了右移操作,将右移过后的尾数作为oscaddsub24的加(减)数输入端。
Figure11. 添标志量k
Figure12. 得到位数加法器的输入
fs[23..0]为尾数经过加或减运算后的结果。还需要选择出原来较大的阶码作为限位浮点数的高8位。当fa[23…0]被送入sr24尾数移位器中移位时则表明fb[31..24]较大,反之fa[31..24]较大。这个选择过程可直接在k标志下完成。另外,ocaddsub24de 的c2h输出为向正数部分的进位,of标志为溢出标志,表明计算结果不正确。