用VHDL语言实现数字电子钟的设计EDA课程设计报告含源程序.docx
- 文档编号:3587576
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:29
- 大小:203.73KB
用VHDL语言实现数字电子钟的设计EDA课程设计报告含源程序.docx
《用VHDL语言实现数字电子钟的设计EDA课程设计报告含源程序.docx》由会员分享,可在线阅读,更多相关《用VHDL语言实现数字电子钟的设计EDA课程设计报告含源程序.docx(29页珍藏版)》请在冰豆网上搜索。
用VHDL语言实现数字电子钟的设计EDA课程设计报告含源程序
课程设计报告
设计题目:
用VHDL语言实现数字钟的设计
班级:
电子0901
学号:
XXXXXXXX
姓名:
XXXXXXXXX
指导教师:
XXXXXXXXX
设计时间:
摘要
现代电子设计技术的核心已转向基于计算机的电子设计自动化技术,即EDA(ElectronicDesignAutomation)技术。
EDA技术就是依赖计算机,在EDA工具软件平台上,对以硬件描述语言HDL(HardwareDescriptionLanguage)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
EDA技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件来完成对系统硬件功能的实现。
硬件描述语言是EDA技术的重要组成部分,常见的HDL语言有VHDL、Verilog、HDL、ABLE、AHDL、SystemVerilog和SystemC。
其中VHDL、Verilog在现在的EDA设计中使用最多,也拥有几乎所有主流EDA工具的支持。
VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化硬件设计任务,提高了设计效率和可靠性。
在这次设计中,主要使用VHDL语言输入。
此次设计很好地完成了数字钟的定时、切换显示年月日和时分秒的功能,完成了小型FPGA的设计开发,锻炼了动手实践能力,达到了课程设计的目的。
关键词:
EDA技术硬件描述语言VHDL设计数字电子钟
摘要………………………………………………………………………2
1、课程设计目的……………………………………………………………4
2、课程设计内容及要求……………………………………………………4
2.1设计内容……………………………………………………………4
2.2设计要求……………………………………………………………4
3、VHDL程序设计…………………………………………………………5
3.1方案论证……………………………………………………………5
3.2设计思路与方法……………………………………………………6
3.2.1设计思路……………………………………………………6
3.2.2设计方法……………………………………………………7
4、仿真与分析………………………………………………………………7
5、器件编程下载及设计结果……………………………………………9
6、课程设计总结…………………………………………………………10
7、参考文献………………………………………………………………10
8、程序清单………………………………………………………………11
8.1顶层模块…………………………………………………………11
8.2秒脉冲模块………………………………………………………13
8.3数码管显示模块…………………………………………………14
8.4时分秒模块………………………………………………………15
8.4.1分秒模块……………………………………………………16
8.4.2小时模块……………………………………………………18
8.5年月日模块………………………………………………………19
8.5.1日期模块……………………………………………………21
8.5.2月份模块……………………………………………………24
8.5.3年份模块……………………………………………………25
1、课程设计目的
EDA技术课程设计在课程结束以后进行,在实践中验证理论知识,不仅是为了巩固课堂上所学知识,更是为了加深我们对EDA技术和VHDL语言的理解;为了让我们自己动手完成从设计输入、逻辑综合、功能仿真、设计实现到实现编程、时序仿真,一直到器件的下载测试的整个过程,真切感受利用EDA技术对FPGA进行设计开发的过程,锻炼和提高我们对器件的编程调试能力。
2、课程设计内容及要求
2.1设计内容
(1)VHDL程序设计、输入——在ise平台上用VHDL描述系统的功能(建立工程文件,添加VHDL文件,输入源程序);
(2)逻辑综合——将源程序编译调试无误后,为设计系统选择一个电路实现方案,按照这个方案进行逻辑综合和优化,生成1个电路网表文件;
(3)功能仿真——添加波形文件,设计输入,观察输出,检查自己的设计是否达到和完成要求的逻辑功能;
(4)设计实现——布局、布线及配置,最后生成可以写到芯片中的目标文件;
(5)时序仿真——是适配到选定的芯片后进行的仿真,它模拟芯片的实际动作,仿真时间模型严格将门级延时计算在内,可以分析出竞争与冒险,时序仿真验证过的电路与实际电路基本上一致;
(6)器件编程——对器件编程下载目标文件;
(7)测试——验证设计项目在目标系统上的实际工作情况,以便排除不完善的地方,改进设计。
2.2设计要求
利用VHDL语言在EDA工具软件平台上设计实现一个具有带预置数的数字电子钟,使其具有切换显示年月日、时分秒的功能。
显示时,用6个数码管显示时分秒,set(设置)按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,第4,个脉冲到来时可预置日期,依次第5、6、7个脉冲到来时分别可预置、时、分、秒,第8个脉冲到来后预置结束,数字电子钟正常工作,6个数码管显示的是时分秒。
另外,up按钮为高电平时,且此时upclk有脉冲到达时,当前预置位加1;up按钮为低高电平时,且此时upclk有脉冲到达时,当前的预置位减1。
还可以在此基础上增加数字电子钟的其它功能。
3、VHDL程序设计
3.1方案论证
设计中使用的时元件例化和进程结合的方案。
每个元件主要采用进程语句实现,在每个进程主要使用了if_else、if_eslif_elsif_----_else、case以及赋值语句,实现了模块化设计,使得整个程序一目了然。
整个电子钟的顶层设计实体为clock(时钟)模块,其下又分为:
second_wave(秒脉冲)、shi_fen_miao(时分秒)、nian_yue_ri(年月日)和led_disp(数码管显示)四个模块,数字电子钟结构图如图1所示。
其中,时分秒模块下又分为3个小模块——shi(时)、fen(分)和miao(秒),如图2所示;年月日模块分为year(年)、month(月)和date(日期)三个模块,如图3所示。
经过功能仿真和器件下载测试验证知,使用此方案可以简单快速的实现数字电子钟的设计。
图1数字电子钟顶层实体clock模块结构图
图2数字电子钟nian_yue_ri(年月日)模块结构图
图3数字电子钟shi_fen_miao(时分秒)模块结构图
3.2设计方法
3.2.1设计思路
课程设计要求我们设计的数字电子钟具有切换显示年月日和时分秒的功能,且能根据set(设置)按钮按动的次数进行相应的切换显示和年月日时分秒的预置,很容易想到led_disp(数码管显示)模块,即对set脉冲进行计数,然后根据计得的数值进行相应的操作——年月日时分秒的计时以及根据up和upclk的变化来进行各个位的设置。
可以把年月日、时分秒分别放在一个模块,两个模块再分别划分为年、月、日和时、分、秒模块,各模块间设置进位信号进行连接。
3.2.2设计方法
按照设计内容和要求以及所有的设计思路,综合考虑后,采用元件例化和进程相结合的方法,设计模块化的结构:
顶层设计实体为clock(时钟)模块,其下又分为:
second_wave(秒脉冲)、shi_fen_miao(时分秒)、nian_yue_ri(年月日)和led_disp(数码管显示)四个模块。
其中,时分秒模块下又分为3个小模块——shi(时)、fen(分)和miao(秒);年月日模块分为year(年)、month(月)和date(日期)三个模块。
每个模块主要使用VHDL语言输入中常用的进程语句、元件例化语句、case语句、if语句以及赋值语句。
需要注意的是,在年月日模块中的日期模块对于2月份要按照平年闰年的情况分别处理。
4、仿真与分析
图4顶层模块图clock功能仿真
分析:
图4中,set脉冲来之前,显示的是时分秒——23:
59:
59;第一个set脉冲来之后切换显示年月日——11年01月28号;set第二个脉冲来:
设置年份,up先高后低再高,在upclk上升沿来时,年份依次变为11→12→13→12→11→12→13,;set第三个脉冲来:
设置月份,up先高后低再高,upclk上升沿来时,年份依次变为01→02→01→12→01→02;等等,以此类推,最后设置成的数字钟显示状态为13年03月29号01点00分01秒,之后在clk时钟输入下开始正常计时显示。
由于程序中增加了1000分频模块,在仿真时间有限的情况下,看不出时分秒计时的增加。
为了验证所设计的能正常计时,又分别进行了年月日和时分秒模块的功能仿真。
图5nian_yue_ri(年月日)模块功能仿真图
分析:
初始化的年月日显示为11年01月28号,在lock为0时,即正常显示时,日期按照clk0的输入正常增加,11年01月29号;lock为2时,即set的第2个脉冲来时,设置年份,up先高后低再高,在选择的clk1的上升沿到时,年份变化为:
11→12→13→14→13→13→15→16;lock为3时,即set的第3个脉冲来时,设置月份,根据up的变化以及clk1的输入,月份依次变化为:
01→02→03→04→03→04→05→06→07→06→05→04→03;以此类推,之后设置日期,最后设置完毕后,年月日为16年03月31号,在clk0上升沿来时,依次为16年04月01号→16年04月2号→16年04月03号。
即,年月日模块可以正常计时,能完成加减的预置功能。
图6shi_fen_miao(时分秒)模块功能仿真
分析同年月日模块。
由图可知,时分秒模块也可以正常计时,能完成加减的预置功能。
综合分析图4至图6可知,按所选用方案所设计的电子钟可以完成加减的预置、切换显示和正常计时功能。
5、器件编程下载及设计结果
(一)管脚锁定如图7所示:
图7管脚锁定图
(二)设计结果分析
此次数字电子钟设计中,使得数字电子钟具有切换显示年月日、时分秒的功能,并且能够根据设置按钮进行相应的设置。
设计过程中对clock模块和shi_fen_miao模块以及nian_yue_ri模块进行了功能仿真,达到了预期效果。
经过器件编程下载验证知,达到了设计所要求的切换显示和设置功能,完成了设计要求。
6、课程设计总结
实际上,课程设计中尝试了两种设计方案,一种就是现在的元件例化与进程相结合的方法;另一种是多进程的方法,把各功能模块使用进程语句全部包含在一个结构体中,却出现了预料之外的错误——把各个进程拿出来放到新建的文件里调试,显示无误,都放在一起后却总出现代号为415的综合错误,先是在李世平老师的提点下改正了多个进程控制一个输出端的错误,改正之后还是无法综合成功,反复检查多次仍发现无处下手之后决定转为元件例化与进程结合的方案,采用模块化鲜明的设计结构。
由于大多采用的是元件例化语句,只要保证各个模块设计无误,最后顶层设计中对各元件进行位置映射时够细心基本上不出处错误。
设计中觉得最难的模块是date模块,因为需考虑闰年和平年的情况下2月的天数,以及大小月的天数,if语句嵌套较多,失之毫厘谬以千里,一个不小心错了一句时设计结果也就无处谈及,所以更需加倍细心的处理各个if语句嵌套。
课程设计中最大的收获是独立自主的完成了设计任务,使得自己有一种成就感,增强了我对利用VHDL语言进行FPGA设计开发的兴趣,更锻炼了我动手调试程序的能力,考验了我在编写程序时的细心和耐心程度。
做过课程设计后的建议就是希望学院能把实验设备规整好,让下一届的做课设时不再像我们一样好几个人同时等一个实验箱。
7、参考文献
(1)《可编程逻辑器件与EDA技术》李景华杜玉远主编东北大学出版社
(2)《EDA与VHDL》(第二版)潘松黄继业编著清华大学出版社
(3)《EDA技术》刘江海主编华中科技大学出版社
(4)《EDA基础与应用》(第1版)于润伟编著机械工业出版社
8、程序清单
8.1顶层模块:
clock
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityclockis
port(clk:
instd_logic;--时钟输入
set:
instd_logic;--设置按钮
up:
instd_logic;--增减控制端
upclk:
instd_logic;--预置时钟输入
en:
instd_logic;--使能端
clr:
instd_logic;--清零端
q5:
bufferstd_logic_vector(3downto0);--输出
q4:
bufferstd_logic_vector(3downto0);
q3:
bufferstd_logic_vector(3downto0);
q2:
bufferstd_logic_vector(3downto0);
q1:
bufferstd_logic_vector(3downto0);
q0:
bufferstd_logic_vector(3downto0));
endclock;
architectureBehavofclockis
componentsecond_waveis--秒脉冲例化
port(clk:
instd_logic;
second_wave:
bufferstd_logic);
endcomponent;
componentshi_fen_miaois--时分秒例化
port(clk0:
instd_logic;
clk1:
instd_logic;
clr:
instd_logic;
en:
instd_logic;
up:
instd_logic;
lock:
instd_logic_vector(2downto0);
sec0:
bufferstd_logic_vector(3downto0);
sec1:
bufferstd_logic_vector(3downto0);
min0:
bufferstd_logic_vector(3downto0);
min1:
bufferstd_logic_vector(3downto0);
hour0:
bufferstd_logic_vector(3downto0);
hour1:
bufferstd_logic_vector(3downto0);
co:
outstd_logic);
endcomponent;
componentnian_yue_riis--年月日例化
port(clk0:
instd_logic;
clk1:
instd_logic;
clr:
instd_logic;
en:
instd_logic;
up:
instd_logic;
lock:
instd_logic_vector(2downto0);
date0:
bufferstd_logic_vector(3downto0);
date1:
bufferstd_logic_vector(3downto0);
month0:
bufferstd_logic_vector(3downto0);
month1:
bufferstd_logic_vector(3downto0);
year0:
bufferstd_logic_vector(3downto0);
year1:
bufferstd_logic_vector(3downto0));
endcomponent;
componentled_dispis--数码管显示例化
Port(lock:
instd_logic_vector(2downto0);
sec0:
instd_logic_vector(3downto0);
sec1:
instd_logic_vector(3downto0);
min0:
instd_logic_vector(3downto0);
min1:
instd_logic_vector(3downto0);
hour0:
instd_logic_vector(3downto0);
hour1:
instd_logic_vector(3downto0);
date0:
instd_logic_vector(3downto0);
date1:
instd_logic_vector(3downto0);
month0:
instd_logic_vector(3downto0);
month1:
instd_logic_vector(3downto0);
year0:
instd_logic_vector(3downto0);
year1:
instd_logic_vector(3downto0);
q0:
bufferstd_logic_vector(3downto0);
q1:
bufferstd_logic_vector(3downto0);
q2:
bufferstd_logic_vector(3downto0);
q3:
bufferstd_logic_vector(3downto0);
q4:
bufferstd_logic_vector(3downto0);
q5:
bufferstd_logic_vector(3downto0));
endcomponent;
-------------------------------各个连接信号定义----------------------------------------
signaltlock:
std_logic_vector(2downto0):
="000";--lock赋初值,显示时分秒
signaltsecond_wave:
std_logic;
signaltcoday:
std_logic;
signalsec0:
std_logic_vector(3downto0);
signalsec1:
std_logic_vector(3downto0);
signalmin0:
std_logic_vector(3downto0);
signalmin1:
std_logic_vector(3downto0);
signalhour0:
std_logic_vector(3downto0);
signalhour1:
std_logic_vector(3downto0);
signaldate0:
std_logic_vector(3downto0);
signaldate1:
std_logic_vector(3downto0);
signalmonth0:
std_logic_vector(3downto0);
signalmonth1:
std_logic_vector(3downto0);
signalyear0:
std_logic_vector(3downto0);
signalyear1:
std_logic_vector(3downto0);
begin
process(set)
begin
if(set'eventandset='1')then--设置按钮set脉冲计数
tlock<=tlock+1;
endif;
endprocess;
----------------------对各元件进行位置映射------------------------
u1:
second_waveportmap(clk,tsecond_wave);
u2:
shi_fen_miaoportmap(tsecond_wave,upclk,clr,en,up,tlock,
sec0,sec1,min0,min1,hour0,hour1,tcoday);
u3:
nian_yue_riportmap(tcoday,upclk,clr,en,up,tlock,date0,
date1,month0,month1,year0,year1);
u4:
led_dispportmap(tlock,sec0,sec1,min0,min1,hour0,hour1,date0,
date1,month0,month1,year0,year1,q0,q1,q2,q3,q4,q5);
endBehav;
8.2秒脉冲模块second_wave
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitysecond_waveis
port(clk:
instd_logic;
second_wave:
bufferstd_logic);
endsecond_wave;
architectureBehavioralofsecond_waveis
signalcnt:
std_logic_vector(8downto0);
begin
process(clk,cnt)
begin
if(clk'eventandclk='1')then--即对总时钟进行分频
if(cnt="111110011")then
cnt<="000000000";
second_wave<=notsecond_wave;
elsecnt<=cnt+'1';
endif;
endif;
endprocess;
endBehavioral;
8.3显示模块led_disp:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityled_dispis
Port(lock:
instd_logic_vector(2downto0);
sec0:
instd_logic_vector(3downto0);
sec1:
instd_logic_vector(3downto0);
mi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 语言 实现 数字 电子钟 设计 EDA 课程设计 报告 源程序