八位二进制乘法器.docx
《八位二进制乘法器.docx》由会员分享,可在线阅读,更多相关《八位二进制乘法器.docx(9页珍藏版)》请在冰豆网上搜索。
八位二进制乘法器
数字逻辑与数字系统
——八位二进制乘法器
学院:
信息科学与技术学院
班级:
计0805-2
学号:
20082459
姓名:
王志军
指导老师:
王彦芳
完成时间:
2010年7月11日
目录
1课题综述
2.1分析问题
2.2结构框图
2.3原理图
3.1上机调试及排错过程
3.2波形文件
3.3VHDL文本
4上机结果分析
5总结
6致谢
7参考资料
课题二:
八位二进制乘法器
1课题综述
选择这个课题与我以前做过二进制乘法电路有关,思想源于此,但那次是用组合逻辑电路实现的且是两位二进制乘法,很受局限,由此想扩展它。
实现二进制乘法器的电路有多种方法,一种是由组合逻辑电路(与、或、非门)构成的乘法器,速度快但占用PLD的资源比较多,难以实现多位乘法;另一种是基于PLD器件外接ROM九九表的乘法器,但无法构成片上系统,不是很适用。
这一次我是采用八位二进制乘法的硬件算法,不同于前面两种乘法器电路,是由一个加法器和移位寄存器构成的时序逻辑方式的八位硬件乘法器。
2.1分析问题
硬件乘法器的乘法原理是通过逐项移位相加的方法来实现。
在计算过程中,先观察乘数的每一位,从最低位开始,若最低位是1,则被乘数被复制到下面,否则复制为全零,复制下来的数值较前一个数值左移一位。
最后,将复制的数值相加,它们的和就是乘积。
两个n位二进制数相乘的结果最多可以有2n位的二进制数。
根据上面这个乘法的过程,可以得出三点:
◆只对两个二进制数进行相加运算,并用寄存器不断地累加部分积;
◆将累加的部分积左移,但复制的被乘数不左移;
◆乘数的对应位若为0时,对累加的部分积不产生影响。
2.2结构框图
图1
2.3原理图
图2
在上图中:
d为被乘数输入,b为乘数输入,ST为启动信号,A[15..0]输出端口为乘积。
当ST为一时乘法器运算开始,累加寄存器A清零。
在S1状态下对乘数最低位b0进行检测,若为1,被乘数加到A中的部分积上;如果b0为0,系统则不操作,直接进入到S2状态。
在S2状态中进行累加寄存器A和乘数b的右移一位,并且判断乘数的位数是否运算结束,若运算结束,在S3状态下,输出乘积结果。
这是由两个进程的状态机来实现:
一个进程描述状态转移,另一个进程描述寄存器操作。
累加寄存器q的位数为WIDTHd+WIDTHb+1,其中,q的高位段(WIDTHd+1)进行数的累加,然后向q的低位进行移位,形成部分积。
当计数器n减到0时,乘法过程结束。
在寄存器操作进程中,由于使用的是时钟同步工作方式,其操作都是在下一个状态完成,因此在乘法结束进入S3状态下,需要对累加寄存器q左移一位,并将寄存器q中的乘积结果输入到乘积输出端A。
3.1上机调试及排错过程
本次是课题二,有了做课题一的熟悉和经验,调试过程容易多了。
具体步骤是:
绘制完后—>file—>project—>setprojectcurrentfile,选择之后,再选择,Max+plus2—>compiler开始进入调试。
图3compiler调试成功的结果
上图是最后调试成功后的结果,在调试没有成功时,曾出现过许多错误,
第一个错误也是最普遍的错误就是:
error:
line1,filee:
\max+plusⅡ\multi_lpm.tdf:
TDFsyntaxerror:
ExpectedASSERT,CONSTANT,DEFINE,DESIGN,FUNCTION,IF.OPTIONS,PARAMETERS,SUBDESIGN,ORTITLEbutfoundasymbolicname”LIBRARY”
上面这个错误是由调试时是用的“。
tdf”文件,把文件保存为“.vhd”之后就消除错误。
其它的错误也不一一列举,有些错误是逻辑问题,还有的是输入时不小心输入错误,根据错误提示,一步一步的完成排错,最后出现无错的调试结果。
3.2波形文件
仿真前:
图4仿真前波形
仿真后:
图5仿真后波形
3.3VHDL文本
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmulti_lpmIS
GENERIC(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(WIDTHd+WIDTHb-1DOWNTO0);
Z:
OUTSTD_LOGIC
);
ENDmulti_lpm;
ARCHITECTUREoneOFmulti_lpmIS
TYPEssIS(s0,s1,s2,s3);
SIGNALstate:
ss:
=s0;
SIGNALn:
INTEGERRANGEWIDTHbDOWNTO0;
SIGNALq:
STD_LOGIC_VECTOR(WIDTHd+WIDTHbDOWNTO0);
SIGNALt:
STD_LOGIC_VECTOR(WIDTHb-1DOWNTO0);
BEGIN
PROCESS(clk,clrn)
begin
IFCLRN='0'THENstate<=s0;
ELSIF(CLK'EVENTANDCLK='1')THEN
CASEstateIS_
WHENs0=>IFST='1'THEN
state<=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);
begin
IF(clk'EVENTANDclk='1')THEN
CASEstateIS
WHENs0=>n<=WIDTHb;t<=b;z<='0';q<=(OTHERS=>'0');
cont(WIDTHdDOWNTO0):
='0'&d(WIDTHd-1DOWNTO0);
WHENs1=>n<=n-1;IFt(0)='1'THEN
q(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(WIDTHd+WIDTHb)<='0';
WHENs3=>z<='1';q(WIDTHd+WIDTHbDOWNTO1)<=q(WIDTHd+WIDTHb-1downto0);
A<=q(WIDTHd+WIDTHb-1downto0);
ENDCASE;
ENDIF;
ENDPROCESS;
ENDone;
4上机结果分析
本次做的是八位二进制乘法器,在时钟控制下进行运算,条件是:
时钟为上升沿,st为1,而且是在时延范围外即可以输出结果。
每个运算时延大约为6us,这个时延较大,也算是这个的缺点吧!
每一个结果的输出不是就在对应的下方输出结果,而是在时延结束,下一个工作来时输出上一个运算结果。
前面已经说明了,Z为1时是一个运算结束,即将输出结果的标志。
5总结
最开始我考虑过“汽车尾灯控制”,后来发现做的同学比较多,于是另选一个,选了这个八位二进制乘法器,它比较灵活,可以做的简单也可以做的复杂。
就这同一个功能,可以写出VHDL文本几百行,也可以写出几十行,说明了八位二进制乘法器实现的的方法有很多种。
也体现了vhdl语言的灵活性,任何一种语言都不是死的,都具有一定的灵活性。
这次课程设计让我受益匪浅。
在摸索该如何设计电路使之实现所需功能的过程中,培养了我的设计思维,增加了实际操作能力,也让我深深地体会到了自己学习知识的不足之处,对于知识的理解程度不够深,自己以为明白的实际上不明白。
在以后的学习过程中,我会重视这些问题,逐渐改变自己的学习习惯,不断的进步!
6致谢
感谢王彦芳老师的指导!
7参考资料
电子工业出版社王永军李景华主编数字逻辑与数字系统(第3版)2006.1
北京航空航天大学出版社包明编著EDA技术与可编程器件的应用(第一版)2007.10
还有一些零碎的资料