赞
踩
本次电子时钟功能:时钟计时功能,时间设置功能(设置的时间是时钟的功能),秒表计时功能三种功能。由于verilog的模块(module)概念,因此设计顺序是自顶而下,首先设计电子时钟的顶层文件,确定每个模块之间的联系。
上图是电子时钟的原理图。 分频模块向秒表计时模块和时钟计时模块输入100Hz(0.01s)和1Hz(1
s)的频率用来计时。其次秒表模块和时钟计时模块将4个4bit的数字输入有到扫描显示模块显示。Key Fliter是按键防抖模块。
在实验中,FPGA开发板有24KHz,27Khz,50KHz三种固定的系统频率,我选择是50KHz的频率。
分频模块的原理就是always模块以clk(系统频率)为敏感事件,在always模块中进行计数,50Khz=50_000_000Hz。那么声明一个integer变量 count1,count1在always模块中进行计数(+1),当计数到25_000_000的时候,让clk_100Hz=1,当计数到49_999_999的时候,让clk_100Hz
=0, 因此就形成了一个1Hz的脉冲信号。
时钟计时模块的原理就是在1HZ的脉冲信号下,进行计数,本次实验中数码管只有四个,因此显示的就是分和秒。 首先对秒的个位计数,当个位满10清零,并且让秒的十位+1,这段文字不好描述,因此代码表示。
秒的个位 - sec_L 秒的十位 - sec_H 分的个位 - min_L 分的十位 - min_H always@(posedge clk_1HZ) begin //每次检测到1Hz脉冲信号频率的 上沿的时候 秒的个位+1 sec_L <= sec_L +1; //当秒的个位满十 if(sec_L == 10) begin sec_L =0; sec_H = sec_H + 1; end //当秒为60的时候 if(sec_H == 5 && sec_L ==10) begin min_L <= min_L +1 ; sec_H <= 0; sec_L <= 0; end //当分的个位为10 if(min_L == 10) begin min_L <= 0; min_H <= min_H +1; end //当分和秒为 60:00 if( (min_H == 5 && min_L == 10) &&(sec_H == 5 && sec_L ==10)) begin min_H <= 0; min_L <= 0; sec_H <= 0; sec_L <= 0; end end
上面的代码只是一个样例,方便理解,并不能运行。整体代码我会上传到GitHub和CSDN库中。
在这次实验中,我把时间设置功能和时间计时功能现在了同一个模块,有一说一,这样对代码的可拓展性、移植性都是不好的。
具体功能:
首先拨动开关SW1进入时间设置模块,之后可以选择设置时间的位置(key1),默认位置是秒的个位,被选中的位置会以2Hz的频率在 当前数字 和 数码管全灭 两种模式之间不停切换闪烁;按key2对当前位置的时间数字进行add,按key3对当前位置的时间数字进行reduce。
原理:
首先定义四个temp值,在时间计时always模块中让把时钟的分秒的四个值赋给temp。
之后再另外的always模块也就是时间设置模块,把四个temp值赋给 设置时间的四个变量(sec_L_set min_L_set, sec_H_set, min_H_set)。之后声明一个变量pos_set表示设置时间的位置。 之后就是围绕这五个变量进行操作。
!!!下面的代码只是为了便于理解,并不能运行。
//首先初始化pos_set pos_set <= 0; //如果检测到key1触发,设置时间的位置发生变化 if(key1) begin if(pos_set == 3) begin pos_set <= 0; end else pos_set = pos_set + 1; end //之后开始实现时间的加减功能 //首先确定设置时间的位置,if和其他else if中的代码j基本相同。只不过是sec_L_set这个变量不同,在其他else if中 // 这个变量分别是 sec_H_set, min_L_set, min_H_set. if(pos_set == 0 ) begin //检测到key2触发 , add if(key2) begin if(sec_L_set == 9) begin sec_L_set <= 0; end else sec_L_set <= sec_L_set + 1; end if(key3) begin if(sec_L_set == 0) begin sec_L_set <= 9; end else sec_L_set <= sec_L_set - 1; end end else if(pos_set == 1) begin ... end else if(pos_set == 2) begin ... end else if(pos_set == 3) begin ... end
这个模块之前设计中没有写,是因为将程序载入开发板中的时候发现需要按键消抖,因为有时候会发生按一次键触发很多次程序的情况。
原理很简单,就是当检测到按键触发之后,等待20ms之后检测按键是否还是处于触发状态,如果是那么输出 按键触发的信号(高电平),否则输出 按键没有触发的信号(低电平)。
显示模块网络上很多资料,所以大致说一下原理。
在1khz的频率下,按顺序 循环四个数字。因此1秒之内 这四个数字会循环250次。因此每个数字闪烁的频率是250Hz,人的肉眼看不出这几个数字的循环。
秒表模块的原理和时钟计时模块基本相似。只不过秒表模块进入的是100Hz的频率,并且 第三、第四位的数字 都是满10进1。
https://github.com/yangli1715977/EEE339-Digital-Clock
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。