FPGA电子时钟的设计与实现设计作业:用FSM实现10110串的检测,画出其状态图。

【图文】《基于FPGA的现代数字系统设计》作业参考答案_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
《基于FPGA的现代数字系统设计》作业参考答案
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢FPGA设计高级进阶_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
FPGA设计高级进阶
&&FPGA设计高级进阶
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩38页未读,
定制HR最喜欢的简历
你可能喜欢使用ModelSim自动生成状态机FSM的状态转换图
HDL代码设计中重要的内容之一就是设计程序的状态机FSM,状态转换控制着整个程序的流程,为了理解程序,我们经常需要把状态机的状态转换图画出来,这样看起来很直观,但是,有没有办法自动生成状态转换图呢?
在ISE或者ModelSim中有没有这样的工具呢?
答案是肯定的,ModelSim中即有这样的工具,下面以ISE13.4和ModelSim6.5为例,使用一段最简单的状态机代码说明如何操作来自动生成状态转换图。
代码如下:
module Top_fsm(
input clk,
input rst,
output reg fsm_out
parameter IDLE = 3'd0, S1 = 3'd1, S2 = 3'd2, S3 = 3'd3, S4 = 3'd4, S5 = 3'd5;
always @ (posedge clk)
if(!rst)begin
status &= IDLE;
else begin
case(status)
IDLE:begin
fsm_out &= 1'b0;
status &= S1;
fsm_out &= 1'b1;
status &= S2;
fsm_out &= 1'b0;
status &= S3;
fsm_out &= 1'b1;
status &= S4;
fsm_out &= 1'b0;
status &= S5;
fsm_out &= 1'b1;
status &= IDLE;
default:begin
fsm_out &= 1'b0;
我们在ISE中直接切换到ModelSim仿真模式,如图所示:
双击Simulate Behavioral Model,将打开ModelSim。
在ModelSim中执行View---FSM list命令,如下图所示:
然后就会发现ModelSim左边这部分的标签多了一项,如下面两幅图的对比:
未执行命令前是这样子的:
执行完命令是这样子的:
这时候在FSM List标签下,可以看到如下内容,双击之:
于是出现了下面的状态转换图:
这时观察生成的状态转换图发现,所有的状态都在复位的情况下返回了状态IDLE,这是我们不期望的,仔细观察这时的菜单栏可以发现,有一个FSM View项:
将Show Transions to &Reset&项前面的对勾去掉,就会发现不显示复位情况下返回状态IDLE了,如下图所示:
细心的人会发现状态到了S5并未返回IDLE,但在前面的状态转换图中的确有Cond2:1这种状态转到状态IDLE,这估计是软件所导致的吧。
简单的应用就这些,深一些的功能自己好好探索吧。
最后说一下这种自动生成的状态转换图的缺点:因为它默认生成的状态转换图一定是一个圆,所以当你的状态比较复杂时,并非是一个简单的切换时,生成的状态转换图也就会很乱很乱,可读性直接下降,不知道是可以可调节或者有什么更好的生成工具?
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
Vim其实一款Linux系统下常用的编辑器,在Windows下叫Gvim,由于它的高度可定制性,操作...
怎么样,通过这个简单的工程,大家是不是掌握了使用Quartus II进行工程创建、设计文本创...
modelsim仿真详细过程(功能仿真与时序仿真).ModelSim不仅可以用于数字电路系统设计的功...
 Modelsim是Mentor公司开发的专业仿真软件,支持VHDL、VerilogHDL和混合仿真...
虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法...
在数字电路设计中(Verilog or VHDL),ModelSim是常用的仿真工具。当我们仿真大型...
 关于modelsim仿真时出现 No objects found matching ‘/*’ 问题...
PicoBlaze是8位微处理器,在Xilinx公司的Virtex、Spartan-II系列以上FP...
赛灵思 Zynq(R)-7000 All Programmable SoC 系列代表了嵌入式设计的新局面...
在FPGA对Flash控制操作中,有限状态机(Finite State Machine,FSM)与多...
DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写,是一...
FPGA的基础就是数字电路和HDL语言,想学好FPGA的人,建议床头都有一本数字电路的书,不管是哪个...
模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。
在我们用ModelSim仿真的时候经常是修改一点一点修改代码,这样会造成一个无奈的操作循环:修改代码...
当ISE调用ModelSim进行仿真的时候,如果在FPGA设计中使用了Xilinx提供的的IP co...
1。我在ISE中启动modelsim时出现了下面的错误 Loading work.tb_ic1_fu...
Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Lang...
有限状态机(FSM)是一种常见的电路,由时序电路和组合电路组成。设计有限状态机的第一步是确定采用Mo...
我们经常使用Xilinx Ise与Modelsim联合仿真,但是经常出现一些由于库没有编译而出现的错...
批命令 A、开始-运行:cmd 在DOS窗口输入:“ compxlib –s mti_se –f a...
前面创新网网友Ricky Su发了篇博文《 说说FPGA中的黑盒子(BlackBox)》,学习了感觉...
最近在写代码的时候总是在思考,我写的这个能被综合吗?总是不放心,或是写完了综合的时候出问题,被搞的非...
虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法...
加减乘除是运算的基础,也是我们在小学课堂里的重点必修课。乘除运算虽然对于我们今天来说还是小菜一碟,让...
一直都在System Generator下做图像处理相关的算法,感觉SysGen挺强大的,前几天突发...
1、代码输入(1)、新建一个ISE工程,名字为count4。(2)、新建一个verilog文件
do wave.do 在ISE中联合使用modelsim中仿真时,经常要修改了ISE里面的程序然后重...
从Windows的Start Menu开始,Xilinx ISE Design Suite 13.4...
一直说要研究官方的例子XAP792,也确实在断断续续地学习着,现在硬件基本搞明白了,在公司也已经做出...
HDL建筑智能照明控制系统借助各种不同的“预设置”控制方式和控制元件,对不同时间不同环境的光照度进行...
很多刚开始学习FPGA的朋友们经常会遇上一些误区而无从解决,FPGA为什么是可以编程的?通过HDL语...
电子发烧友网核心提示:对于FPGA初学者而言,如何正确了解并理解FPGA的仿真是关键。应广大FPGA...
1 概述 随着集成电路(Integrated Circuit,IC)设计技术和工艺水平进入超深亚微米...
用ModelSim 进行功能仿真,进行功能仿真首先要检查设计的语法是否正确;其次检查代码是否达到设计...
电子发烧友网核心提示: 对于初学者而言,在学硬件描述语言(HDL)之前一定要注意以下几点。算是电子发...
电子发烧友网核心提示 :目前,硬件描述语言(HDL)可谓是百花齐放,有VHDL、Superlog、V...
电子发烧友网核心提示 :硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。 利用这种语言...
MathWorks 近日宣布推出 HDL Coder,该产品 支持MATLAB 自动生成 HDL 代...
ModelSim是工业界最优秀的语言仿真器,它提供最友好的调试环境,是作FPGA、ASIC设计的RT...
利用Moelsim的FLI功能,用c语言对所设计的模型进行功能验证,可以加大验证代码的覆盖率,减少验...
在我国使用Verilog HDL的公司比使用VHDL的公司多。从EDA技术的发展上看,已出现用于CP...
功能仿真不是一个孤立的过程,其和综合、时序分析等形成一个反馈工作过程,只有这个过程收敛,各个环节才有...
[page_break] 本文适合初学者,源代码:mux4_to_1.v &工作内容: 1...
1 前言&&& 协同仿真就是利用仿真工具提供的外部接口,用其它程序设计...
1.&建一个总文件夹,如cnt2.&为源代码,测试台文件,仿真各建一文件夹。如s...
ModelSim和QuestaSim功能简介及应用
ModelSim是工业界最优秀的语言仿真器,它...
VHDL和Verilog HDL语言对比
Verilog HDL和VHDL都是用于逻辑设计的硬件描...
Verilog HDL程序基本结构与程序入门
Verilog HDL程序基本结构
HDL设计和验证与System Generator相结合
Xilinx&SystemGen...
摘要: 介绍了一种采用硬件控制的自动数据采集系统的设计方法,包括数字系统自顶向下的设计思路、Veri...
摘要: 介绍一种用于卫星姿态测量的CMOS图像敏感器--STAR250的时序驱动信号,并使用Veri...
摘要:从数字系统设计的性质出发,结合目前迅速发展的芯片系统,比较、研究各种硬件描述语言;详细阐述各种...
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-6.FPGA复杂逻辑设计_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
6.FPGA复杂逻辑设计
&&FPGA复杂逻辑设计
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩53页未读,
定制HR最喜欢的简历
你可能喜欢当前位置: >>
FPGA多功能电子钟
集美大学毕业设计闭应明:基于 FPGA 的多功能电子钟基于 FPGA 的多功能电子钟集美大学信息工程学院 电子科学与技术专业 2015 届 闭应明 学号:[摘要] 本设计在基于以硬件描述语言 VHDL 为基础的 EDA 设计方法上,设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的 数字系统逻辑简化为基本的模型从而降低实现的难度。通过层次化的设计方法, 自顶向下设计,把不同的功能模块组合到一起,使用 quartus II 工具进行设计编 译仿真, 最终在在 FPGA 的 DE2_70 开发板上中实现具有基本的年月日、 时分秒、 农历显示、节气提醒、传统节假日提醒、闹铃闰年提醒等多功能的电子钟[关键字] 硬件描述语言 VHDL 能电子钟EDAFPGAquartus IIDE2_70 开发板多功I 集美大学毕业设计闭应明:基于 FPGA 的多功能电子钟The multi-function electronic clock of FPGABi Yingming NO:,Electronic science and technology major,2015 Information Engineering College of Jimei University Abstract: This design based on VHDL( hardware description language) and EDAdesign method, so that we can through the function of the system in the design to divide reasonably into layers, hierarchical design and simulation, and to simplify the complex number system logic as a basic model to reduce the difficulty of implementation. Through the design method of hierarchical, top-down design, the different function modules were moved together by using the quartus II tool design compiled simulation.Finally ,the multi-function electronic clock that can show the date and time,and can warn the Solar terms , Traditional festivals , the leap year and the alarm , was realized in DE2_70 development board of FPGA Key words: VHDL hardware description language EDA FPGA the quartus II DE2_70 development board multi-function electronic clockII 目录目录引言................................................................ 1 第一章 FPGA 介绍 .................................................... 3 1.1 FPGA 简单工作原理............................................ 3 1.2 FPGA 应用.................................................... 3 1.2.1 FPGA 的硬件描述语言 VHDL 简述 ........................... 3 1.2.2 FPGA 的 DE2_70 开发板简述 ............................... 3 第二章 电子时钟设计................................................ 5 2.1 电子钟的功能设计指标 ........................................ 5 2.2 电子钟的整体构造 ............................................ 5 2.2.1 分频模块............................................... 6 2.2.2 秒模块................................................. 6 2.2.3 分模块................................................. 7 2.2.4 小时模块............................................... 7 2.2.5 天模块................................................. 8 2.2.6 月份模块............................................... 9 2.2.7 年模块 ................................................ 10 2.2.8 阳历转阴历模块........................................ 11 2.2.9 闹铃模块.............................................. 13 2.2.10 译码转换模块......................................... 13 2.2.11 七段数码管和 LCD 显示模块............................. 15 2.2.12、传统节假日提醒模块.................................. 16 2.2.13 24 节气提醒模块 ...................................... 17 2.2.14 定时关机模块......................................... 18 2.2.15 l602LCD 显示驱动模块 ................................. 19 2.2.16、顶层模块............................................ 20 第三章 时钟验证.................................................... 24 3.1 管脚绑定 ................................................... 24 3.2 时间参数一 ................................................. 24 3.3 时间参数二 ................................................. 26 3.4 时间参数三 ................................................. 26 3.5 结果分析 ................................................... 27 总结............................................................... 29 致谢............................................................... 30 参考文献........................................................... 31 附录............................................................... 32III IV 引言引言FPGA 是现场可编程门阵列(Field-Programmable Gate Array)的缩写,它 是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定 制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA 器件具有 标准化,小型化、多功能、低功耗、高密度、系列化、高速率、低成本,可无限 反复编程,并可现场模拟调试验证,设计灵活方便等特点。 随着 FPGA 芯片的更新和发展,使数字系统的设计迈进了 SOPC 时代,而各种 IP 核的设计和应用是 SOPC 设计的重要特征。除了各 FPGA 设计厂商,还有许多 第三方的 IC 设计公司将各种 IP 核推向市场,用户可以方便地下载试用,将其集 成到自己的系统中。 本设计是基于以硬件描述语言 VHDL 为基础的 EDA 设计方法, 在 FPGA 芯片上 实现多功能电子钟。 本设计涉及了 EDA 设计的完整流程,可以很方便地通过修改 增删,应用于各种基于 FPGA 的系统中。1 闭应明2 第一章 FPGA 介绍第一章 FPGA 介绍1.1 FPGA 基本工作原理FPGA 采用了逻辑单元阵列 LCA(Logic Cell Array)这样一个概念,内部包 括输出输入模块 IOB (Input Output Block) , 可配置逻辑模块 CLB (Configurable Logic Block)和内部连线(Interconnect)三个部分。FPGA 是由存放在片内 RAM 中的程序来设置其工作状态的,因此,工作时需要对片内的 RAM 进行编程。用户 可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA 芯片将 EPROM 中数据读入片内编程 RAM 中,配置完成后,FPGA 进入工作状态。掉电后,FPGA 恢复成白片,内部逻辑关系消失,因此,FPGA 能够反复使用。FPGA 的编程无须 专用的 FPGA 编程器,只须用通用的 EPROM、PROM 编程器即可。当需要修改 FPGA 功能时,只需换一片 EPROM 即可。这样,同一片 FPGA,不同的编程数据,可以 产生不同的电路功能。因此,FPGA 的使用非常灵活。1.2 FPGA 应用 1.2.1 FPGA 的硬件描述语言 VHDL 简述VHDL ( very High Speed Integrate Circuit Hardware Description Language) 是一种标准的硬件描述语言,也可以理解为超高速集成电路硬件描述 语言。由于 IEEE 标准硬件描述语言,在电子产业中,利用 VHDL 进行系统行为级 设计已经成为 FPGA 和 ASIC 的设计主流。一个完整的 VHDL 程序,通常包括程序 包(package) 、库(library) 、实体(entity) 、结构体(architecture)和配 置(configuration)5 部分。其中,程序包用于存放各种设计模块的能共赏的 数据类型、 常数和子程序等; 实体用于描述设计实体的外部接口信号 (I/O 接口) ; 结构体用于描述设计实体的内部电路;配置用于从库中选取所需的元件,并将其 安装到设计单元的实体中; 库用于存放已经编译的实体、 结构体、 包集合和配置。1.2.2 FPGA 的 DE2_70 开发板简述DE2_70 开发板是基于 FPGA 应用的一种多功能运用的电子设备,它采用了 Altera Cyclone II 2C70 FPGA 芯片,给用户提供了方便,且所有的端口都是由 FPGA 来驱动,其可以利用硬件描述语言,通过软件编程、仿真、编译、最终下 载到开发板上,从而实现具有特定功能的电路。以下对 DE2_70 开发板的一些驱 动管脚及芯片型号做简单是描述3 闭应明图 1 DE2_70 开发板DE2平台上提供的资源如下: 1、Altera Cyclone II 系列的EP2C35F672C6 FPGA芯片(板上器件标号U11), 该芯片内含35 000个逻辑单元(LE)。 2、主动串行配置器件EPCS16(板上器件标号U30)。 3、板上内置用于编程调试和用户API设计的USB Blaster,支持JTAG模式和AS模 式; U25是实现USB Blaster的USB接口芯片FT245B; U26是用于控制和实现JTAG 模式和AS模式的CPLD器件EPM3128,可以通过SW19选择配置模式;USB接口为 J9。 4、512K字节SRAM(U18)。 5、8M字节(1Mx4x16)SDRAM(U17)。 6、1M字节闪存(可升级至4M字节)(U20)。 7、SD卡接口(U19)。 8、4个按键KEY0 ~ KEY3。 9、18个拨动开关SW0 ~ SW17。 10、 9个绿色LED灯LEDG0 ~ LEDG8。 11、 18个红色LED灯LEDR0 ~ LEDR17。 12、 两个板上时钟源(50MHz晶振Y1和27 MHz晶振Y3),也可通过J5使用外部时 钟。 13、 24位CD品质音频编/解码器WM8371(U1),带有麦克风输入插座J1、线路输 入插座J2和线路输出插座J3。 14、 VGA DAC ADV7123(U34,内含3个10位高速DAC)及VGA输出接口J12。 15、 支持NTSC和PAL制式的TV解码器ADV7181B(U33)及TV接口J12。4 第二章 电子时钟设计第二章 电子时钟设计2.1 电子钟的功能设计指标A、支持日历和当日事件提醒两种显示模式; B、具有电子钟的基本功能:年月日显示、是否闰年提示、阴阳历显示、中国传 统重要节日 提醒、中国 24 节气提示; C、支持定时自动关机功能; D、支持闹铃功能; E、FPGA 基于 DE2 开发板。2.2 电子钟的整体构造本电子时钟系统含有分频模块、计时模块、显示模块、节气提醒模块、闹铃提 醒模块、传统节假日提醒模块、定时关机模块,阳历转阴历模块、译码转换模块 等。分频器通过晶振得到 1HZ 的频率时钟信号,加载到秒模块中,通过异步的计 数方式,从而实现时钟计数的驱动。通过译码转换模块,可以实现显示模块和提 醒模块的功能,具体的框架图如下图所示:图 2 电子钟结构 5 闭应明2.2.1 分频模块详细代码描述见附录分频模块 图 3 管脚说明如下 Clk:50MHZ 时钟输入 COUT:1HZ 时钟输出图 3 50 分频结 构2.2.2 秒模块秒模块采用 60 进制,分频模块输出的时钟信号作为该模块的时钟信号 clks, 每当时钟的上升沿来时,就开始计数,即从 0 计数到 59,之后返 0,再开始计数 到 59,如此反复,每当计数到 59 后,都会产生一个进位信号 clk1,这个进位信 号作为分模块的时钟信号。当需要设置秒的时间时,可以添加一个设置信号 sets,之后 30 作为设定值开始计数。 主要代码实现如下 : if sets='1' then -------调制时间使能信号 qs&=30; elsif(clks'event and clks='1') then if(qs=59) then qs&=0; clk1&='1'; ------输出分模块时钟信号 elsif qs&59 then qs&=qs+1; clk1&='0';------秒计数 详细代码描述见附录。 图 4 管脚说明如下: 其中 clks:时钟信号 Sets:校时设置信号 Clks1:进位信号 Qts:输出的秒时钟图 4 秒计数结构其仿真波形如下:进位信号6 第二章 电子时钟设计图 5 秒模块计数仿真2.2.3 分模块分模块也是采用 60 进制,其基本的计数原理和秒模块是一样的,其产生的 进位信号 clk2 作为小时模块的时钟信号,主要功能代码和秒模块一样,其中设 置了一个闹铃控制信号 alarmmn,当 alarmmn=1 时,内定的时间就会作为闹铃时 间。代码描述见附录分模块。 图 6 管脚分布如下: clkmn:时钟信号 Setmn:校时设置信号 alarmmn:闹铃校时设置信号 Clks2:进位信号 mnx、mny:输出信号,作为闹铃的对照信号 Qtmn1、Qtmn2、Qtmn3:输出的分时钟图 6 分计数结构 其仿真波形如下:图 7 分模块计数仿真2.2.4 小时模块小时模块采用的是 24 进制计数,当计数到 23 后,输出计数值会回 0,产生 进位信号 clk3 作为天模块的时钟信号,其主要的功能代码和分模块一样。代码 描述见附录小时模块。 图 8 管脚说明如下: 其中 clkh:时钟信号 Seth:校时设置信号 Alarmh:闹铃校时设置信号 Clks3:进位信号7 闭应明hx、hy:输出信号,作为闹铃的对照信号 Qth1、Qth2、Qth3:输出的小时时钟其仿真波形如下:图 8 小时计数结构图 9 小时模块计数仿真2.2.5 天模块在天模块中,当上一个模块的时钟信号来临时,如果是闰年,并且是 1、3、 5、7、8、10、12、月,day 模块开始则从 1 计数到 31,而如果是 2 月,则 day 模块开始计时从 1 计数到 29,如果其他月份时,则计数从 1 到 30,之后并输出 一个控制信号 clk2 控制 month 模块, 此时 clk2=1 , 计数到最大值时都会回到 1, 然后循环计数,此时 clk2=0。如果是非闰年,并且是 1、3、5、7、8、10、12、 月,day 模块开始则从 1 计数到 31,而如果是 2 月,则 day 模块开始计时从 1 计数到 29,如果其他月份时,则计数从 1 到 30,之后并输出一个控制信号 clk2 控制 month 模块,此时 clk2=1 ,计数到最大值时都会回到 1,然后循环计数, 此时 clk2=0。详细代码描述见附录天模块。 核心代码: elsif (clkd'event and clkd='1') then if ( yearin rem 4 =0) then -----当前为闰年 if ((monthin=1) or (monthin=3) or (monthin=5) or (monthin=7) or (monthin=8) or ( monthin=10) or (monthin=12)) then-------当前为大月 31 天 if(qd=31) then qd&=1;clk2&='1'; elsif qd&31 then qd&=qd+1; clk2&='0'; elsif (monthin=2) then -------当前为小月 29 天 if(qd=29) then qd&=1;clk2&='1'; elsif qd&29 then qd&=qd+1; clk2&='0'; elsif ((monthin=4) or (monthin=6) or (monthin=9) or (monthin=11)) then if(qd=30) then qd&=1;clk2&='1';--------当前为中月 30 天 elsif qd&30 then qd&=qd+1; clk2&='0';8 第二章 电子时钟设计 elsif ((monthin=1) or (monthin=3) or (monthin=5) or (monthin=7) or (monthin=8) or (monthin=10) or (monthin=12)) then ------非闰年大月份 31 天 if(qd=31) then qd&=1;clk2&='1'; elsif qd&31 then qd&=qd+1; clk2&='0'; elsif monthin=2 then ------非闰年小月 28 天 if(qd=28) then qd&=1;clk2&='1'; elsif qd&28 then qd&=qd+1; clk2&='0'; elsif ((monthin=4) or (monthin=6) or (monthin=9) or (monthin=11)) then----非闰年中月 30 天 if(qd=30) then qd&=1;clk2&='1'; elsif qd&30 then qd&=qd+1; clk2&='0'; 图 10 管脚说明如下: clkd:时钟信号 Setd:校时设置信号 Yearin:闰年检查信号 Monthin:月份检测信号 Clks2:进位信号 Qtd1、Qtd2、Qtd3、Qtd4:输出的天时钟 其仿真波形如下:闰年 2 月 29 4 月 30 天图 10 天计数结构图 11 天模块计数仿真根据以上图 11 波形图可以知道闰年二月为 29 天,4 月为 30 天,由于条件 限制,还有其他月份没有显示出来,这里只截取了部分仿真波形,总的来说,天 模块是符合设计要求的。2.2.6 月份模块在月份模块中,采用 12 进制,计数到 12 后返回 1,并且产生一个进位信号9 闭应明clk4 作为年模块的时钟信号,核心代码和秒模块相似,这里省略,详细代码描 述见附录月模块。 图 12 管脚说明如下: 其中 clkm:时钟信号 Setm:校时设置信号 Alarmm:闹铃校时设置信号 Clks4:进位信号 Qtm1、Qtm2、Qtm3、Qtm4、Qtm5:输出的月份时钟其仿真波形如下:图 12 月计数结构图 13 月模块计数仿真由以上图 13 波形图可以知道,初始设置是 5 月份,当计数到 12 后返回 1, 符合月份的规律要求, 并且计数到 12 后,产生一个进位作为年模块的时钟输入。2.2.7 年模块当前模块中的时钟信号来临时, 年的计数就开始从预定的值开始计数,一 直计数到 2099,核心代码和秒模块相似,这里省略,详细代码代码描述见附录 年模块。 图 14 管脚说明如下: clky:时钟信号 Sety:校时设置信号 Alarmy:闹铃校时设置信号 Qty1、Qty2、Qty3、Qty4、Qty5:输出的年时钟图 14 年计数结构其仿真波形如下:10 第二章 电子时钟设计图 15 年模块计数仿真根据以上图 15 波形,由于我们只设置了 2015 到 2099 年的时间,所以年的 计数值最大只能到 2099 年,如果有需要扩大年份可以自行修改该模块的代码参 数。2.2.8 阳历转阴历模块这个模块能够实现阳历转阴历,程序使用了一个制表的模式,它包含了从 2014 年到 2099 年之间的农历信息,在程序中每一个年份使用 23 位的输入作为 表述农历月份大小月、 农历闰年的的月份以及其大小月、当年春节对应的阳历日 期的数据。其中,高四位表示当年闰年的月份,如果为“0000” ,表示没有闰月; 第 19 位到第 8 位分别对应的是农历 1 月到 12 月的大小月, 如果对应的位数为 0, 则表示当月是小月 29 天,否则为大月 30 天;第 7 位表示的是闰月份的大小月; 第 6 到第 5 位表示的是当年春节对应的月份; 最后低五位表示的当年春节对应公 历的日期。这个模块只包含了 86 个年份的信息数据,但也可以根据需要自行扩 充更多的年份。 在这个制表中, 可能会存在有个别的天数差异而导致对应的日期 转换错误, 在实验中如果发现存在这些信息错误,可以通过修改制表中对应的错 误信息来修正。 代码描述见附录阴阳历转换模块。 核心代码如下: -----------------------------节前---------------------------------if (month1&QQ1)or (month1=QQ1 and day1&QQ) then-----春节前 Tyear&=year1-1;Tyear_1&=year1-1;----输出的农历年份 day13:=QQ-day1+(QQ1(3 downto 0)-month1(3 downto 0))*&11111&;---当前日 期距离春节的总天数 if day13&=mmday12 then-----天数小于农历 12 月份的天数 Tmonth&=&&;-----对应的农历月份输出 Tday&=mmday12-day13+1;-----对应的农历日输出 Tmonth_1&=&&; Tday_1&=mmday12-day13+1; Else-----大于 12 月份天数 if Q(23 downto 20)=&1100& then----判断 12 月是不是农历闰月 Tmonth&=&&; Tday&=mmday12+mmday13-day13+1; Tmonth_1&=&&; Tday_1&=mmday12+mmday13-day13+1;11 闭应明Else -------农历 12 月不是闰月 Tmonth&=&&; Tday&=mmday12+mmday11-day13+1; Tmonth_1&=&&; Tday_1&=mmday12+mmday11-day13+1; ------------------------------节后----------------------------------i:=20;j:=&&;day12:=&&; L1:while (i&8) loop i:=i-1;j:=j+1;x:=&&&Q(i); day12:=day12+&&+x;-----当前农历日期距离春节天数 day12 if day12&day11 then exit L1;---day11 表示当前阳历日期距离春节天数 if Q(23 downto 20)=j then day12:=day12+mday1;---当前月份是闰月,则加上 该闰月天数 mday1 if day12&day11 then exit L1; end loop L1; 图 16 管脚如下: year1:输入的阳历年份 Month1:输入的阳历月份 Day1:输入的阳历日期 Tyear、tyear_1:输出农历年份 Tmonth、tmonth_1::输出的农历月份 Tday、Tday_:输出的农历日期 Chu1:除夕的信号提醒,作为传统节日提醒 模块的输入信号 其仿真波形如下:图 16 阳历转阴历结构图 17 阳历转阴历仿真由以上图 17 的波形仿真图可以知道,阳历相对应的阴历日期,可以通过手 机或者挂历进行对照, 发现仿真出来的农历日期和挂历上农历日期是一致的。但 是不一定代表对所有的日期都能准确表示, 原因在于代码中的个别年份信息记录 可能出现错误, 如果发现仿真出来的波形存在错误现象,我们可以通过修改代码12 第二章 电子时钟设计中个别年份的信息参数即可。 总的来说阳历转阴历是可以实现的。在最后输出一 个 chu1 信号,可以作为除夕的传统节假日提醒。2.2.9 闹铃闰年模块闹铃模块是通过设置的闹铃时间和当前时间进行对照, 进而判断是否有闹铃提 醒,即如果当前时间和设置的闹铃时间一致,对应输出就会置 1,否则为 0;在 这个模块中还存在闰年的提醒功能,如果输入的年份 run 是一个闰年,那么对应 出就会置 1,否则为 0。在这个模块中,我们只取分钟和小时的对照时间,代码 描述见附录。 核心代码: if (( run rem 4 =0 )and (mn1a/=mn2a or h1a/=h2a)) then ring&=&10&; ---------是闰年,提醒 elsif ((run rem 4 =0) and mn1a=mn2a and h1a=h2a ) then ring&=&11&;---闰年,闹铃提醒 elsif ((run rem 4 /=0) and mn1a=mn2a and h1a=h2a ) then ring&=&01&;------闹铃提醒图 18 管脚说明如下 run:输入月份信号,判断是否闰年 Mn1a、h1a:输入闹铃预置时间信号 Mn2a、h2a:当前时间的信号 Ring:输出信号, “10”表示只有闰年, “01”表示闹铃 “11”表示既是闰年,也有闹铃,否则都没有其仿真波形如下: 闹铃提醒 闰年提醒图 18 闹铃结构图 19 闹铃波形仿真根据 图 19 仿真波形可以知道,当年不存在闰年的时候,当闹铃时间到后, ring1(闰年)为 0,ring0 (闹铃)为 1;当年不存在闰年的时候,当闹铃时间 到后,ring1(闰年)为 1,ring1 (闹铃)为 1;由此可以知道,闰年提醒,闹 铃提醒都可以通过此模块来实现。2.2.10 译码转换模块13 闭应明添加这个模块,是因为以上的程序都是以整型数据类型存在的,而我们需要把 程序下载到 DE2_70 开发板中,并使数据能在开发板上显示,我们需要把输入的 型数据转换为其他所需要的数据类型,比如说假设 s1=21,则 a1=“0001” ,a2= “0010”即对应公式为(a1=s1 rem 10,a2=(s1-a1)/10,同理,mn、h1、d1、 m1、y1 也是按照此类公式进行运算;对于 Tday、Tmonth11、Tyear11,由于其是 八位的数据类型,在转换时可以先转换成整型数据(即 conv_integer(Tday))再调用以上的公式。代码描述见 附录译码转换模块。 图 20 管脚说明如下: s1:秒输入(整型) Mn1:分输入 h1:小时输入 D1:小时输入 M1:月份输入 Y1:年份输入 Tday11:农历天输入 Tmonth11:农历月份输入 Tyear11:农历年份输入 A1,a2:分别是秒的个位,秒的十位 B1,b2:分别是分的个位,分的十位 C1,c2:分别是小时的个位,小时的十位 E1,e2:分别是天的个位,天的十位 F1,f2:分别是月份的个位,月份的十位 G1,g2,g3,g4:表示年的个位,十位,百位,千位 H_1,h_2:分别表示农历天的个位,天的十位 图 20 译码结构 I1,i2:分别为农历月的个位,月的十位 J1,j2,j3,j4:分别表示农历年的个位,十位,百位,千位 其波形仿真如下14 第二章 电子时钟设计图 21 译码波形仿真由以上图 21 的波形仿真可以知道,每一个年月日,时分秒的参数都会拆分 成一个单独的数,有两位就被拆成两个数,有四位的就被拆成 4 个单独的数,因 此可以看出, 数的转换是正确的。从而才可以使每一个数分别地通过数码管或者 LCD 单独显示出来。2.2.11 七段数码管和 LCD 显示模块如图 22 中,该模块其中输入信号 a11 到 j14 分别对应译码 转换模块的输出信号,即从秒的个位开始,一直到年的千位; 输出也分别对应转换输出的 num1 到 num22,即输出的信号从 num1 到 num6 表示时分秒(数码管显示) ,从 num7 到 num14 表 示年月日 (LCD 显示) , 从 num15 到 num22 表示农历 (LCD 显示) , 由于实验开发板的七段数码管采用了共阳的显示方法,所以在 编码时, 输出的数字从 0 到 9 分别对应 “” “” 、 、 “
” 、 “” “” 、 “” 、 “” (其中的 最高位表数码管的点显示,表灭) ,同时 LCD 显示从 0~9 的代码 分别表示为 “” 、 “” 、 “” 、 “” 、 “
” 、 “” 、 “”代码描述见附录。 其仿真波形如下: 图 22 显示结构15 闭应明图 23 显示模块波形仿真由以上图 23 仿真波形可以知道, 每一个数都可以转换成特定的数值, 即 a11 (秒为个位 1) , 对应输出 num1 (秒数码管显示) , e11 (天个位 3) , 对应输出 num7 (天个位 LCD 显示) ,这些数值都可以用作数码管或者 LCD 的显示,所以显示模 块是可以实现的。2.2.12、传统节假日提醒模块我们知道中国的大部分传统节日一般以农历为 对应固定时间, 比如春节在一月初一, 元宵在一月初 十五,端午在五月初五,七夕在七月初七,中原节在 七月十五, 重阳节在九月九等, 但也有部分节日是不 固定的,比如清明节,冬至,和除夕。代码描述见该 模块附录。 图 24 管脚如下说明: Chu,dong,qing:分别是除夕、冬至、清明提醒输 入信号 Play:表示输出的对应传统节日的提醒(附录标注对应的提醒)图 24 传统节假日提醒结构 其仿真波形如下:图 25 传统节假日提醒波形仿真以上图 25 仿真波形可以知道,各个传统节假日到来时,play0~play10 都会16 第二章 电子时钟设计相应出现一个高电平, 进而可以判断提醒当前的传统节假日是什么节日。所以节 假日提醒是可以实现的。2.2.13 24 节气提醒模块在该模块中,运用了判断 24 节气的运用公式,即日期=[Y*D+C]-L,其中 Y 是 年数的后两位,D 为 0.2422,L 等于闰年数(当年是闰年并且小于等于二月时 L=Y/4-1,否则 L=Y/4),C 对应的是对于不同年份对应不同气节的因子其中(冬 至日 C=21.94,小寒 C=5.4055,大寒 C=20.12,立春 C=3.87,雨水 C=18.73,惊 蛰 C=5.63,春风 C=20.646,清明 C=4.81、谷雨 C=20.1,立夏日 C=5.52,小满 C=21.04, 芒种 C=5.678, 夏至 C=21.37, 小暑 C=7.108, 大暑 C=22.83, 立秋 C=7.5, 处暑 C=23.13,白露 C=7.646,秋分 C=23.042,寒露 C=8.318,霜降 C=23.438, 立冬 C=7.438, 小雪 C=22.36 大雪 C=7.18) 。 当算出的日 期与当前时钟日期一致时,就会有相应的气节提醒,代 码描述见附录,具体看该程序模块 图 26 管脚说明如下: Year、month、day:分别表示年月日输入信号 Qing1、dong1:分别表示当前清明、冬至提醒信号,作为对传统节假日提醒的输 入反馈信号 Play_1:表示输出节气的提醒图 26 节气提醒结构其仿真波形如下:小寒 立春 夏至 冬至图 27 节气提醒波形仿真由以上图 27 的波形仿真, 可以知道, 1 月 8 号时 (小寒) , play_1 是 00001; 2 月 4 号(立春),play_1 是 00010;6 月 21(夏至),play_1 是 10110 等;不同 的节气,play_1 对应不同的数值,具体节气对应数值可以通过附录代码注释。 总的来说,该模块的节气提醒是可行的。17 闭应明2.2.14 定时关机模块该模块中有控制关机信号 close_timeset,即 1 时关机信号有效,并且当当 前时间与设定的关机时间一致时,所有的输出不显示,从而达到关机的目的;当 控制关机信号为 0 时,则无论当前时间多少,都不会出现关机现象,代码描述见 附录。 图 28 管脚说明如下: close_timeset:控制关机信号 Hour_set:设定的关机小时 Minute_set:设定的关机分 Hour_current:当前的小时信号 Minute_current:当前的分钟信号 输入的 Play_1LED1 到 ring_play1:受控制的输 出信号 输出的 Play_1LED2 到 ring_play2:最终输出的 显示信号图 28 关机结构该模块仿真波形如下:图 29 关机波形仿真根据以上 图 29 的仿真波形可以知道,当前时间 12:03 分到来时,对应是输 出, 比如数码管 num1~num6 都输出 , LED 的 play_1LED2 (传统节假日) 、 play_2LED2 (节气) 、 ring_play (闰年闹铃) 都输出 0, LCD_rs1 输出 0 (对 1602LCD 写命令) ,LCD_Data 输出 (清屏命令) 。可以看出关机时间到来后所有18 第二章 电子时钟设计的显示都灭了。所以该模块的功能是可行的。2.2.15 l602LCD 显示驱动模块该模块主要是驱动阳历年月日、农历年月日的显示,使其在实验开发板的 1602LCD 液晶显示出来。其显示字符格式已经在七段数码管和 LCD 显示模块中陈 述。要使 LCD 显示,需要先写命令,即使 rs=0,然后再输入命令,其中命令 X “01”表示清屏,X”38”表示设置功能:8 位,两行,5×7/每字符 ;X”0c” 表示显示控制:显示开,光标关,光标不闪烁;X”06”表示光标显示地址右移, 自动加 1 。然后再写数据,即使 rs=1,把需要输出的字符通过 data 写入。最后 设置显示字符的地址,即使 rs=0,再写入首地址。这些过程都是通过 en 的高脉 冲来驱动显示的,所以需要设定 LCD 的时钟晶振,为使 LCD 能显示,必须保证 lcdon 和 lcdblon 都处在高电平。 图 30 管脚说明: Clk_R:液晶 LCD 的驱动时钟 Num7p 到 num14p:对应天月年 Num15p 到 num22p:对应农历天月年 RS:0,写命令;1,写数据 rw:读写信号 en:使能信号 LCDon:电源开关信号 LCDBlon:背光开关信号 Data:8 位的数据图 30 LCD 驱动结构仿真波形:19 闭应明图 31 LCD 驱动显示波形仿真根据 31 波形图可以知道,en 可以产生合适的脉冲来驱动 lcd 的工作,lcdon 和 lcdblon 都处在高电平,rw 处在低电平,当 rs 为 1 时,不断写入 data 的数 据,rs 为 0 时,就写入显示首地址。因此可以看得出,波形的仿真是符合驱动 l602LCD 的工作条件的。 其中看到输入 SC 和 LC 分别表示 solar calendar (阳历) , lunar calendar(阴历) ,而实现格式为 X”53” ,X”43”和 X”4C” ,X”43” 。2.2.16、顶层模块该模块是通过例化语句, 把以上的各个模块组合到一起,最终形成了一个具有 多功能的电子钟, 并且可以满足设计要求的各个指标,实验最终结果可以在以下 的仿真波形以及时钟验证图形看出。 图 32 管脚说明: Close_timeset:定时关机控制信号 Hour_set、minute_set:定时关机时间信号 Clk:时钟信号 Set:时间校正控制信号 Alarm:闹铃控制信号 Control:数码管输出选择信号(00 输出时分秒,01 输出年月日,11 输出农历) S、mn、h、d、m、y:输出时间(quartus II 观察) Num1~num22:分别输出秒分时,天月年,农历天月年 信号(七段数码管显示) Play_1LED:气节提醒(对应提醒看气节模块) 图 4_16_1 电子钟结构 Play_2LED:传统节日提醒(对应提醒看传统节日提20 第二章 电子时钟设计醒模块) Ring_play:闰年和闹铃提醒信号(01 是闹钟提醒,10 是 闰年提醒,11 是闹钟和闰年的提醒)图 32 电子钟结构其仿真波形如下: 1、关机显示 12:34 分关机:关机时间图 33 电子钟关机波形仿真由图 33 可以知道, 当时间为 34 分的时候, 电子钟的数码管显示为 “1111111” (灭) ,所有的 LED 都是低电平(灭) ,LCD 输入 X“01” ,且此刻 rs 为 0(清屏 作用) 。即所有结果显示都灭了,具有关机的作用小效果。 2、年月日时分秒输出,以及数码管输出显示如下图:年月日时分 秒计数数码管显示传统节 日提醒闰年提醒21 闭应明图 34 电子钟计数及七段数码管显示波形仿真由图 34 可以知道,年月日时分秒有计时的作用功能,同时也具有数码管显 示的功能, 即 num1 到 num6 对应的输出数据符合数码管显示的要求,在波形上可 以知道当天时间是 2016 年 6 月 9 号,当天为端午节,play_2LED 对应输出的数 据就是端午节的提醒,并且 ring_play 对应的输出数据对应闰年提醒。 3、年月日的 LCD 显示输出以及数码管的点显示如下图:LCD 的驱动显示 数码管的点控制显示(灭)图 35 电子钟 LCD 显示波形仿真由图 35 可以知道,LCD 的驱动显示符合驱动要求的条件,同时不需要数码管 的点显示。 4、 闰年闹钟提醒如下图:闰年提醒闹铃提醒22 第二章 电子时钟设计图 36 电子钟闰年闹铃提醒波形仿真由以上所有的仿真波形可以看出,该电子钟能实现基本电子钟计时功能,也 包括阴阳历显示,闹铃闰年提醒,定时关机功能,传统节假日提醒,24 节气提 醒等。23 闭应明第三章 时钟验证3.1 管脚绑定输入管脚绑定 Set――isw13,alarm――isw14,close_timeset――isw15,minute_set―― isw0~isw5 Hour_set――isw8~isw12,clk――clk50(AD15),clk_1――clk50(A16) 输出管家绑定 Play_1LED――oLEDG(0 to 4) Play_2LED――oLEDR(0 to 10) Ring_play――oLEDR(16 to17) Num1~num6――oHEX0~ohex5 LCD_Data――LCD(7 to 70) LCD_WR1――LCDwr,LCD_en1――lcden,LCD_RS1――lcdrs3.2 时间参数一取设定时间为 2015 年 5 月 6 号 12:30:30 闹铃时间 12:33:00 定时关机时间 12:35:00 参数一结果:图 37 DE2_70 初始状态24 第三章 时钟验证图 38 时分秒计数,农历阳历显示,节气提醒( 立夏)图 39 闹铃提醒图 40 关机状态25 闭应明3.3 时间参数二取设定时间为 2016 年 6 月 20 号 12:30:30 闹铃时间 12:33:00 定时关机时间 12:35:00 时间参数二结果图 41 闰年提醒图 42 参数二的闹铃提醒3.4 时间参数三取设定时间为 2016 年 6 月 9 号 12:30:30 闹铃时间 12:33:00 定时关机时间 12:35:00 参数三结果26 第三章 时钟验证图 43 传统节假日提醒(添加 sc 表阳历,Lc 表阴历)图 44 传统节假日,闰年,闹铃的提醒3.5 结果分析根据图 37 的初始状态可以知道,其他的图片都显示出电子钟的功能。由图 38 可以知道,电子钟会有节气的提醒,由于节气输出管脚绑定的是 oLED(4~0) , 根据绿色 LED 灯可以看出电平为 LLLHLH,再根据节气模块从而判断出当前节气 为立夏,再对照挂历可以知道
当天就是立夏日,从而可以看出节气的 提醒功能是准确的。由图 39 可以知道,当时间到达 12:33 后,右边的一个红色 LED 灯亮,对应于绑定的管脚是 oLEDR17 管脚,又由于之前设定的闹铃时间为 12:33,从而可以判定该电子钟有闹铃提醒的功能。由图 40 可以看出,当时间计 数到 12:35 后, 所有相关的输出都不显示,右边的两个数码管亮是由于没有被利 用到,进而不对这两个数码管处理,所以根据图 40 的状态可以说明电子钟有定 时关机的功能。由图 41 可以知道,当前时间是 2016 年,为闰年,左边起第二个27 闭应明LED 亮,对应闰年提醒显示绑定的管脚,从而可以看出该电子钟也可以实现闰年 的提醒功能。由图 42 可以知道,与图 41 相比较,多了一个 LED 灯显示,是因为 当前时间到 12:33 了,因此闹铃开始提醒,从而可以看出,不同的功能模块是可 以同时进行,并且是可以实现相应功能的。由图 43 可以知道,当前不仅存在闰 年的提醒,还存在某个功能的提醒,在图片上可以看出,左起的第 12 个 LED 灯 亮, 刚好对应传统节假日的端午节提醒管脚,再从 LCD 上可以看出当前的农历月 日刚好是五月初五, 与传统节假日对应,所以可以看出该电子钟有传统节假日提 醒的功能。由图 44 可以看出电子钟同时有传统节假日,闰年,闹铃的提醒,从 而进一步验证了该电子钟能够同时实现多种功能。 总之, 由以上的图片和结果的分析,该电子钟能够基本实现了设计的技术指 标, 各个功能都能在开发板上显示出来了,所以设计的该电子钟是一个具有多功 能的电子钟。28 总结总结本毕业设计通过 VHDL 语言对每个模块进行编写, 各个模块的功能在上文以及 附录都做了较为详细的描述, 然后把以上各个的模块组合,最终实现一个具有多 功能的电子时钟。 在刚刚得到老师给的毕业设计课题后,我翻阅了较多的书籍并且在网上收集 了大量的开题资料, 对完成多功能电子钟有了一定的基础。在收集课题资料过程 中,我查阅并记录了 VHDL 语言描述的使用,FPGA 的使用,电子钟的设计内容, 比如阳历转阴历的方法,传统节假日的规律,24 节气的规律、七段数码管显示 规律等资料。在此基础上得以设计出电子钟的雏形。在这整个雏形中,我完成了 整个电子时钟方框图。 在这设计的过程中,电子钟的阴阳历转换花费了我较大的时间精力,毕竟每 一个新历年对应的农历没有详细的固定规律。 根据收集资料后, 得到了一些思路, 最终决定把每个农历年的信息收集到一起,以春节作为阳阳历转换的媒介桥梁, 即根据当前日期与春节相隔的天数,再逆推出对应的农历日期,根据这个思想最 终完成了阴阳历转换。 在设计的过程中, LCD 显示驱动模块上花费较多的精力和时间。由于不懂 DE2_70 开发板中 LCD 的工作原理,所以在网上和图书馆里找了较多的关于 LCD 资料,最终才知道要使 LCD 能够显示出来,必须先输入命令,然后再输入数据, 最后再设定显示的地址, 从而显示出字符。之前由于没有把 LCD 的电源开关和背 光电源开关给做处理,所以一直没有显示出字符,通过这次的毕业设计,让我对 LCD 的使用有了进一步的掌握,希望能在以后的工作中有所帮助。 VHDL 语言具有通俗的可读性,能够让人更容易掌握电路的系统及其原理。 在设计中,我主要使用 quartus II 软件对各个功能模块进行描述,编译、仿真, 当把所有功能都综合后,把管脚绑定好,最终下载到 DE2_70 开发板上,通过拨 动开关,来设定时钟的信息,从而观察电子钟的各个功能是实现。 在这次毕业论文中,也有不足的部分,首先,没有校时模块,校时只能在软 件中调试,即如果设定所要的时间,只能通过改写功能模块中的时间参数,从而 实现时间设定,却不能在硬件中调试。其次,节气和传统节假日应该使用 LCD 显示, 而不是用 LED 显示, 因为 LCD 显示更为直观。 由于毕设论文期限将要结束, 没有更多的时间来完善这些不足点,所有本次毕业设计只能基本符合设计要求。 总之,这次的毕业设计,一方面提升了自己的知识整合能力,并且丰富了关 于 FPGA 的运用知识,另一方面,也让我知道自己不足的地方。这个过程让我学 到了更多的知识, 掌握了更多的应用技巧,对即将结束的大学生活有个全新的理 念。29 总结致谢大学生活即将结束, 毕设作为大学里的最后一课,不仅体现着大学四年的学 习能力,更加体现的是大学知识的积累和运用。在这里,特别感谢卫雅芬老师给 以的支持和帮助。从拿到毕业课题到最终完成论文,这个过程中,出现过很多的 困难, 甚至有时候无从下手, 但是在卫老师的指导下, 给予了我一些思路和方法, 根据这些思路, 再结合一下自己所搜寻的资料,让我得以顺利地完成了毕设的最 后终稿。同时,也感谢卫老师在我们完成毕设的过程中,及时地通知我们关于毕 业生论文要求和注意事项,让我们及时地做好毕设的工作要求。总之,卫老师作 为我的导师, 对我的毕业论文设计尽心尽力, 在方方面面上给予了我支持和帮助, 最终完成了毕业设计论文,在这里,再一次发自内心的感谢! 其次, 我要感谢同学和朋友对我的支持,感谢他们共享的各种检测论文的网 站,让我的毕设符合要求;感谢他们所收集的资料内容,给我提供了一种借鉴; 感谢他们在生活中的帮助,使我的压力得到减轻。总之,感谢他们的帮助,因为 他们的帮助,对我的毕设工作完成有很大的作用。 此外,本文最终得以顺利完成,也离不开教研室老师的支持与帮助,他们都 对我的毕设提供了帮助,开放实验室为我们提供方便,从而能让我在学院的实验 室里完成设计的最终结果,在此向他们表示深深的感谢!30 参考文献参考文献[1] 姜立东. VHDL 语言设计及其应用[M]. 北京:北京邮电大学出版社,2001 [2] 徐{民,安德宁. 数字逻辑设计与 VHDL 描述[M]. 北京:机械工业出版社,2008 [3] 王振红. FPGA 电子系统设计项目实战(VHDL 语言)[M]. 北京:清华大学出版社,2014 [4]] 陈忠平,袁碧胜,龚亮. 基于 VHDL 的 FPGA 数字系统一样实践[M]. 北京:电子工业出 版社,2014 [5] 江国强. EDA 技术应用[M]. 北京:电子工业出版社,2014 [6] 江国强. EDA 技术习题与实验[M]. 北京: 电子工业出版社,2014 [7] 潘松,黄继业. EDA 技术应用教程. 北京: 科学出版社,2004 [8] 潘松,潘明. 现代计算机组成原理. 北京: 科学出版社,2007 [9] 徐志军,徐光辉. CPLD/FPGA 的开发与应用. 北京: 电子工艺出版社,2002 [10] Xilinx Inc. Data book 2011. Xilinx,2000 [11] Altera Corporation. Altera Digital library. Altera,200231 闭应明附录1、分频模块 2、秒模块 use ieee.std_logic_1164. use ieee.std_logic_unsigned. entity second is port ( clks: in std_ sets: in std_ qts1: out integer range 0 to 59;--------------输出时间 qts2: out integer range 0 to 59;--------------输出时间 clk1: out std_logic); architecture miao of second is signal qs:integer range 0 to 59; begin process(clks,sets) begin if sets='1' then -------调制时间使能信号 qs&=30; elsif(clks'event and clks='1') then if(qs=59) then qs&=0; clk1&='1'; ------输出分模块时钟信号 elsif qs&59 then qs&=qs+1; clk1&='0';------秒计数 qts1&=qts2&= 3、分模块 use ieee.std_logic_1164. use ieee.std_logic_unsigned. entity minute is port ( clkmn: in std_32 附录 setmn: in std_ alarmmn: in std_ qtmn1: out integer range 0 to 59; qtmn2: out integer range 0 to 59; qtmn3: out integer range 0 to 59; clk2: out std_ mnx: out integer range 0 to 59 ; mny: out integer range 0 to 59) ; architecture fen of minute is signal qmn:integer range 0 to 59; begin process(clkmn,setmn) begin if setmn='1' then qmn&=30; elsif(clkmn'event and clkmn='1') then if(qmn=59) then qmn&=0; clk2&='1'; elsif qmn&59 then qmn&=qmn+1; clk2&='0'; process(alarmmn) begin if alarmmn='1' then mnx&=33; else mnx&= qtmn1&= mny&=qtmn2&=qtmn3&=4、时模块 use ieee.std_logic_1164. use ieee.std_logic_unsigned. entity hour is port ( clkh: in std_ seth: in std_----小时调制时间信号 33 闭应明 alarmh: in std_------闹铃调制信号 qth1: out integer range 0 to 23 ;-----输出当前小时时间 qth2: out integer range 0 to 23 ;-----输出当前小时时间 qth3: out integer range 0 to 23 ;-----输出当前小时时间 clk3: out std_----输出作为天模块的时钟信号 hx: out integer range 0 to 23;-----闹铃对比 hy: out integer range 0 to 23) ;-----输出时间对比 architecture shi of hour is signal qh:integer range 0 to 23; begin process(clkh,seth) begin if seth='1'then ------高电平调制 qh&=12; elsif(clkh'event and clkh='1') then if(qh=23) then qh&=0;clk3&='1'; elsif qh&23 then qh&=qh+1; clk3&='0';------小时计数 process(alarmh) begin if alarmh='1' then hx&=12; ------闹铃高电平调制 else hx&= qth1&= hy&=qth2&=qth3&=5、天模块 use ieee.std_logic_1164. USE IEEE.STD_LOGIC_ARITH.ALL; use ieee.std_logic_unsigned. entity day is port ( clkd: in std_ setd: in std_ yearin: in integer range 2015 to 2099; -- 作为判断闰年信号,定义最大年份到 2099 年34 附录 monthin:in integer range 1 to 12; ----作为判断月份信号 qtd1: out integer range 1 to 31; qtd2: out integer range 1 to 31; qtd3: out std_logic_vector(8 downto 0); qtd4: out integer range 1 to 31; clk2: out std_logic ) ; architecture ri of day is signal qd:integer range 1 to 31; begin process(clkd,setd,yearin,monthin) begin if setd='1' then qd&=6; elsif (clkd'event and clkd='1') then if ( yearin rem 4 =0) then-----当前为闰年if ((monthin=1) or (monthin=3) or (monthin=5) or (monthin=7) or (monthin=8) or (monthin=10) or (monthin=12)) then-------当前为大月 31 天 if(qd=31) then qd&=1; clk2&='1'; elsif qd&31 then qd&=qd+1; clk2&='0'; elsif (monthin=2) then -------当前为小月 29 天 if(qd=29) then qd&=1; clk2&='1'; elsif qd&29 then qd&=qd+1; clk2&='0'; elsif ((monthin=4) or (monthin=6) or (monthin=9) or (monthin=11)) then if(qd=30) then --------当前为中月 30 天 qd&=1; clk2&='1'; elsif qd&30 then qd&=qd+1; clk2&='0'; elsif ((monthin=1) or (monthin=3) or (monthin=5) or (monthin=7) or (monthin=8) or 35 闭应明 (monthin=10) or (monthin=12)) then if(qd=31) then qd&=1; clk2&='1'; ------非闰年大月份 31 天elsif qd&31 then qd&=qd+1; clk2&='0'; elsif monthin=2 then ------非闰年小月 28 天 if(qd=28) then qd&=1; clk2&='1'; elsif qd&28 then qd&=qd+1; clk2&='0'; elsif ((monthin=4) or (monthin=6) or (monthin=9) or (monthin=11)) then----非闰年中月 30 天 if(qd=30) then qd&=1; clk2&='1'; elsif qd&30 then qd&=qd+1; clk2&='0'; qtd1&= qtd2&= qtd3&= conv_std_logic_vector(qd,9); qtd4&=6、月份模块 use ieee.std_logic_1164. USE IEEE.STD_LOGIC_ARITH.ALL; use ieee.std_logic_unsigned. entity month is port ( clkm: in std_ setm: in std_ qtm1: out integer range 1 to 12; qtm2: out integer range 1 to 12; qtm3: out std_logic_vector(3 downto 0); qtm4: out std_logic_vector(8 downto 0);36 附录 qtm5: out integer range 1 to 12; clk4: out std_logic) ; architecture yue of month is signal qm:integer range 1 to 12; begin process(clkm,setm) begin if setm='1' then qm&=5; elsif(clkm'event and clkm='1') then if(qm=12) then qm&=1; clk4&='1'; elsif qm&12 then qm&=qm+1; clk4&='0'; qtm1&=qtm2&=qtm3&=conv_std_logic_vector(qm,4);qtm4&=conv_std_logic_vector(qm,9 );qtm5&=7、年模块 use ieee.std_logic_1164. use ieee.std_logic_unsigned. use ieee.std_logic_ entity year is port ( clky: in std_ sety: in std_ qty1: out integer range 2015 to 2099; qty2: out integer range 2015 to 2099; qty3: out integer range 2015 to 2099; qty4: out integer range 2015 to 2099; qty5: out integer range 2015 to 2099) ; architecture nian of year is signal qy:integer range 2015 to 2099; begin process(clky,sety) begin if sety='1' then 37 闭应明 qy&=2015; elsif(clky'event and clky='1') then if(qy=2099) then qy&=2015; else qy&=qy+1; qty1&=qty2&=qty3&=qty4&=qty5&= :8、阳历转阴历模块 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; Entity trans2 is Port ( --clk:in std_ year1 : in integer range 2014 to 2099; month1:in std_logic_vector(8 downto 0); day1 :in std_logic_vector(8 downto 0); Tday:out std_logic_vector(8 downto 0); Tmonth:out std_logic_vector(8 downto 0); Tyear : out integer range 2014 to 2099; Tday_1:out std_logic_vector(8 downto 0); Tmonth_1:out std_logic_vector(8 downto 0); Tyear_1 : out integer range 2014 to 2099;chu1:out std_logic); E Architecture mk of trans2 is Signal Tyear1:integer range 2014 to 2099; Signal QQ:std_logic_vector(8 downto 0);---Signal QQ1:std_logic_vector( 8downto 0);---Signal Q:STD_LOGIC_VECTOR(23 DOWNTO 0); Signal Q_1:STD_LOGIC_VECTOR(23 DOWNTO 0); ----格式 Q(23)-(20) 位表示闰月月份,值为 0 为无闰月,Q(19)-(16) 对应农历第 1-4 月的大小 ----Q(15)-(8) 对应农历第 5-12 月大小,第三字节 Q(7) 表示农历第 13 个月大小 ----月份对应的位为 1 表示本农历月大(30 天),为 0 表示小(29 天) ----第三字节 Q(6)-(5) 表示春节的公历月份,Q(4)-(0) 表示春节的公历日期 Begin38 附录 Process(month1,year1,day1) variable day11:STD_LOGIC_VECTOR(8 DOWNTO 0); variable x:std_logic_vector(8 downto 0);---variable day12:STD_LOGIC_VECTOR(8 DOWNTO 0); variable day13:STD_LOGIC_VECTOR(8 DOWNTO 0); variable i: variable j:std_logic_vector(8 downto 0);--variable mday1:STD_LOGIC_VECTOR(8 DOWNTO 0); variable mday2:STD_LOGIC_VECTOR(8 DOWNTO 0); variable mmday11:STD_LOGIC_VECTOR(8 DOWNTO 0); variable mmday12:STD_LOGIC_VECTOR(8 DOWNTO 0); variable mmday13:STD_LOGIC_VECTOR(8 DOWNTO 0); begin case year1-1 is when 2014=& Q_1&=X&955ABf&; when 2015 =&Q_1&=X&04BA53& ; when 2016 =&Q_1&=X&0A5B48& ; when 2017=&Q_1&=X&6517BC& ; when 2018 =&Q_1&=X&052B50&; when 2019 =&Q_1&=X&0A9345& ; when 2020=&Q_1&=X&474AB9&; when 2021 =&Q_1&=X&06AA4C&; when 2022 =&Q_1&=X&0Ad541& ; when 2023=&Q_1&=X&24dAB6&; when 2024=&Q_1&=X&04B64A&; when 2025=&Q_1&=X&69573d& ; when 2026=&Q_1&=X&0A4e51&; when 2027 =&Q_1&=X&0d2646& ; when 2028=&Q_1&=X&5e933A& ; when 2029=&Q_1&=X&0d534d& ; when 2030=&Q_1&=X&05AA43& ; when 2031 =&Q_1&=X&36B537& ; when 2032=&Q_1&=X&096d4B&; when 2033=&Q_1&=X&B4AeBf& ; when 2034=&Q_1&=X&04Ad53& ; when 2035=&Q_1&=X&0A4d48& ; when 2036=&Q_1&=X&6d25BC&; when 2037=&Q_1&=X&0d254f& ; when 2038=&Q_1&=X&0d5244& ; when 2039=&Q_1&=X&5dAA38& ; when 2040=&Q_1&=X&0B5A4C& ; when 2041=&Q_1&=X&056d41& ; when 2042=&Q_1&=X&24AdB6& ; 39 闭应明 when 2043=&Q_1&=X&049B4A& ; when 2044=&Q_1&=X&7A4BBe& ; when 2045=&Q_1&=X&0A4B51& ; when 2046=&Q_1&=X&0AA546& ; when 2047=&Q_1&=X&5B52BA& ; when 2048=&Q_1&=X&06d24e& ; when 2049=&Q_1&=X&0AdA42& ; when 2050=&Q_1&=X&355B37& ; when 2051=&Q_1&=X&09374B& ; when 2052=&Q_1&=X&8497C1& ; when 2053=&Q_1&=X&049753& ; when 2054=&Q_1&=X&064B48& ; when 2055=&Q_1&=X&66A53C& ; when 2056=&Q_1&=X&0eA54f& ; when 2057=&Q_1&=X&06B244& ; when 2058=&Q_1&=X&4AB638& ; when 2059=&Q_1&=X&0AAe4C& ; when 2060=&Q_1&=X&092e42& ; when 2061=&Q_1&=X&3C9735& ; when 2062=&Q_1&=X&0C9649& ; when 2063=&Q_1&=X&7d4ABd& ; when 2064=&Q_1&=X&0d4A51&; when 2065=&Q_1&=X&0dA545&; when 2066=&Q_1&=X&55AABA& ; when 2067=&Q_1&=X&056A4e& ; when 2068=&Q_1&=X&0A6d43& ; when 2069=&Q_1&=X&452eB7& ; when 2070 =&Q_1&=X&052d4B& ; when 2071=&Q_1&=X&8A95Bf&; when 2072=&Q_1&=X&0A9553&; when 2073=&Q_1&=X&0B4A47& ; when 2074=&Q_1&=X&6B553B&; when 2075 =&Q_1&=X&0Ad54f& ; when 2076=&Q_1&=X&055A45& ; when 2077=&Q_1&=X&4A5d38& ; when 2078=&Q_1&=X&0A5B4C& ; when 2079=&Q_1&=X&052B42& ; when 2080=&Q_1&=X&3A93B6& ; when 2081=&Q_1&=X&069349& ; when 2082=&Q_1&=X&7729Bd& ; when 2083=&Q_1&=X&06AA51& ; when 2084=&Q_1&=X&0Ad546& ; when 2085=&Q_1&=X&54dABA& ; when 2086=&Q_1&=X&04B64e& ;40 附录 when 2087=&Q_1&=X&0A5743& ; when 2088=&Q_1&=X&452738& ; when 2089=&Q_1&=X&0d264A& ; when 2090=&Q_1&=X&8e933e& ; when 2091=&Q_1&=X&0d5252& ; when 2092=&Q_1&=X&0dAA47& ; when 2093=&Q_1&=X&66B53B& ; when 2094=&Q_1&=X&056d4f& ; when 2095=&Q_1&=X&04Ae45&; when 2096=&Q_1&=X&4A4eB9& ; when 2097=&Q_1&=X&0A4d4C& ; when 2098 =&Q_1&=X&0d1541& ; when 2099=&Q_1&=X&2d92B5& ; when others=&Q_1&= case year1 is when 2015 =&Q&=X&04BA53& ; when 2016 =&Q&=X&0A5B48& ; when 2017=&Q&=X&6517BC& ; when 2018 =&Q&=X&052B50&; when 2019 =&Q&=X&0A9345& ; when 2020=&Q&=X&474AB9&; when 2021 =&Q&=X&06AA4C&; when 2022 =&Q&=X&0Ad541& ; when 2023=&Q&=X&24dAB6&; when 2024=&Q&=X&04B64A&; when 2025=&Q&=X&69573d& ; when 2026=&Q&=X&0A4e51&; when 2027 =&Q&=X&0d2646& ; when 2028=&Q&=X&5e933A& ; when 2029=&Q&=X&0d534d& ; when 2030=&Q&=X&05AA43& ; when 2031 =&Q&=X&36B537& ; when 2032=&Q&=X&096d4B&; when 2033=&Q&=X&B4AeBf& ; when 2034=&Q&=X&04Ad53& ; when 2035=&Q&=X&0A4d48& ; when 2036=&Q&=X&6d25BC&; when 2037=&Q&=X&0d254f& ; when 2038=&Q&=X&0d5244& ; when 2039=&Q&=X&5dAA38& ; when 2040=&Q&=X&0B5A4C& ; when 2041=&Q&=X&056d41& ; 41 闭应明 when 2042=&Q&=X&24AdB6& ; when 2043=&Q&=X&049B4A& ; when 2044=&Q&=X&7A4BBe& ; when 2045=&Q&=X&0A4B51& ; when 2046=&Q&=X&0AA546& ; when 2047=&Q&=X&5B52BA& ; when 2048=&Q&=X&06d24e& ; when 2049=&Q&=X&0AdA42& ; when 2050=&Q&=X&355B37& ; when 2051=&Q&=X&09374B& ; when 2052=&Q&=X&8497C1& ; when 2053=&Q&=X&049753& ; when 2054=&Q&=X&064B48& ; when 2055=&Q&=X&66A53C& ; when 2056=&Q&=X&0eA54f& ; when 2057=&Q&=X&06B244& ; when 2058=&Q&=X&4AB638& ; when 2059=&Q&=X&0AAe4C& ; when 2060=&Q&=X&092e42& ; when 2061=&Q&=X&3C9735& ; when 2062=&Q&=X&0C9649& ; when 2063=&Q&=X&7d4ABd& ; when 2064=&Q&=X&0d4A51&; when 2065=&Q&=X&0dA545&; when 2066=&Q&=X&55AABA& ; when 2067=&Q&=X&056A4e& ; when 2068=&Q&=X&0A6d43& ; when 2069=&Q&=X&452eB7& ; when 2070 =&Q&=X&052d4B& ; when 2071=&Q&=X&8A95Bf&; when 2072=&Q&=X&0A9553&; when 2073=&Q&=X&0B4A47& ; when 2074=&Q&=X&6B553B&; when 2075 =&Q&=X&0Ad54f& ; when 2076=&Q&=X&055A45& ; when 2077=&Q&=X&4A5d38& ; when 2078=&Q&=X&0A5B4C& ; when 2079=&Q&=X&052B42& ; when 2080=&Q&=X&3A93B6& ; when 2081=&Q&=X&069349& ; when 2082=&Q&=X&7729Bd& ; when 2083=&Q&=X&06AA51& ; when 2084=&Q&=X&0Ad546& ; when 2085=&Q&=X&54dABA& ;42 附录 when 2086=&Q&=X&04B64e& ; when 2087=&Q&=X&0A5743& ; when 2088=&Q&=X&452738& ; when 2089=&Q&=X&0d264A& ; when 2090=&Q&=X&8e933e& ; when 2091=&Q&=X&0d5252& ; when 2092=&Q&=X&0dAA47& ; when 2093=&Q&=X&66B53B& ; when 2094=&Q&=X&056d4f& ; when 2095=&Q&=X&04Ae45&; when 2096=&Q&=X&4A4eB9& ; when 2097=&Q&=X&0A4d4C& ; when 2098 =&Q&=X&0d1541& ; when 2099=&Q&=X&2d92B5& ; when others=&Q&= case Q(7) is when '1'=&mday1:=&& ; when '0'=&mday1:=&& ; case Q_1(9) is--------------------表示当前的年份对应的当前的农历月份 when '1'=&mmday11:=&& ; when '0'=&mmday11:=&& ; case Q_1(8) is when '1'=&mmday12:=&& ; when '0'=&mmday12:=&& ; case Q_1(7) is when '1'=&mmday13:=&& ; when '0'=&mmday13:=&& ; QQ1&=&0000000&&Q(6 downto 5); QQ&=&0000&&Q(4 downto 0);------把春节日期的位数扩大 if Q(6 downto 5)=month1(1 downto 0) and ((Q(4 downto 0)-1)=day1) then chu1&='1'; else chu1&='0'; --if clk'event and clk='1' then if (month1&QQ1)or (month1=QQ1 and day1&QQ) then 43 闭应明 Tyear&=year1-1;Tyear_1&=year1-1; day13:=QQ-day1+(QQ1(3 downto 0)-month1(3 downto 0))*&11111&; if day13&=mmday12 then Tmonth&=&&; Tday&=mmday12-day13+1; Tmonth_1&=&&; Tday_1&=mmday12-day13+1; else if Q(23 downto 20)=&1100& then Tmonth&=&&; Tday&=mmday12+mmday13-day13+1; Tmonth_1&=&&; Tday_1&=mmday12+mmday13-day13+1; else Tmonth&=&&; Tday&=mmday12+mmday11-day13+1; Tmonth_1&=&&; Tday_1&=mmday12+mmday11-day13+1; --------春节后-----------elsif (month1=QQ1 and day1&=QQ)or (month1&QQ1) then Tyear&=year1;Tyear_1&=year1; day11:=day1+(month1(3 downto 0)-QQ1(3 downto 0))*&11110&-QQ; if month1&&&and(year1 rem 4)=0 then day11:=day11+1; if Q(6 downto 5)=&10& then case month1 is when &&=&day11:=day11; when &&=&day11:=day11-&&; when &&=&day11:=day11-&&; when &&=&day11:=day11-&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when others=& elsif Q(6 downto 5)=&01& then44 附录 case month1 is when &&=&day11:=day11+&&; when &&=&day11:=day11-&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when &&=&day11:=day11+&&; when others=& i:=20; j:=&&; day12:=&&; L1:while (i&8) loop i:=i-1; j:=j+1; x:=&&&Q(i); day12:=day12+&&+x; if day12&day11 then exit L1; if Q(23 downto 20)=j then day12:=day12+mday1; if day12&day11 then exit L1; end loop L1; Tday&=&&+x-(day12-day11)+1; Tmonth&=j; Tday_1&=&&+x-(day12-day11)+1; Tmonth_1&=j; --9、译码转换模块 45 闭应明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned. USE IEEE.STD_LOGIC_ARITH.ALL;--这个包就是转换函数 ENTITY trans IS PORT( s1:in integer range 0 to 59; mn1:in integer range 0 to 59; h1: in integer range 0 to 23; d1: in integer range 1 to 31; m1: in integer range 1 to 12; y1: in integer range 2015 to 2099 ; Tday11: in std_logic_vector(8 downto 0); Tmonth11: in std_logic_vector(8 downto 0); Tyear11: in integer range 2015 to 2099 ; a1,a2,b1,b2,c1,c2,e1,e2,f1,f2,g1,g2,g3,g4,h_1,h_2,i1,i2,j1,j2,j3,j4 :OUT std_logic_vector(3 downto 0)); END ARCHITECTURE RTL OF trans IS signal AA1 : signal AA2 : signal BB1 : signal BB2 : signal CC1 : signal CC2 : signal EE1 : signal EE2 : signal FF1 : signal FF2 : signal GG1 : signal GG2 : signal GG3 : signal GG4 : signal HH1 : signal HH2 : signal II1 : signal II2 : signal JJ1 : signal JJ2 : signal JJ3 : signal JJ4 : BEGIN AA1&= s1 rem 10; AA2&=(s1-(s1 rem 10))/10;46 附录 a1&= conv_std_logic_vector(AA1,4);---s1 个位转换 a2&= conv_std_logic_vector(AA2,4); ---s2 十位转换 BB1&= mn1 rem 10; BB2&=(mn1-(mn1 rem 10))/10; b1&= conv_std_logic_vector(BB1,4); b2&= conv_std_logic_vector(BB2,4); CC1&= h1 rem 10; CC2&=(h1-(h1 rem 10))/10; c1&= conv_std_logic_vector(CC1,4); c2&= conv_std_logic_vector(CC2,4); EE1&= d1 rem 10; EE2&=(d1-(d1 rem 10))/10; e1&= conv_std_logic_vector(EE1,4); e2&= conv_std_logic_vector(EE2,4); FF1&= m1 rem 10; FF2&=(m1-(m1 rem 10))/10; f1&= conv_std_logic_vector(FF1,4); f2&= conv_std_logic_vector(FF2,4); GG1 &= y1 rem 10; GG2 &= ((y1 rem 100)-GG1)/10; GG3&=((y1 rem 1000)-(y1 rem 100))/100; GG4&=(y1-(y1 rem 100))/1000; g1&= conv_std_logic_vector(GG1,4); g2&= conv_std_logic_vector(GG2,4); g3&= conv_std_logic_vector(GG3,4); g4&= conv_std_logic_vector(GG4,4); HH1&=(conv_integer(Tday11))rem 10; HH2&=(conv_integer(Tday11)-((conv_integer(Tday11))rem 10))/10; h_1&= conv_std_logic_vector(HH1,4); h_2&= conv_std_logic_vector(HH2,4); II1&=(conv_integer(Tmonth11))rem 10; II2&=(conv_integer(Tmonth11)-((conv_integer(Tmonth11))rem 10))/10; i1&= conv_std_logic_vector(II1,4); i2&= conv_std_logic_vector(II2,4); JJ1 &= Tyear11 rem 10; JJ2 &= ((Tyear11 rem 100)-JJ1)/10; JJ3&=((Tyear11 rem 1000)-(Tyear11 rem 100))/100; JJ4&=(Tyear11-(Tyear11 rem 100))/1000; j1&= conv_std_logic_vector(JJ1,4); j2&= conv_std_logic_vector(JJ2,4); j3&= conv_std_logic_vector(JJ3,4); j4&= conv_std_logic_vector(JJ4,4); END;47 闭应明 10、七段数码管显示和 LCD 显示模块 use ieee.std_logic_1164. use ieee.std_logic_arith. use ieee.std_logic_unsigned. entity play is port ( a11,a12,b11,b12,c11,c12,e11,e12,f11,f12,g11,g12,g13,g14,h11,h12,i11,i12,j11,j12,j13,j14 :in std_logic_vector(3 downto 0); num1,num2,num3,num4, num5,num6:OUT std_logic_vector(7 downto 0); num7,num8,num9,num10,num11,num12, num13,num14,num15,num16,num17, num18,num19,num20,num21, num22:OUT std_logic_vector(7 downto 0)); architecture xians of play is signal a21:std_logic_vector(5 downto 0); signal a22:std_logic_vector(5 downto 0); signal b21:std_logic_vector(5 downto 0); signal b22:std_logic_vector(5 downto 0); signal c21:std_logic_vector(5 downto 0); signal c22:std_logic_vector(5 downto 0); signal e21:std_logic_vector(5 downto 0); signal e22:std_logic_vector(5 downto 0); signal f21:std_logic_vector(5 downto 0); signal f22:std_logic_vector(5 downto 0); signal g21:std_logic_vector(5 downto 0); signal g22:std_logic_vector(5 downto 0); signal g23:std_logic_vector(5 downto 0); signal g24:std_logic_vector(5 downto 0); signal h21:std_logic_vector(5 downto 0); signal h22:std_logic_vector(5 downto 0); signal i21:std_logic_vector(5 downto 0); signal i22:std_logic_vector(5 downto 0); signal j21:std_logic_vector(5 downto 0); signal j22:std_logic_vector(5 downto 0); signal j23:std_logic_vector(5 downto 0); signal j24:std_logic_vector(5 downto 0); begin a21&=&00& & a11; a22&=&00& & a12; b21&=&00& & b11;48 附录 b22&=&00& & b12; c21&=&00& & c11; c22&=&00& & c12; e21&=&00& & e11; e22&=&00& & e12; f21&=&00& & f11; f22&=&00& & f12; g21&=&00& & g11; g22&=&00& & g12; g23&=&00& & g13; g24&=&00& & g14; h21&=&00& & h11; h22&=&00& & h12; i21&=&00& & i11; i22&=&00& & i12; j21&=&00& & j11; j22&=&00& & j12; j23&=&00& & j13; j24&=&00& & j14; with a21 select num1&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with a22 select num2&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with b21 select 49 闭应明 num3&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with b22 select num4&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with c21 select num5&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with c22 select num6&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&,50 附录 && when &001000&, && when &001001&, && with e21 select num7&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with e22 select num8&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with f21 select num9&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with f22 select num10&=&& when &000000&, && when &000001&, && when &000010&, 51 闭应明 && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with g21 select num11&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with g22 select num12&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with g23 select num13&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, &&52 附录 with g24 select num14&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with h21 select num15&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with h22 select num16&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with i21 select num17&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, 53 闭应明 && when &000111&, && when &001000&, && when &001001&, && with i22 select num18&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with j21 select num19&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with j22 select num20&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with j23 select num21&=&& when &000000&, && when &000001&, && when &000010&,54 附录 && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, && with j24 select num22&=&& when &000000&, && when &000001&, && when &000010&, && when &000011&, && when &000100&, && when &000101&, && when &000110&, && when &000111&, && when &001000&, && when &001001&, &&11、闹铃闰年提醒模块 use ieee.std_logic_1164. use ieee.std_logic_unsigned. entity alarm_clock is port( run:in integer range 2013 to 2099; mn1a:in integer range 0 to 59; h1a: in integer range 0 to 23; mn2a:in integer range 0 to 59; h2a: in integer range 0 to 23; ring: out std_logic_vector(1 downto 0) ); end alarm_ architecture one of alarm_clock is begin process(mn2a,h2a,mn1a,h1a ,run) begin if (( run rem 4 =0 )and (mn1a/=mn2a or h1a/=h2a)) then ring&=&10&; ---------是闰年,提醒 elsif ((run rem 4 =0) and mn1a=mn2a and h1a=h2a ) then ring&=&11&; elsif ((run rem 4 /=0) and mn1a=mn2a and h1a=h2a ) then ring&=&01&;-------时间比较一致 (这里 只设计时分作为闹钟,如果要设置年月日时分秒的闹钟,可以添加各个对应时间的比较) , 提醒 55 闭应明 else ring&=&00&;12、传统节日提醒模块 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; Entity tradition_play is Port (chu:in std_ dong: in std_ qing: in std_ Tyear1 : in integer range 2014 to 2099; Tmonth1:in std_logic_vector(8 downto 0); Tday1 :in std_logic_vector(8 downto 0); play2: out std_logic_vector(10 downto 0)); architecture plya_1 of tradition_play is begin process(Tyear1,Tmonth1,Tday1) variable exp: std_logic_vector(15 downto 0); begin exp:=Tmonth1(7 downto 0) & Tday1(7 downto 0); if chu='1' then play2&=&&;-----除夕 elsif dong='1' then play2&=&&;-----冬至 elsif qing='1' then play2&=&&;-----清明 elsif exp=X&0101& then play2&=&&;-----春节 elsif exp=X&010F& then play2&=&&;----元宵 elsif exp=X&0505& then play2&=&&;------端午 elsif exp=X&0707& then play2&=&&;-----七夕 elsif exp=X&070F& then play2&=&&;-----中元节 elsif exp=X&080F& then56 附录 play2&=&&;-----中秋节 elsif exp=X&0909& then play2&=&&;-----重阳节 elsif exp=X&0C08& then play2&=&&;------腊八节 else play2&=&&;13、24 节气提醒模块 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; Entity qijie_play is Port ( year2 : in integer range 2015 to 2099; month2:in std_logic_vector(3 downto 0); day2 :in integer range 1 to 31; qing1:out std_ dong1:out std_ play_1:out std_logic_vector(4 downto 0)); architecture play1 of qijie_play is begin process(year2,month2,day2) variable TTyear: variable TTmonth:std_logic_vector(3 downto 0); variable TDD: variable TYY: variable TLL: variable TCC: variable TD: variable X:std_ variable XX:std_logic_vector(4 downto 0) ; begin TDD:=2422; TYY:=year2-2000; TTyear:=year2; if day2&10 then X:='0'; 57 闭应明 else X:='1'; XX:=X&month2; if (year2 rem 4)=0 and month2&=2 then TLL:=(TYY-1)/4; else TLL:=TYY/4; case XX is when &00001&=&TCC:=54055;-----小寒 when &10001&=&TCC:=201200 ;-----大寒 when &00010&=&TCC:=38700;-----立春 when &10010&=&TCC:=187300 ;------雨水 when &00011&=&TCC:=56300;-------惊蛰 when &10011&=&TCC:=206460 ;------春风 when &00100&=&TCC:=48100;-------清明 when &10100&=&TCC:= 201000;------谷雨 when &00101&=&TCC:=55200;------立夏 when &10101&=&TCC:=210400; -----小满 when &00110&=&TCC:=56780;----芒种 when &10110&=&TCC:= 213700;-------夏至 when &00111&=&TCC:=71080;------小暑 when &10111&=&TCC:= 228300;-------大暑 when &01000&=&TCC:=75000;-----立秋 when &11000&=&TCC:= 231300;------处暑 when &01001&=&TCC:=76460;------白露 when &11001&=&TCC:= 230420;-----秋分 when &01010&=&TCC:=83180;-------寒露 when &11010&=&TCC:= 234380;------霜降 when &01011&=&TCC:=74380;-----立冬 when &11011&=&TCC:= 223600;------小雪 when &01100&=&TCC:=71800;-----大雪 when &11100&=&TCC:= 219400;-----冬至 when others=& TD:=(TYY * TDD+TCC)/10000-TLL; TTmonth:=XX(3 downto 0); if year2=2019 and XX=&00001& then TD:=TD-1;----2019 年小寒的特例 elsif year2=2082 and XX=&10001& then TD:=TD+1;------2082 年大寒的特例 elsif year2=2026 and XX=&10010& then TD:=TD-1;-----2026 年雨水的特例58 附录 elsif year2=2084 and XX=&10011& then TD:=TD+1;------2018 年春风的特例 e}

我要回帖

更多关于 gis 设计与实现电子书 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信