您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 第94章Verilog设计进阶
第9章Verilog设计进阶9.1加法器设计◆级连加法器◆数据流描述的加法器◆超前进位加法器◆流水线加法器(1)级连加法器a[0]b[0]cinsum[0]1位全加器a[1]b[1]cin[1]1位全加器a[7]b[7]cin[7]1位全加器sum[1]sum[7]a[2]b[2]cin[2]1位全加器sum[2]cout结构简单,n倍延时,主要是进位信号级连造成。moduleadd_jl(sum,cout,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;full_add1f0(a[0],b[0],cin,sum[0],cin1);//级连描述full_add1f1(a[1],b[1],cin1,sum[1],cin2);full_add1f2(a[2],b[2],cin2,sum[2],cin3);full_add1f3(a[3],b[3],cin3,sum[3],cin4);full_add1f4(a[4],b[4],cin4,sum[4],cin5);full_add1f5(a[5],b[5],cin5,sum[5],cin6);full_add1f6(a[6],b[6],cin6,sum[6],cin7);full_add1f7(a[7],b[7],cin7,sum[7],cout);endmodule8位级连加法器代码(2)数据流描述的加法器moduleadd_bx(cout,sum,a,b,cin);parameterWIDTH=8;inputcin;outputcout;input[WIDTH-1:0]a,b;output[WIDTH-1:0]sum;assign{cout,sum}=a+b+cin;endmodule全部由逻辑门实现,级联超前进位加法器超前进位链能有效减少进位的的延时令G=ab,P=a+b,inininOUTcbaabcacbbaC)()()()(incbasumininOUTcPGcbaabC)(比级联加法器耗用资源更多(3)8位超前进位加法器moduleadd_ahead(sum,cout,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;wire[7:0]G,P;wire[7:0]C,sum;assignG[0]=a[0]&b[0];assignP[0]=a[0]|b[0];assignC[0]=cin;assignsum[0]=G[0]^P[0]^C[0];assignG[1]=a[1]&b[1];assignP[1]=a[1]|b[1];assignC[1]=G[0]|(P[0]&cin);assignsum[1]=G[1]^P[1]^C[1];assignG[2]=a[2]&b[2];assignP[2]=a[2]|b[2];assignC[2]=G[1]|(P[1]&C[1]);assignsum[2]=G[2]^P[2]^C[2];assignG[3]=a[3]&b[3];assignP[3]=a[3]|b[3];assignC[3]=G[2]|(P[2]&C[2]);assignsum[3]=G[3]^P[3]^C[3];assignG[4]=a[4]&b[4];assignP[4]=a[4]|b[4];assignC[4]=G[3]|(P[3]&C[3]);assignsum[4]=G[2]^P[2]^C[2];assignG[5]=a[5]&b[5];assignP[5]=a[5]|b[5];assignC[5]=G[4]|(P[4]&C[4]);assignsum[5]=G[5]^P[5]^C[5];assignG[6]=a[6]&b[6];assignP[6]=a[6]|b[6];assignC[6]=G[5]|(P[5]&C[5]);assignsum[6]=G[6]^P[6]^C[6];assignG[7]=a[7]&b[7];assignP[7]=a[7]|b[7];assignC[7]=G[6]|(P[6]&C[6]);assignsum[7]=G[7]^P[7]^C[7];assigncout=G[7]|(P[7]&C[7]);endmodule(4)流水线加法器流水线设计技术(Pipeline)基本思想:在逻辑电路中加入若干寄存器来暂存中间结果,虽然多用了一些寄存器资源,但减少了每一级组合电路的延时,因此可提高整个加法器的运行频率。(4)流水线加法器-10.2moduleadder8(cout,sum,a,b,cin,enable);input[7:0]a,b;inputcin,enable;output[7:0]sum;reg[7:0]sum;outputcout;regcout;reg[3:0]tempa,tempb,firsts;regfirstc;always@(posedgeenable)begin{firstc,firsts}=a[3:0]+b[3:0]+cin;tempa=a[7:4];tempb=b[7:4];endalways@(posedgeenable)begin{cout,sum[7:4]}=tempa+tempb+firstc;sum[3:0]=firsts;endendmodule9.2乘法器◆并行乘法器◆移位相加乘法器◆查找表乘法器◆加法树乘法器modulemult(outcome,a,b);parametersize=8;input[size:1]a,b;output[2*size:1]outcome;assignoutcome=a*b;endmodule(1)并行乘法器利用Verilog语言的乘法操作符,可很容易地实现并行乘法器,并可由EDA综合软件自动转化为电路网表结构8×8并行乘法器的门级综合原理图(1)并行乘法器如果所用的FPGA中内有嵌入式乘法器,建议用乘法器来实现乘法操作,硬件乘法器具有速度快、资源利用合理等优点。Tools-ChipPlanner(2)移位相加乘法器移位相加乘法器将乘法变为加法实现,其设计思路是:乘法通过逐次移位相加实现,每次判断乘数的最低位,若为1则将被乘数移位相加。相对节省资源被乘数A1011110110110000010111011110111101110001111×乘数B部分积0部分积1部分积2积PA左移A左移4×4移位相加乘法操作示意图8位移位相加乘法器顶层设计8位移位相加乘法器时序仿真波形图9.11底层模块也使用状态机来实现,相对节省资源。(3)加法树乘法器增加若干寄存器来暂存数据,增加了芯片资源的耗用,但加法树乘法器能在一个时钟周期内完成两数相乘,提高了运算速度。【例9.7】8位加法树乘法器moduleadd_tree(out,a,b,clk);input[7:0]a,b;inputclk;outputwire[15:0]out;wire[14:0]out1,c1;wire[12:0]out2;wire[10:0]out3,c2;wire[8:0]out4;reg[14:0]temp0;reg[13:0]temp1;reg[12:0]temp2;reg[11:0]temp3;reg[10:0]temp4;reg[9:0]temp5;reg[8:0]temp6;reg[7:0]temp7;function[7:0]mult8x1;//该函数实现8×1乘法input[7:0]operand;inputsel;beginmult8x1=(sel)?(operand):8'b00000000;endendfunctionalways@(posedgeclk)//调用函数实现操作数b各位与操作数a的相乘begintemp7=mult8x1(a,b[0]);temp6=((mult8x1(a,b[1]))1);temp5=((mult8x1(a,b[2]))2);temp4=((mult8x1(a,b[3]))3);temp3=((mult8x1(a,b[4]))4);temp2=((mult8x1(a,b[5]))5);temp1=((mult8x1(a,b[6]))6);temp0=((mult8x1(a,b[7]))7);endassignout1=temp0+temp1;//加法树运算assignout2=temp2+temp3;assignout3=temp4+temp5;assignout4=temp6+temp7;assignc1=out1+out2;assignc2=out3+out4;assignout=c1+c2;endmodule(4)查找表乘法器-P90-3.4.6节查找表乘法器将乘积直接存放在存储器中,将操作数(乘数和被乘数)作为地址访问存储器,得到的输出数据就是乘法运算的结果。查找表方式的乘法器速度只局限于所使用存储器的存取速度。但由于查找表规模随操作数位数增加而迅速增大,因此如用于实现位数宽的乘法操作,需要FPGA器件具有较大的片内存储器模块。比如,要实现8×8乘法,要求存储器的地址位宽为16位,字长为16位,即存储器大小为1M比特。ROM(ReadOnlyMemory,只读存储器)是存储器的一种,利用FPGA可以实现ROM的功能,但其不是真正意义上的ROM,因为FPGA器件在掉电后,其内部的所有信息都会丢失,再次工作时需要重新配置。QuartusII提供的参数化ROM是lpm_rom,下面用一个乘法器的例子来说明它的使用方法,这个例子使用lpm_rom构成一个4位×4位的无符号数乘法器,利用查表方法完成乘法功能。3.4.6存储器模块(storage)P90如下图所示是基于ROM实现的4位×4位的无符号数乘法器电路图,其参数设置为:LPM_WIDTH=8LPM_WIDTHAD=8LPM_FILE=mult_rom.mif仿真结果乘累加器的结构框图实现相乘和累加的功能9.3乘累加器(MultiplyAccumulatorMAC)乘累加器(MAC)moduleMAC(out,opa,opb,clk,clr);output[15:0]out;input[7:0]opa,opb;inputclk,clr;wire[15:0]sum;reg[15:0]out;function[15:0]mult;//函数定义,mult函数完成乘法操作input[7:0]opa,opb;reg[15:0]result;integeri;beginresult=opa[0]?opb:0;for(i=1;i=7;i=i+1)beginif(opa[i]==1)result=result+(opb(i-1));endmult=result;endendfunctionassignsum=mult(opa,opb)+out;always@(posedgeclkorposedgeclr)beginif(clr)out=0;elseout=sum;endendmodule偶数分频:详见习题6.18-P165偶数2n次分频,占空比是50%:计数到n-1(从0开始计),波形就翻转;或在最后一级加一个2分频器。modulefdiv12(reset,clkin,clkout,qout);inputreset,clkin;outputregclkout;outputreg[4:0]qout;always@(posedgeclkin)beginif(!reset)beginclkout=0;qout=0;endelsebeginif(qout==5)beginqout=0;clkout=~clkout;endelseqout=qout+5'b00001;endendendmodule偶数分频-习题6.18P165【例
本文标题:第94章Verilog设计进阶
链接地址:https://www.777doc.com/doc-2129315 .html