8位乘法器设计.docx
- 文档编号:3635069
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:12
- 大小:231.96KB
8位乘法器设计.docx
《8位乘法器设计.docx》由会员分享,可在线阅读,更多相关《8位乘法器设计.docx(12页珍藏版)》请在冰豆网上搜索。
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的输出值即为最后乘积。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乘法器 设计