verilog hdl的故事之整数乘法器_第1页
verilog hdl的故事之整数乘法器_第2页
verilog hdl的故事之整数乘法器_第3页
verilog hdl的故事之整数乘法器_第4页
verilog hdl的故事之整数乘法器_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VerilogVerilogHDLPAGE2PAGE2解开疑问之外,自然而然和“硬件乘法器”有关...器(虽然VerilogHDL语言也可以描述由组合逻辑建立而成的乘法器。话长了...话说在寻找资料之际,笔者不得不感谢那些无私的博客和博文,国内那些打用。果然还是百科,鸟文最情切。 第一章整数乘法 BOOTH算法乘法 笔者情有独钟的步骤 Booth算法乘法器的改 实验四:Booth算法乘法器改 LUT乘法 实验五:基于Quartersquare的查表乘法 ModifiedBooth算法乘法 实验六:ModifiedBooth乘法 1.10ModifiedBooth乘法器· 实验七:ModifiedBooth乘法器· 整数在IEEE的规定上有,短整数shortinteger,中整数integer和长整数longinteger,它们之间的关系如下:-127~ +127+127+4-127-4,时的笔者曾经这个东西头疼过。一个负值表示如-4,是由+4 // // //1(+127)和B=8'b1000_0001(-127)。ififA[7] ifB[7] B280~255,但是符号位的出现吃掉了最,所以造成由28的取值范围变成27=0~171。?在短整数里面存在一个成员。该成员很神秘,它不是正值,即不是负值或者0值。而且它的能力也不可忽视,它划分了正值和负值的边界,它就是 8'b1000_00008'b1000_0000之后是负值。如果读者硬是要说8'b1000_00000”,笔记也无话可说 // // //13x412341。大伙们都明白那是整数,但是初中的一段时间说不出话来。好一段时间笔者都是自己在嘀咕3x3x4=-3x4=-3x-4=--3x-4=4312@#¥%#¥*!%"(乘法的门儿,考试还常常满江红,真的悲剧的初衷时代AB正正正负负负负正3x4=12;-3x4=-3x-4=--3x-4=“异或”关系来判断...”3~11Start_SigDone_Sig是仿顺序操作的标志性结构,不明白的去看笔者之前写的笔记。MultiplicandMultiplier被乘数和乘数),都是8位位宽,所以输出Product16位位宽。第16~21行是该模块所使用的寄存器i寄存表示步骤,McandMultiplicand的正值,Mer用来暂存Multiplier的正值,Temp寄存器是操作空间。然而isNeg标志寄存器是用来寄存Multiplicand和Multiplier之间的正负关系。0(36~45行)39行isNeg寄存“乘数和被乘数之间的正负40行,McandMultiplicand的正值,该行表示:如果被乘数的符号位是逻辑1的话,就将负值转换为正值,然后Mcand寄存该值,否则Mcand直接寄存Multiplicand41行是用来寄存Multiplier40行很相识。寄存就递减(49行Mer0(48行2~3是么Temp的结果从负值转换为正值。否则直接输出Temp的值。VerilogHDLPAGE9PAGE9VerilogVerilogHDL第39行以下和普通的仿顺序操作的写法一样,不明白的话请看笔者以往写过的笔记。步骤0~3,会输入不同的乘数和被乘数来激励multiplier_module.v。体的原因在下一章节解释VerilogHDL语言所描述的乘法器的消耗是以“时钟”作为时间单位。反之,组合逻辑所建立的乘法器是以“广播时间”作为时间单位。说简单点就是,VerilogHDL语言所假设A=10,B= AxB,那么时钟的消耗至少需要20个,因为A值需要累加有学过乘法的朋友都知道A(B)=B(A)。如果以实验一的乘法器作为基础,那么A(B)和B(A)所消耗的时间就不一样了。所以我们可以这样改进:{{Multiplier,Multiplicand}=Multiplicand<Multiplier?{Multiplicand,Multiplier}{Multiplier,Multiplicand举个例子:Multiplicand2,Multiplicand10实验二:.vt在仿真的结果上,10x22x10127x127的乘数和被乘数,咋也看不出什么优化过生活的大反转,看到了自己存在意义,有的人则...当然补码也有存在的意-3 8 5-38-30011110181000相加就会得到5,亦即0101。至于溢出的最可以无视掉。-3 -2 -5其实,如QuartusII综合器,当我们使用“-”算术操作符的时候,其实就AA=B=ABA~B1'b1:Booth它就是Booth算法乘法器。实际上Booth算法是一种“加码”乘法运算。000110110010 //LSB右边出现的就是-1 2,那么乘数2的加码过程会是如下。00100010001000100010BB-1(-1 从数学的角度看来,确实Booth算法是麻烦的存在,但是在位操作的角度来看就不是这么一回事。实际上在千奇百怪的位操作乘法中,Booth算法其中可以容纳“补码”亦即00011011Booth算法。Booth算法在位操作的时候,它使用一个很有个性的空间,就是P空间。A70111)B20010)n4P空间的容量是nx2+1,亦即9位。________ //P空间 那么P空间如何实现乘法的位操作呢?-1被乘数P空间,P=00000000P[4..1]P=00000010判断P[1:0]2'b00P=00000010],P=00000001P=00000001P空间的[8..5]AP=00000001 P=10010001],P=11001000P=11001000P空间的[8..5]Ap=11001000 P=001110001无视 P=00011100判断P[1:0]2'b00P=00011100],P=00001110P空间的[8..1]P=00001110实验三:Booth

如左边的循环图。A为被乘数,AP为操作空间。一开始P导致P空间右移一次,至于右移由当时P[8]说了算。n13~15行是仿真的输出(SSimulationQOutput20~25行定义了该模块所使用的寄存器。aA值,s-1(A)的值,p寄存器是P空表示n位,用来指示n次循环。1(43~51行)p[1:0]2(53~55行)是执行右移一位,3~57~6172~74行是仿真用的输出信号,功能如字面上的意思。P空间的详细操作过程,自己看吧,界面有限的关系。从仿真结果上可以看到,4次的乘法操作所使用的时间都一样,尤其是-127x-127的情形,不像传统乘空间的[Width*2:Width+1]是用来执行和被乘数A的操作)要先操作后移位的关系,所以多出8个时钟的消耗在笔者初学VerilogHDLVerilogHDL语言和时序的关系,吃了步骤i有关《VerilogHDL那些事儿》那本笔记,虽然笔者的实例都和“它”有关。但是在笔记中,笔者只是微微的带过“步骤i...i是什么,那不是初学VerilogHDL的任务。步骤i的用法很简单,从概念上和“顺序操i,低级建模里面有一个准则,就是“一个模块一个到i被清理,这也表示了这个模块已经结束工作。或者可以这样说“一个模块不会出现两个步骤i。具体上,步骤i的“值”是指示着“第几个时钟沿”发生,然而VerilogHDL语言里的“步骤”和C语言里的“步骤”是不一样。C语言里的“步骤”就好比“把大象放进冰如上面的示意图所示,在这个时间点里所发生的“决定”会产生不一样的未来。然而在初值是0。case(case(ibeginA<=A+2'd2;B<=B+2'd3;i<=i+1'b1;if(A>3)beginB<=A;A=0;i<=i+1'b1;endelseifi<=i+1'b1;i0的时候,A2,B3在i=1的时候,如果A大于 0过后所产生的结果”。"<="...如果换做时间点的概念来说“<=”的操作符,表示了“在这个时间点下决定”的赋值操作符。问题A,B和Ccase(case(ibeginA<=3;B<=4;C<=0;i<=i+1'b1;C<=A+if(C>0)beginA<=0;B<=0;endelsebeginA<=1;B<=1;endi<=i+0A3,B4,C等011C的1过去的C值,还是在这一个瞬间A+B所产生的值?”。时间点过去的值,作为当前时间点下决定的参考(写到这里,笔者流泪了实际上“=”不是不可以在always@(posedgeCLK...)里出现,只不过它比较case(case(ibeginA<=3;B<=4;C<=0;i<=i+1'b1;C=A+if(C>0)beginA<=0;B<=0;endelsebeginA<=1;B<=1;endi<=i+1CAB在某种程度上,它的存在会破坏和谐,如果没有步骤i的控制,它很容易暴走。笔者在设计模块中,除非出现“不得已”的情况,否则笔者在always@(posedgeCLK...)区Booth8个时间就是消耗在移位的方面上。那么有什么办法改进实验三中的Booth算1.6iBooth乘法器:casecase(i0:...if(p[1:0]==2'b01)p<={p[16],p[16:9]+a,p[8:1]elseif(p[1:0]==2'b10)p<={p[16],p[16:9]+s,elsep<={p[16],i<=i+Booth那么问题来了,从上面的代码看来pp[16],p[16:9a,p[8:1]};其中的p[16]是以当前时间点的过去值作为基础,而不是p[1:0]操作过后的值,case(case(i0:...Diff1=p[16:9]+ Diff2=p[16:9]if(p[1:0]==2'b01)p<={Diff1[7],Diff1,elseif(p[1:0]==2'b10)p<={Diff2[7],Diff2,p[8:1]};elsep<={p[16],p[16:1]};i<=i+1~8Diff1寄存了p[16:9]+a的结果,反之Diff2寄存p[16:9]sp[1:0]pDiff1,Diff2或Diff1Diff2没有使用“<=”,换一句话说,Diff1Diff2结果的产实验四:Booth基于实验三的Booth168个Booth55~671~8的循环操作。不再使用X寄存器作为循环计数,而是直接使用步骤来指示8个循环操作。在55~67行,这样的写法有一个好处,就是可以使得p8个时钟。.vt0ia值,并且填充在p空间的[8:1]0值右边的上升沿,亦即步骤1。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦即 ,结果为 2'b10,所以p值的未来是{Diff2[7],Diff2,p过去[8:1]},亦即 1值右边的上升沿,亦即步骤2。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b01,所以p值的未来是{Diff1[7],Diff1,p过去[8:1]},亦 0值右边的上升沿,亦即步骤3。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b00,所以p值的未来是{p过去[16],p过去[16:1]},亦即 0值右边的上升沿,亦即步骤4。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦即 ,结果为 2'b00,所以p值的未来是{p过去[16],p过去[16:1]},亦即 0值右边的上升沿,亦即步骤5。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b00,所以p值的未来是{p过去[16],p过去[16:1]},亦即 0值右边的上升沿,亦即步骤6。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b00,所以p值的未来是{p过去[16],p过去[16:1]},亦即 0值右边的上升沿,亦即步骤7。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b00,所以p值的未来是{p过去[16],p过去[16:1]},亦即 0值右边的上升沿,亦即步骤8。此时:Diff1寄存过去的p[16:9]+a,亦即 ,结果 。Diff2寄存过去的p[16:9]+s,亦 ,结果为 2'b10,所以p值的未来是{Diff2[7],Diff2,p过去[8:1]},亦即 i,在实验四中可能会产生许多思考逻辑上的。换一个想法,如果以“时间点”的概念去理解步骤i的话,从仿真图看来间的[Width*2:Width+1]是用来执行和被乘数A的操作)LUT只不过它们无法达到急性一族人的而已。LUT乘法器,又成为查表乘法器。用傻瓜的话来说,就是先吧各种各样的结果在一个表中,然后将输入资源以“查表”的方16x1600123 00001012334567890000000003456789689假设AxB4位,A10,B220。查表乘法器之所以被称为快速乘法器,就是上面的原因(实际上许多硬件乘法器都是使用查表的方式)。AxB8256x256乘法器!?不知道读者有没有听过Quartersquare上边是该算法的,在的结束得到ab=((a+b)2)/4-((a-b)2)/4ab2/4ab2/4,经过幂运算后,得到的结假设ab81271272412712724。那么我们可以得到一个结论“(a+b)2/4或者(a-b2/4使用同样的(C)2/4查表”。C0~255(C)2/4最大值相加仅有-127+-127=-254或者127+127=254。那么问题来了,-127~127-254~254呢?C9位位宽的不正规整数AB8CABC=A+C={A[7],A}+{B[7],BA=127(0111A=127(00111B=127(0111B=127(00111 + 01111A=-127(1000B=-127(1000A=-127(11000B=-127(11000 1000 1000 10000 10000regregcase(iI1<={A[7],A}+{B[7],B//C=A+I2<={A[7],A}+{~B[7],(~B+1'b1)}; //C=A-B;i<=i+1'b1; //I1<=I1[8]?(~I1+1'b1):I2<=I2[8]?(~I2+1'b1):I2;i<=i+1'b1;I1I290,I1CABI2假设A=-1(11111111),B=-3(11111101),0的操作:I2={1111111011111111004)I1130000000110000000102)I213131I1I2I1411111100),I22000000010),1I1I1=000000011+1=00000I2=00000(C)2I1I2共用相同的查表这是必须的步骤。如果用I1和I2来表达Quartersquare,那么:((|I1|2/4)-(|I2|2/4实验五:基于Quartersquare0~255(C)2/4lut_module.v,因为用QuartusIIrom.vI1AB,I2AB,然后I1I2都正值值,将I1和I2送至各自的查表,然后将得出的结果Q1_Sig(I1的结果)和Q2_Sig(I2的结果),执行相减。实际上是补码形式的相加,Q1_Sig~Q2_Sig1'b1),以致符合Quartersquare的:ab2/4ab2/4|I1|)2/4|I2|)2/4]Q1_SigQ2_Sig]15~1826~27Q1_SigQ2_Sig,实际上这两个线型数据是U1(81~87行)和U2(91~97行)实例前申明的,可是那么混蛋,偏行)是I1和I22(63~64行)是延迟一个时钟,给予足够的时间从lut_module.v读出结果。步骤3(66~67行是Quartersquare操作的最后一步。89~99lut_module.vU1I1U2是给I2使用,它们的输出Q1_Sig和Q2_Sig。102Product输出信号由Data寄存器驱动。然106~109行是仿真输出的驱动,分别有I1,I2,Q1_Sig和Q2_Sig的仿真输出。.vt文件的写法和之前的实验都一样,如果真的不知道笔者在写什么,就得好好看笔者4个时钟的而已。比起改进的Booth算法减少了一半的时钟打破。感谢前人的努力吧,我们后人才能乘凉ModifiedBooth事先modifiedbooth算法和改进的booth算法乘法器(实验四)是没有任何关系的。如字面上的意思modifiedbooth算法是booth算法的升级版。我们稍微来回味一下booth算法。假设B是4位位宽的乘数,那么booth算对B[0:-1],B[1:0],B[2:1],B[3:2]加码,而使得乘法运算得到简化。booth算法有典型数学做法,也有位操作的做法。Modifiedbooth算法比起booth4B乘数的加码返回会更广,而使得n/2乘法运算的优化。再假设B是4微微款的倍数,那么modifiedbooth算对B[1:-1],B[3:1]000001010011100101110111pnx219位。乘数A70111),被乘数B20010)+AAA=0111,A=P0,然后P空间的[4..1]填入乘数亦即B。P=00000000P=00000010先判断p[2:0]P=00000010P=00000001p[8:5]P=00000001 P=10010001p=11001000判断p[2:0]p=11001000p[8:5]P=11001000 P=00111000P=00001110最终取出p[8:1]14P=000011104modifiedbooth实验六:ModifiedBooth15~17行是仿真输出。43~940(45~51行)取得被乘数Aa-1(被乘数A)sp空间的同时,将乘数B填入p[8:1]。(由于被乘数AB8pnx219。我知道我很长[Width*2:Width+1]是用来执行和被乘数A的操作。12(53~62行)p[2:0]等于3'b000|111|001|010|101|110的操作。相反modifiedbooth算法当p[2:0]3'b011和3'b100所执行的步骤次数是不一样(56~57行。3~5(66~73行)针对p[2:0]等于3'b011的操作(56行6~8(77~84行)针对p[2:0]3'b100的操作(57行。a,s和p.vt~2(4)127(-127)Moifiedbooth是很别扭。换句话说,用它还要图运气,因为不同的乘数和被乘数都有不同的时钟消耗ModifiedBooth乘法器·modifiedboothmodifiedbooth针对乘数B000001010011100101110111A=7(0111,=2(0010在这里须注意一下当B[1:-1]等于011或者100的时候,4位的被乘数A的取-7~7然而,+2(被乘数)2(被乘数)A的最大值突破取BB[1:-1]3'b1002(被乘数)B[3:1]3'b100+01011001 11110010+00000111000011102booth4n次,而且乘积也是n位的次数,亦即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论