1、基于VHDL万年历的设计EDA技术实用教程基 于 VHDL 的 万 年 历 设 计(实验报告)2012 年 12 月 28 日前言本设计为实现一个多功能的万年历,具有年、月、日、时、分、秒计时并显示的功能, 顾名思义,其满量程计时为一万年;具有校对功能,能够对初始的时间进行人为的设定。本设计采用 EDA技术,以硬件描述语言 VHDL为系统逻辑描述手段设计具有万年历功 能的硬件电路,在 QuartusII 软件设计环境下,采用自顶向下的设计思路,分别对各个基 础模块进行创建,通过各个基础模块的组合和连接来构建上层原理图,完成基于 VHDL万 年历设计。系统目标芯片采用 EP1K30TC144-3
2、,由时钟模块、控制模块、计时模块、数据译码模 块、显示模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,将硬件 编写程序下载到试验箱上,选择 模式 3 进行功能验证。本系统能够完成年、月、日和时、 分、秒的分别显示,由按键输入进行万年历的校时功能。1实验概述 41.1EDA 技术 41.2QuartusII 的使用 41.3模块化设计 . 41.4分析、解决问题 . 42实验内容与要求 52.1实验内容 52.1实验说明 52.3 实验要求 63实验原理 73.1设计思想 73.2设计原理图 83.3工作工程 94实验结果 104.1VHDL程序与仿真 104.1.1秒和分模块
3、104.1.2小时模块 114.1.3日(天)模块 124.1.4月份模块 154.1.5年模块 174.1.6校时模块 194.1.7显示模式切换模块 214.2顶层设计与仿真 234.3下载与验证 254.3.1 电路结构选择 254.3.2端口配置 264.3.3实际电路验证 295实验小结 30参考文献 311 、实验概述1.1 EDA 技术EDA( Electronic Design Automation ),即电子设计自动化,是指利用计算机完成 电子系统的设计。它的主要特征及核心是“自顶向下”的设计方法,这种设计方法首先从 系统设计入手, 在顶层进行功能方框图的划分和结构设计。 在
4、方框图一级进行仿真、 纠错, 并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。然后用综合优化 工具生成具体门电路的网表。由于设计的主要仿真和调试过程是在高层次上完成的,这不 仅有利于早期发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真 的工作量,提高了设计的一次成功率。1.2 QuartusII 的使用通过实验,熟悉并掌握 QuartusII 软件的使用,熟悉该软件工具的环境。除了学习 利用 VHDL语言编写程序实现硬件电路以外,还要熟练的使用原理图输入的方法进行硬件 设计,具体是对每个模块形成一个功能元件,通过元件的连接来实现系统的功能,而不是 通过 VHD
5、L语言的元件例化程序来完成,不仅提高了效率,而且思想原理也更加的清晰。1.3 模块化设计 掌握年、月、日、时、分、秒以及控制部分的各功能模块程序设计的原理,进而理解 万年历的设计原理,学习并理解模块化设计的方法与思想。用 VHDL语言编写各模块程序, 进一步了解和掌握各个程序语言,知道编程中的注意事项,提高编程的熟练程度。1.4 分析、解决问题 通过本实验设计,理论联系实际,巩固所学理论知识,并且提高自己通过所学理论 分析、解决实际问题的能力。进一步加深对 VHDL设计的了解与认识,体会 EDA的巨大作 用,了解进行硬件系统设计的整个流程, 对生活工作中的电气设备有了更深一层次的了解, 对电气
6、工程专业有了更多兴趣。2、实验内容与要求2.1 实验内容设计具有如下功能的万年历:1)能进行正常的年、月、日和时、分、秒的日期和时间计时功能, 按键 KEY1 用来进行模式切换,当 KEY1=1时,显示年、月、日;当 KEY1=0时,显示时、分、 秒。2)能利用实验系统上的按键实现年、月、日和时、分、秒的校对功能。3)用层次化设计方法设计该电路,编写各个功能模块的程序。4)仿真报时功能,通过观察有关波形确认电路设计是否正确。5)完成电路设计后,用实验系统下载验证设计的正确性。2.2 实验说明万年历的设计思路与多功能时钟的设计思路相似。多功能时钟的各功能模块及相互之间的连接如下图 1 所示图 1
7、 多功能时钟系统原理框图年、月、日和时、分、秒的显示格式如图 2 所示。年、月、日同时显示,时、分、秒 同时显示,通过显示模式切换来分别显示2.3 实验报告要求1)分析系统的工作原理。2 )画出顶层原理图,写出顶层文件源程序3)写出各功能模块的源程序。4)仿真各功能模块,画出仿真波形。5)书写实验报告应结构合理,层次分明。3、实验原理3.1 设计思想按照模块化的设计思想,要实现万年历的基础功能,必定要包含年、月、日和时、分、 秒的功能模块,其中秒和分可以用六十进制计数器来实现,时用二十四进制计数器实现, 月用十二进制计数器来实现,年的低两位和高两位都是一百进制计数器,比较特殊的是天 的计数器,
8、因为它有四种情况,大月三十一天,小月三十天,平年二月二十八天,闰年二 月有二十九天,所以年和月的模块对天的计数都有影响,需要从年和月的输出端引出控制 信号来控制天的计数。 同时每个计数器都有显示输出端和进位输出端, 同时低级别 (如秒) 的进位输出要给较高级别 (如分)的时钟输入端, 以此类推,采用串行工作方式进行连接。 从而完成了基础的计时和显示的功能。再按照由基础功能到增强功能的设计思路,要实现校时功能,要在之前电路的基础之 上增加一个校时控制模块,增加两个按键来实现控制, 按键 1 来选择校对哪一个模块,按 键 2 选择校对到何值检测到按键 2 的一个上升沿,对应的计数器加 1 。除此之
9、外还需 要有显示模式的切换的功能,需要增加一个模式切换的控制模块,通过增加一个按键 3 来实现控制,是显示年月日还是时分秒。3.2 实验原理图万年历时分秒部分的原理图如下图所示,年月日部分与之同理,通过控制可以进行切换。图 3 万年历实验原理图图 4 万年历实验结构框图图 5 万年历实验结构局部图原理图说明:如图 4、5 所示, K1键是选择万年历工作的模式, K2键提供上升沿(时钟功能)来使 各计数模块加一,从而实现校时的功能。 LED灯起指示作用。模式 0:正常计时显示 -K1 不按, LED1到 LED5都不亮模式 1:调整分增加-K1按下一次, LED1亮其余四个不亮模式 2:调整时增
10、加- K1按下两次,LED2亮其余四个不亮模式 3:调整日增加- K1按下三次,LED3亮其余四个不亮模式 4:调整月增加- K1按下四次,LED4亮其余四个不亮模式 5:调整年增加- K1按下五次,LED5亮其余四个不亮CLK 是外部 1Hz 输入时钟,作为秒的时钟输入,驱动整个万年历工作运行。K3 键是显示模式的选择, 显示时分秒时, LEDSHUCHUMO指SH示I 灯亮, 显示年月日时, LEDSHUCHUMO指SH示I 灯灭。3.3 工作过程当 1Hz 时钟信号从 CLK输入端输入时, K1,K2,K3 都没有按下时,系统从零(闰年) 开始处于正常的计时模式,显示时分秒部分, LED
11、SHUCHUMO指SH示I 灯亮。低位计满归零并 且向高位进 1,如果月份是二月,则天计满 29 就向月进 1。如果按下按键 3,LEDSHUCHUMOSHI 指示灯不亮,显示年月日部分。如果此时按一下按键 1,那么万年历停止计时,工作于模式 1 ,再通过按键 2 对分进行校时,通过同样的方法可以对时、日、月、年进行校时。当 校时完毕,需要万年历重新计时工作时,通过按下键 1使 LED1到LED5都不亮时,系统工 作与正常计时模式。4、实验结果4.1VHDL 程序与仿真4.1.1 秒与分模块 秒与分模块为六十进制的计数器 源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_
12、1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT60 ISPORT(CLK:IN STD_LOGIC;Q1,Q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC);END CNT60;ARCHITECTURE ONE OF CNT60 ISSIGNAL Q11,Q22:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK)BEGINIF CLKEVENT AND CLK=1 THEN Q11=Q11+1;IF Q11=9 THEN Q110);
13、 Q22=Q22+1;END IF;IF Q22=5 AND Q11=9 THENQ22=0000;Q11=0000;COUT=1; ELSE COUT=0;END IF;END IF;END PROCESS; Q1=Q11;Q2=Q22;END; 仿真结果:图 6 60 进制计数器仿真图如上图所示当 Q1、Q2计满 60 时,Q1、Q2都归零同时有一个进位输出脉冲,完成了六十进 制计数器的功能,设计正确。4.1.2 小时模块时模块为 24 进制计数器。源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNE
14、D.ALL;ENTITY CNT24 ISPORT(CLK:IN STD_LOGIC;Q1,Q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC);END CNT24;ARCHITECTURE ONE OF CNT24 ISSIGNAL Q11,Q22:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK)BEGINIF CLKEVENT AND CLK=1 THEN Q11=Q11+1;IF Q11=9 THEN Q110); Q22=Q22+1;END IF;IF Q22=2 AND Q11=3 THENQ22=0000;Q11=0000;COUT=1;ELSE COUT=0;END IF;END IF;END PROCESS;Q1=Q11;Q2=Q22;END;图 7 24 进制计数器仿真图如上图所示当 Q1、Q2计满 24 时,Q1、Q2都归零同时有一个进位输出脉冲,完成了六 十进制计数器的功能,设计正确。4.1.3 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1