EDA实习之8位乘法器设计文档格式.docx
《EDA实习之8位乘法器设计文档格式.docx》由会员分享,可在线阅读,更多相关《EDA实习之8位乘法器设计文档格式.docx(19页珍藏版)》请在冰点文库上搜索。
硬件平台:
软件平台:
2方案设计及实现2
系统实现原理2
设计步骤2
系统介绍:
2
原理框图:
主要模块之8位右移寄存器模块的设计4
源代码:
4
仿真图:
5
仿真分析:
主要模块之8位加法寄存器模块的设计6
6
主要模块之选通与门模块的设计7
7
8
主要模块之16位锁存器的设计9
10
系统总体仿真11
11
3硬件调试11
调试方法:
调试步骤:
调试结果及分析:
12
4心得体会及总结12
5参考文献12
6附录13
引脚锁定13
功能扩展13
1产品设计介绍
该乘法器是由8位加法器构成的以时序方式设计的8位乘法器。
纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器°
基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。
由8位加法器构成的以时序逻借方式设汁的8位乘法器,具有一左的实用价值。
英乘法通过逐项移位相加来实现,从被乘数最低位开始,若为1,则乘数左移后与上次的和相加,若为0,左移后与全0相加,直至被乘数的最高位。
乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;
若为0,左移后以全零相加,直至被乘数的最高位。
GW48EDA实验系统
MAX+plusII;
Windows?
2方案设计及实现
系统实现原理
在下图中,START信号的上跳沿及其高电平有两个功能,即16位寄存器清零和被乘数A17..0]向移位寄存器SREG8B加载;
它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,与门ANDER打开,8位乘数B[7..0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此往复,直至8个时钟脉冲后,乘法运算过程中止。
此时SREG16B的输出值即为最后的乘积。
此乘法器的优点是节省芯片资源,它的核心元件只是一个8位加法器,其运算速度取决于输入的时钟频率。
本设计釆用层次描述方式,且用原理图输入和文本输入混合方式建立描述文件。
下图是乘法器顶层图形输入文件,它表明了系统山8位右移寄存器(SREG8B)、8位加法器(ADDER8)、选通与门模块(ANDER)和16位锁存器(SREG16B)所组成,它们之间的连接关系如下图所示。
设计步骤
此移位相加8位硬件乘法器分为四大部分。
第一部分:
8位寄存器设计
第二部分:
选通与门设计
第三部分:
8位带进位加法器
第四部分:
16位锁存器
移位相加硬件乘法器电路原理图
主要模块之8位右移寄存器模块的设计
模块说明:
输入为elk、load和din,输出为q;
模块功能:
模块的主要功能是数据右移。
8位右移寄存器工作流程图
开始
装载新数据数据右移
输出最低位
结束
libraryieee;
useSREG8Bis
port(elk,load:
instd_logic;
din:
instd_logic_vector(7downto0);
q:
outstd_logic):
endSREG8B;
architecturebehaveofSREG8Bis
signalreg8:
std_logic_vector(7downto0):
begin
process(load,elk)
begin
if(elk5eventandelk二T‘)then辻(load=,O'
)then
reg8<
=din;
else
reg8(6downto0)<
=reg8(7downto1);
endif:
endif;
endprocess;
q<
=reg8(0);
endbehave;
仿真图:
仿真分析:
在上升沿脉冲到来且load为0的时候,装载新数据,并输出din(0);
在load为1的时候,进行数据右移,并输出din(0)。
主要模块之8位加法寄存器模块的设计
输入为d、b,输岀为q:
模块功能:
模块的主要功能是实现两个8位数的加法运算
8位加法寄存器的工作流程图
源代码:
useADDER8is
port(a:
instd_logic_vector(7downto0):
b:
q:
outstd_logic_vector(8downto0));
endADDER8:
architecturebehaveofADDER8is
=a+b;
endbehave:
Name.^Value.f
100.0n$
£
1V
10001111
-
11110000
101111111
erOWalaa[7..0]
0/de(0|gcp[2.2]
B0
$oddcrB-scfWaveformxdi:
or
Ref:
|O.Ons11』创Time:
710nsInterval:
卩1.阮
这是一个8位带进位加法器,输出q为输入a与输入b的和,最高位q(8)是进位位
主要模块之选通与门模块的设计
输入为dbin和din,输出为q:
模块的主要功能是完成8位与1位运算。
useANDERis
port(abin:
outstd_logic_vector(7downto0)):
endANDER;
architecturebehaveofANDERis
process
if(abin二i)thenq<
qU'
00000000"
;
endif:
.A
^arder.scf-W^efcrmEditor
Ref.StO.Ons
♦hlTime:
Interal:
•ISI.fe
4
Name:
Value:
80Uiis
i
nrabin
衫血
mmw
帚q
mm
"
3
I
在abin为T的时候,输出q二din;
在abin为©
的时候,输出q二“00000000”。
主要模块之16位锁存器的设计
输入为elk、clr和din,输出为q:
模块的主要功能是将数据锁存。
16位锁存器工作流程图
useSREG16Bis
port(elk,clr:
instd_logic_vector(8downto0);
outstd_logic_vector(15downto0));
endSREG16B;
architecturebehaveofSREG16Bissignalregl6:
std_logic_vector(15downto0);
process(clr,elk)
辻(clr二'
O'
regl6〈二"
0000000000000000"
elsif(clk^eventandelk二T‘)thenregl6(15downto7)<
regl6(6downto0)〈二regl6(7downto1);
=regl6;
当clr为'
0'
的时候,输出清零;
在clr为'
1'
且上升沿脉冲到来的时候,输入din锁存至输出的高9位且将低8位右移一位。
系统总体仿真
将输入A设定为21,输入B设定为32,按下START(键8),连续来8个脉冲后,输出为0672,与理论计算结果相同。
3硬件调试
调试方法:
在GW48EDA实验箱上选择电路模式1,8位输入A、B分别锁定键1、2、3、4,START信号锁定键&
16位输出锁定数码管5、6、7、8,CLK信号选择2KHz。
1.输入A设定为21,输入B设定为32;
选择2KHz,按下START(键8);
3•观察数码管5、6、7、8o
结果:
在第8个脉冲到来时,数码管上显示0672;
分析:
与仿真波形的结果相同,更改输入A,B的数据,数码管的输出结果与仿真波形都相同,达到设计要求。
4心得体会及总结
总结
在长达十天的课程设计当中,我更加熟悉了MAX+plusII软件的使用,比如说实体、结构体的作用、保存的时候不能还有中文及文件名要和实体名相同等。
加深了对VHDL编程语言的理解,尤其是本课题中锁存器的设计让我更清楚进程、变量.信号的使用及它们之间的区别。
EDA这门课程还是非常重要的。
通过这次EDA课程设计,意识到了其重要性。
当然,团队合作也很重要,非常感谢其他组员的配合,才能让这次的EDA课程设计快速的完成。
遇到的问题
10
在调试过程中,其输出结果与仿真波形总是不一致,但是一直找不到错误。
后来,想到了原因是因为引脚锁定时锁定错误。
一个非常低级的错误,让我多走了一些弯路。
提醒自己在做各种事情的时候要小心谨慎,不要粗心大意。
5参考文献
(1)朱正伟编着《EDA基础及应用》
[2]韩学超,张小鸣编着《EDA技术开发系统GW48实验指导书》
6附录
引脚锁定
选择器件FLEXEPF10K10-PLCC84-4
名称
引脚号
A(0)
5
B(0)
17
A(l)
6
B(l)
18
A
(2)
7
B
(2)
19
A(3)
8
B(3)
21
A(4)
9
B(40
22
A(5)
B(5)
23
A(6)
11
B(6)
24
A(7)
16
B(7)
25
START
81
CLK
43
DOUT(0)
27
DOUT(l)
28
DOUT
(2)
29
DOUT(3)
30
DOUT(4)
35
DOUT(5)
36
DOUT(6)
37
DOUT(7)
38
DOUT(8)
39
DOUT(9)
47
DOUT(10)
48
DOUT(11)
49
DOUT(12)
50
DOUT(13)
51
DOUT(14)
52
DOUT(15)
53
功能扩展以下内容是为了显示本次课程设讣的题l_T4:
MUTIPLYS采用verilog语言。
代码如下:
modulelcd(clk,rs,rw,en,dat);
inputelk;
output[7:
0]dat;
outputrs,rw,en;
rege;
reg[7:
regrs;
reg[15:
0]counter;
set0=4,hO;
setl二4’hl;
set2二4'
h2;
set3=4'
h3;
dat0=4Jh4;
dat1二4'
h5;
dat2=4,h6;
dat3=4Jh7;
dat4=4'
h8;
dat5=4?
h9;
dat6=4JhA;
dat7=4'
hB;
dat8=4'
hC;
dat9=4JhD;
dat10二4'
hE;
datll二5'
hlO
parameternul=4,hF;
always@(posedgeelk)begincounter=counter+l;
if(counter==16,hOOOf)clkr二、clkr;
end
always@(posedgeclkr)begin
current二next;
case(current)
setO:
beginrs<
=0;
dat〈二8'
h30;
next<
=setl;
end
setl:
hOc;
=set2;
12
set2:
rs<
=0
dat<
set3:
datO:
=l
datl:
dat2:
dat3:
dat4:
dat5:
dat6:
dat7:
dat8:
dat9:
IT
L"
〃〃
next〈二set3;
next<
=datO;
next〈二datl;
=dat2;
next〈二dat3;
next〈二dat4;
next〈二dat5;
next〈二dat6;
=dat7;
next〈二dat8;
next〈二dat9;
=datlO;
8'
h6;
hl;
4—
datlO:
datll:
nul:
=l:
dat<
="
“;
nex二datll;
endrs<
=l;
=,z“;
next〈二nul;
enddat<
=8,h00;
default:
endcase
beginrs<
if(ent!
二2'
h2)
e<
next〈二setO;
ent<
=cnt+l;
beginnext〈二nul;
e<
next=setO;
assignen=clkre;
assignrw=0;
endmodule
13