• 基于FPGA的数字时钟verilog开发


    目录

    一、理论基础

    二、案例背景

    1.问题描述

    2.思路流程

    三、verilog核心仿真

    四、仿真结论分析

    五、参考文献


    一、理论基础

    整个程序分为以下三大部分:

    ·时钟控制部分,分为调整分,秒功能,秒清零功能;

    ·暂停功能,时钟计数停止功能;

    ·4位数码管显示功能;

    系统按键为,分快速调整按钮,复位,秒清零按钮,系统暂停按钮(工作和暂停两个功能供用) 

    所以需要四个按钮。

    二、案例背景

    1.问题描述

    整个系统的基本框图如下所示:

    2.思路流程

        ·按键消抖主要是通过延迟的功能来实现的,在实际下板子的时候往往需要延迟很长一段时间,所以我们的代码为您提供两个版本的代码,一个版本为仿真版本,不加消抖,一个版本为硬件版本,具有消抖功能。

          ·仿真版本主要考虑系统的功能,所以我们直接对时钟进行系统控制;而硬件版本,我们为了得到1秒对应的时钟,需要对系统时钟进行分频。

    三、verilog核心仿真

    top程序如下:

    1. module time_module(
    2. i_clk, //系统时钟
    3. //这里假设按键的初始状态为0,按下后为1
    4. i_rst, //系统复位
    5. i_min_fast,//调整分
    6. i_sec_fast,//调整秒
    7. i_stop_run,//暂停或者继续工作
    8. o_min, //显示分
    9. o_sec //显示秒
    10. );
    11. input i_clk;
    12. input i_rst;
    13. input i_min_fast;
    14. input i_sec_fast;
    15. input i_stop_run;
    16. output[7:0]o_min;
    17. output[7:0]o_sec;
    18. reg[7:0]o_min = 8'd0;
    19. reg[7:0]o_sec = 8'd0;
    20. always @(posedge i_clk or posedge i_rst)
    21. begin
    22. if(i_rst)
    23. begin
    24. o_min <= 8'd0;//59
    25. o_sec <= 8'd0;//59
    26. end
    27. else begin
    28. if(i_stop_run == 0)//不按下时为0,时钟正常工作
    29. begin
    30. //正常计时间
    31. if(o_sec[3:0] == 4'd9)
    32. begin
    33. o_sec[3:0] <= 4'd0;
    34. if(o_sec[7:4] == 4'd5)
    35. begin
    36. o_sec[7:4] <= 4'd0;
    37. //分计数
    38. if(o_min[3:0] == 4'd9)
    39. begin
    40. o_min[3:0] <= 4'd0;
    41. if(o_min[7:4] == 4'd5)
    42. begin
    43. o_min[7:4] <= 4'd0;
    44. end
    45. else begin
    46. o_min[7:4] <= o_min[7:4] + 4'd1;
    47. end
    48. end
    49. else begin
    50. o_min[3:0] <= o_min[3:0] + 4'd1;
    51. end
    52. end
    53. else begin
    54. o_sec[7:4] <= o_sec[7:4] + 4'd1;
    55. end
    56. end
    57. else begin
    58. o_sec[3:0] <= o_sec[3:0] + 4'd1;
    59. end
    60. //调整时间
    61. if(i_min_fast == 1'b1)
    62. begin
    63. if(o_min[3:0] == 4'd9)
    64. begin
    65. o_min[3:0] <= 4'd0;
    66. if(o_min[7:4] == 4'd5)
    67. begin
    68. o_min[7:4] <= 4'd0;
    69. end
    70. else begin
    71. o_min[7:4] <= o_min[7:4] + 4'd1;
    72. end
    73. end
    74. else begin
    75. o_min[3:0] <= o_min[3:0] + 4'd1;
    76. end
    77. end
    78. if(i_sec_fast == 1'b1)
    79. begin
    80. o_sec <= 8'd0;
    81. end
    82. end
    83. else begin//按下时为1,时钟停止
    84. o_min <= o_min;
    85. o_sec <= o_sec;
    86. end
    87. end
    88. end
    89. endmodule

    四、仿真结论分析

    仿真结果如下所示:

    正常运行:

    如上图可以看到,当秒计数到59的事后哦,变0,然后分的数字加1;

    调整:

    分调整:

    分调整按钮按下,分马上开始快速计数,和现实中的电子表一个原理。

    秒调整:

    秒调整按钮按下,秒变0。

    暂停:

    当按下暂停的时候,停止走动。

    复位:

    通过复位后,系统变为0;A02-36

  • 相关阅读:
    Java 多线程:锁(二)
    产品包装如何进行测试评价?
    PVT法碳化硅SIC单晶生长工艺真空压力控制装置的国产化替代解决方案
    再谈Android消息分发
    day-49 代码随想录算法训练营(19) 动态规划 part 10
    安全狗入选《可信业务与应用安全全景视图(2022)》多个模块
    蓝帽杯2022年半决赛 writeup(附取证题目+解压密码+附件)
    Ubuntu 18.04上无法播放MP4格式视频解决办法
    2022-08-27 第六小组 瞒春 学习笔记
    qt化步骤
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/126395857