EDA实习报告文档格式.docx
《EDA实习报告文档格式.docx》由会员分享,可在线阅读,更多相关《EDA实习报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
一、实验目的
1学习VHDL语言的一些基本特点。
2掌握VHDL程序的基本结构。
3掌握VHDL程序设计方法。
4要能够用vhdl语言读懂并编写eda程序,对eda设计的总体框架能有较好的把握,掌握各模块的调用方式。
二、实验内容和要求
设计一个数字时钟,显示时(2位),分(2位),秒(2位),具体要求是:
具有时分秒计数显示功能,以24小时循环计时;
数码管动态显示时,分,秒;
具有清零功能。
在软件工具平台上,进行VHDL语言的各模块编程输入、编译实现和仿真验证。
三、实验主要仪器设备和材料
计算机,开发环境MAX-PLUSII,ZY11EDA实验系统,VHDL语言。
四、实验方法、步骤及结果测试
1、设计思路:
数字钟的主体是计数器,它记录并显示接收到的秒脉冲个数,其中秒和分位60进制计数器,小时为24进制计数器,分别产生3位BCD码。
BCD码经译码,驱动后接数码显示电路。
根据实验要求,将设计分为5个主要部分,时功能模块、分功能模块、秒功能模块、扫描仪功能模块和7段LED功能模块。
在时、分、秒模块中,包括复位和预置数,其主要思路如下:
秒钟的模块:
设计一个60进制的计数器,以clk为其时钟信号,每60个clk后产生一个进位信号CF给分钟模块,作为分钟进程的响应信号。
秒钟模块VHDL程序见附录1:
仿真波形如下:
封装如下图:
分钟的模块:
同理于秒钟的模块,设计一个60进制的计数器,以CFM为其时钟信号,每60个CFM后产生一个进位信号CFM给小时模块,作为小时模块进程的响应信号。
分钟模块VHDL程序见附录二:
小时的模块:
为24进制计数器,在分的进位信号CFM的激发下计数,从0到23的时候产生一个信号CFH,全部清0,重新开始计时。
小时模块VHDL程序见附录三:
扫描仪模块:
在扫描仪内部,有一个3-8译码器的片选信号,当3-8译码器的片选信号为000时,片选信号选中7段LED模块中的秒的个位,当3-8译码器的片选信号为001时,片选信号选中7段LED模块中的秒的十位,当3-8译码器的片选信号为010时,片选信号选中7段LED模块中的分的个位,当3-8译码器的片选信号为011时,片选信号选中7段LED模块中的分的十位,当3-8译码器的片选信号为100时,片选信号选中7段LED模块中的时的个位,当3-8译码器的片选信号为101时,片选信号选中7段LED模块中的时的十位,就这样动态扫描,当输入的时钟信号频率很高的时候,就形成了我们的时钟。
扫描仪模块VHDL程序见附录四:
7段LED模块:
根据动态扫描仪的片选信号来依次点亮我们所需的时间。
7段LED模块VHDL程序见附录五:
综合以上5大模块,把它们用线连接起来就得到我们的总的电路图:
如下图所示:
其工作原理为:
扫描仪3-8译码器的片选信号根据时分秒的输入选中7段LED模块,然后再由时分秒中产生的3位BCD码来输出秒的个位,十位、时的个位,十位、小时的个位,十位。
4.总结:
在实验这两周的时间里,我们做过DC触发器、DQ触发器、3-8译码器、二选一电路和四选一电路等,最后综合做了数字时钟电路,通过这次实习,我对用VHDL来编程有了更深的了解,在要编程的时候,我学会了分模块进行,因为一开始的时候设计一个时钟系统比较麻烦,没有分模块之前总是会有差错,而之后思路就会比较清晰,有明确的方案,在对照书本里的编程规则与语句,就完成了这次的设计,总之就是获益良多。
附录1:
秒钟模块VHDL程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysecondis
port(clk,reset:
instd_logic;
cf:
outstd_logic;
second1_out:
outstd_logic_vector(3downto0);
second10_out:
outstd_logic_vector(2downto0));
endentitysecond;
architectureoneofsecondis
signalsecond1n:
std_logic_vector(3downto0);
signalsecond10n:
std_logic_vector(2downto0);
begin
second1_out<
=second1n;
second10_out<
=second10n;
process(clk,reset)
begin
if(reset='
1'
)then
second1n<
="
0000"
;
second10n<
000"
elsif(clk'
eventandclk='
if(second1n="
1001"
)then
if(second10n="
101"
cf<
='
elsesecond10n<
=second10n+1;
endif;
elsesecond1n<
=second1n+1;
endif;
endprocess;
endarchitectureone;
附录二:
分钟模块VHDL程序
entityminuteis
minute1_out:
minute10_out:
endentityminute;
architectureoneofminuteis
signalminute1n:
signalminute10n:
minute1_out<
=minute1n;
minute10_out<
=minute10n;
minute1n<
minute10n<
if(minute1n="
if(minute10n="
elseminute10n<
=minute10n+1;
elseminute1n<
=minute1n+1;
附录三:
小时模块VHDL程序
entityhouris
hour1_out:
hour10_out:
outstd_logic_vector(1downto0));
endentityhour;
architectureoneofhouris
signalhour1n:
signalhour10n:
std_logic_vector(1downto0);
hour1_out<
=hour1n;
hour10_out<
=hour10n;
hour1n<
hour10n<
00"
if(hour1n="
or(hour1n="
0011"
andhour10n="
0010"
))then
if(hour10n="
10"
elsehour10n<
=hour10n+1;
elsehour1n<
=hour1n+1;
附录四:
扫描仪模块VHDL程序
useieee.std_logic_arith.all;
entitysaomiaoyiis
port(clk:
reset:
second1,minute1,hour1:
instd_logic_vector(3downto0);
second_10,minute_10:
instd_logic_vector(2downto0);
hour_10:
instd_logic_vector(1downto0);
dataout:
sel:
endentitysaomiaoyi;
architectureoneofsaomiaoyiis
signalcount:
sel<
=count;
process(clk,reset)
dataout<
elsif(clk'
eventandclk='
)then
ifcount>
then
count<
else
=count+1;
casecountis
when"
=>
dataout<
=second1;
001"
0'
&
second_10;
010"
=m