ALU设计简介及源代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ALU设计—回顾内容回顾补码计算算法加法器设计•行波进位加法器•先行进位加法器•选择进位加法器ALU设计行波进位加法器gi=ai·bi(0≤i≤n-1)pi=aibi(0≤i≤n-1)ci+1=gi+pi·ci(0≤i≤n-1)si=aibici=pici(0≤i≤n-1)ALU设计—gipi生成pSabSabSabSab3210babapbagbabapbagS3S2S1S0MC0100110011011baSbaSg23cpcpSMbaSbaSg23baSbaSbaSbaSS0123ALU设计—gipi生成逻辑M采用行波进位的ALU逻辑无符号数除法算法-不恢复余数除法举例A=14=1110除B=001100000111000001110左移一位-00011减(B)─────────111101100P是负的,商“0”11101100左移一位+00011加(B)─────────000001001P是非负的,商“1”00001001左移一位-00011减(B)─────────111100010P是负的,商“0”11100010左移一位+00011加(B)─────────111110100P是负的,商“0”+00011余数是负的,作最后恢复─────────00010商是0100,余数是0010Pnan-1……a0加法器bn-1……b00P:余数寄存器a:被除数寄存器(有左移位功能)b:除数寄存器无符号数除法算法-不恢复余数除法举例A=-7=11001除B=-3=11101|B|=001100000011100000111左移一位+11101加(B)─────────111011110P是负的,商“0”11011110左移一位-11101减(B)─────────111101100P是负的,商“0”11101100左移一位+11101加(B)─────────111101000P是负的,商“0”11101010左移一位-11101减(B)─────────111110100P是负的,商“0”+00011余数是负的,作最后恢复─────────00010商是0100,余数是0010Pnan-1……a0加法器bn-1……b00P:余数寄存器a:被除数寄存器(有左移位功能)b:除数寄存器借助ALU实现除法运算ALUSRdstsrc1src2左移一位SignA总线B总线C总线S[3:0]MC0无符号数除法计算过程无符号整数除法占用35个时钟周期。第一个周期完成被除数初始化操作:dst←0同时为了与有符号整数除法一致,在A、B总线上要分别读出src1和src2/lit的值。第二个周期将被除数送到移位寄存器SR中:SR←(src1)中间32个周期完成下列重复动作:dst←21·(dst)&(SR)-(-1)sign(dst)(src2)│litSR←21·(SR)&!sign(dst),上商当前余数(在dst寄存器中)左移1位时最低位移入SR的最高位。上商规则是本次计算结果为正则商1,否则商0。最后一个周期将商从SR送到dst中。有符号数除法计算过程对有符号整数,将符号数转换为无符号数再按无符号数方法计算。第一步:目的寄存器送全“0”,同时记录src1和src2的符号,dst←0,判(src1)、(src2)│lit的符号第二步:将被除数src1送SR寄存器。若被除数为负,将其求补后再送SR寄存器。第3~34步:重复执行如下操作:dst←21·((dst)&(SR))+(-1)sign(dst)·(-1)sign((src2)│lit)·((src2)│lit)SR←21·(SR),上商上商的规则与无符号数除法相同。第35步:送结果到目的寄存器。若结果为负则求补后再送目的寄存器。dst←(-1)sign((src2)│lit)^sign(src1)·(SR)(通过减法或传送实现)时当时当0110011|1|srcsrcsrcsrcsrcSRALU--HDL实现modulealu_core(opA,opB,S,Cin,M,DO,C,N,Z,V);inputwire[32:0]opA,opB;inputwire[3:0]S;inputwireM,Cin;outputreg[31:0]DO;outputregC,V,N,Z;reg[32:0]LT3,LT2,LT1,LT0,P,G;reg[32:0]Dout;integeri;reg[32:0]zero;reg[33:0]CA;always@(opAoropBorS)for(i=0;i33;i=i+1)beginLT3[i]=S[3]&opA[i]&opB[i];LT2[i]=S[2]&opA[i]&~opB[i];LT1[i]=S[1]&~opA[i]&opB[i];LT0[i]=S[0]&~opA[i]&~opB[i];endalways@(LT3orLT2orLT1orLT0orM)for(i=0;i33;i=i+1)beginP[i]=~(LT3[i]|LT2[i]|LT1[i]|LT0[i]);G[i]=LT3[i]|LT2[i]|~M;endalways@(PorGorCin)beginCA[0]=Cin;//CA[i]:carrytoibitfor(i=0;i33;i=i+1)beginCA[i+1]=G[i]|(P[i]&CA[i]);Dout[i]=P[i]^CA[i];end{C,DO}=Dout;V=Dout[32]^Dout[31];if(DO)Z=0;elseZ=1;N=DO[31];endendmodule定点乘法器设计定点乘法器设计•乘法器是高性能微处理器中的关键部件,是进行高速计算特别是信号处理等方面应用时所必须的。•定点乘法器应支持有符号数和无符号数乘法。•本章主要介绍32位定点乘法器设计方法:•假定:被乘数:A=an-1an-2…a0乘数:B=bn-1bn-2…b0乘积:P=AB乘法计算方法•用笔算进行乘法计算的方法为:01011010000001010000010100110010乘积部分积乘数被乘数术语•乘法计算过程–产生部分积–部分积相加乘法运算的关键•要提高乘法计算速度,需要:加快部分积的形成减少部分积数目采用多位扫描、跳过连续的0/1串和对乘数重编码(如Booth算法)等处理方法加快部分积加法运算的速度一般是利用进位保留加法器(CSA)先使参与操作的部分积形成两个数(这两个数分别是伪和与局部进位)二阶Booth算法00110001001100010二阶Booth编码bi+1bibi-1重编码操作0000中间结果右移2位0011加A;中间结果右移2位0101加A;中间结果右移2位0112加2A;中间结果右移2位100-2减2A;中间结果右移2位101-1减A;中间结果右移2位110-1减A;中间结果右移2位1110中间结果右移2位01010010100001010010110111110101531h=?111-212020最低位补一位0为什么?二阶Booth算法乘数:B=bn-1bn-2…b0Bbbnniiin110222=-bn-12n-1+bn-22n-2+bn-32n-3+bn-42n-4+…+b020=-2bn-12n-2+bn-22n-2+bn-32n-2-bn-32n-3+bn-42n-4+…+b020=(-2bn-1+bn-2+bn-3)2n-2-bn-32n-3+bn-42n-4+…+b020jiiiiibbbB02122122)2(乘数必须是偶数位二阶Booth算法—控制信号编码b2i+1b2ib2i-1重编码符号与数值分别控制直接按重新编码控制NEGB1B2YZYP1YN1YP2YN2000000010000001101001000010101001000011200100010100-210100001101-111000100110-111000100111-010010000NEG2i=b2i+1部分积取1倍的控制信号B12i逻辑是:B12i=b2Ib2i-1部分积取2倍的控制信号B22i逻辑是:对于第j位部分积产生逻辑:pp2i,j=(aj·B12i+aj-1·B22i)NEG2iBbbbbbbiiiiiii222122121221二阶Booth算法—控制信号产生逻辑编码电路部分积产生电路二阶Booth算法举例001100010011000100101001010000101001011000111110101最低位补一位0531h=F5h(-6)+12=611010+01100001101010+0110010110x二阶Booth算法举例0101000000001010000000000111010000001010100000011110101531h=F5h防止符号位扩展•例:B=9=(001001)2,A=10=(01010)2,AB=90=(01011010)2的执行过程。防止符号位扩展•例:B=9=(001001)2,A=10=(01010)2,AB=90=(01011010)2的执行过程。防止符号位扩展•防止符号扩展的方式解决部分积是负数时可能产生的问题。•假定所有的部分积都为负,那么所有符号扩展的“1”的和是:•这个数可以作为一个固定的值加在部分积中。由于2m-1=4m/2-1=3(4m/2-1+4m/2-2+…+41+40)•因此符号扩展的“1”对应的二进制数可以表示为(10101…01011)2,它共有m位,最低位的权是2n。•如果一个部分积实际上非负,为了消除假定它是负数所带来的影响,只需将它的符号位用“1”代替即可。signsniminm(())()()(/)12421213021二阶Booth算法—举例•例:B=9=(001001)2,A=10=(01010)2,AB=90=(01011010)2的执行过程。加法器树-保留进位加法器•二阶Booth算法针对补码数操作。若进行无符号数乘法,则需要将无符号数转换为符号数,即在高位补两位0。•32位乘法器产生17个部分积,再加上防止符号位扩展的补偿数,共18个部分积。•加法器树采用保留进位加法器加法器树-保留进位加法器加法器树-保留进位加法器•基本的加法器单元多采用(2,2)计数器(半加器)、(3,2)计数器、(5,3)计数器和(7,3)计数器等++++++++++++CLA加法器c+sp1p2p3加法器树—4-2压缩加法器•4-2压缩器的加法器单元在乘法器的设计中得到了广泛采用。它可以较快地完成中间伪和的产生,而逻辑又比较简单加法器树-保留进位加法器加法器树—线性阵列•结构最简单规整,速度最慢,需要8级4-2加法器串联加法器树—WallaceTree•速度最快,但结构不规则加法器树—折衷结构•32位乘法器只有18个部分积,可以采用折衷结构:在速度和规则性进行折衷加法器树—折衷结构加法器树安排•将加法器树安排为近似矩形乘法器结构乘数编码被乘数64位加法器部分积产生4-2压缩器BA乘法器结果乘法器结构示意图乘法器乘数编码被乘数乘法器-HDL实现modulemult(P,RAbus,RBbus,Ssign);inputwiresigned[31:0]RAbus,RBbus;outputwiresigned[63:0]P;assignP=RAbus*RBbus;endmodulemodulemult(P,RAbus,RBbus,Ssign);inputwire[31:0]RAbus,RBbus;outputwire[63:0]P;inputwireSsign;DW02_mult#(32,32)U1(.A(RAbus),.B(RBbus),.TC(),.PRODUCT(P));

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功