EDA实验--8位二进制乘法电路

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

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

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

资源描述

EDA数字系统设计实验——8位二进制乘法电路学院:电子工程学院学号:0210****姓名:***8位二进制乘法电路1.选题目的:通过八位二进制乘法器设计实验,进一步熟悉VHDL语言的电路设计,及数字电路的基本知识,为以后进一步在数字电路学习上奠定基础。2.设计要求8位二进制乘法采用移位相加的方法。即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下:11010101×1001001111010101N0与被乘数相乘的部分积,部分积右移一位11010101N1与被乘数相乘的部分积+1101010110011111111001111111两个部分积之和,部分积之和右移一位+00000000N2与被乘数相乘的部分积0100111111101001111111与前面部分积之和相加,部分积之和右移一+00000000N4与被乘数相乘的部分积······N7与被乘数相乘的部分积+11010101111101001001111与前面部分积之和相加011110100100111右移一位得到最后的积为了实现硬件乘法器,根据上面的乘法的计算过程可以得出3点:一是只对两个二进制数进行相加操作,并用寄存器不断累加部分积;而是将累加的部分积左移(复制的被乘数不移动);三是乘数的对应位若为0时,对累加的部分积不产生影响(不操作)。3.硬件乘法器的实现根据硬件乘法器的设计思想,画出8位二进制乘法器的ASM图,如下。其中d为被乘数输入,b为乘数输入,ST为启动信号,A[15..0]为累加结果输出,输出Z为二进制乘法器结束指示,当Z输出信号有上跳脉冲时,A[15..0]输出端口为乘积。当ST为1时乘法器运算开始,累加器A清零。在S1状态下,对乘数最低位b0进行检测,若为1,将被乘数加到A中的部分积上;如果b0为0,系统不操作,直接进入到S2状态。在S2状态中进行累加寄存器A和乘数b的右移一位,并且判断乘数的位数是否已运算结束。若乘法运算结束,在S3状态下输出乘积结果。STd[7..0]被乘数b[7..0]乘数n位数S001Z=1输出n←n-1S1S3b0A右移n=00图8位二进制乘法器的ASM图4.根据以上流程图写出的VHDL描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmulti_lpmISGENERIC(WIDTHd:INTEGER:=8;——设置被乘数位数参数WIDTHb:INTEGER:=8);——设置乘数位数参数PORT(clk,clrn,st:INSTD_LOGIC;d:INSTD_LOGIC_VECTOR(WIDTHd-1DOWNTO0);——被乘数b:INSTD_LOGIC_VECTOR(WIDTHb-1DOWNTO0);——乘数A:OUTSTD_LOGIC_VECTOR(WIDTHb+WIDTHd-1DOWNTO0);——乘积z:OUTSTD_LOGIC);——运算结束指示ENDmulti_lpm;ARCHITECTUREoneOFmulti_lpmISTYPEssIS(s0,s1,s2,s3);——定义状态机SIGNALstate:ss:=s0;——定义状态变量SIGNALn:INTEGERRANGEWIDTHbDOWNTO0;——乘数位数SIGNALq:STD_LOGIC_VECTOR(WIDTHb+WIDTHdDOWNTO0);——累加寄存器SIGNALt:STD_LOGIC_VECTOR(WIDTHb-1DOWNTO0);——乘数BEGINPROCESS(clk,clrn)——此进程描述状态转移BEGINIFclrn='0'THENstate=s0;ELSIF(clk'EVENTANDclk='1')THENCASEstateIS——用CASE语句和IF语句来实现状态转移WHENs0=IFst='1'THENstate=s1;ENDIF;WHENs1=state=s2;WHENs2=IFn=0THENstate=s3;ELSEstate=s1;ENDIF;WHENs3=state=s0;WHENOTHERS=state=s0;ENDCASE;ENDIF;ENDPROCESS;PROCESS(clk)——此进程描述寄存器操作VARIABLEcont:STD_LOGIC_VECTOR(WIDTHdDOWNTO0);BEGINIF(clk'EVENTANDclk='1')THENCASEstateISWHENs0=n=WIDTHb;t=b;z='0';q=(OTHERS='0');——定义初始值cont(WIDTHdDOWNTO0):='0'&d(WIDTHd-1DOWNTO0);——增加被乘数位数1位WHENs1=n=n-1;IFt(0)='1'THENq(WIDTHd+WIDTHbDOWNTOWIDTHb)=q(WIDTHd+WIDTHbDOWNTOWIDTHb)+cont(WIDTHdDOWNTO0);ENDIF;WHENs2=t(WIDTHb-2DOWNTO0)=t(WIDTHb-1DOWNTO1);t(WIDTHb-1)='0';q(WIDTHd+WIDTHb-1DOWNTO0)=q(WIDTHd+WIDTHbDOWNTO1);q(WIDTHb+WIDTHd)='0';WHENs3=z='1';q(WIDTHd+WIDTHbDOWNTO1)=q(WIDTHd+WIDTHb-1DOWNTO0);A=q(WIDTHd+WIDTHb-1DOWNTO0);——输出乘积ENDCASE;ENDIF;ENDPROCESS;ENDone;5.实现过程说明该硬件乘法器采用参数化的VHDL描述,由两进程的状态机来实现:一个进程描述状态转移,另一个进程描述寄存器操作。累加寄存器q的位数为WIDTHd(被乘数位数)+WIDTHb(乘数位数)+1,其中q的高位段(WIDTHd+1)进行数的累加,然后向q的地位进行移位(右移),形成部分积。当寄存器n减到0时,乘法过程结束。在寄存器操作过程中,由于使用的是时钟同步工作方式,其操作都是在下一个状态完成,因此在乘法结束进入S3状态下,需要对累加寄存器q左移一位,并将寄存器q中的乘积结果输入到乘积输入端A。(1)状态机转移示意图:(2)原理图如下:6.仿真波形7.心得体会通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。器件的选择也很重要,只有选择合适的器件,才能正确的编译,从而能更好的做好本次试验!通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。8.对该课程的实施意见及建议建议就是多增加几次上机,这样就能够有更多的实践机会。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢。

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

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

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

×
保存成功