第一篇:VHDL实现数字钟课设报告[推荐]
东北大学信息学院
课程设计报告
课程设计题目:用VHDL语言实现数字钟的设计
班 级:电子1001班 学 号:20102594 姓 名:刘云飞
指导老师:李世平、李宁
设计时间:2012年12月
东北大学信息学院
摘要
随着EDA技术的发展,EDA在通信、电子等领域占有十分重要的地位。本设计介绍了基于VHDL语言的数字钟的设计。数字钟的功能是对年、月、日、时、分、秒、星期,以及闹钟时、分的预置;在正常计数时的时、分与闹钟设定的时、分相同时,实现报时,同时以stop和pass键对闹钟进行停止及延迟响铃的控制;在整点的时候led灯闪烁一下。其中,用set脉冲的不同实现对预置,正常计时,闹钟的控制。Set为1~12分别控制显示年月日、预置年月日、时分秒、星期、显示时分秒、预置闹钟时分、显示闹钟预置的时分。预置时用up的高、低电平实现对各预置量的加、减控制。将1KHZ的时钟进行分频为1HZ,实现每次脉冲为1秒。经仿真和验证显示,此数字钟切实可行,可以实现显示时间和闹钟的功能。
关键词:VHDL语言,数字钟,预置
东北大学信息学院
目录
摘 要............................................................2
1、设计目的.........................................................4
2、设计内容和要求...................................................4
3、设计原理.........................................................4
3.1 数字钟功能介绍..........................................................................................................4 3.2 数字钟设计原理..........................................................................................................5
4、VHDL程序设计.....................................................6
4.1 整体设计思路................................................................................................................6 4.2 各模块设计方法............................................................................................................7 4.2.1 顶层模块...............................................................................................................7 4.2.2 其他模块...............................................................................................................8 4.2.3 程序包模块.........................................................................................................13
5、仿真与分析......................................................13
5.1 仿真结果....................................................................................................................13 5.2 仿真分析....................................................................................................................16
6、课程设计总结....................................................16
7、参考文献........................................................17
东北大学信息学院
1、设计目的
掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法。
2、设计内容和要求
用VHDL语言实现数字钟的设计,要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。Up为高电平时,upclk有脉冲到达时,预置位加1。否则减1。
3、设计原理 3.1 数字钟功能介绍
数字钟具有计时、预置、报时的功能。以不同的set脉冲控制各个功能。
(1)在计时功能中,数字钟实现对年月日时分秒即星期的计时,并可以通过LED数码管分别显示年月日、或时分秒、或星期、或闹钟的时分。
(2)在预置功能中,可以通过UP键对各需要预置的量进行控制。UP=1时,进行“加”控制,UP=0时,进行“减”控制。
(3)在报时功能中,分为整点报时和设置时间报时。其中整点报时以ce作为使能输入端,在整点时灯进行一秒闪烁;设置时间报时以enable作为使能输入端,enable=1时设置时间报时功能启动,在闹钟预置时间与时钟当前时间相同时报时,若此时按下stop,闹钟立即停止并不再响铃,若按下pass,则闹钟立即停止,但三分钟后再响,如此循环5次后不再响铃,若什么都不按,闹钟响铃持续1分钟。
东北大学信息学院
3.2 数字钟设计原理
本设计功能有8个子模块:分频模块、时分秒模块、日模块、年月模块、闹钟预置模块、星期模块、响铃模块。通过元件例化由顶层文件timekeeper综合。
整体设计框图及外观图如(图 3-1)及(图3-2)
图3-1 数字钟设计整体框图
东北大学信息学院
图3-2 数字钟外观图
4、VHDL程序设计
4.1 整体设计思路
采用自上而下的方法进行整体设计。整个设计共分为8个模块,通过顶
层文件timekeeper元件例化将8个模块各个端口对应相连。在设计各个模块时所用到的其它运算方法等放于work库中,通过程序包及程序包体的方式对所使用函数进行定义。
主要使用的语句有:元件例化语句,过程语句,信号赋值语句,if语句,case语句(在状态机中)。
图(4-1)表示了个模块的连接及连接是所用到的触发器等。
东北大学信息学院
图4-1
整体结构图
4.2 各模块设计方法
4.2.1 顶层模块
顶层模块timekeeper是.对对所有模块的综合。
它包含的功能是:通过元件例化连接各模块;实现对闹钟控制位sp2的控制;实现闹钟的整点报时闪烁。
输入端:up
全局加减选择,控制预置时的加减
setpin 设定选择
东北大学信息学院
upclk 加减触发
f1000 时钟输入
输出端:a0~d1 八位数码管控制引脚的输出
z
整点报时输出 4.2.2 其他模块
1、时分秒模块
时分秒模块h_m_s是对时、分、秒正常计时(set=0 or 1 or 12)和预置时分秒(set=5 or 6 or 7)的实现。
分和秒由两个六十进制实现,时由24进制实现。当时间达到23时59分59秒时,时分秒全部归零,进位位ov由零变为1,通过管脚连接到date模块的时钟计数信号clk0,开启date模块。
2、日的模块
日的模块date实现日子进行正常计时(set=0 or 1 or 12)和预置(set=4)。
由于每月的天数与月份、年份有关,故需判断年月。(1)(2)(3)当1、3、5、7、8、10、12月时,每月31天,使用31进制。当4、6、9、11月时,每月30天,使用30进制。当2月时,分闰年和平年。闰年29天,平年28天。
闰年和平年的判断方法是:由于通过年月模块传输的年份为两位BCD码。若高位信号为“xxx0”且低位信号为“xx00”或高位信号为“xxx1”且低位信号为“xx10”,则可判定为闰年,否则为平年。
以上各月,当日期至月底时返回1,进位位ov变为1通过管脚连接年月模块的时钟计数信号clk0,开启年月模块。
3、年月模块
年月模块year_mon实现年月正常计时(set=0 or 1 or 12)和年、月的预置(set=2 or 3)。
月为12进制,当达到12时变回为1,同时使年份进1。由两位BCD码表示年份,故可以表示100年之年的所有年,为100进制。
东北大学信息学院
图4-2 year_mon和date模块的电路连接图
4、星期模块
星期模块week的功能是实现对星期的计时(set=0 or 1 or 12)和预置(set=8)。为七进制。
图4-3 week模块的RTL
5、闹钟模块
东北大学信息学院
闹钟模块alarm是对闹钟时和分的预置(set=10 or 11)。时为24进制,分为60进制。
图4-3 alarm模块的RTL
另外,在顶层模块timekeeper,当闹钟预置时间与计时时间相同时(仅时、分),闹钟响铃,当不对其进行任何操作时,响铃维持1分钟。响铃方式见4.2.7响铃模块。
6、响铃模块
响铃模块alarm是对闹钟响铃的控制。其中主要包含:
Enable:当enable=1时,闹钟可以工作。
Sp2 :当顶层模块闹钟时间与计时相等时,sp2=1,响铃开启。Stop :闹钟停止并不再响铃。
Pass :闹钟停止但三分钟后再响,循环5次。Sp :响铃输出。Sp=1时响铃,sp=0时不响。本模块主要使用的方法是状态机。相应状态转换图如下:
东北大学信息学院
图 4-4 响铃模块状态转换图
在状态t_pass时,使用计数的方法实现对3分钟,5次循环的计数。
图 4-5 计数的流程图
东北大学信息学院
图4-6 speak模块的RTL
7、分频模块
分频模块fenpin使输入为1KHZ时钟信号时,接入电路经分频后仍能按1HZ即1s计数。
图4-7 fenpin模块的RTL
8、显示模块
显示模块led即七段数码管的显示电路。
东北大学信息学院
图4-8 led模块的RTL 4.2.3 程序包模块
程序模块是对各模块所用到的函数的定义,通过程序包package定义时、日、月、年等的增减函数(procedure),并用程序包体package body具体说明函数的内容。通过use.work.pac.all语句调用程序包,使程序书写更加方便简洁。
5、仿真与分析
5.1 仿真结果
1、h_m_s模块
东北大学信息学院
表示当up=1时,时钟时(set=5)、分(set=6)、秒(set=7)从0开始加。
图 5-1
2、date模块
以下为对应月份截图。另外,当日期由最末变为1时,ov进1以控制year_mon模块。
(1)大月:每月31天。
图5-2-1(2)小月:每月30天。
图5-2-2(3)平年2月:每月28天。
东北大学信息学院
图5-2-3(3)闰年2月:每月29天。
图5-2-4
3、year_mon模块
图5-3
4、week模块
前半部分up=1,为加,1~7,后半部分up=0,为减,6~1
图5-4
5、alarm模块
下图反映对闹钟时(set=10)、分(set=11)的预置,up=1为加。
图 5-5
6、speak模块
(1)按下pass
由下图可见,当时间相同sp为高电平;按下pass后sp变为低电平,三分钟
东北大学信息学院
后sp又为高电平。
图5-6-1(2)按下stop
由下图可见,当时间相同时sp为高电平,按下stop后sp变为低电平。
图 5-6-2
5.2 仿真分析
各模块仿真均可实现,且波形显示可以实现预想的功能。
6、课程设计总结
通过这次的课程设计,我又一次系统的复习了VHDL语言,通过实践对VHDL语言和EDA技术有了更具现实性应用性的了解,并熟练了相关软件的使用方法。
此次课程设计的内容是数字钟,我学会了如何利用元件例化将各个模块结合起来,而不是一味的想起一个功能设计一个功能,而是有一个总体的自上而下的设计,建立基本的设计框图(如图 3-1),再进行具体的设计。
在程序调试的过程中,出现了很多的问题。我发现往往是一行出现了错误导致了接下来一系列错误的出现。
还有在仿真中出现错误的红线,并出现了‘U’字符,全都是未设置初值所致。而在设置初值时仍然出现了问题。最开始我想定义一个clr信号,当clr为高电平时各功能清零,但是在实际仿真时,由于常常要看在月末或类似23时59分59秒这样的时刻是否有进位信号进为高电平,从零开始显然让仿真变的十
东北大学信息学院
分麻烦,如果可以直接赋初值到接近进位的时刻就会让仿真变得简便。即使用信号赋初值的方法对信号进行赋初值,既解决错误又利于仿真。
在最后对顶层仿真时出现了很多的问题,最后发现都是未对应的问题。当然,我的设计还有很多不足的地方。比如有一处的竞争冒险产生的毛刺没有解决。最开始是将speak模块控制信号sp2的相关程序写在了alarm模块,仿真时发现在一处出现了毛刺,在对闹钟进行预置时分时的第一个时间都未足一个时钟周期(如图 5-5)。后来我想是否因为alarm模块有两个process进程,就将sp2的相关程序挪到了顶层模块,但是最后还是没有实现。咨询了一下同学们,他们都说这没有问题,不需要解决,所以就没有解决这个问题。
此次课程设计我学到了很多,但是我觉得应该放在刚刚考完EDA之后,那时候对只是记得比较清楚,不像在这次设计时很多知识都想不起来了。其他的对我帮助都很大。
7、参考文献 李景华,杜玉远等著.可编程逻辑器件与EDA技术.沈阳:东北大学出版社,2000 2 齐怀印等.高级逻辑器件与设计.北京:电子工业出版社,1996 3 可编程逻辑器件与数字系统设计[M].北京航天航空大学出版社,1999 4 刘真,毕才术.数字逻辑与计算机设计[M ]北京:高等教育出版社,2002 5 王小军.VHDL简明教程[M].北京:清华大学出版社,1997
第二篇:数字钟课设任务书
课程设计任务书
一、设计课题
数字钟
二、设计时间
2011年 6 月 20日至2011年 6 月 24日
三、设计内容及要求
1、设计要求
1)时间以24小时为一个周期; 2)能显示时、分、秒,24小时制;
3)有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间; 4)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时; 5)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。6)在完成上述设计内容的基础上,可以自行设计一些附加功能。注意:硬件资源的节约,否则器件内资源会枯竭。
2、工作任务与要求
1)搜集有关资料,进行方案设计,画出总体设计框图,说明抢答器由哪些相对独立的功能模块组成,标出各个模块之间互相联系,并以文字对原理作辅助说明。
2)进行电路参数分析、论证,以及电路可靠性分析。3)设计各个功能模块的电路图,加上原理说明。
4)在验证各个功能模块基础上,对整个电路的元器件和布线,进行合理布局,画出总体电路图。
3、设计报告正文内容要求
1)设计目的。2)设计指标。3)设计方案及论证。
4)画出设计的原理框图,并要求说明该框图的工作过程及每个模块的功能。5)画出各功能模块的电路图,加上原理说明(例如抢答门及控制电路,锁存器及译码显示原理等)。
6)画出总布局接线图(集成块按实际布局位置画,关键的连接应单独画出,集成块的引脚须按实际位置画,并注明名称。)
7)元器件清单。
胡静波
第三篇:基于VHDL的多功能数字钟设计报告
基于VHDL的多功能数字钟
设计报告
021215班 卫时章 02121451
一、设计要求
1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1秒。
二、设计环境:Quartus II
三、系统功能描述
1、系统输入:时钟信号clk采用50MHz;系统状态及较时、定时转换的控制信号为k、set,校时复位信号为reset,均由按键信号产生。
2、系统输出:LED显示输出;蜂鸣器声音信号输出。
3、多功能数字电子钟系统功能的具体描述如下:
(一)计时:正常工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
(二)校时:在计时显示状态下,按下“k”键,进入“小时”待校准状态,若此时按下“set”键,小时开始校准;之后按下“k”键则进入“分”待校准状态;继续按下“k”键则进入“秒”待复零状态;再次按下“k”键数码管显示闹钟时间,并进入闹钟“小时”待校准状态;再次按下“k”键则进入闹钟“分”待校准状态;若再按下“k”键恢复到正常计时显示状态。若校时过程中按下“reset”键,则系统恢复到正常计数状态。(1)“小时”校准状态:在“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。(2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。(3)“秒”校准状态:在“秒复零”状态下,显示“秒”的数码管以2Hz闪烁,并以1Hz的频率递增计数。
(4)闹钟“小时”校准状态:在闹钟“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。
(5)闹钟“分”校准状态:在闹钟“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。
(三)整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57”秒发频率为500Hz的低音,在“59”分钟的第“59”秒发频率为1000Hz的高音,结束时为整点。
(四)显示:采用扫描显示方式驱动4个LED数码管显示小时、分,秒由两组led灯以4位BCD 码显示。
(五)闹钟:闹钟定时时间到,蜂鸣器发出频率为1000Hz的高音,持续时间为60秒。
四、各个模块分析说明
1、分频器模块(freq.vhd)(1)模块说明:输入一个频率为50MHz的CLK,利用计数器分出 1KHz的q1KHz,500Hz的q500Hz,2Hz的q2Hz和1Hz的q1Hz。(2)源程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity freq is
port
(CLK: in std_logic;
--输入时钟信号
q1KHz: buffer std_logic;
q500Hz: buffer std_logic;
q2Hz: buffer std_logic;
q1Hz: out std_logic);end freq;
architecture bhv of freq is begin P1KHZ:process(CLK)variable cout:integer:=0;begin
if CLK'event and CLK='1' then
cout:=cout+1;
--每来个时钟上升沿时cout开始计数 if cout<=25000 then q1KHz<='0';
--当cout<=25000时,q1KHz输出“0”
elsif cout<50000 then q1KHz<='1';--当25000 else cout:=0; --输出“1”,完成1KHz频率输出 end if; end if;end process; P500HZ:process(q1KHz) --q1KHz作为输入信号,分出q500Hz variable cout:integer:=0;begin if q1KHz'event and q1KHz='1' then cout:=cout+1;if cout=1 then q500Hz<='0'; --二分频 elsif cout=2 then cout:=0;q500Hz<='1';end if; end if;end process; P2HZ:process(q500Hz)variable cout:integer:=0;begin if q500Hz'event and q500Hz='1' then cout:=cout+1;if cout<=125 then q2Hz<='0'; elsif cout<250 then q2Hz<='1'; else cout:=0;end if; end if;end process; P1HZ:process(q2Hz)variable cout:integer:=0;begin if q2Hz'event and q2Hz='1' then cout:=cout+1;if cout=1 then q1Hz<='0'; elsif cout=2 then cout:=0;q1Hz<='1';end if; end if;end process;end bhv;(3)模块图: 2、控制器模块(contral.vhd)(1)模块说明:输入端口k,set键来控制6个状态,这六个状态分别是: 显示计时时间状态,调计时的时、分、秒的3个状态,调闹铃的时、分的3个状态,reset键是复位键,用来回到显示计时时间的状态。(2)波形仿真图: (3)模块图: 3、二选一模块(mux21a.vhd)(1)源程序: library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity mux21a is port(a,b,s:in bit; y:out bit);end entity mux21a; architecture one of mux21a is begin process(a,b,s)begin if s='0' then y<=a; --若s=0,y输出a,反之输出b。else y<=b;end if;end process;end architecture one;(2)仿真波形图: (3)模块图: 4、计时模块 a.秒计时(second.vhd)(1)仿真波形图: (2)模块图: b.分计时(minute.vhd)(1)仿真波形图: (2)模块图: c.小时计时(hour.vhd)(1)仿真波形图: (2)模块图: d.闹钟分计时(cntm60b.vhd)(1)仿真波形图: (2)模块图: e.闹钟小时计时(cnth24b.vhd)(1)仿真波形图: (2)模块图: 5、闹钟比较模块(compare.vhd)(1)模块说明:比较正常计数时间与闹钟定时时间是否相等,若相等,compout输出“1”,反之输出“0”。(2)仿真波形图: (3)模块图: 6、报时模块(bell.vhd)(1)模块说明:该模块既实现了整点报时的功能,又实现了闹铃的功能,蜂鸣器通过所选频率的不同,而发出不同的声音。(2)仿真波形图: (3)模块图: 7、控制显示模块(show_con.vhd)(1)模块说明:该模块实现了数码管既可以显示正常时间,又可以显示闹钟时间的功能;调时过程的定时闪烁功能也在此模块中真正实现。(2)源程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity show_con is port(th1,tm1,ts1:in std_logic_vector(7 downto 4); th0,tm0,ts0:in std_logic_vector(3 downto 0); bh1,bm1:in std_logic_vector(7 downto 4); bh0,bm0:in std_logic_vector(3 downto 0); sec1,min1,h1: out std_logic_vector(7 downto 4); sec0,min0,h0: out std_logic_vector(3 downto 0); q2Hz,flashs,flashh,flashm,sel_show:in std_logic);end show_con; architecture rtl of show_con is begin process(th1,tm1,ts1,th0,tm0,ts0,bh1,bm1,bh0,bm0,q2Hz,flashs,flashh,flashm,sel_show) begin if sel_show='0'then if(flashh='1'and q2Hz='1')then h1<=“1111”;h0<=“1111”;--显示小时数码管以2Hz闪烁 min1<=tm1;min0<=tm0; sec1<=ts1;sec0<=ts0; elsif(flashm='1'and q2Hz='1')then h1<=th1;h0<=th0; min1<=“1111”;min0<=“1111”; sec1<=ts1;sec0<=ts0; elsif(flashs='1'and q2Hz='1')then h1<=th1;h0<=th0; min1<=tm1;min0<=tm0; sec1<=“1111”;sec0<=“1111”; else h1<=th1;h0<=th0; min1<=tm1;min0<=tm0; sec1<=ts1;sec0<=ts0; end if; elsif sel_show='1'then--若sel_show为“1”,数码管显示闹钟时间 if(flashh='1' and q2Hz='1')then h1<=“1111”;h0<=“1111”; min1<=bm1;min0<=bm0; sec1<=“0000”;sec0<=“0000”; elsif(flashm='1' and q2Hz='1')then h1<=bh1;h0<=bh0; min1<=“1111”;min0<=“1111”; sec1<=“0000”;sec0<=“0000”; else h1<=bh1;h0<=bh0; min1<=bm1;min0<=bm0; sec1<=“0000”;sec0<=“0000”; end if; end if; end process;end rtl;(3)模块图: 8、动态扫描显示模块(scan_led.vhd)(1)模块说明:由4组输入信号和输出信号进而实现了时钟时、分的动态显示。(2)源程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity scan_led is port(clk1:in std_logic; h0:in std_logic_vector(3 downto 0); h1:in std_logic_vector(7 downto 4); min0:in std_logic_vector(3 downto 0); min1:in std_logic_vector(7 downto 4); ML:out std_logic_vector(7 downto 0); MH:out std_logic_vector(7 downto 0); HL:out std_logic_vector(7 downto 0); HH:out std_logic_vector(7 downto 0));end scan_led; architecture one of scan_led is signal cnt4:std_logic_vector(1 downto 0);signal a: std_logic_vector(3 downto 0);begin p1:process(clk1)begin if clk1'event and clk1 ='1' then cnt4<=cnt4+1; if cnt4=3 then cnt4<=“00”;end if;end if;end process p1; p2:process(cnt4,h1,h0,min1,min0)begin case cnt4 is --控制数码管位选 when “00”=>case min0 is when “0000”=>ML<=“11000000”; when “0001”=>ML<=“11111001”; when “0010”=>ML<=“10100100”; when “0011”=>ML<=“10110000”; when “0100”=>ML<=“10011001”; when “0101”=>ML<=“10010010”; when “0110”=>ML<=“10000010”; when “0111”=>ML<=“11111000”; when “1000”=>ML<=“10000000”; when “1001”=>ML<=“10010000”; when others=>NULL; end case;when “01”=>case min1 is when “0000”=>MH<=“11000000”; when “0001”=>MH<=“11111001”; when “0010”=>MH<=“10100100”; when “0011”=>MH<=“10110000”; when “0100”=>MH<=“10011001”; when “0101”=>MH<=“10010010”; when “0110”=>MH<=“10000010”; when “0111”=>MH<=“11111000”; when “1000”=>MH<=“10000000”; when “1001”=>MH<=“10010000”; when others=>NULL; end case;when “10”=>case h0 is when “0000”=>HL<=“11000000”; when “0001”=>HL<=“11111001”; when “0010”=>HL<=“10100100”; when “0011”=>HL<=“10110000”; when “0100”=>HL<=“10011001”; when “0101”=>HL<=“10010010”; when “0110”=>HL<=“10000010”; when “0111”=>HL<=“11111000”; when “1000”=>HL<=“10000000”; when “1001”=>HL<=“10010000”; when others=>NULL; end case;when “11”=>case h1 is when “0000”=>HH<=“11000000”; when “0001”=>HH<=“11111001”; when “0010”=>HH<=“10100100”; when “0011”=>HH<=“10110000”; when “0100”=>HH<=“10011001”; when “0101”=>HH<=“10010010”; when “0110”=>HH<=“10000010”; when “0111”=>HH<=“11111000”; when “1000”=>HH<=“10000000”; when “1001”=>HH<=“10010000”; when others=>NULL; end case;when others =>null;end case;end process p2;end one;(3)模块图: 五、端口设定 k:button2,set:button1,reset:button0 ; Bell:SW1 用于开关蜂鸣器; 六、顶层电路图 七、心得体会 此次的数字钟设计重在于按键的控制和各个模块代码的编写,虽然能把键盘接口和各个模块的代码编写出来,并能正常显示,但对于各个模块的优化设计还有一定的缺陷和不足,比如对按键消抖等细节处并未作出优化。 经过此次数字钟的设计,我确实从中学到很多的东西。首先,通过VHDL硬件语言的学习,我充分认识到了功能模块如何用语言实现,让我初步了解到了一个数字电路用硬件语言设计的方式和设计思想。其次,也让我深深地体会到实践的重要性,起初我学VHDL语言的时候,只是学得书本上的知识,经过这次课程设计,通过对模块的语言实现,对于VHDL语言我有了更深的认识。而且在程序错误的发现和改正的过程中,我得到了更多的收获,也确实让我进步了不少。再次,当我遇到一些问题的时候,请教老师,和同学们一起讨论,令我受益颇多!最后,这个多功能数字电子钟是自我创造与吸取借鉴共同作用的产物,是自我努力的结果。这让我对数字电路的设计充满了信心。虽然课程设计已经结束,但这并不代表着我已经真正掌握了VHDL语言,仍需继续学习! 设计并实现具有一定功能的数字钟 1、该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个功能:计时、重置时间、复位。 2、对所有设计的小系统能够正确分析; 3、基于VHDL语言描述系统的功能; 4、在quartus 2环境中编译通过; 5、仿真通过并得到正确的波形; 6、给出相应的设计报告。 其中计时模块有4部分构成:秒计时器(second)、分计时器(minute)、时计时器(hour)、日计时器(date)、月计时器(mouth)、年计时器(year) 1)秒计时器(second)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,秒计时器清0;set 为置数信号,当set为0时,秒计时器置数,置s1的值。clk为驱动秒计时器的时钟,sec为秒计时器的输出,ensec为秒计时器的进位信号,作为下一级的时钟输入信号。 2)分计时器(minute)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,分计时器清0;set 为置数信号,当set为0时,分计时器置数,置m1的值。clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。 3)时计时器(hour)是由一个24进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,时计时器清0;set 为置数信号,当set为0时,时计时器置数,置h1的值。clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。 4)日计时器(date1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,星期计时器清0;set 为置数信号,当set为0时,星期计时器置数,置d1的值。clkd为驱动星期计时器工作的时钟,与enhour相连接;date为日计时器的输出,endate为分计时器的进位信号,作为下一级的时钟输入信号,由于月份的天数存在天数不同,闰年2月的天数为28天等情况,还设计了一个润年判别器,准确显示时间。 5)月计时器(mouth)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,星期计时器清0;set 为置数信号,当set为0时,星期计时器置数,置mou1的值,clkmou为驱动星期计时器工作的时钟,与enday相连接;mou为日计时器的输出,enmou为分计时器的进位信号,作为下一级的时钟输入信号。6)计时器(year)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,星期计时器清0;set 为置数信号,当set为0时,星期计时器置数,置y1的值,clky为驱动星期计时器工作的时钟,与enmou相连接;year为日计时器的输出。VHDL程序 1、屏幕切换模块 运用状态机进行屏幕切换,分别显示年月日,以及时分秒 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;--Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity mux3 is Port(clk,Reset,sel : in std_logic; int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--rst must a1,a2,a3,a4,a5,a6: out std_logic_vector(3 downto 0));end mux3; architecture Behavioral of mux3 is TYPE states IS(st0, st1, st2, st3, st4, st5, st6, st7); SIGNAL STX: states; begin COM1 : PROCESS(STX,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12) BEGIN--决定转换状态的进程 CASE STX IS WHEN st0 => a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6; WHEN st1 => a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12; WHEN st2 => a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12; WHEN st3 => a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12; WHEN st4 => a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12; WHEN st5 => a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6; WHEN st6 => a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6; WHEN st7 => a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6; WHEN OTHERS => NULL; END CASE; END PROCESS COM1;REG: PROCESS(clk,Reset,sel) --主控时序进程 BEGIN IF Reset = '1' THEN STX<= st0; --异步复位 ELSIF clk='1' AND clk'EVENT THEN if sel='1' then CASE STX IS WHEN st0=>STX<=st1; WHEN st1=>STX<=st2; WHEN st2=>STX<=st3; WHEN st3=>STX<=st4; WHEN st4=>STX<=st5; WHEN st5=>STX<=st6; WHEN st6=>STX<=st7; WHEN st7=>STX<=st0; END CASE; END IF; END if;END PROCESS; 2、显示切换程序 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity mux1 is Port(clk,ina,inb,sel,Reset : in std_logic; result : out std_logic);end mux1; architecture Behavioral of mux1 is TYPE state IS(st0,st1,st2,st3,st4,st5,st6,st7); SIGNAL STX:state;begin REG1: PROCESS(ina,inb,STX) BEGIN CASE STX IS WHEN st0=>result<=ina; WHEN st1=>result<=ina; WHEN st2=>result<=inb; WHEN st3=>result<=inb; WHEN st4=>result<=inb; WHEN st5=>result<=inb; WHEN st6=>result<=inb; WHEN st7=>result<=inb; END CASE; END PROCESS;REG2:PROCESS(clk,sel,Reset)BEGIN IF(Reset='1')THEN STX<=st0;ELSIF(clk'EVENT AND clk='1')THEN if sel='1' then CASE STX IS WHEN st0=>STX<=st1;WHEN st1=>STX<=st2;WHEN st2=>STX<=st3;WHEN st3=>STX<=st4;WHEN st4=>STX<=st5;WHEN st5=>STX<=st6;WHEN st6=>STX<=st7;WHEN st7=>STX<=st0; END CASE;END IF;end if;END PROCESS REG2; end Behavioral; 3、置数操作模块 运用状态机,进行置数操作 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity mux is Port(clk,ina,inb,sel,Reset : in std_logic; r1,r2,r3,r4,r5,r6 : out std_logic);end mux; architecture Behavioral of mux is TYPE state IS(st0,st1,st2,st3,st4,st5,st6,st7); SIGNAL STX:state;begin PROCESS(ina,inb,STX)BEGIN CASE STX IS WHEN st0=>r1<=ina;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';WHEN st1=>r1<=ina;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';WHEN st2=>r1<='0';r2<='0';r3<='0';r4<='0';r5<='0';r6<=inb;WHEN st3=>r1<='0';r2<='0';r3<='0';r4<='0';r5<=inb;r6<='0';WHEN st4=>r1<='0';r2<='0';r3<='0';r4<=inb;r5<='0';r6<='0';WHEN st5=>r1<='0';r2<='0';r3<=inb;r4<='0';r5<='0';r6<='0';WHEN st6=>r1<='0';r2<=inb;r3<='0';r4<='0';r5<='0';r6<='0';WHEN st7=>r1<=inb;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';END CASE;END PROCESS;PROCESS(clk,sel,Reset)BEGIN IF(Reset='1')THEN STX<=st0;ELSIF(clk'EVENT AND clk='1')THEN if sel='1' then CASE STX IS WHEN st0=>STX<=st1;WHEN st1=>STX<=st2;WHEN st2=>STX<=st3;WHEN st3=>STX<=st4;WHEN st4=>STX<=st5;WHEN st5=>STX<=st6;WHEN st6=>STX<=st7;WHEN st7=>STX<=st0; END CASE;END IF;end if;END PROCESS;end Behavioral;end Behavioral; 4、秒显示模块 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity secute1 is Port(clkm,set,reset : in std_logic; sec2,sec1 : inout std_logic_vector(3 downto 0); ensec : out std_logic);end secute1; architecture Behavioral of secute1 is begin Process(clkm,reset,set) Begin If reset='1' then sec2<=“0000”;sec1<=“0000”; Elsif set='1' then sec2<=“0101”;sec1<=“1000”; Elsif(clkm'event and clkm='1')then if sec2=“0101” AND sec1=“1001” then sec2<=“0000”;sec1<=“0000”;ensec<='1'; elsif sec1=“1001” then sec2<=sec2+'1';sec1<=“0000”;ensec<='0'; else sec1<=sec1+'1';ensec<='0'; end if;end if;End process;end Behavioral; 5、分显示模块 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity minute1 is Port(clkm,set,reset : in std_logic; min2,min1 : inout std_logic_vector(3 downto 0); enmin : out std_logic);end minute1; architecture Behavioral of minute1 is begin Process(clkm,reset,set) Begin If reset='1' then min2<=“0000”;min1<=“0000”; Elsif set='1' then min2<=“0101”;min1<=“1000”; Elsif(clkm'event and clkm='1')then if min2=“0101” AND min1=“1001” then min2<=“0000”;min1<=“0000”;enmin<='1'; elsif min1=“1001” then min2<=min2+'1';min1<=“0000”;enmin<='0'; else min1<=min1+'1';enmin<='0'; end if;end if;End process;end Behavioral; 6、小时显示模块 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity hour1 is Port(clkh,set,reset: in std_logic; hor2,hor1 : inout std_logic_vector(3 downto 0); enhour : out std_logic);end hour1; architecture Behavioral of hour1 is begin Process(clkh,reset,set) Begin If reset='1' then hor2<=“0000”;hor1<=“0000”; Elsif set='1' then hor2<=“0010”;hor1<=“0011”; Elsif(clkh'event and clkh='1')then if hor2=“0010” AND hor1=“0011” then hor2<=“0000”;hor1<=“0000”;enhour<='1'; elsif hor1=“1001” then hor2<=hor2+'1';hor1<=“0000”;enhour<='0'; else hor1<=hor1+'1';enhour<='0'; end if; end if;End process;end Behavioral; 7、日显示模块(已加入闰年判断功能)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity date1 is Port(clkd,set : in std_logic; dat2,dat1 : inout std_logic_vector(3 downto 0); endate : out std_logic);end date1; architecture Behavioral of date1 is begin Process(clkd,set) Begin if set='1' then dat2<=“0010”;dat1<=“1000”; Elsif(clkd'event and clkd='1')then if dat2=“0011” AND dat1=“0000” then dat2<=“0000”;dat1<=“0001”;endate<='1';elsif dat1=“1001” then dat2<=dat2+'1';dat1<=“0000”;endate<='0'; else dat1<=dat1+'1';endate<='0'; end if;end if;End process;end Behavioral; 8、月显示模块 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity month1 is Port(clkn,set: in std_logic; mon2,mon1 : inout std_logic_vector(3 downto 0); enmon : out std_logic);end month1; architecture Behavioral of month1 is begin Process(clkn,set) Begin if set='1' then mon2<=“0000”;mon1<=“0110”; Elsif(clkn'event and clkn='1')then if mon2=“0001” AND mon1=“0010” then mon2<=“0000”;mon1<=“0001”;enmon<='1'; elsif mon1=“1001” then mon2<=mon2+'1';mon1<=“0000”;enmon<='0'; else mon1<=mon1+'1';enmon<='0'; end if;end if;End process; 9、年显示模块 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; --Uncomment the following lines to use the declarations that are--provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all; entity yearth1 is Port(clkn,set: in std_logic; year2,year1 : inout std_logic_vector(3 downto 0); enyear : out std_logic);end yearth1; architecture Behavioral of yearth1 is begin Process(clkn,set) Begin if set='1' then year2<=“0001”;year1<=“0001”; Elsif(clkn'event and clkn='1')then if year2=“1001” AND year1=“1001” then year2<=“0000”;year1<=“0001”; elsif year1=“1001” then year2<=year2+'1';year1<=“0000”;enyear<='0'; else year1<=year1+'1';enyear<='0'; end if;end if; end Behavioral; 数字钟课程设计元器件清单单价(元/个)1、2、3、共阳极数码管:6个174LS247集成芯片:6块1 74LS90集成芯片:6块14、CD4060集成芯片:1块5、74LS00集成芯片:1块6、74LS74集成芯片:2块7、74LS20集成芯片:2块8、74LS08集成芯片:2块9、74LS04集成芯片:1块10、74LS32集成芯片:1块11、22pf电容:2个12、32768时钟晶体:1个13、1K电阻:1个 14、三极管:1个15、100Ω电阻:6个 17、蜂鸣器:1个 18、小饭盒:1个 19、面包板:1块1 1 1 11 111第四篇:用状态机实现的EDA多功能数字钟课程设计VHDL代码
第五篇:电工电子课设-数字钟元器件清单