毕业设计中期汇报
题目名称:基于FPGA万年历设计
院系名称:电气学院
班 级: 应电
指导老师:潘金凤
06月
目录
一、多功效电子万年历及FPGA介绍....................................................................................1
1.1电子万年历发展........................................................................................................1
1.2FPGA介绍..................................................................................................................1
1.3电子万年历工作原理............................................................................................2二、多功效电子万年历各功效模块实现............................................................................42.1时钟问题................................................................................................................42.1.1全局时钟....................................................................................................4
2.1.2门控时钟....................................................................................................4
2.1.3多级逻辑时钟............................................................................................5
2.1.4波动式时钟................................................................................................5
2.2电子万年历控制系统............................................................................................62.3主控制模块maincontrol.....................................................................................72.4时间及其设置模块time_auto_and_set...............................................................82.2.1时间模块timepiece_main........................................................................8
2.2.2 时间设置模块timeset.................................................................................9
2.3 时间显示动态位选模块time_disp_select.........................................................13 2.2.3 时间数据和时间设置数据多路选择模块time_mux............................11
2.6 日期显示和设置模块date_main.......................................................................16
2.6.1 日期自动工作模块autodate..................................................................16
2.6.2 日期设置模块setdate.............................................................................17
2.7闹钟模块alarmclock...........................................................................................17
2.8 分频模块 fdiv......................................................................................................19
2.9顶层模块图..........................................................................................................20
三、附录..............................................................................................................................22
电子万年历系统VerilogHDL语言程序设计部分代码.............................................22
3.1主控制模块....................................................................................................22
3.2秒自动计时子模块........................................................................................24
3.3时间自动工作控制........................................................................................24
3.4时间数据和时间设置数据多路选择模块....................................................25
3.5时间及其设置模块........................................................................................26
3.6时间显示动态位选模块................................................................................27
3.7秒表模块........................................................................................................28
3.8分频模块........................................................................................................28
参考文件.......................................................................................................................30
1引言
1.1选题意义
钟表数字化给大家生产生活带来了极大方便,
而且大大地扩展了钟表原先报时功效,诸如定时自动报警、按时自动打铃、
时间程序自动控制、定时广播、 定时启闭路灯等。 全部这些,
全部是以钟表数字化为基础。所以, 研究电子万年历及扩大其应用,
含 有更 长 使 用 寿 命, 所 以得 到 了 广 泛 使 用 。
电子万年历从原理上讲是一个经典数字电路,
其中包含了组合逻辑电路和时序电路。
所以,我们此次设计和制做电子万年历就是为了了解数字钟原理,
从 | 而 | 学 | 会 | 制 | 作 | 数 | 字 | 钟 | 。 |
而且经过万年历制作深入了解多种在制作中用到中小规模集成电路作用及使用
方法,且因为电子万年历包含组合逻辑电路和时序电路,
经过它能够深入学习和掌握多种组合逻辑电路和时序电路原理和使用方法。
本设计基于FPGA芯片,外围电路简单,系统集成化程度高,精度高,
采取 Verilog HDL语言编程,用软件方法设计硬件, 灵活性好,
方便以后产品升级。
1.2电子万年历研究背景
在现代繁忙工作和生活中,时间和我们每一个人全部有很亲密关系,每个人全部受到时间影响。为了愈加好利用我们自己时间,我们必需对时间有一个度量,所以产生了钟表。钟表发展是很快速,从刚开始机械式钟表到现在普遍用到数字式钟表,即使现在钟表千奇百怪,不过它们全部只是完成一个功效——计时功效,只是工作原理不一样而已,在大家使用过程中,逐步发觉了钟表功效太单一,没有更大程度上满足大家需求。所以在这里,
我 | 想 | 能 | 不 | 能 | 把 | 部 | 分 | 辅 | 助 | 功 | 效 | 加 | 入 | 钟 | 表 | 中 | 。 |
在此设计中所设计钟表不仅含有一般钟表功效,它还能实现额外功效:世界时、农历显示。 人类不停研究,不停创新纪录。
发展到现在大家广泛使用万年历。
,车码头办公室等公共场所,成为大家常生活中不可少必需品,因为数字集成电路发
展和石英晶体振荡器广泛应用,使得数字钟精度,远远超出传统钟表,
钟表数字化给大家生产生活带来了极大方便,
而且大大地扩展了钟表原先报时功效。
诸如定时自动报警、 按时自动打铃、时间程序自动控制、 定时广播、 自动起闭路灯、定时开关烘箱、 通断动力设备、 甚至多种定时电气自动启用等,不过全部这些, 全部是以钟表数字化为基础。所以, 研究万年历及扩大其应用,有着很现实意义。 它能够对年、月、 日、 周日、 时、 分、 秒进行计时,对于数字电子万年历采取直观数字显示, 能够同时显示年、 月、 日、周日、 时、 分、 秒等信息,
还含有时间校准等功效。
总而言之此万年历含有读取方便、显示直观、 功效多样、 电路简练、 成本低廉等很多优点,符合电子仪器仪表发展趋势,含有宽广市场前景。
1.3中国外产品研究综述
万年历含有读取方便、显示直观、 功效多样、 成本低廉等很多优点,符合电子仪器仪表发展趋势,含有宽广市场前景。
近些年中国也开始重视对电子万年历开发和设计,让更多电子时钟能够走进人民生活,让更多人能够应用到功效强大,精度高电子时钟。不过仍然存在很多问题。
中国电子万年历产业发展出现问题中,很多情况不容乐观,
如产业结构不合理、产业集中于劳动力密集型产品;
技术密集型产品显著落后于发达工业国家;生产要素决定性作用正在减弱;
产业能源消耗大、 产出率低、环境污染严重、 对自然资源破坏力大;
开创性地提出了“新型电子万年历产业”及替换品产业概念, 在此基础上,
从四个维度即“ 以人为本”、 “ 科技创新” 、
“ 环境友好”和“ 面向未来” 正确地界定了“ 新型电子万年历产业”
及替换产品内涵。 依据“新型电子万年历产业”
及 | 替 | 换 | 品 | 评 | 价 | 体 | 系 | 和 | 量 | 化 | 指 | 标 | 体 | 系 | , |
从全新角度对中国电子万年历产业发展进行了推演和正确估计,在此基础上,对中国行政区划和四大城市圈电子万年历产业发展进行了全方面研究。
伴随大家生活水平提升和生活节奏加紧,对时间要求越来越高,
正确数字计时消费需求也是越来越多。 [1]
一、多功效电子万年历及FPGA介绍1.1电子万年历发展
钟表数字化给大家生产生活带来了极大方便,而且大大地扩展了钟表原先报时功效,诸如定时自动报警、按时自动打铃、 时间程序自动控制、 定时广播、定时启闭路灯等。 全部这些,全部是以钟表数字化为基础。所以,研究电子万年历及扩大其应用,有很现实意义。数字钟是一个用数字电路技术实现时、 分、 秒计时装置,和机械式时钟相比含有更高正确性和直观性,且无机械装置,
电子万年历从原理上讲是一个经典数字电路,
含有更长使用寿命,所以得到了广泛使用。
从 而 学 会 制 作 数 字 钟 。
而且经过万年历制作深入了解多种在制作中用到中小规模集成电路
作用及使用方法,且因为电子万年历包含组合逻辑电路和时序电路,
经过它能够深入学习和掌握多种组合逻辑电路和时序电路原理和使
用方法。
1.2 FPGA介绍
PLD/FPGA是近几年集成电路中发展最快产品。因为PLD性能高速发展和设计人员本身能力提升,可编程逻辑器件供给商将深入扩大可编程芯片领地,
将复杂专用芯片挤向高端和超复杂应用。据ICInsights数据显示,PLD市场从1999年29亿美元增加到去年56亿美元,几乎翻了一番。
Matas估计这种高速增加局
面以后极难出现,
但可编程逻辑器件仍然是集成电路中最具活力和前途产业。 复杂可编程逻辑器件。
可编程逻辑器件两种关键类型是现场可编程门阵列(FPGA)和复杂可编程逻辑(CPLD)。 在这两类可编程逻辑器件中,
FPGA提供了最高逻辑密度、最丰富特征和最高性能。
现在最新FPGA器件,如Xilinx Virtex"系列中部分器件,
大容量存放器、 时钟管理系统等特征,
并支持多个最新超快速器件至器件(device-to-device)信号技术。
FPGA被应用于范围广泛应用中,从数据处理和存放,和到仪器仪表、电信和数字信号处理等。
1.3电子万年历工作原理
可
按 | 编 | LED |
键 | 功效键程 | 显示模块 |
消 | 调整键1 逻 | |
抖 | 调整键2 辑 |
器
件
功效键用来选择不一样工作模式:CPLD/FPGA
时间正常显示功效、时间调整和显示、 秒表功效、
闹钟设置和查看、 日期显示、日期调整和设置。
2号键功效模式,即时间调整和设置时, 用作时、分、 秒移位,
按一下,将会实现“时-分-秒”依次移位,
便于在特定位置进行调整;
4号键功效模式,即闹钟设置和查看时,一样用作时、分、 秒移位,按一下,将会实现“时-分-秒”依次移位,
便于在特定位置进行调整;
6号键功效模式,即日期调整和设置时,用作月、日移位,
按 | 一 | 下 | , | 将 | 会 | 实 | 现 | “月 | -日 |
| , |
便于在特定位置进行调整。
调整键2:关键用于闹钟设置、日期显示和调整、 秒表、
时间调整和设置中调整按钮,和功效键配合使用。
2号键功效模式,即时间调整和设置时,用作时、分、 秒调整,
按一下,将会使得目前调整键1选择位置数字增加1;
4号键功效模式,即闹钟设置和查看时,一样用作时、分、
秒调整,按一下,将会使得目前调整键1选择位置数字增加1;
6号键功效模式,即日期调整和设置时,用作月、日移位,
按一下,将会使得目前调整键1选择位置数字增加1。
二、多功效电子万年历各功效模块实现
还是用全定制器件实现任何数字电路,设计不良时钟在极限温度、
电压或制造工艺存在偏差情况下将造成系统错误行为,
所以可靠时钟设计是很关键。在FPGA设计时通常采取四种时钟:
全局时钟、门控时钟、 多级逻辑时钟和波动式时钟,
多时钟系统是这四种时钟类型任意组合。
2.1.1全局时钟
对 于 一 个 设 计 项 目 来 说 ,
全局时钟(或同时时钟)是最简单和最可估计时钟。
在 | FPGA设 | 计 | 中 | 最 | 好 | 时 | 钟 | 方 | 案 | 是 | : |
由专用全局时钟输入引脚驱动单个主时钟去控制设计项目中每一个
触发器。FPGA通常全部含有专门全局时钟引脚,
在 | 设 | 计 | 项 | 目 | 时 | 应 | 尽 | 可 | 能 | 采 | 取 | 全 | 局 | 时 | 钟 | , |
它能够提供器件中最短时钟到输出延时。
2.1.2门控时钟
在 | 很 | 多 | 应 | 用 | 中 | , |
整个设计项目全部采取外部全局时钟是不可能或不实际,
所 以 通 常 见 阵 列 时 钟 组 成 门 控 时 钟 。
每当用组合逻辑来控制触发器时,通常全部存在着门控时钟。
门控时钟常常同微处理器接口相关,比如用地址线去控制写脉冲。
门控时钟就能够像全局时钟一样可靠工作:
驱动时钟逻辑必需只包含一个“和门” 或一个“ 或门” ,
假 | 如 | 采 | 取 | 任 | 何 | 附 | 加 | 逻 | 辑 | , |
就会在一些工作状态下出现因为逻辑竞争而产生毛刺。
逻 | 辑 | 门 | 一 | 个 | 输 | 入 | 作 | 为 | 实 | 际 | 时 | 钟 | , |
而该逻辑门全部其它输入必需当成地址或控制线,
它们遵守相对于时钟建立和保持时间约束。
2.1.3 多级逻辑时钟 |
|
当 | 产 | 生 | 门 | 控 | 时 | 钟 | 组 | 合 | 逻 | 辑 | 超 | 出 | 一 | 级 | , |
即超出单个“和门”或“或门”时,该设计项目标可靠性将变得很差。
在这种情况下,即使样机或仿真结果没有显示出静态险象,
但 | 实 | 际 | 上 | 仍 | 然 | 可 | 能 | 存 | 在 | 危 | 险 | , |
所以我们不应该用多级组合逻辑区作为触发器时钟端。不一样系统
需要采取不一样方法消除多级时钟,并没有一个固定模式。
2.1.4波动式时钟
很多系统要求在同一设计内采取多时钟,
最常见例子是两个异步微处理器之间接口,
因为两个时钟信号之间要求一定建立和保持时间,
或 微 处 理器 和 道 接 口 。
而在很多应用中只将异步信号同时化还是不够,
当系统中有两个或两个以上非同源时钟时,
数 | 据 | 建 | 立 | 和 | 保 | 持 | 时 | 间 | 极 | 难 | 得 | 到 | 确 | 保 | , | |||
设 | 计 | 人 | 员 | 将 | 面 | 临 | 复 | 杂 | 时 | 间 | 分 | 析 | 问 | 题 | 。 |
最好方法是将全部非同源时钟同时化。
使用FPGA内部锁相环(PLL)是一个效果很好方法,
但 | 并 | 带 | 不 | 是 | 全 | 部 | FPGA全 | 部 | 带 | 有 | PLL, | ||
而 | 且 | 有 | PLL功 | 效 | 芯 | 片 | 大 | 多 | 价 | 格昂贵。 |
这 | 时 | 就 | 需 | 要 | 使 | 用 | 带 | 使 | 能 | 端 | D触 | 发 | 器 | , |
并引入一个高频时钟来实现信号同时化。
稳定可靠时钟是确保系统可靠工作关键条件,
设计中不能够将任何可能含有毛刺输出作为时钟信号,
而 | 且 | 尽 | 可 | 能 | 只 | 使 | 用 | 一 | 个 | 全 | 局 | 时 | 钟 | , |
对多时钟系统要尤其注意异步信号和非同源时钟同时问题。
为了取得高驱动能、低抖动时延、 稳定占空比时钟信号,
通常使用FPGA内部专用时钟资源产生同时时序电路主工作时钟。
专用时钟资源关键指两部分,一部分是布线资源,
2.2 电子万年历控制系统
包含全局时钟布线资源和长线资源等,另一部分则是FPGA内部PLL。
分别是以下8个模块:
1. 主控制模块maincontrol
2. 时间及其设置模块timepiece_main
3. 时间显示动态位选模块time_disp_select
4. 显示模块disp_data_mux
5. 秒表模块stopwatch
6. 日期显示和设置模块date_main
7. 闹钟模块 alarmclock
8. 分频模块 fdiv
2.3主控制模块maincontrol
该模块实现对各个功效模块整体控制,包含对时间显示和调整、日期显示和调整、 闹钟显示和调整、 秒表操作等控制,结构功效图如2-1所表示,波形仿真图如2-2所表示。
图2-1主控制模块结构功效图
图2-2 主控制模块波形仿真图
SW3是功效键,从波形图中可知,SW3每出现一次上升沿,
输 | 出 | 全 | 部 | 会 | 发 | 生 | 对 | 应 | 改 | 变 | , | ||||||
即 | 根 | 据 | Timepiece_EN( | 时 | 钟 | 自 | 动 | 显 | 示 | 使 | 能 | ) | , | ||||
TimeSet_EN( | 时 | 钟 | 设 | 置 | 和 | 调 | 整 | 使 | 能 | ) | , | ||||||
Stopwatch_EN( | 秒 | 表 | 功 | 效 | 使 | 能 | ) | , |
Alarmclock_EN(闹钟时间设置使能),Date_EN(日期显示使能),DateSet_EN(日期显示和设置使能)次序依次输出有效波形“1”, 对对应模块输入有效使能,从而实现对应功效。
2.4时间及其设置模块time_auto_and_set
时间及其设置模块关键完成时间自动正常运行和显示,和在对应功效号下,实现时间调整和设置。
2.2.1时间模块timepiece_main
该模块关键完成时间自动增加和显示功效,即为正常自动模式运行,其结构功效图如2-3所表示,波形仿真图如2-4所表示。
秒自动计时子模块second_counter, 结构功效图如2-5所表示,
图2-5秒自动计时子模块结构功效图
分自动计时子模块minute_counter,结构功效图如2-6示。
图2-6分自动计时子模块结构功效图
小时自动计时子模块hour_counter,结构功效图如2- 7所表示。
图2-7小时自动计时子模块结构功效图
当Timepiece_EN为1时,即处于时间自动工作状态,即每出现一次时钟信号clk,计数一次,先计数second0,当计数到1001(即十进制9)时,向second1发出一个计数信号,
此 | 时 | second1进 | 行 | 一 | 次 | 计 | 数 | , | 类 | 推 | , | |
second1计 | 数 | 到 | 0101( | 即 | 十 | 进 | 制 | 5) | , |
且second0计数到1001(即十进制9)时,minute0则进行一次计数,根据此规律进行时间计数。当计满二十四小时, 向day_EN发出一个计数信号,即此使能端输出有效信号1,
进行日期计数。
2.2.2 时间设置模块timeset
该模块关键完成对时间设置相关闪烁显示控制以立即间中小时、分钟、 秒等数据改变,步骤图如2-9所表示,结构功效图如2-10所表示,波形仿真图如2-11所表示。
开始
初始化,
将目前时间给予设
置后时间
Timeset_EN=1?
disp_drive<=3’b0
disp_drive<= disp_drive+3’b1
依SW2,按位进行数字调整
结束 图2-9 时间设置模块步骤图
图2-10 时间设置模块结构功效图
图2-11时间设置模块波形仿真图
表2-12时间设置模块端口说明
|
当Timeset_EN为1时,即实现时间设置功效。SW1实现时间格式中小时高、低位,分钟高、低位,秒钟高、
低 | 位 | 位 | 选 | , | 即 | 每 | 出 | 现 | 一 | 个 | SW1上 | 升 | 沿 | , |
disp_drive对应数值加1(选择具体需要调整位置)。SW2实现对应得位数值得调整,即每出现一个SW2上升沿,对应位数值增加1。
2.2.3 时间数据和时间设置数据多路选择模块time_mux
该模块用来分时向显示单元传输显示数据,步骤图如2-
13所表示,结构功效图如2-14所表示,波形仿真图如2-15所表示。
图2-13多路选择模块结构功效图
开始
依输入条件,
判定是自动显示时间,
或显示调整后时间
Timeset_EN=1?
图2-14 多路选择模块步骤图
图2-15 多路选择模块波形仿真图
|
TimeSet_EN | 时间设置使能信号 |
hour1,hour0 | 自动模式中目前时间小时数输入 |
minute1,minute0 | 自动模式中目前时间分钟数输入 |
second0,second1 | 自动模式中目前时间秒数输入 |
hour_set1,hour_set0 | 时间设置后小时数输入 |
minute_set1,minute_set0 | 时间设置后分钟数输入 |
second_set1,second_set0 | 时间设置后秒数输入 |
输入端口 | 功效 |
hour_1,hour_0 | 目前需要显示小时输出 |
minute_1,minute_0 | 目前需要显示分钟输出 |
second_0,second_1 | 目前需要显示秒输出 |
表2-16多路选择模块端口说明
2.3时间显示动态位选模块time_disp_select
该模块用来分时显示时间数据,不过在选择适宜时间间隔下,
人眼并不能分辨出是分时显示,这么显示方法能够降低功耗,
结构功效图如2-17所表示,波形仿真图如2-18所表示。
图2-17时间显示动态位选模块结构功效图
图2-18(a)时间显示动态位选模块波形仿真图
图2-18(b)时间显示动态位选模块波形仿真图
TimeSet_EN表示时间设置使能,Time_EN表示时间自动显示使能,
clk_1kHz用于动态显示时间,clk_200Hz用于闪烁显示时间,
timeset_disp_drive表示时间设置数据显示同时信号,
time_disp_select表示显示动态位选输出信号。当TimeSet_EN为0,
Time_EN为1时,以clk_1kHz为是时钟信号,输出自动显示时间,
按位依次显示;当TimeSet_EN为1,Time_EN为0时,则以clk_200Hz为时钟信号,输出以timeset_disp_drive对应位置。
模块是时间、日期等数据用数码管显示控制和数据传输模块,
包含数据传输和BCD码译码等,结构功效图如2-19所表示,
波形仿真图如4-20所表示。
图2-19 显示模块结构功效图
显示原理采取是七段数码管现实原理, 如2-20所表示:
图2-20七段数码管显示原理
2.5 秒表模块 stopwatch
该 | 模 | 块 | 实 | 现 | 秒 | 表 | 功 | 效 | , | 在 | 实 | 际 | 中 | , |
能够经过改变自动工作模式下时间计数时钟频率来实现秒表功效,步骤图如2-22所表示,结构功效图如2-23所表示,波形仿真图如2-24所表示。
开始
EN=1?
秒表工作状态时间自动工作状态
结束
图2-22秒表模块步骤图
图2-24秒表功效波形仿真图
EN表示秒表使能控制信号,clk1表示自动工作模式时钟信号,clk2表示秒表工作模式时钟信号,故当EN为有效信号1时,输出F_out和clk2同,即处于秒表工作状态,同理EN为0时,输出F_out和clk1同,即处于自动工作状态。
2.6日期显示和设置模块date_main
该模块实现日期显示和日期调整和设置,结构功效图如2-
25所表示。
图2-25时间显示和设置模块结构功效图
2.6.1日期自动工作模块autodate
该模块实现是日期自动工作功效,结构功效图如2-26所表示,波形仿真图如2-27所表示。
图2-26 日期自动工作模块结构功效图
图2-27(a)日期自动工作模块波形仿真图
图2-27(b) 日期自动工作模块波形仿真图
2.6.2日期设置模块setdate
该模块用于日期,结构功效图如2-28所表示。
图2-28日期设置模块结构功效图
2.7闹钟模块alarmclock
该模块实现功效包含闹钟设置和闹钟时间到后提醒,步骤图如2-
29所表示,结构功效图如2-30所表示,波形仿真图如2-31所表示。
_drive选择在不
alarm<=1’b1 | alarm<=1’b0 | 一样位置上数值 |
闹钟工作 | 闹钟不工作 | 加1 |
EN=1
disp_drive<3’b101?
disp_drive<=3’b0
disp_drive<=disp_drive+3,b1
结束
图 2-29 闹钟模块步骤图
图2-30闹钟模块结构功效图
second_set1, second_set0, 用来表示已经设置好闹钟时间。
闹钟一直处于工作状态,目前时间(hour1,hour0, minute1, minute0, second1, second0)和设置闹钟时间相比较,当小时、分钟、秒钟时间完全相同时,则闹铃响,输出信号alarm为有效信号1。
SW1和SW2是调整键,分别控制位选和数值调整。
2.8分频模块fdiv
该模块完成全局时钟信号分频输出200Hz、60Hz、1Hz三种时钟信号,步骤图如2-32所表示,结构功效图如2-33所表示,
波形仿真图如2-34所表示。
图2-33分频模块结构功效图
开始,输入1kHz时钟信号
posedgeclk
CNT<4?
输出200Hz时
钟信号f200H CNT=CNT+1
z
posedgef200Hz
CNT2<2? | posedge f200Hz |
CNT3<199?
CNT2=CNT2+1
CNT3=CNT3+1
输出60Hz时钟信号
输出1Hz时钟信号
图2-32 分频模块步骤图
2.9顶层模块图
将各个主模块综合成电子万年历系统,其包含:fdiv分频模块,
maincontrol主 | 控 | 制 | 模 | 块 | , | stopwatch秒 | 表 | 模 | 块 | , |
time_auto_and_set时间及其设置模块,date_main日期及其设置模块,
alarmclock闹 | 钟 | 模 | 块 | , |
time_disp_select时间显示动态位选模块及disp_data_mux显示模块, 该顶层电路Top图2-35所表示。
alarmclock
stopwatch | time_auto_and_set | EN | alarm | OUTPUT | alarm |
SW1 | alarmclock_disp_select[5..0] |
SW2
Clock | INPUT | fdiv | EN | F_out | CLK | Day_EN | clk_200Hz |
clk1 | Timepiece_EN | hour_1[3..0] | hour1[3..0] | ||||
clk2 | TimeSet_EN | hour_0[3..0] | hour0[3..0] | ||||
clk f200Hz | inst2 | SW1 | minute_1[3..0] | minute1[3..0] | |||
SW2 | minute_0[3..0] | minute0[3..0] | |||||
f60Hz | second_1[3..0] | second1[3..0] | |||||
f1Hz | second_0[3..0] | second0[3..0] | |||||
inst5 | TimeSet_disp_drive[2..0] |
inst11
inst1
maincontrol
SW3 INPUT GNDSW3Timepiece_EN
TimeSet_ENtime_disp_select
Stopwatch_EN
clk_1kHz time_disp_select[5..0] Alarmclock_EN
clk_200Hz
Date_EN
Time_EN
DateSet_EN
TimeSet_EN
timeset_disp_drive[2..0]
inst3
disp_data_mux
Timepiece_EN disp_select[5..0] OUTPUT disp_select[5..0]
TimeSet_EN disp_data[6..0] OUTPUT disp_data[6..0]
Stopwatch_EN
time_disp_select[5..0]
Alarmclock_EN
alarmclock_disp_select[5..0]
hour1[3..0]
hour0[3..0]
minute1[3..0]
minute0[3..0]
second1[3..0]
second0[3..0]
Date_EN
DateSet_EN
date_disp_select[5..0]
month1[3..0]
month0[3..0]
day1[3..0]
day0[3..0]
inst8
图2-35 顶层电路Top
三、附录
电子万年历系统VerilogHDL语言程序设计部分代码3.1主控制模块
module
maincontrol(clk,SW3,Timepiece_EN,TimeSet_EN,Stopwatch_EN,Alarmclock_EN,Date_EN,DateSet_EN);
outputTimepiece_EN; //时间自动显示使能
outputTimeSet_EN; //时间调整和设置使能
outputStopwatch_EN; //秒钟功效使能
outputAlarmclock_EN; //闹钟时间设置使能
outputDate_EN; //时期显示使能
outputDateSet_EN; //日期调整和设置使能
input clk; input SW3; //功效号选择
regTimeSet_EN;
reg Stopwatch_EN; reg Timepiece_EN;
regAlarmclock_EN;
regDate_EN;
regDateSet_EN;
reg[2:0] Function;
reg[31:0] cnt;
regq1,q2,q3;
regCLK;
always@(posedgeclk)
begin if(cnt<49999)
begin
cnt=cnt+1;
CLK<=0;
end
else
begin
cnt=0;
CLK<=1'b1;
end
end
always@(posedgeCLK)
begin
begin
q2<=q1;
end begin
q3<=q1&(~q2);
end
end
always@(posedgeq3 ) /*实现对时间显示和调整,日期显示和调整,
闹钟显示和调整,秒表操作等控制*/ begin //功效号产生和其自动循环
if(Function<3'b101&& SW3==1'b1)
Function<=Function+3'b1;
else | Function<=3'b0; |
|
case(Function) //各个分功效控制和实现
//时钟自动显示
3'b000:begin
Timepiece_EN<=1'b1;
TimeSet_EN<=1'b0;
Stopwatch_EN<=1'b0;
Alarmclock_EN<=1'b0;
Date_EN<=1'b0;
DateSet_EN<=1'b0;
end
//时钟调整和设置
3'b001:begin
end
//秒表
3'b010:begin
3'b011:begin
end
//日期显示
3'b100:begin
end
//日期调整和设置
3'b101:begin
end
default:begin end
endcase
end
endmodule
3.2秒自动计时子模块
module second_counter(EN,clk,second_data1,second_data0,E0);
output [3:0] second_data1,second_data0;
output E0;
input clk,EN;
reg [3:0] second_data1,second_data0;
reg E0;
begin always@(posedge clk)
second_data0<=second_data0+4'b1;
else
begin
E0<=1'b0;
second_data0<=4'b0;
if(second_data1<4'b0101)
second_data1<= second_data1+4'b1;
else
begin second_data1<=4'b0; |
|
E0<=1'b1;
end
end
end
end
endmodule
3.3时间自动工作控制
moduletimepiece_main(CLK,Timepiece_EN,day_EN,hour0,hour1,minute0,minute1,second0,second1);
input CLK;
input Timepiece_EN;
output day_EN;
output [3:0] minute1,minute0; output [3:0] hour1,hour0;
hour_counter /*小时计时*/
b2v_inst(.clk(SYNTHESIZED_WIRE_0),.EN(Timepiece_EN),.E0(day_EN),.hour_data0(hour0),.hour_data1(hour
1));
minute_counter /*分钟计时*/
b2v_inst1(.clk(SYNTHESIZED_WIRE_1),.EN(Timepiece_EN),.E0(SYNTHESIZED_WIRE_0),.minute_data0(m
inute0),.minute_data1(minute1));
second_counter /*秒计时*/
b2v_inst2(.clk(CLK),.EN(Timepiece_EN),.E0(SYNTHESIZED_WIRE_1),.second_data0(second0),.second_data1
(second1)); endmodule |
|
3.4时间数据和时间设置数据多路选择模块module
time_mux(TimeSet_EN,hour1,hour0,minute1,minute0,second1,second0,hour_set1,hour_set0,minute_set1,minute_
set0,second_set1,second_set0,hour_1,hour_0,minute_1,minute_0,second_1,second_0);
output [3:0] hour_1,hour_0; //目前需要显示小时输出
output [3:0] minute_1,minute_0; //目前需要显示分钟输出
output [3:0] second_1,second_0; //目前需要显示秒输出
input TimeSet_EN; //时间设置使能信号
input [3:0] hour1,hour0; //自动模式中目前时间小时输入
input [3:0] minute1,minute0; //自动模式中目前时间分钟输入
input [3:0] second1,second0; //自动模式中目前时间秒输入
input [3:0] minute_set1,minute_set0; //时间设置后分钟输入input [3:0] hour_set1,hour_set0; //时间设置后小时输入
reg [3:0] second_1,second_0;
/*时间自动显示和时间调整和设置中显示数据多路选择*/
always@(TimeSet_EN,hour1,hour0,minute1,minute0,second1,second0,hour_set1,hour_set0,minute_set1,minute_s
et0,second_set1,second_set0)
begin
if(TimeSet_EN==1'b1)
begin
hour_1<=hour_set1;
hour_0<=hour_set0;
minute_1<=minute_set1;
minute_0<=minute_set0;
second_1<=second_set1;
second_0<=second_set0;
end
else
begin
hour_1<=hour1;
hour_0<=hour0;
minute_1<=minute1;
minute_0<=minute0;
second_1<=second1;
second_0<=second0;
end
end
endmodule
3.5时间及其设置模块
module
time_auto_and_set(CLK,Timepiece_EN,TimeSet_EN,SW1,SW2,Day_EN,hour_0,hour_1,minute_0,minute_1,sec
ond_0,second_1,TimeSet_disp_drive);
input CLK;
input Timepiece_EN;
input TimeSet_EN;
input SW1;
input SW2;
output Day_EN; output [3:0] hour_1,hour_0;
output [3:0] minute_1,minute_0;
output [3:0] second_1,second_0;
output [2:0] TimeSet_disp_drive;
reg [3:0] hour_1,hour_0;
reg [3:0] minute_1,minute_0;
reg [3:0] second_1,second_0;
reg [2:0] TimeSet_disp_drive;
wire [3:0] SYNTHESIZED_WIRE_18;
wire [3:0] SYNTHESIZED_WIRE_19;
wire [3:0] SYNTHESIZED_WIRE_2;
wire [3:0] SYNTHESIZED_WIRE_3;
wire [3:0] SYNTHESIZED_WIRE_20;
wire [3:0] SYNTHESIZED_WIRE_21;
wire [3:0] SYNTHESIZED_WIRE_6;
wire [3:0] SYNTHESIZED_WIRE_23;
wire [3:0] SYNTHESIZED_WIRE_10;
wire [3:0] SYNTHESIZED_WIRE_11;
/*时间自动运行和显示*/
timepiece_main
b2v_inst1(.CLK(CLK),.Timepiece_EN(Timepiece_EN),.day_EN(Day_EN),.hour0(SYNTHESIZED_WIRE_18),.
hour1(SYNTHESIZED_WIRE_19),.minute0(SYNTHESIZED_WIRE_20),.minute1(SYNTHESIZED_WIRE_21),
.second0(SYNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23));
/*时间和时间调整数据多路选择*/
time_mux
b2v_inst2(.TimeSet_EN(TimeSet_EN),.hour0(SYNTHESIZED_WIRE_18),.hour1(SYNTHESIZED_WIRE_19),.
hour_set0(SYNTHESIZED_WIRE_2),.hour_set1(SYNTHESIZED_WIRE_3),.minute0(SYNTHESIZED_WIRE_
20),.minute1(SYNTHESIZED_WIRE_21),.minute_set0(SYNTHESIZED_WIRE_6),.minute_set1(SYNTHESIZE
D_WIRE_7),.second0(SYNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23),.second_set0(SYNTH
ESIZED_WIRE_10),.second_set1(SYNTHESIZED_WIRE_11),.hour_0(hour_0),.hour_1(hour_1),.minute_0(minu
te_0),.minute_1(minute_1),.second_0(second_0),.second_1(second_1));
/*时间调整和设置*/
timeset
b2v_inst3(.TimeSet_EN(TimeSet_EN),.SW1(SW1),.SW2(SW2),.hour0(SYNTHESIZED_WIRE_18),.hour1(SYN
THESIZED_WIRE_19),.minute0(SYNTHESIZED_WIRE_20),.minute1(SYNTHESIZED_WIRE_21),.second0(S
YNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23),.disp_drive(TimeSet_disp_drive),.hour_set0(S
YNTHESIZED_WIRE_2),.hour_set1(SYNTHESIZED_WIRE_3),.minute_set0(SYNTHESIZED_WIRE_6),.minu
te_set1(SYNTHESIZED_WIRE_7),.second_set0(SYNTHESIZED_WIRE_10),.second_set1(SYNTHESIZED_WI
RE_11));
endmodule
moduletime_disp_select(clk_1kHz,clk_200Hz,Time_EN,TimeSet_EN,timeset_disp_drive,time_disp_select);
output [5:0] time_disp_select;
input clk_1kHz;
input clk_200Hz;
input Time_EN;
input TimeSet_EN;
input [2:0] timeset_disp_drive;
reg [5:0] time_disp_select;
reg [2:0] auto_disp_drive;
reg clk; reg [2:0] disp_drive;
always@(posedgeclk_1kHz) /*实现自动运行模式中动态显示“位选驱动”*/
begin
if(auto_disp_drive<3'b101)
auto_disp_drive<=auto_disp_drive+3'b1;
else
auto_disp_drive<=3'b0;
end
always /*实现自动运行模式中时间动态显示位选驱动和时间设置中时间动态显示位选驱动二选一*/
begin
if(Time_EN==1'b1)
begin
clk<=clk_1kHz;
end
disp_drive<=auto_disp_drive;
clk<=clk_200Hz;
disp_drive<=timeset_disp_drive;
end
end
always@(posedgeclk) /*实现时间动态位选*/
begin
case(disp_drive)
3'b000:time_disp_select<=6'b100000;
3'b001:time_disp_select<=6'b010000;
3'b010:time_disp_select<=6'b001000;
3'b011:time_disp_select<=6'b000100;
3'b100:time_disp_select<=6'b000010;
3'b101:time_disp_select<=6'b000001;
default:time_disp_select<=6'b000000;
endcase
end
endmodule
3.7秒表模块
module stopwatch(clk1,clk2,EN,F_out);
output F_out;
input EN;
input clk1,clk2;
always@(EN,clk1,clk2) reg F_out;
1'b1:F_out<=clk2;
default:F_out<=1'b0;
endcase
end
endmodule
3.8分频模块
module fdiv(clk,f200Hz,f60Hz,f1Hz);
output f200Hz,f60Hz,f1Hz;
input clk; reg f200Hz,f60Hz,f1Hz; |
|
integer CNT1=0,CNT2=0,CNT3=0;
/*实现将全局时钟分频得到200Hz时钟信号*/
always@(posedgeclk)
begin
if(CNT1<4)
begin
CNT1=CNT1+1;
f200Hz<=1'b0;
end
else
begin
CNT1=0;
end
f200Hz<=1'b1;
always@(posedge f200Hz)
begin
if(CNT2<2)
begin
CNT2=CNT2+1;
f60Hz<=1'b0;
end
else
begin CNT2=0; f60Hz<=1'b1; |
|
end
end
/*实现将200Hz时钟分频得到1Hz时钟信号*/
always@(posedgef200Hz)
begin
if(CNT3<199)
begin
CNT3=CNT3+1;
f1Hz<=1'b0;
end
else
begin
CNT3=0;
f1Hz<=1'b1;
endmodule
参考文件
(1)(美)帕尔尼卡、夏宇闻.VERILOG HDL数字设计和综合,电子工业出版社,.
(2)褚振勇,翁木云.FPGA设计和应用(第二版),西安电子科技大学出版社,. (3) 侯伯亨,顾新.VHDL硬件描述语言和数字逻辑电路设计修订版, 西安电子科技大学出版社,.
(4) 赵曙光, 郭万有.可编程逻辑器件原理,西安电子科技大学出版社,. (5) 徐志军, 徐光辉.CPLD/FPGA开发和应用, 电子工业出版社,.
(6)冼进,戴仙金,潘懿萱.Verilog HDL数字控制系统设计实例, 中国水利水电出版社,.
(7)夏宇闻.Verilog HDL数字系统设计教程,北京航空航天大学出版社,.
(8)黄智伟.FPGA系统设计和实践,电子工业出版社,.
(9)王金明等.数字系统设计和verilogHDL,电子工业出版社,.
(10)J.Bhasker. Verilog HDL Synthesis: A Practical Prime, Star GalaxyPublishing, 1998.