EDA课程设计报告模板.docx
《EDA课程设计报告模板.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告模板.docx(27页珍藏版)》请在冰豆网上搜索。
EDA课程设计报告模板
河南农业大学
课程设计报告
设计题目:
基于VHDL的数字闹钟的设计
学院:
理学院
专业:
电子信息科学与技术
班级:
班
学号:
姓名:
电子邮件:
日期:
2012年月日
成绩:
指导教师:
林爱英
…………………………装………………………………订………………………………线………………………………………………………………
河南农业大学
理学院
课程设计任务书
学生姓名指导教师林爱英
学生学号专业班级
题目基于VHDL的数字闹钟设计
任务与要求
设计要求:
该数字闹钟包括以下几个组成部分:
(1)显示屏,由6个七段数码管组成,用于显示当前时间(时、分、秒)或设置的闹钟时间;
(2)KEY键:
用于输入新的时间或新的闹钟时间,对每位输入数字的确认;(3)TIME(时间)键,用于确定新的时间设置;(4)ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间;(5)扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。
开始日期2012年月日完成日期2012年月日
课程设计所在地点理学院电子科学系机房
一、数字闹钟设计要求:
该数字闹钟包括以下几个组成部分:
(1)显示屏,由6个七段数码管组成,用于显示当前时间(时、分、秒)或设置的闹钟时间;
(2)KEY键:
用于输入新的时间或新的闹钟时间,对每位输入数字的确认;(3)TIME(时间)键,用于确定新的时间设置;(4)ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间;(5)扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。
二、实验目的:
1、初步了解可编程逻辑器件(PLD)的基本原理;
2、熟练掌握MAX+PlusⅡ图形编辑器、文本编辑器等不同的输入设计方法,掌握EDA的自顶向下(ToptoDown)的模块化设计思想;
3、了解VHDL语言的语法、句法及结构,能看懂VHDl语言编写的程序,并能熟练运用MAX+PlusⅡ软件对各个程序模块进行波形仿真;
4、熟悉顶层电路的原理图输入法,能应用EDA设计思想进行较复杂系统的分析和设计。
三、设计方案:
按照EDA自顶向下的设计理念,该数字闹钟可以分为告警控制器(ALARM_CONTROLLER)模块、计数器(ALARM_COUNTER)模块、寄存器(ALARM_REG)模块、分频器(DIVIDER)模块、显示驱动电路(DIS_DRIVER)木刻、输入电路(KEY_BUFFER)模块和时钟设置(CLOCK)模块,其顶层电路如下图所示。
四、各个模块的功能:
1.计时功能:
这是本闹钟设计的基本功能,每隔一秒钟计时一次,并在显示屏显示当前时间;
2.闹钟功能:
如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声;
3.设置新的计时器时间:
用户用KEY键输入新的时间。
在输入过程中,输入数字在显示屏上从右到左依次显示。
例如,用户要设置新的时间08:
34:
06,则按顺序输入“0”,“8”,“3”,“4”,“0”,“6”键与之对应,显示屏上依次显示的信息为:
“0”,“08”,“083”,“0834”,“08340”,“083406”。
然后按“TIME”键确认,如果用户在输入任意几个数字后较长时间内,例如5秒,没有按任意键,则计时器恢复到正常的计时显示状态。
4.设置新的闹钟时间:
用户用KEY键输入新的时间,然后按“ALARM”键确认。
5.显示所设置的闹钟时间:
在正常计时显示状态下,用户直接按下“ALARM”键,则已设置的闹钟时间显示在显示屏上。
五、系统的各组成部分的原理框图及功能
1、控制器的原理框图:
2、计数器的原理框图:
3、寄存器的原理框图:
4、分频器的原理框图:
5、显示电路的原理框图:
6、输入电路的原理框图:
7、计时器的原理框图:
其中各部分功能如下:
1、键盘缓冲器KEY-BUFFER是一个移位寄存器,暂存用户键入的数字,并且实现用户键入数字在显示器上从右到左是依次显示。
2、分频器DIVIDER将高速的外部时钟频率分频成每一分钟一次的时钟频率,以便进行时钟计数。
3、计数器ALARM-COUNTER实际上是一个异步复位、异步置位的累加器,通常情况下进行时钟累加计数,必要时可以置入新的时钟值,然后从该值开始新的计数。
4、寄存器ALARM-REG用于保存用户设置的闹钟时间,是一个异步复位寄存器。
5、显示器DRIVER根据需要显示当前时间、用户设置的闹钟时间或用户通过键盘输入的新的时间,同时判断当前时间是否已到了闹钟时间,实际上是一个多路选择比较器。
6、控制器ALARM-CONTROLLER是设计的核心部分,按设计要求产生相应是控制逻辑,以控制其他各部分的工作。
六、系统的主要模块VHDL源程序:
1、控制器源程序alarm-controller:
libraryieee;
useieee.std_logic_1164.all;
packagep_alarmis
subtypet_digitalisintegerrange0to9;
subtypet_shortisintegerrange0to65535;
typet_clock_timeisarray(5downto0)oft_digital;
typet_displayisarray(5downto0)oft_digital;
endpackagep_alarm;
libraryieee;
useieee.std_logic_1164.all;
usework.p_alarm.all;
entityalarm_controlleris
port(key:
instd_logic;
alarm_button:
instd_logic;
time_button:
instd_logic;
clk:
instd_logic;
reset:
instd_logic;
load_new_a:
outstd_logic;
load_new_c:
outstd_logic;
show_new_time:
outstd_logic;
show_a:
outstd_logic);
endentityalarm_controller;
architectureartofalarm_controlleris
typet_stateis(s0,s1,s2,s3,s4);
constantkey_timeout:
t_short:
=500;
constantshow_alarm_timeout:
t_short:
=500;
signalcurr_state:
t_state;
signalnext_state:
t_state;
signalcounter_k:
t_short;
signalenable_count_k:
std_logic;
signalcount_k_end:
std_logic;
signalcounter_a:
t_short;
signalenable_count_a:
std_logic;
signalcount_a_end:
std_logic;
begin
process(clk,reset)is
begin
ifreset='1'then
curr_state<=s0;
elsifrising_edge(clk)then
curr_state<=next_state;
endif;
endprocess;
process(key,alarm_button,time_button,curr_state,count_a_end,count_k_end)is
begin
next_state<=curr_state;
load_new_a<='0';
load_new_c<='0';
show_a<='0';
show_new_time<='0';
enable_count_k<='0';
enable_count_a<='0';
casecurr_stateis
whens0=>
if(key='1')then
next_state<=s1;
show_new_time<='1';
elsif(alarm_button='1')then
next_state<=s4;
show_a<='1';
else
next_state<=s0;
endif;
whens1=>
if(key='1')then
next_state<=s1;
elsif(alarm_button='1')then
next_state<=s2;
load_new_a<='1';
elsif(time_button='1')then
next_state<=s3;
load_new_c<='1';
else
if(count_k_end='1')then
next_state<=s0;
else
next_state<=s1;
endif;
enable_count_k<='1';
endif;
show_new_time<='1';
whens2=>
if(alarm_button='1')then
next_state<=s2;
load_new_a<='1';
else
next_state<=s0;
endif;
whens3=>
if(time_button='1')then
next_state<=s3;
load_new_c<='1';
else
next_state<=s0;
endif;
whens4=>
if(key='1')then
next_state<=s1;
else
next_state<=s4;
if(count_a_end='1')then
next_state<=s0;
else
next_state<=s4;
show_a<='1';
endif;
enable_count_a<='1';
endif;
whenothers=>
null;
endcase;
endprocess;
count_key:
process(enable_count_k,clk)is
begin
if(enable_count_k='0')then
counter_k<=0;
count_k_end<='0';
elsif(rising_edge(clk))then
if(counter_k>=key_timeout)then
count_k_end<='1';
else
counter_k<=counter_k+1;
endif;
endif;
endprocesscount_key;
count_alarm:
process(enable_count_a,clk)is
begin
if(enable_count_a='0')then
counter_a<=0;
count_a_end<='0';
elsifrising_edge(clk)then
i