赞
踩
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我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)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。