当前位置:   article > 正文

FPGA基于VerilogHDL的电子时钟----开发平台Quartus II_基于fpga采用verilog设计电子时钟

基于fpga采用verilog设计电子时钟

整体框架

本次电子时钟功能:时钟计时功能,时间设置功能(设置的时间是时钟的功能),秒表计时功能三种功能。由于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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

上面的代码只是一个样例,方便理解,并不能运行。整体代码我会上传到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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

防抖模块

这个模块之前设计中没有写,是因为将程序载入开发板中的时候发现需要按键消抖,因为有时候会发生按一次键触发很多次程序的情况。
原理很简单,就是当检测到按键触发之后,等待20ms之后检测按键是否还是处于触发状态,如果是那么输出 按键触发的信号(高电平),否则输出 按键没有触发的信号(低电平)。

显示扫描模块

显示模块网络上很多资料,所以大致说一下原理。
在1khz的频率下,按顺序 循环四个数字。因此1秒之内 这四个数字会循环250次。因此每个数字闪烁的频率是250Hz,人的肉眼看不出这几个数字的循环。

秒表模块

秒表模块的原理和时钟计时模块基本相似。只不过秒表模块进入的是100Hz的频率,并且 第三、第四位的数字 都是满10进1。

代码资源

https://github.com/yangli1715977/EEE339-Digital-Clock

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/562094
推荐阅读
相关标签
  

闽ICP备14008679号