8位乘法器设计.docx

上传人:b****1 文档编号:3397134 上传时间:2023-05-05 格式:DOCX 页数:14 大小:231.99KB
下载 相关 举报
8位乘法器设计.docx_第1页
第1页 / 共14页
8位乘法器设计.docx_第2页
第2页 / 共14页
8位乘法器设计.docx_第3页
第3页 / 共14页
8位乘法器设计.docx_第4页
第4页 / 共14页
8位乘法器设计.docx_第5页
第5页 / 共14页
8位乘法器设计.docx_第6页
第6页 / 共14页
8位乘法器设计.docx_第7页
第7页 / 共14页
8位乘法器设计.docx_第8页
第8页 / 共14页
8位乘法器设计.docx_第9页
第9页 / 共14页
8位乘法器设计.docx_第10页
第10页 / 共14页
8位乘法器设计.docx_第11页
第11页 / 共14页
8位乘法器设计.docx_第12页
第12页 / 共14页
8位乘法器设计.docx_第13页
第13页 / 共14页
8位乘法器设计.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

8位乘法器设计.docx

《8位乘法器设计.docx》由会员分享,可在线阅读,更多相关《8位乘法器设计.docx(14页珍藏版)》请在冰点文库上搜索。

8位乘法器设计.docx

8位乘法器设计

EDA大作业

基于VHDL的8位乘法器设计

 

1.乘法器原理

8位乘法器可用移位和加法来实现,两个8位数相乘,总共需要执行8次加法运算和8次移位运算,由乘数的末位值确定被乘数是否与原部分积相加,从乘数的最低位开始,若乘数为1,加被乘数,然后右移一位,形成新的部分积,乘数同时右移一位;若乘数为0,加上零值,然后右移一位,形成新的部分积,乘数同时右移一位,直到乘数的最高位为止,从而得出最终的乘积结果。

实现原码一位乘法的硬件逻辑结构图如下图所示。

用寄存器R0存放部分积;R0存放乘数Y,并且最低位Yn作判断为;R0和R1都具有右移功能并且是连通的;寄存器R2存放被乘数X,加法器完成部分积与位积求和,计数器记录相加移位的操作次数。

8位乘法器的顶层设计主要分成四大功能模块,并可根据分解的层次进行设计,各个功能模块作用介绍如下:

1)右移寄存器模块:

是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移,本设计采用的一个8位寄存器,能存放8位二进制代码,需用8个触发器来构成,它可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。

2)加法器:

本设计用到一个8位加法器,主要进行操作数的加法运算。

3)乘1模块:

主要实现8位与1位的乘法运算。

4)锁存器:

它所实现的功能是把当前的状态锁存起来,使CPU送出的数据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁定。

本次设计采用16位锁存器,同时也是一个右移寄存器,在时钟信号作用下,进行输入值的移位与锁存。

2.乘法器设计流程

本设计采用移位和加法来实现两个8位二进制数相乘。

由乘数的末尾值来确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最高位。

例如被乘数为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:

INSTD_LOGIC;

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='1'THEN

IFCNT4B<8THEN

CNT4B<=CNT4B+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(CLK,CNT4B,START)IS

BEGIN

IFSTART='0'THEN

IFCNT4B<8THEN

CLKOUT<=CLK;ARIEND<='0';

ELSECLKOUT<='0';ARIEND<='1';

ENDIF;

ELSECLKOUT<=CLK;ARIEND<='0';

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART;

 

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYADDER4BIS

PORT(C4:

INSTD_LOGIC;

A4:

INSTD_LOGIC_VECTOR(3DOWNTO0);

B4:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S4:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CO4:

OUTSTD_LOGIC);

ENDENTITYADDER4B;

ARCHITECTUREARTOFADDER4BIS

SIGNALS5:

STD_LOGIC_VECTOR(4DOWNTO0);

SIGNALA5,B5:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

A5<='0'&A4;

B5<='0'&B4;

S5<=A5+B5+C4;

S4<=S5(3DOWNTO0);

CO4<=S5(4);

ENDARCHITECTUREART;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYSREG8BIS

PORT(CLK:

INSTD_LOGIC;

LOAD:

INSTD_LOGIC;

DIN:

INSTD_LOGIC_VECTOR(7DOWNTO0);

QB:

OUTSTD_LOGIC);

ENDENTITYSREG8B;

ARCHITECTUREARTOFSREG8BIS

SIGNALREG8B:

STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN

PROCESS(CLK,LOAD)IS

BEGIN

IFCLK'EVENTANDCLK='1'THEN

IFLOAD='1'THENREG8B<=DIN;

ELSEREG8B(6downto0)<=REG8B(7DOWNTO1);

ENDIF;

ENDIF;

ENDPROCESS;

QB<=REG8B(0);

ENDARCHITECTUREART;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYREG16BIS

PORT(CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

D:

INSTD_LOGIC_VECTOR(8DOWNTO0);

Q:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDENTITYREG16B;

ARCHITECTUREARTOFREG16BIS

SIGNALR16S:

STD_LOGIC_VECTOR(15DOWNTO0);

BEGIN

PROCESS(CLK,CLR)IS

BEGIN

IFCLR='1'THENR16S<="0000000000000000";

ELSIFCLK'EVENTANDCLK='1'THEN

R16S(6DOWNTO0)<=R16S(7DOWNTO1);

R16S(15DOWNTO7)<=D;

ENDIF;

ENDPROCESS;

Q<=R16S;

ENDARCHITECTUREART;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYADDER8BIS

PORT(CIN:

INSTD_LOGIC;

A:

INSTD_LOGIC_VECTOR(7DOWNTO0);

B:

INSTD_LOGIC_VECTOR(7DOWNTO0);

S:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);

COUT:

OUTSTD_LOGIC);

ENDENTITYADDER8B;

ARCHITECTUREARTOFADDER8BIS

COMPONENTADDER4BIS

PORT(C4:

INSTD_LOGIC;

A4:

INSTD_LOGIC_VECTOR(3DOWNTO0);

B4:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S4:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CO4:

OUTSTD_LOGIC);

ENDCOMPONENTADDER4B;

SIGNALSC:

STD_LOGIC;

BEGIN

U1:

ADDER4B

PORTMAP(C4=>CIN,A4=>A(3DOWNTO0),B4=>B(3DOWNTO0),

S4=>S(3DOWNTO0),CO4=>SC);

U2:

ADDER4B

PORTMAP(C4=>SC,A4=>A(7DOWNTO4),B4=>B(7DOWNTO4),

S4=>S(7DOWNTO4),CO4=>COUT);

ENDARCHITECTUREART;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYANDARITHIS

PORT(ABIN:

INSTD_LOGIC;

DIN:

INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:

OUTSTD_LOGIC_vector(7DOWNTO0));

ENDENTITYANDARITH;

ARCHITECTUREARTOFANDARITHIS

BEGIN

PROCESS(ABIN,DIN)IS

BEGIN

FORIIN0TO7LOOP

DOUT(I)<=DIN(I)ANDABIN;

ENDLOOP;

ENDPROCESS;

ENDARCHITECTUREART;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYMULTI8X8IS

PORT(CLK:

INSTD_LOGIC;

START:

INSTD_LOGIC;

A:

INSTD_LOGIC_VECTOR(7DOWNTO0);

B:

INSTD_LOGIC_VECTOR(7DOWNTO0);

ARIEND:

OUTSTD_LOGIC;

DOUT:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDENTITYMULTI8X8;

ARCHITECTUREARTOFMULTI8X8IS

COMPONENTARICTLIS

PORT(CLK:

INSTD_LOGIC;START:

INSTD_LOGIC;

CLKOUT:

OUTSTD_LOGIC;RSTALL:

OUTSTD_LOGIC;

ARIEND:

OUTSTD_LOGIC);

ENDCOMPONENTARICTL;

COMPONENTANDARITHIS

PORT(ABIN:

INSTD_LOGIC;

DIN:

INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENTANDARITH;

COMPONENTADDER8BIS

PORT(CIN:

INSTD_LOGIC;

A:

INSTD_LOGIC_VECTOR(7DOWNTO0);

B:

INSTD_LOGIC_VECTOR(7DOWNTO0);

S:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);

COUT:

OUTSTD_LOGIC);

ENDCOMPONENTADDER8B;

COMPONENTSREG8BIS

PORT(CLK:

INSTD_LOGIC;

LOAD:

INSTD_LOGIC;

DIN:

INSTD_LOGIC_VECTOR(7DOWNTO0);

QB:

OUTSTD_LOGIC);

ENDCOMPONENTSREG8B;

COMPONENTREG16BIS

PORT(CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

D:

INSTD_LOGIC_VECTOR(8DOWNTO0);

Q:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDCOMPONENTREG16B;

SIGNALS1:

STD_LOGIC;

SIGNALS2:

STD_LOGIC;

SIGNALS3:

STD_LOGIC;

SIGNALS4:

STD_LOGIC;

SIGNALS5:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALS6:

STD_LOGIC_VECTOR(8DOWNTO0);

SIGNALS7:

STD_LOGIC_VECTOR(15DOWNTO0);

BEGIN

DOUT<=S7;S1<='0';

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));

ENDARCHITECTUREART;

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的输出值即为最后乘积。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2