2022年用VHDL语言编写的数字钟程序 .pdf

上传人:H****o 文档编号:39878816 上传时间:2022-09-08 格式:PDF 页数:20 大小:1.44MB
返回 下载 相关 举报
2022年用VHDL语言编写的数字钟程序 .pdf_第1页
第1页 / 共20页
2022年用VHDL语言编写的数字钟程序 .pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《2022年用VHDL语言编写的数字钟程序 .pdf》由会员分享,可在线阅读,更多相关《2022年用VHDL语言编写的数字钟程序 .pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 永州职业技术学院课程设计课程名称:EDA 技术实用教程题目:基于 FPGA 的数字钟设计系、专业:电子技术系应用电子年级、班级:07级电子大专学生姓名:冯苗指导老师:龙安国时间:2008年 12 月名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 20 页 -2 目录一、系统设计.1.1设计要求 1.1.1任务.1.1.2要求.1.1.3题目分析 二方案论证与比较 2.1方案一 2.2 方案二 2.3 方案三 三、设计思路 3.1硬件模块 3.2软件模块.四、调试情况.五、系统调试 六、心得体会.附:参考文献.名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 20

2、页 -3 用 VHDL 语言编写的数字钟程序摘要:本设计要求一个 12 进制或 24 进制的具有时、分、秒计时功能的数字钟,并要求能进行时、分、秒调整,每逢时有报时功能。数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。本设计基于 FPGA 芯片的数字钟的设计,通过多功能数字钟的设计思路,详细叙述了整个系统的硬件、软件实现过程,实现了时间的显示和修改功能、报时功能等,并尽可能的减少误差,使得系统可以达到实际数字钟的允许误差范围内。关键词:FBGA、数码管、按键一、系统设计11 设计要求111

3、任务设计并制作一个数字钟,通过设计,掌握电子设计的一般思路,学习电子设计的一般方法。112 要求(1)基本要求计时功能:这是数字钟的基本功能,每隔一秒钟计时一次,并在显示屏上显示当前时间。校时功能:能设置实时时间作为数字钟的当前时间,具有小时、分钟的手动校准时间功能。(2)发挥部分计时进制的选择功能:十二小时制或二十四小时制可选择控制;整点报警功能:每逢整点自动报警;其他创新功能。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 20 页 -4 二方案论证与比较 2.1、方案一:采用74LS163和 CD4046 设计数字钟图 1.1.1 方案一电路图晶体振荡器电路给数字钟提供一个

4、频率稳定准确的32768z 的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。由CD4046组成的分频器电路将32768 z 的高频方波信号经32768(214)次分频后得到2Hz的方波信号经过D触发器二分频得到秒信号供秒计数器进行计数。分频器实际上也就是计数器。时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60 进制计数器,而根据设计要求,时个位和时十位计数器为12 进制计数器。时间计数器由74LS163组成.译码驱动电路将计数器输出的8421BC

5、D码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。2、方案二:采用AT89C52 单片机、数码管设计数字钟名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 20 页 -5 图 1.1.2 方案二电路图本方案采用 AT89C52单片机,单片机的 P1口接数码管显示电路,P0口接键控制数码管的显示,P2.0 口接入整点报时电路,RESET 接入复位和晶振电路。该电路能否成功,关键在于程序的编写而对元器件的要求不太高。用汇编编写得数字钟电路,采用分支结构编写,利用跳转指令与

6、大量的中断指令.当没有按键扫描没有按键按下时,程序正常计数,当检测到有键按下时,程序运转到相应中断程序进行响应处理.从而实现了分支程序的处理.方案三:采用 FPGA 制成的数字钟图 1.1.3 方案三电路图名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 20 页 -6 市电经过降压电路为FPGA 芯片提供 3.3V 的直流电压,12MHZ的晶振信号加入到 FPGA 芯片的内定义 PORT,切换键、调时键,输出的 8 个四位的 BCD 码,经过数据选择器使得某一位信号的BCD 码被选中,被选中的信号经过 3/8 译码电路,送到数码管的进行段码显示.而数码管的位选端也有内部软件编程实

7、现位选.而由时、分,信号为蜂鸣器提供闹钟信号.并口端为程序输入端.三.设计思路 3.1 硬件模块采用 ALTER 公司的 ACE 1K系列的 EP1K10TC100-3 芯片,通过 Quartus 软件编译各个管脚的功能及特性.接入 12MHZ 时钟信号,经过内部软件分频.得到 1HZ和 1000HZ信号,得到的 1HZ时钟信号作为内部秒个位计数模块的时钟信号,秒个位进行十进制计数,到 9 进位,为秒十位提供 6 进制时钟信号,当秒为 59 时,为分钟提供时钟信号.当秒进位信号作为低位十进制分计数器时钟.分钟计数器为 59时,为小时计数器的个位提供时钟信号,当小时计数器、分钟计数器输出信号与闹

8、钟预设信号一样时,扬声器发声.输出信号经过数据选择器选择1位 BCD 码输出到译码电路,译码后送到数码管显示.位选择信号为数码管显示提供条件.而分频得到的 1KHZ的时钟频率作为位选计数器的时钟信号.由于该方案简单而且可靠性高,故采用此种方案.该数字钟可以实现 3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有 4部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。该数字钟可以实现 3个功能:计时功能、整点报时功能和重置时间功能,因此有3个

9、子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有 4部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。3.2 软件模块1)、分频器模块名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 20 页 -7 其实是一个计数器,外加信号频率为 12MHZ 时,在内部定义了一个信号从 0到11999999 的整数型计数信号count1,当内部信号计数为 11999999 时,count1 计数为0,产生进位信号CLK1 为1,其余时间计数器正常计数.CLK 为0,从而实现了12000000 次

10、分频.得到1HZ 的时钟信号.内部定义了一个从 0到11999的整数性信号 countf,当内部信号计数为 11999时,countf 计数为 0,产生进位信号 CLK1为1,其余时间计数器正常计数.CLK 为0,从而实现了 12000 次分频.得到1KHZ 的时钟信号的位选信号.2)、秒计数模块内部定义时钟其余时刻均为为秒计时器(second1)是由一个 60进制的计数器构成的,具有清 0、置数和计数功能。其中reset 为清0信号,当 reset 为0时,秒计时器清 0;set 为置数信号,当set 为0时,秒计时器置数,置s1的值。clk为驱动秒计时器的时钟,sec 为秒计时器的输出,e

11、nsec 为秒计时器的进位信号,作为下一级的时钟输入信号。3)、分计时器(minute1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,分计时器清0;set 为置数信号,当set为0时,分计时器置数,置m1的值。clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。4)、时计时器(hour1)模块是由一个24进制的计数器构成的,具有清0、置数和计数功能。其中reset为清0信号,当reset为0时,时计时器清0;set 为置数信号,当set为0时,时计时器

12、置数,置h1的值。clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。图75)、报时模块(alarm1)的功能是当整点(将min 作为该模块的输入信号,min=00)时,alarm 输出高电平,并且持续 1分钟。清0端(reset)前面一小段(200ns)为低电平,后面均为高电平;设置min 的值,使其分别为 58分、59分、00分、01分、02分、03分,保存波形图,进行仿真,产生如下波形:名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 20 页 -8 见由上述波形可以清楚的看到:alarm

13、 在0分时输出高电平,并且持续至1min 不为0。6)、去抖模块定义变量 fb 范围0到29999,当外部时钟信号来临时候,fp 计数,只有当 FP 为29999 时,fp 赋值为 0.内部5ms 信号反向输出.输出5ms 时钟信号,该信号送到内部的D 触发器中,只有按键按下且 5ms 时钟信号来临时,按键信号才被送到触发器.从而实现了去抖.7)、系统总调试(topclock)(Endtime 为10us在秒计时器的clk 输入一个周期为 5ns 的时钟信号;清 0端(reset)前面一小段(40ns)为低电平,后面均为高电平;置数端(set)前面一小段(60ns)为低电平,后面均为高电平;秒

14、重置端(s1)可设置数值为 50秒,分重置端(m1)可设置数值为 57分,时重置端(h1)可设置数值为 23时,星期重置端(d1)可设置数值为 6(星期六);保存波形图,进行仿真,产生如下波形”图8由上述波形可以清楚的看到:当reset 为0时,数字钟清 0;当 set 为1时,数字钟置数名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 20 页 -9 图9由上述波形可以清楚的看到:秒计时器开始计时,当到达59秒后,秒计时器sec 又从 0开始计时,同时分钟min 加了1,为58分。由上述波形可以清楚的看到:分计时器开始计时,当到达59分后,分计时器 min 又从0开始计时,同时小

15、时hour 加了1,为24时,即时计时器hour 也又从0开始计时,而此时星期计时器day 也由6加1后回0,又从0开始计时。当分计时器 min 为0时,alarm 输出一个高电平,持续直到分计时器min 的值为 1。图108)、用经过 ms 去抖程序后,使得 keyout 输出一个脉冲,将此信号作为按键代码计数电路为每一种按键代码赋已一定功能从而实现一键控制名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 20 页 -10 程序流程图如下:详细程序见附录。程序控制过程如下说明:四、产品调试与结果分析1)书写遗漏错误提示在 305行和 307行附近有一个错误,没有加 IF.查看后发

16、现由于自己的疏忽,在结束时,没有加 END IF.将 307 行中加入一行结束语句,问题解决.2)数码管显示时有闪烁检查扫描信号时钟时,发现扫描信号时钟为100HZ,扫描频率过低,引起闪烁.检 查分 频部 分 程 序,发 现 扫描 信号 频 率 设为 100HZ,将扫 描 信号 频率 改为1000KHZ.然后发现无闪烁.修改有效.3)数码管秒个位显示时无2、8 字符检查后发现秒个位译码部分字符书写错误.将秒个位字符 2、8 赋值错误修改观察,有显示.名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 20 页 -11 五、心得体会转眼一学期就要悄悄走远,感觉这些天是我学的最多的.通

17、过这次设计,进一步加深了对 EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,数字钟开始计数,但是始终看不到小时、星期的循环计数。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于小时、星期来说太短了。经过屡次调试,终于找到了比较合适的输入数值:分钟的初始值可以设为 57

18、(58、59都可以),小时的初始值可以设为23,星期的初始值可以设为 6,这样,仿真之后,就能清楚的看出分钟、小时的循环计数。另外,Endtime 的值需要设置的长一点:10us 左右,输入的时钟周期值要设置的短一点:5ns 左右。总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。附:参考文献1、黄仁欣主编 EDA 技术实训教程,清华大学出版社,2006 年第 2 版。2、杨志忠主编数字电子技术,北京高等教育出版

19、社,2003 年 12 第 2 版。3、潘松、黄继业主编单片机实训教程,科学出版社,2005 年 5 月第 2版。附件程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 20 页 -12 use ieee.std_logic_unsigned.all;entity clock is port(clk:in std_logic;-12M时钟keyin:in std_logic;speak:out std_logic;-蜂鸣器dout:out

20、 std_logic_vector(7 downto 0);-段码selout:out std_logic_vector(2 downto 0);-位选end clock;architecture one of clock is signal count:integer range 0 to 11999999;-1HZ秒信号signal counf:integer range 0 to 11999;-1000HZ SIGNAL CP_5ms:STD_LOGIC;SIGNAL Q1,Q2,Q3:STD_LOGIC;SIGNAL keyout:STD_LOGIC;SIGNAL CJ:STD_LOG

21、IC_VECTOR(2 DOWNTO 0);signal sel:std_logic_vector(2 downto 0);-位选signal hou1:std_logic_vector(3 downto 0);-计数中小时的十位signal hou2:std_logic_vector(3 downto 0);-小时的个位signal min1:std_logic_vector(3 downto 0);-分钟的十位signal min2:std_logic_vector(3 downto 0);-分钟的个位signal sec1:std_logic_vector(3 downto 0);-秒的

22、十位signal sec2:std_logic_vector(3 downto 0);-秒的个位signal seth1:std_logic_vector(3 downto 0);-设时中小时的十位signal seth2:std_logic_vector(3 downto 0);-小时的个位signal setm1:std_logic_vector(3 downto 0);-分钟的十位signal setm2:std_logic_vector(3 downto 0);-分钟的个位signal h1:std_logic_vector(3 downto 0);-显示小时十位signal h2:s

23、td_logic_vector(3 downto 0);-小时的个位signal m1:std_logic_vector(3 downto 0);-分钟的十位signal m2:std_logic_vector(3 downto 0);-分钟的个位signal s1:std_logic_vector(3 downto 0);-秒的十位signal s2:std_logic_vector(3 downto 0);-秒的个位signal clk1,clkk,beep:std_logic;begin-分频fp:process(clk)begin if rising_edge(clk)then cou

24、nt=count+1;counf=counf+1;if count=11999999 then clk1=1;-1Hz count=0;beep5999999 then beep=0;-2Hz 名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 20 页 -13 else clk1=0;end if;if counf=11999 then clkk=1;-1000HZ counf=0;else clkk=0;end if;end if;end process fp;-位扫描choice:process(clkk)-位选扫描begin if rising_edge(clkk)then

25、 if sel=111 then sel=000;else sel=sel+1;end if;end if;end process choice;-秒个位s220:process(clk1,cj)begin if clk1event and clk1=1 then if sec2=1001 then-其中 sec2 是秒的个位sec2=0000;elsif cj=010 then sec2=sec2;else sec2=sec2+1;end if;end if;if cj=001 then sec2=0000;-秒个位复位end if;end process s220;-秒十位s110:pro

26、cess(clk1,cj)begin if clk1event and clk1=1 then if(sec1=0101 and sec2=1001)then-其中 sec1是秒钟的十位sec1=0000;elsif cj=010 then sec1=sec1;else if sec2=1001then sec1=sec1+1;end if;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 20 页 -14 end if;end if;if cj=001 then sec1=0000;-秒十位复位end if;end process s110;-分钟个位m220:process(

27、clk1,sec1,sec2,cj)begin if clk1event and clk1=1 then if min2=1001and(sec1=0101 and sec2=1001)then-其中 min2 是分钟的个位min2=0000;elsif min2=1001and(cj=011 and cj=100)then-min2=0000;else if(sec1=0101 and sec2=1001)or(cj=011 and cj=100)then min2=min2+1;end if;end if;end if;if cj=001 then min2=0000;end if;end

28、 process m220;-分钟十位m110:process(clk1,min2,sec1,sec2,cj)begin if clk1event and clk1=1 then if(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)then min1=0000;elsif min1=0101and min2=1001and(cj=011 and cj=100)then min1=0000;elsif(min2=1001and(sec1=0101 and sec2=1001)or(min2=1001and cj=011 and cj=10

29、0)then min1=min1+1;end if;end if;-end if;if cj=001 then min1=0000;end if;end process m110;-小时个位h220:process(clk1,min1,min2,sec1,sec2,cj,hou1)begin if clk1event and clk1=1 then if(hou1=0010 and hou2=0011)and(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)then 名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 20 页

30、 -15 hou2=0000;elsif hou2=1001and(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)then hou2=0000;elsif(hou2=1001and cj=110)or(hou1=0010and hou2=0011and cj=110)then hou2=0000;-md=1;elsif(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)or(cj=110)then hou2=hou2+1;-speak=clk;end if;end if;if cj=

31、001 then hou2=0000;end if;end process h220;-小时十位h110:process(clk1,hou2,min1,min2,sec1,sec2,cj)begin if clk1event and clk1=1 then if(hou1=0010 and hou2=0011)and(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)then hou1=0000;elsif hou1=0010and hou2=0011and cj=110 then-当时间为 23点且处于校时状态时hou1=0000;els

32、if(hou2=1001and(min1=0101 and min2=1001)and(sec1=0101 and sec2=1001)or(hou2=1001and cj=110)then hou1=hou1+1;end if;end if;if cj=001 then hou1=0000;end if;end process h110;-时间设置小时部分sethour1:process(clk1,seth1,seth2,cj)begin if clk1event and clk1=1 then if seth1=0010and seth2=0011 then seth1=0000;elsi

33、f seth2=1001 then seth1=seth1+1;end if;end if;if cj=001 then seth1=0000;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 20 页 -16 end if;end process sethour1;-sethour2:process(clk1,seth1,cj)begin if clk1event and clk1=1 then if(seth1=0010and seth2=0011)or seth2=1001 then-其中 seth1,seth2分别是调时的小时部位的十位与个位seth2=0000;elsi

34、f cj=111 then seth2=seth2+1;end if;end if;if cj=001 then seth2=0000;end if;end process sethour2;-时间设置分钟部分setmin1:process(clk1,setm2,cj)begin if clk1event and clk1=1 then if setm1=0101and setm2=1001 then setm1=0000;elsif setm2=1001 then setm1=setm1+1;end if;end if;if cj=001 then setm1=0000;end if;end

35、 process setmin1;-setmin2:process(clk1,cj)begin if clk1event and clk1=1 then if setm2=1001 then setm2=0000;elsif cj=101 then setm2=setm2+1;end if;end if;if cj=001 then setm2=0000;end if;end process setmin2;-闹铃speaker:process(clkk,hou1,hou2,min1,min2,cj)名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 20 页 -17 begin

36、if clkkevent and clkk=1then if seth1=hou1 and seth2=hou2 and setm1=min1 and setm2=min2 then speak=beep;else speak=0;end if;end if;if cj=001 then speak=0;end if;end process speaker;-disp:process(sel,cj,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)-显示begin if sel=010 then seloutdoutdoutdoutdo

37、ut=00000000;-不显示end case;elsif sel=011 then seloutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=10000000;-不显示end case;elsif sel=100 then seloutdoutdoutdoutdoutdoutdoutdout=00000000;end case;elsif sel=101 then seloutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=10000000;end case;elsif sel=110 then selo

38、utdoutdoutdoutdoutdoutdoutdout=00000000;end case;elsif sel=111 then seloutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=00000000;end case;名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 20 页 -19 end if;if cj=011 then-计时时间显示和设置模式h1=hou1;h2=hou2;m1=min1;m2=min2;s1=sec1;s2=sec2;else-闹铃时间现实和设置模式h1=seth1;h2=seth2;m1=setm

39、1;m2=setm2;s1=1111;s2=1111;end if;end process disp;-yanshi:process(clk)variable fp:integer range 0 to 29999;begin if clkevent and clk=1 then if fp=29999 then fp:=0;CP_5ms=not CP_5ms;else fp:=fp+1;end if;end if;end process;-quout:process(CP_5ms,keyin)begin if CP_5msevent and CP_5ms=1 then Q1=keyin;Q2

40、=Q1;Q3=Q2;end if;end process;-process(Q1,Q2,Q3)begin if(Q1=0 and Q2=0 and Q3=0)then keyout=0;else keyout=1;end if;end process;process(keyout,CJ)begin if Rising_edge(keyout)then if cj=111 then cj=000;名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 20 页 -20 else CJ=CJ+1;end if;end if;end process;end one;名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 20 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁