西电EDA报告.docx
《西电EDA报告.docx》由会员分享,可在线阅读,更多相关《西电EDA报告.docx(16页珍藏版)》请在冰豆网上搜索。
西电EDA报告
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次移位操作,最终得出乘积结果。
其设计流程图所如下所示:
三8位乘法器的顶层设计
8位移位相加乘法器的顶层原理图如下图所示。
在图中,START信号的上升沿及其高电平有两个功能,即16位寄存器清零和被乘数A[7……0]向移位寄存器SREG8B加载;当被乘数被加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,1位乘法器ANDARTIH打开,8位乘数B[7…0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此反复,直至8个时钟脉冲后。
最后乘积完整出现在REG16B端口。
移位相加乘法器的原理图如下:
仿真波形图如下:
输入十六进制数a=3,b=2,结果显示dout=6
3.2十六位位锁存器
原理图如下:
3.3八位二进制加法器
输入a=3,b=5,结果s=8
3.4一位乘法器
移位相加乘法器乘法器的顶层设计的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.乘法器仿真
4.1系统仿真情况
仿真图如下:
输入a=9F
输入b=FD
输出结果DOUT=9D23
5实验总结
1对quartus软件的使用更加熟练,掌握了元件component(调用子函数)的设计方法,在本次设计中,首次将所有模块设计为元件。
在设计乘法器的过程中利用调用语句来实现对元件的包含。
2加深了对vhdl语言的学习,对硬件语言有了更深的认识。
6实验收获
通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。
特别是当每一个子模块编写调试成功时,心里特别的开心。
但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,并且EDA总共有5节课,我发现自己基础不够,查阅了很多资料,并借鉴别人的设计才完成了这个设计。
虽然不完全是自己设计的,但也有成就感了。