八位二进制乘法器[精品]
——八位二进制乘法器
学院: 信息科学与技术学院
班级: 计0805-2
20082459 学号:
姓名: 王志军 指导老师: 王彦芳
完成时间:2010年7月11日
目录
1 课题综述
2.1 分析问题 2.2 结构框图 2.3原理图
3.1上机调试及排错过程 3.2 波形文件 3.3 VHDL文本 4 上机结果分析 5
6 致谢
7 参考资料
课题二:八位二进制乘法器
1 课题综述
选择这个课题与我以前做过二进制乘法电路有关,思想源于此,但那次是用组合逻辑电路实现的且是两位二进制乘法,很受局限,由此想扩展它。
实现二进制乘法器的电路有多种
,一种是由组合逻辑电路(与、或、非门)构成的乘法器,速度快但占用PLD的资源比较多,难以实现多位乘法;另一种是基于PLD器件外接ROM九九表的乘法器,但无法构成片上系统,不是很适用。这一次我是采用八位二进制乘法的硬件算法,不同于前面两种乘法器电路,是由一个加法器和移位寄存器构成的时序逻辑方式的八位硬件乘法器。
2.1 分析问题
硬件乘法器的乘法原理是通过逐项移位相加的方法来实现。
在计算过程中,先观察乘数的每一位,从最低位开始,若最低位是1,则被乘数被复制到下面,否则复制为全零,复制下来的数值较前一个数值左移一位。最后,将复制的数值相加,它们的和就是乘积。两个n位二进制数相乘的结果最多可以有2n位的二进制数。
根据上面这个乘法的过程,可以得出三点:
, 只对两个二进制数进行相加运算,并用寄存器不断地累加部
分积;
, 将累加的部分积左移,但复制的被乘数不左移;
, 乘数的对应位若为0时,对累加的部分积不产生影响。
2.2 结构框图 S0
d[7…0]被乘数
b[7…0]乘数
n为数
0
ST
1
A[15..0] 0
0 S2 S1
Z=1输出 n n-1
1
B0
0
A A+d
A右移 S2 0 1
n=0
图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—>set project current file,选择之后,再选择,Max+plus2—>compiler开始进入调试。
图3 compiler调试成功的结果
上图是最后调试成功后的结果,在调试没有成功时,曾出现过许多错误,
第一个错误也是最普遍的错误就是:
error:line1,file e:\max+plus?\multi_lpm.tdf:
TDF syntax error:Expected ASSERT ,CONSTANT,DEFINE,DESIGN,FUNCTION,IF.OPTIONS,PA
RAMETERS,SUBDESIGN,OR TITLE but found a symbolic
name”LIBRARY”
上面这个错误是由调试时是用的“。tdf”文件,把文件保存为
“.vhd”之后就消除错误。
其它的错误也不一一列举,有些错误是逻辑问题,还有的是输入时不小心输入错误,根据错误提示,一步一步的完成排错,最后出现无错的调试结果。
3.2 波形文件
仿真前:
图 4 仿真前波形
仿真后:
图 5 仿真后波形
3.3 VHDL文本
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY multi_lpm IS
GENERIC(WIDTHd:INTEGER:=8;
WIDTHb:INTEGER:=8);
PORT(clk,clrn,st:IN STD_LOGIC;
d:IN STD_LOGIC_VECTOR(WIDTHd-1 downto 0);
b:IN STD_LOGIC_VECTOR(WIDTHb-1 downto 0);
A:OUT STD_LOGIC_VECTOR(WIDTHd+WIDTHb-1 DOWNTO 0);
Z:OUT STD_LOGIC
);
END multi_lpm;
ARCHITECTURE one OF multi_lpm IS
TYPE ss IS(s0,s1,s2,s3);
SIGNAL state:ss:=s0;
SIGNAL n:INTEGER RANGE WIDTHb DOWNTO 0;
SIGNAL q:STD_LOGIC_VECTOR(WIDTHd+WIDTHb DOWNTO 0);
SIGNAL t:STD_LOGIC_VECTOR(WIDTHb-1 DOWNTO 0); BEGIN
PROCESS(clk,clrn)
begin
IF CLRN='0' THEN state<=s0;
ELSIF(CLK'EVENT AND CLK='1')THEN
CASE state IS
WHEN s0=>IF ST='1' THEN
state<=s1;
END IF;
WHEN s1=>state<=s2;
when s2=>IF n=0 then state<=s3;
ELSE state<=s1;
end if;
when s3=>state<=s0;
when OTHERS=>state<=s0;
END CASE;
END IF;
END PROCESS;
PROCESS(clk)
VARIABLE cont:STD_LOGIC_VECTOR(WIDTHd downto 0);
begin
IF(clk'EVENT AND clk='1') THEN
CASE state IS
WHEN s0=>n<=WIDTHb;t<=b;z<='0';q<=(OTHERS=>'0');
cont(WIDTHd DOWNTO 0):='0'&d(WIDTHd-1 DOWNTO 0);
WHEN s1=>n<=n-1;IF t(0)='1' THEN
q(WIDTHd+WIDTHb DOWNTO WIDTHb)<=q(WIDTHd+WIDTHb DOWNTO
WIDTHb)
+cont(WIDTHd DOWNTO 0);
END IF;
WHEN s2=>t(WIDTHb-2 DOWNTO 0)<=t(WIDTHb-1 downto
1);t(WIDTHb-1)<='0';
q(WIDTHd+WIDTHb-1 downto 0)<=q(WIDTHd+WIDTHb DOWNTO
1);q(WIDTHd+WIDTHb)<='0';
WHEN s3=>z<='1';q(WIDTHd+WIDTHb DOWNTO 1)<=q(WIDTHd+WIDTHb-1
downto 0);
A<=q(WIDTHd+WIDTHb-1 downto 0);
END CASE;
END IF;
END PROCESS;
END one;
4 上机结果分析
本次做的是八位二进制乘法器,在时钟控制下进行运算,条件是:时钟为上升沿,st为1,而且是在时延范围外即可以输出结果。每个运算时延大约为6us,这个时延较大,也算是这个的缺点吧~每一个结果的输出不是就在对应的下方输出结果,而是在时延结束,下一个工作来时输出上一个运算结果。
前面已经说明了,Z为1时是一个运算结束,即将输出结果的标志。
5 总结
最开始我考虑过“汽车尾灯控制”,后来发现做的同学比较多,于是另选一个,选了这个八位二进制乘法器,它比较灵活,可以做的简单也可以做的复杂。
就这同一个功能,可以写出VHDL文本几百行,也可以写出几十行,说明了八位二进制乘法器实现的的方法有很多种。也体现了vhdl语言的灵活性,任何一种语言都不是死的,都具有一定的灵活性。
这次课程设计让我受益匪浅。在摸索该如何设计电路使之实现所需功能的过程中,培养了我的设计思维,增加了实际操作能力,也让我深深地体会到了自己学习知识的不足之处,对于知识的理解程度不够深,自己以为明白的实际上不明白。在以后的学习过程中,我会重视这些问题,逐渐改变自己的学习习惯,不断的进步~
6 致谢
感谢王彦芳老师的指导~
7 参考资料
电子工业出版社 王永军 李景华 主编 数字逻辑与数字
系统(第3版) 2006.1
北京航空航天大学出版社 包明 编著 EDA技术与可编
程器件的应用(第一版) 2007.10
还有一些零碎的资料