FPGA项目(10)——基于FPGA的倒计时显示电路的设计与仿真_fpgazh5-9+基于fpga的倒计时时钟电路设计的计数器模块仿真波形图

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

接着就是分频模块。这种分频非常简单,就不具体解释了,直接给出代码:

下面重点来了

首先,要实现k2按下数值清0的效果,这个非常简单。直接在if语句里面判断,符合条件直接清0就行。然后要实现时间的预设功能,那么假定只有在倒计时暂停的情况下才可以进行时间设定,倒计时运行过程中不能对时间进行修改。所以在设定时间时首先要判断k1的状态,如果k1为0,才可以进行时间预设。当k1为1时,就是正常的倒计时状态。Sec信号在1HZ脉冲的驱动下(clk_hz信号每隔1S会置1一次)减1,每次减到0都判断一次minute是否为0,如果minute不为0,说明倒计时过程还未结束,应该重新给sec赋值并且minute减1,否则说明倒计时结束了,蜂鸣器报警,同时暂停倒计时的过程。这部分的逻辑代码如下:

需要注意这里使用的是 if  else if 语句,里面的条件是有优先级顺序的。复位信号的优先级最高,然后的清0按键k2,然后是k1.

最后就是将所得的时间数值,取出来,送给显示模块进行显示。

仿真图如下:

这是不加数码管显示的,为的是更清楚的看到时间的变化。一开始我令k3按下去一个周期  K5按下去2个周期,那么对应的效果就是minute+1,sec+2。从仿真的结果看,确实是这样。随后当k1置为高电平以后,分钟和秒钟在进行倒计时的过程。当时间减完以后,可以看到蜂鸣器输出了高电平,倒计时过程暂停了!

接下来给出一张完整的仿真图:

完整代码如下:

module count_down(
 input                   clk    ,        // 时钟信号				假设时钟信号为50M
 input                   rst_n  ,        // 复位信号
 input					 k1,			//用于控制计时的启动和停止			1表示启动    0表示停止
 input					 k2,			//用于控制计数时间的归零
 input					 k3,			//用于设置倒计时时间时 对分钟的+
 input					 k4,			//用于设置倒计时时间时 对分钟的-
 input					 k5,			//用于设置倒计时时间时 对秒钟的+
 input					 k6,			//用于设置倒计时时间时 对秒钟的-			//所有按键都假设 不按下为1   按下为0
 
 output			[5:0]	 minut_out,		//将时间输出  便于观察
 output			[5:0]	 sec_out,
 output	  reg			 beep,			//蜂鸣器报警   高电平报警
 output    		[3:0]     seg_sel,        // 数码管位选,最左侧数码管为最高位
 output    	    [6:0]     seg_led         // 数码管段选
);


//parameter    hz_num=32'd50_000_000;
parameter    hz_num=32'd50;						//将50M时钟分频到1HZ所需要的分频系数   仿真时取50   实物取50_000_000

reg [5:0]	minute;					//预设时间的分钟
reg	[5:0]	sec;					//预设时间的秒钟

reg			clk_hz;					//分频后的1hz信号
reg	[31:0]	hz_cnt;					//分频模块使用的寄存器

wire [3:0]  minute_ge;				//保存分钟的个位  用于输出到数码管显示
wire [3:0]  minute_shi;				//保存分钟的十位  用于输出到数码管显示
wire [3:0]  sec_ge;					//保存秒钟的个位  用于输出到数码管显示
wire [3:0]  sec_shi;				//保存秒钟的时位  用于输出到数码管显示

wire [15:0] data_out;			   //要传递到数码管显示的数据

//产生1hz的模块
always @(posedge clk) begin
	if(hz_cnt==hz_num-1)
		begin
		hz_cnt<=32'd0;
		clk_hz<=1'b1;
		end
	else
		begin
		hz_cnt<=hz_cnt+1;
		clk_hz<=1'b0;
		end
end

//读取按键信息  进行倒计时预设  假设只有在停止状态下才能进行时间预设 (也就是k1=0  才可以设置时间)
always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		begin				//复位时  时间都归0
		minute<=6'd0;
		sec<=6'd0;
		beep<=1'b0;			//蜂鸣器不响
		end
	else if(k2==0)			//按下k2 时间也归0
		begin				
		minute<=6'd0;
		sec<=6'd0;
		end
	else if(k1==0)			//如果是在停止状态下,则对时间进行设定
		begin
			if(k3==0)
				begin
				minute<=minute+6'd1;
				end
			else if(k4==0)
				begin
				minute<=minute-6'd1;
				end
			else if(k5==0)
				begin
				sec<=sec+6'd1;
				end
			else if(k6==0)
				begin
				sec<=sec-6'd1;
				end
			else
				begin
				minute<=minute;
				sec<=sec;
				end
		end
	else if(k1==1)				//如果实在开启状态下
		begin
			if(clk_hz)			//在1S的脉冲驱动下  进行倒计时操作
				begin
				if(sec>0)
					sec<=sec-6'd1;
				else					//秒钟倒计时到0了
					begin				
					if(minute>0)		//如果分钟不为0
						begin
					    sec<=6'd60;			//秒钟重新赋值为60
						minute<=minute-6'd1;		//分钟 减1
						end
					else				//如果分钟为0 说明倒计时结束了
 						begin


![img](https://img-blog.csdnimg.cn/img_convert/6025a7fe5bfc56361e592c820ca5c93b.png)
![img](https://img-blog.csdnimg.cn/img_convert/afee22bdcd909bd03b65179cab7e7cbf.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值