问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

FPGA期末项目 | 数字时钟

发布网友 发布时间:2022-10-04 02:47

我来回答

1个回答

热心网友 时间:2023-10-12 22:08

FPGA开发平台、计算机、其它外接器件

选题的意义:个人认为本项目(《数字时钟》)的选题意义有二,其一,时钟和闹钟早已是老生常谈的日常工具,利用课堂上所学习的知识贯通运用到现实生活中,作为操作实践,具有一定的现实意义;其二,数字时钟的功能设计囊括了数码管、LCD屏、开关运用、管教分配等知识,能够对本学期所学的实验知识做一个挽接,在知识的总结上也具备一定意义;

功能要求:
1.用数码管显示时、分、秒:分为两个界面,即时钟界面以及闹钟设置界面,显示时钟的时分秒以及闹钟的时分秒,可以通过开关切换显示,是项目的基本功能;
2.能按比例缩短时间调试:*时钟或闹钟的频跳速度,方便演示和调试;
3.闹钟功能:用户可以通过sw8切换进入闹钟界面,再利用sw1-3设定具体的闹钟时间,到点即响,同样是项目的基本功能;
4.用LCD屏显示日期(年月日)以及祝福语:作为时钟,显示年月日的功能个人觉得也是有必要的,另外关于祝福语,我们对实验和知识的学习其实本身就是快乐的过程,生活也没有必要每天都过得毫无色彩、千篇一律,所以怀揣着这份情怀呢,我在本项目中加了一个显示祝福语的功能,意在表达自己的这份对科学和生活的热爱以及学习的热情。

系统结构图如下所示:

各模块的功能及端口介绍:
(这里的模块功能和端口做简要的介绍,详细的用法请移步至《设计思路》部分)

功能:顶层模块,调用其他子模块,统筹整个系统的功能;

端口:
clk_50M, //系统时钟输入
Reset_n, //系统复位输入
seg7, //数码管显示输出位
ledcom, //数码管位置*输出位
key, //开关输入号位,主要使用于CLKcounter_60BCD
beep, //蜂鸣器输出信号
LCD_ON1, //LCD供电电源开关
LCD_BLON1, //LCD背景电源开关
LCD_RS1, //寄存器选择信号
LCD_RW1, //液晶读写信号
LCD_EN1, //液晶时钟信号
LCD_DATA1, //LCD的数据端口

功能:LCD屏显示控制模块,用于控制LCD屏显示年月日以及祝福语;

端口:
LCD_ON, //LCD供电电源开关
LCD_BLON, //LCD背景电源开关
LCD_RS, //寄存器选择信号
LCD_RW, //液晶读写信号
LCD_EN, //液晶时钟信号
LCD_DATA, //LCD的数据端口
CLK, //模块时钟输入(项目中输入的是clk_50M)

功能:基于视觉暂留知识,控制时钟界面数码管的显示;

端口:
clk, //模块时钟输入
rst_n, //复位信号输入
mimute_cnt, //分钟位数据输入
second_cnt, //秒位数据输入
hour_cnt, //时位数据输入
seg7, //数码管显示输出位
ledcom, //数码管位置*输出位

功能:在顶层模块调用,根据输入的时钟和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;

端口:
clk, //模块时钟输入
rst, //复位信号输入
couter_o, //数字时钟部分的时|分|秒位数据输出
flag, //输出一个溢出进位标志

功能:对输入的50MHz的系统时钟分频,调用时根据CLK_DIV变量的复用情况进行运算并返回对应的时钟分频结果;

端口:
clk_in, //模块时钟输入,在顶层模块
rst, //复位信号输入
clk_out, //时钟分频结果输出

hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8);
功能:基于视觉暂留知识,控制闹钟设置界面数码管的显示,并基于sw8的状态控制切换数码管屏显示;

端口:
clk, //模块时钟输入
rst, //复位信号输入
mimute_cnt, //分钟位数据输入(时钟)
second_cnt, //秒位数据输入(时钟)
hour_cnt, //时位数据输入(时钟)
CLKmimute_cnt,//分钟位数据输入(闹钟设置)
CLKsecond_cnt,//秒位数据输入(闹钟设置)
CLKhour_cnt, //时位数据输入(闹钟设置)
seg7, //数码管显示输出位
ledcom, //数码管位置*输出位
sw8 //开关8的输入信号

功能:在顶层模块调用,根据输入的时钟频率clk和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;

端口:
clk, //模块时钟输入
rst, //复位信号输入
couter_o, //数字闹钟设置部分的时|分|秒位数据输出
flag, //输出一个溢出进位标志
sw //开关输入位,作为key的接收变量

功能:顶层模块,调用其他子模块,统筹整个系统的功能;

思路:
A.复用两次分频模块clk_gen,产生两个速度不一样的时钟频——clk_second和clk_second2,分别用来驱动数字时钟和数字闹钟设置;

B.复用三次时钟控制模块counter_60BCD:
第一次,用clk_second作为时钟频输入,传入second_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,模块每溢出一次(即每计数到60个秒),产生一个flag,即flag_min;
第二次,用flag_min作为时钟频输入,传入minute_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,模块每溢出一次(即每计数到60个分),产生一个flag,即flag_hour;
第三次,用flag_hour作为时钟频输入,传入hour_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为24,模块每计数到24个时溢出一次;

C.复用三次闹钟控制模块CLKcounter_60BCD:
第一次,用clk_second2作为时钟频输入,传入CLKsecond_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,sw位传入key[2]信号,即sw3的状态信号;
第二次,用clk_second2作为时钟频输入,传入CLKminute_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,sw位传入key[1]信号,即sw2的状态信号;
第三次, 用clk_second2作为时钟频输入,传入CLKhour_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为24,sw位传入key[0]信号,即sw1的状态信号;

D.复用LCD屏控制显示模块lcd_ori,根据本函数定义的变量复用对应的参数;

E.复用闹钟数码管控制显示模块CLKseg_display,根据本函数定义的变量复用对应的参数;

F.接下来,编写了一个状态机,主要设置并使用了state0、state1、state2等三个状态;
state0状态:使用if判断语句
if(second_cnt==CLKsecond_cnt&&minute_cnt==CLKminute_cnt&&hour_cnt==CLKhour_cnt)
等一个在闹钟界面模块设置的时分秒数列,等到这个数列的时候转跳到state1或state2,并设置好蜂鸣器鸣响的延时时间到变量cnt_2;
state1、state2:在计数变量cnt_2归零之前,一直给蜂鸣器管脚输出高电平,直到计数变量cnt_2归零,输出为低电平,停止蜂鸣器鸣响;

功能:LCD屏显示控制模块,用于控制LCD屏显示年月日以及祝福语;

思路:
A.将年月日以及祝福语分别编写成字符串,再分别付给变量lcd_buf_first、data_first和lcd_buf_second、data_second;

B.准备好状态参数常量——
clear_lcd、
set_disp_mode、
disp_on、
shift_down、
write_data_first、
write_data_second;
基于状态机思想,并用current_state变量承载状态常量;
C.初始化LCD模块;

D.clear_lcd状态, 清屏并光标复位 ;
set_disp_mode: 设置显示模式:8位2行5x8点阵;
disp_on: 显示器开、光标不显示、光标不允许闪烁 ;
shift_down: 文字不动,光标自动右移;data_first赋值给lcd_buf_first;
write_data_first、write_data_second: 用于写入数据
default: 若current_state为其他值,则将current_state置为clear_lcd;

功能:基于视觉暂留知识,控制时钟界面数码管的显示;

思路:
A.复用分频模块clk_gen分频出一个时钟clk_div,周期约为0.1s;

B.设置一个8位的变量cnt,基于clk_div进行递加一,并在0到满位溢出之间循环(满位溢出时将之归零,再继续加一处理);

C.基于快速递加一的变量cnt,在每个clk时钟上升沿来的是时候,取其低三位(八个数码管格位,刚好三位二进制数可以完整表示)进行case处理,
每个case的子状态中,根据cnt低三位的值,把对应的表示数码管位置的二进制数赋值给ledcom,用于选择数码管格位;再把对应的数据(如秒位数据的低四位second_cnt[3:0],高四位second_cnt[7:4]等)传给dis变量; dis的用法是在下一个always模块里面,case判断dis的值,根据dis的值把对应的二进制数传给seg7变量,用于基于ledcom选择数码管格位之后,显示格位里面的内容;

由此,基于快速跳变的clk时钟和clk_div时钟,ledcom的值也不断地快速变换,由此数码管的每个格位都在被快速地选择和显示,于是这样便是通过了视觉暂留效应,实现了数码管时钟的显示;

功能:在顶层模块调用,根据输入的时钟和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;

思路:
A.将MODULEofCNT(分别通过/10和%10运算)切成5/2和9/3两个数,并分别付给变量a和b;

B.通过a和b判断是对分秒位数据(MODULEofCNT为60)还是对时位数据(MODULEofCNT为24)进行计算;
若是分秒位数据:先对couter_o[7:4]进行判断,若小于5,则对couter_o[3:0]判断,若couter_o[3:0]小于9,则couter_o[3:0]数据加一,若couter_o[3:0]不小于于9,则couter_o[3:0]归零处理,couter_o[7:4]加一;若couter_o[7:4]不小于5,则对couter_o[3:0]判断,若couter_o[3:0]小于a(9),则couter_o[3:0]数据加一,若couter_o[3:0]不小于于a(9),则couter_o八个位都归零,并返回一个溢出进位flag(flag<=1);
若是时位数据:逻辑同上,只将b替换为2,将a替换为3进行处理即可;

功能:对输入的50MHz的系统时钟分频,调用时根据CLK_DIV变量的复用情况进行运算并返回对应的时钟分频结果;

思路:简单地基于系统时钟clk_in以及可复用的参数CLK_DIV实现分频的功能;

hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8);
功能:基于视觉暂留知识,控制闹钟设置界面数码管的显示,并基于sw8的状态控制切换数码管屏显示;

思路:
A.复用分频模块clk_gen分频出一个时钟clk_div,周期约为0.1s;

B.(基于sw8的状态控制切换数码管屏显示)If语句判断sw8时候为高电平,如果是,则将CLKsecond_cnt、CLKmimute_cnt、CLKhour_cnt系列数据付给dis变量,如果不是则将second_cnt系统数据付给dis变量;细节处如cnt、ledcom、dis、case(cnt[2:0])等用法则跟seg_display模块的设计思路相同;

功能:在顶层模块调用,根据输入的时钟频率clk和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;

思路:同counter_60BCD模块的设计思路;

1.开机状态,初始为数字时钟界面,下图为数码管上规则地显示闪动的时钟,通过分频模块的参数调改可以改变其速度;
LCD屏上显示具体的日期(年月日)以及祝福语(Wish you happy/happiness——祝你幸福),开关状态为全数低电平:

2.上推sw8,令之输出为高电平,数码管即切换到闹钟设置界面:

4.上推sw2,令之输出为高电平,数码管闹钟界面上“分”数位持续加一(图中已加到04):

5.上推sw3,令之输出为高电平,数码管闹钟界面上“秒”数位持续加一(图中已加到05):

顶层文件,用于调用诸多要使用的模块;

管教分配的脚本文件,描述管教的分配;

LCD屏模块,实现LCD屏显示年月日以及祝福语的功能;

时钟模块的数码管显示的相关模块文件;

关于实现时钟界面显示的后台数字计算(相关变量的加一和进位操作等)的文件;

时钟分频模块,用于实现各种参数频率的分频;

闹钟模块的数码管管显示的相关模块文件;

关于实现闹钟界面显示的后台数字计算(相关变量的加一和进位操作等)的文件。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 在学校每天被别人骂傻子从宿舍到饭堂到教室,被孤立,我该怎么办,每天都好痛苦? 从小被生你的人讨厌和谩骂到大很痛苦怎么办?对待我和哥哥简直一个天上一个地下,我还要孝敬她吗 文件传输助手的文件为什么删不掉咋办? QQ宝贝的 怎么改变新版QQ宠物的性别?美容院在哪儿,找不到呢 QQ宝贝美容院怎么没有了呢? qq空间宠物美容院在哪里啊 诟病是什么意思解释,诟病是什么意思? 诟病是什么意思?,诟病是什么意思解释 电脑如何让括号成对出现 何为有情?何为无情? 何为无情? 赞美云龙山七律 功劳远超张廷玉的曾国藩,最后也得到配享太庙的待遇了吗? 清朝乾隆御前侍卫中有我的先祖,谁能告诉我名单? 富家女不愿嫁穷书生,让丫鬟顶替,为何20年后却说你把我一生都毁了? 梦见认识的人买饮料给我喝 祝福新人结婚的文案 祝福新人的话 百合熬汤优点苦呢 百合炖冰糖为何苦的 蒙古语发展阶段如何分层,都有什么特点 商众网的基本简介 上海众商网络科技有限公司怎么样 众商网络科技有限公司受国家支持吗 海南合众电商网络科技有限公司怎么样? 关系不好 和 有仇,有什么区别? 人缘关系不好。是什么意思??? 人缘关系不好。是什么意思? 什么样叫关系好? 什么样才叫关系不好?怎样才算搞好关系?什么样叫没搞好关系?与男与女~ 如何用光盘启动linux,请高手详细指教 手机的备用密码在哪里? 江西省专升本英语考试考什么(难度多大) 刺青电视剧多少集? 刺青蔡知铭多少集死了 应用锁密码忘了备用密码也忘了怎么重置? 义释严颜是谁 义释严颜的简介 小腿抽筋是什么 三国演义中智擒严颜梗概300 猪舍热风炉最高温或最低温是多少 养猪场保暖怎么做最有效 养猪场常见的保暖方法