8位乘法器设计Word格式文档下载.docx
《8位乘法器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《8位乘法器设计Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
例如被乘数为00000101,乘数为01101111,初始条件下,部分积为0,乘数最低位为1,加被乘数,和为00000101,使其右移一位,形成新的部分积为00000010,乘数同时右移一位,原和最低位1被放到乘数的最高位,此时,乘数最低位为1,加00000101,和为00000111,使其右移一位,形成新的部分积为0000011,依次类推,循环8次,总共需要进行8次相加和8次移位操作,最终得出乘积结果。
其设计流程图所如下所示:
3.8位乘法器的顶层设计
8位移位相加乘法器的原理图如下图所示。
在图中,START信号的上升沿及其高电平有两个功能,即16位寄存器清零和被乘数A[7……0]向移位寄存器SREG8B加载;
它的低电平则作为乘法使能信号。
CLK位乘法时钟信号。
当被乘数被加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,1位乘法器ANDARTIH打开,8位乘数B[7…0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此反复,直至8个时钟脉冲后。
最后乘积完整出现在REG16B端口。
移位相加乘法器的原理图如下:
根据上图移位相加乘法器的原理图,利用元例化的方法可得乘法器乘法器的顶层设计的VHDL的代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYARICTLIS
PORT(CLK:
INSTD_LOGIC;
START:
ARIEND:
OUTSTD_LOGIC;
CLKOUT:
OUTSTD_LOGIC;
RSTALL:
OUTSTD_LOGIC);
ENDENTITYARICTL;
ARCHITECTUREARTOFARICTLIS
SIGNALCNT4B:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
RSTALL<
=START;
PROCESS(CLK,START)IS
BEGIN
IFSTART='
1'
THENCNT4B<
="
0000"
;
ELSIFCLK'
EVENTANDCLK='
THEN
IFCNT4B<
8THEN
CNT4B<
=CNT4B+1;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CNT4B,START)IS
BEGIN
0'
THEN
8THEN
CLKOUT<
=CLK;
ARIEND<
='
ELSECLKOUT<
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
ENTITYADDER4BIS
PORT(C4:
INSTD_LOGIC;
A4:
INSTD_LOGIC_VECTOR(3DOWNTO0);
B4:
S4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CO4:
ENDENTITYADDER4B;
ARCHITECTUREARTOFADDER4BIS
SIGNALS5:
STD_LOGIC_VECTOR(4DOWNTO0);
SIGNALA5,B5:
A5<
&
A4;
B5<
B4;
S5<
=A5+B5+C4;
S4<
=S5(3DOWNTO0);
CO4<
=S5(4);
ENTITYSREG8BIS
PORT(CLK:
LOAD:
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
ENDENTITYSREG8B;
ARCHITECTUREARTOFSREG8BIS
SIGNALREG8B:
STD_LOGIC_VECTOR(7DOWNTO0);
PROCESS(CLK,LOAD)IS
IFCLK'
IFLOAD='
THENREG8B<
=DIN;
ELSEREG8B(6downto0)<
=REG8B(7DOWNTO1);
QB<
=REG8B(0);
ENTITYREG16BIS
PORT(CLK:
CLR:
D:
INSTD_LOGIC_VECTOR(8DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDENTITYREG16B;
ARCHITECTUREARTOFREG16BIS
SIGNALR16S:
STD_LOGIC_VECTOR(15DOWNTO0);
PROCESS(CLK,CLR)IS
IFCLR='
THENR16S<
0000000000000000"
EVENTANDCLK='
R16S(6DOWNTO0)<
=R16S(7DOWNTO1);
R16S(15DOWNTO7)<
=D;
Q<
=R16S;
ENDARCHITECTUREART;
ENTITYADDER8BIS
PORT(CIN:
A:
B:
S:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COUT:
ENDENTITYADDER8B;
ARCHITECTUREARTOFADDER8BIS
COMPONENTADDER4BIS
ENDCOMPONENTADDER4B;
SIGNALSC:
STD_LOGIC;
U1:
ADDER4B
PORTMAP(C4=>
CIN,A4=>
A(3DOWNTO0),B4=>
B(3DOWNTO0),
S4=>
S(3DOWNTO0),CO4=>
SC);
U2:
SC,A4=>
A(7DOWNTO4),B4=>
B(7DOWNTO4),
S(7DOWNTO4),CO4=>
COUT);
ENTITYANDARITHIS
PORT(ABIN:
DOUT:
OUTSTD_LOGIC_vector(7DOWNTO0));
ENDENTITYANDARITH;
ARCHITECTUREARTOFANDARITHIS
PROCESS(ABIN,DIN)IS
FORIIN0TO7LOOP
DOUT(I)<
=DIN(I)ANDABIN;
ENDLOOP;
ENTITYMULTI8X8IS
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDENTITYMULTI8X8;
ARCHITECTUREARTOFMULTI8X8IS
COMPONENTARICTLIS
START:
ENDCOMPONENTARICTL;
COMPONENTANDARITHIS
PORT(ABIN:
DIN:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTANDARITH;
COMPONENTADDER8BIS
A:
B:
S:
COUT:
ENDCOMPONENTADDER8B;
COMPONENTSREG8BIS
ENDCOMPONENTSREG8B;
COMPONENTREG16BIS
ENDCOMPONENTREG16B;
SIGNALS1:
SIGNALS2:
SIGNALS3:
SIGNALS4:
SIGNALS6:
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALS7:
DOUT<
=S7;
S1<
U1:
ARICTLPORTMAP(CLK=>
CLK,START=>
START,
CLKOUT=>
S2,RSTALL=>
S3,ARIEND=>
ARIEND);
U2:
SREG8BPORTMAP(CLK=>
S2,LOAD=>
S3,
DIN=>
A,QB=>
S4);
U3:
ANDARITHPORTMAP(ABIN=>
S4,DIN=>
B,DOUT=>
S5);
U4:
ADDER8BPORTMAP(CIN=>
S1,A=>
S7(15DOWNTO8),
B=>
S5,S=>
S6(7DOWNTO0),COUT=>
S6(8));
U5:
REG16BPORTMAP(CLK=>
S2,CLR=>
S3,D=>
S6(8DOWNTO0),Q=>
S7(15DOWNTO0));
4.乘法器仿真
1)系统仿真情况
输入值A=0AH、B=0CH,结果DOUT=0078H;
输入值A=0CH、B=0AH,结果DOUT=0078H;
输入值A=02H、B=03H,结果DOUT=0006H;
仿真图如下:
2)仿真分析
当START输入信号为“1”,REG16B清零和被乘数A[7..0]向移位寄存器加载。
此后START信号为“0”,乘法进行。
乘法时钟从ARICTL的CLK输入。
当被乘数加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,与门ANDARITH打开,8位乘数B在同一节拍进入八位加法器,与上一次锁存在16位锁存器REG16B中高8位进行相加,其和在下一时钟节拍的上升沿被锁进此寄存器。
而当被乘数移出位为0时,与门全零输出。
如此往复,直至八个时钟脉冲后,有ARICTL的控制,乘法运算终止ARIEND输出高电平,以此点亮发光管,以示乘法结束。
此时,REG16B的输出值即为最后乘积。