FPGA基于Verilog实现的多功能时钟

时钟实现的功能:
1.数码管显示时间
2.有计时功能
3.可实现定点报时

多功能时钟共两种工作状态:
1.正常的时钟显示时间
2.计时状态

由于部分原因,本例中调节时间的功能并没有添加,程序大体功能完整,可能出现少许BUG,可以做个参考,望知。
实现资源:

  1. FPGA开发板一块,包括: 六位八段数码管(用于显示时间)、蜂鸣器(用于定点报时)、 四位按键输入
  2. 开发板采用50Mhz晶振产生时钟

变量定义

一共有5个输入,包括四个按键及一个时钟输入
3个输出,包括位、段数码管及蜂鸣器

module multfun_clock(clk,key1,key2,key3,key0,beep,dxuan, wxuan,count,divclk,wei_cnt,disp_state );
input   clk;
input   key1;
input   key2;
input   key3;
input   key0;output reg [7:0] dxuan;
output reg [5:0] wxuan;
output reg beep;    reg [25:0] count;reg divclk; //分频产生1次/秒的脉冲用于时钟计数reg [4:0] cnth,cnthh;reg [5:0] cntd,cntdd;reg [5:0] cnts,cntss;reg [1:0] kstate;
//******************数码管数值定义*********************************//
parameter disp0=8'b1100_0000;
parameter disp1=8'b1111_1001;
parameter disp2=8'b1010_0100;
parameter disp3=8'b1011_0000;
parameter disp4=8'b1001_1001;
parameter disp5=8'b1001_0010;
parameter disp6=8'b1000_0010;
parameter disp7=8'b1111_1000;
parameter disp8=8'b1000_0000;
parameter disp9=8'b1001_0000;

按键的消抖

利用脉冲的递送产生的上升沿来控制时钟状态转换

reg  low_g;
reg  low_g_r;
reg  d1;
reg  [19:0]  cnt;always @ (posedge clk )if (cnt == 20'hfffff)  low_g <= key3;else cnt <= cnt + 1'b1;always @ (posedge clk  )low_g_r <= low_g;wire  led_ctr = low_g_r & (~low_g);always@(posedge clk)beginif(led_ctr==0)  //按键3用来切换时钟、计数器与调节时钟状态beginif(kstate>2'b10)kstate<=2'b00;else kstate<=kstate+2'b01;endelse kstate<=kstate;end

分频

该always语句用于产生时钟所用脉冲,将50Mhz脉冲分频,计数2500_0000次即为1秒钟时间。50Mhz脉冲每个脉冲为20ns,1秒钟需要5000_0000个脉冲,那么产生的分频信号应该计数至2500_0000就翻转一次

always@(posedge clk)   //时钟分频beginif(count<=26'd2500_0000)  count<=count+26'd1; else    begindivclk=~divclk;count<=26'd0;end   end

时钟模块

无论当前多功能时钟计数状态为什么,时钟模块永远处于工作状态,按秒、分、时依次进位

always@(posedge divclk)beginif(cnts<=6'd58)      cnts=cnts+6'd1;else begin            //计时60秒,秒计数清零,分计数加1cnts<=6'd0;if(cntd<=6'd58)cntd<=cntd+6'd1;elsebegin        //计数60分,分计数清零,时计数加1cntd<=6'd0;if(cnth<=5'd22)cnth<=cnth+5'd1;else cnth<=5'd0;  //计数24时,时计数清零endendend

计时模块

本例中计时最大限度设为2小时,可清零

 always@(posedge divclk)if(kstate==2'b01)  begin//切换到计时if(key0==1'b0)  //开关0清零begincntss<=0;cntdd<=0;cnthh<=0;endelse if(key1==1'b0) begin  //复位端无效if(cntss<=6'd59)  cntss=cntss+6'd1;else begin            //计时60秒,秒计数清零,分计数加1cntss<=6'd0;if(cntdd<=6'd59) cntdd<=cntdd+6'd1;else begin        //计数60分,分计数清零,时计数加1cntdd<=0;if(cnthh<=5'd31) cnthh<=cnthh+5'd1;else cnthh<=5'd0; end  //计数2小时,时计数清零   endendelse begincntss<=cntss;cntdd<=cntdd;cnthh<=cnthh; end
end

时间显示模块

cnt_symin用于选择八段数码管的输入显示

  case(cnt_symin)

显示分为时钟显示和计时显示,根据状态不同进行切换

 if(kstate==2'b01) begin ……else begin ……

下面为该模块所有代码:

reg [15:0] wei_cnt;
reg [ 2:0] disp_state;
reg [ 7:0] cnt_symin;
reg [ 7:0] cnt_symout;always@(posedge clk)  //位数码管切换beginif(wei_cnt<=16'd5_0000) begindisp_state<=disp_state; wei_cnt<=wei_cnt+12'd1; endelse beginwei_cnt<=16'd0;if(disp_state==3'd5) disp_state<=3'd0;else disp_state<=disp_state+3'd1;endendalways@(posedge clk)   //段数码管切换begincase(cnt_symin)1:dxuan<=disp1;2:dxuan<=disp2;3:dxuan<=disp3;4:dxuan<=disp4;5:dxuan<=disp5;6:dxuan<=disp6;7:dxuan<=disp7;8:dxuan<=disp8;9:dxuan<=disp9;0:dxuan<=disp0;default:dxuan<=disp0;endcaseendalways@(posedge clk)beginif(kstate==2'b01) begincase(disp_state)0:begin wxuan<=6'b011_111;cnt_symin<=cnthh/10; end1:begin wxuan<=6'b101_111;cnt_symin<=cnthh%10; end2:begin wxuan<=6'b110_111;cnt_symin<=cntdd/10; end3:begin wxuan<=6'b111_011;cnt_symin<=cntdd%10; end4:begin wxuan<=6'b111_101;cnt_symin<=cntss/10; end5:begin wxuan<=6'b111_110;cnt_symin<=cntss%10; enddefault:wxuan<=6'b111_111;endcase endelse begincase(disp_state)0:begin wxuan<=6'b011_111;cnt_symin<=cnth/10; end1:begin wxuan<=6'b101_111;cnt_symin<=cnth%10; end2:begin wxuan<=6'b110_111;cnt_symin<=cntd/10; end3:begin wxuan<=6'b111_011;cnt_symin<=cntd%10; end4:begin wxuan<=6'b111_101;cnt_symin<=cnts/10; end5:begin wxuan<=6'b111_110;cnt_symin<=cnts%10; enddefault:wxuan<=6'b111_111;endcase end end

定点提醒

这个模块因为某些原因并没有实现功能,可做参考

reg [15:0] beep_cnt;
always@(posedge clk)beginif(cnts==6'd58) begin         //59秒时开始提醒if(beep_cnt==16'd1000) begin        //如果计时等于0.01秒,则停止蜂鸣beep<=0;beep_cnt<=0; endelse beginbeep<=~beep;           //否则一直蜂鸣直到计时结束beep_cnt<=beep_cnt+16'd1;endendelse  beep=0;end

【注】:个人学习记录,如有错误,望不吝赐教
邮箱:2267395007@qq.com

FPGA学习——基于Verilog实现的多功能时钟相关推荐

  1. FPGA学习: Verilog刷题记录(10)

    FPGA学习: Verilog刷题记录(10) 刷题网站 : HDLBits 第三章 : Circuits 第二节 :Sequential Logic 第一节:Latches and Flip-Flo ...

  2. FPGA学习: Verilog刷题记录(15)

    FPGA学习: Verilog刷题记录(14-1) 刷题网站 : HDLBits 第三章 : Circuits 第二节 :Sequential Logic 第一节:Finite State Machi ...

  3. FPGA学习:Verilog基本语法

    前言 这学期的数电课进行了很大的改革,要求学生使用FPGA开发板进行课内实验,还有专门的数电实验课,课程结束后还有为期两周的课程设计,近几年,由于深度学习.异构计算等的兴起,FPGA的地位也是显著上升 ...

  4. FPGA学习——基于zynq的图像视频采集处理

    图1:一个典型的基于zynq系统的图像处理框架 根据系统读取外界 视 频 数 据 信 息 的 数 据 流 向,从 软 硬件功能层面具体划分为: 1)采集 部 分:视 频 通 过 位 于PL 侧 的50 ...

  5. FPGA学习之verilog语言入门指导

    本人985硕士,在此分享下学习过程,verilog通关!本人博客页也分享了很多课程设计和毕业设计,欢迎收藏观看订阅!谢谢支持! 在学习之前,要思考下为什么学习FPGA,老师要求?项目要求?课题组要求? ...

  6. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

  7. FPGA学习笔记---Verilog HDL 可综合语句和不可综合语句汇总

    作为HDL语言,有两种基本的用途:系统仿真和设计实现.所有的HDL描述都可用于仿真,但并非所有的HDL描述都可综合. 一般综合工具支持的Verilog HDL结构 Verilog HDL结构 可综合性 ...

  8. FPGA学习笔记---Verilog延迟语句分析比较

    在Verilog语言中经常要用到延时语句,延时语句添加的位置不同,输出的结果就会不同.今天就来分析比较一下延时语句在不同位置时,对赋值语句的影响. 一.阻塞式左延时赋值 文件代码: `timescal ...

  9. FPGA学习-基于FPGA的高速串行通信GTX知识梳理

    对于XILINX,7系列FPGA,关于GTX核对配置见PG168,了解GTX内部结构及更多的知识见ug476. 以7系列XC7k325t-ffg900为例,见各ug476,351页.可看到该芯片共有4 ...

最新文章

  1. 子组件跟随父组件re-render
  2. 方法论之 如何解决一个问题
  3. QApplication类详细描述
  4. decimal(numeric )、float 和 real 数据类型的区别
  5. iOS项目之交换方法(runtime)
  6. wedo巡线机器人编程教程_这是一个机器人和编程的时代
  7. LeetCode215:数组中第K个最大元素
  8. 用python倒序输出一个字符串_Python 反转字符串(reverse)的方法小结
  9. javascript 比量str今天的日期是,参数diff
  10. 解决python读取json格式数据后提取object不存在报错KeyError
  11. big sur 黑苹果_苹果宣布11日再开发布会!自研芯片届时或将发布!
  12. Angular 小试牛刀[2]:CI(travie+firebase)
  13. mysql的驱动connect放在哪里_MySQL的JDBC驱动程序下载地址
  14. 【OCP|052】OCP题库更新,052最新考题及答案整理-第10题
  15. mysql清除内存不足_MySQL内存不足怎么办
  16. 读后感系列3:《人类简史》尤瓦尔·赫拉利(一)
  17. 设备屏幕亮度调节代码实现
  18. 给定秒数 seconds ,把秒转化成小时、分钟和秒
  19. idea新建module无法push到GitHub,没有Git选项
  20. 柏拉图和他的三个弟子的故事:如何寻找幸福?如何寻找理想伴侣?

热门文章

  1. 微信小程序 - 生成二维码
  2. Why Redis beats Memcached for caching
  3. 医学图像相关公开数据集
  4. 正高职称计算机考试题,职称计算机考试试题高分技巧
  5. c语言 扫雷 试题,c语言课程设计经典例题扫雷346.doc
  6. 爬取最近七天的天气情况并实现语言播报-Python综合实战
  7. 今日份安利:什么软件可以录音翻译英语?
  8. fiddler stave插件
  9. 学习英文-学以致用【场景:公寓】
  10. 深入了解JavaScript 中的For循环之详解