• 基于FPGA的电子万年历设计


    1.软件版本

    quartusii12.1

    2.系统描述

    系统的整个结构框图:

     然后,设置控制输入有5个脚,分析功能如下所示:

    i_Function_Controller=0;显示年月日

    i_sel:选择需要调整的某位数字。

    i_set:计数器,调整需要调整的位置的数字。

    具体调整的时候,首先选择i_sel,按键按一下,需要调整的位置会移动一次,然后移动到需要调整的位置上,然后松开i_sel,然后按下i_set,调整显示的数字。

    i_run:不使用

    i_Function_Controller=1;显示时间,小时,分,秒

    i_sel:

    i_set:

    i_run:

    正常工作的时候,上面三个设置分别输入0,0,1

    当需要调整时间的时候,设置i_run=0,然后设置i_sel,选择对应的需要调整的数字位,然后设置i_set,设置具体的值,其中秒位置,如果设置i_set。那么秒直接清零。

    注意,因为时间部分计数到24小时的时候,年月日才被加1,所以在年月日这里i_run不使用,他是靠日期模块来驱动的。

    i_Function_Controller=2;闹钟设置模块

    i_sel:

    i_set:

    i_run:不使用,

    通过设置i_sel,选择需要被设置的数字位,然后通过i_set进行闹钟的设置。

    i_Function_Controller=3;秒表的控制

    i_sel:清零

    i_set:暂停

    i_run:开始秒表计时

    整体的结构如下所示:

    3.部分源码

    1. `timescale 1ns / 1ps
    2. module tops(
    3. i_clk,
    4. i_rst,
    5. i_Function_Controller,
    6. i_sel,
    7. i_set,
    8. i_run,
    9. o_Num1,
    10. o_Num2,
    11. o_Num3,
    12. o_Num4,
    13. o_Num5,
    14. o_Num6,
    15. o_Num7,
    16. o_Num8,
    17. o_digit,
    18. o_en
    19. );
    20. input i_clk;
    21. input i_rst;
    22. input[1:0] i_Function_Controller;
    23. input i_sel;
    24. input i_set;
    25. input i_run;
    26. output[3:0]o_Num1;
    27. output[3:0]o_Num2;
    28. output[3:0]o_Num3;
    29. output[3:0]o_Num4;
    30. output[3:0]o_Num5;
    31. output[3:0]o_Num6;
    32. output[3:0]o_Num7;
    33. output[3:0]o_Num8;
    34. output[7:0]o_digit;
    35. output[7:0]o_en;
    36. wire Clock_mb;
    37. wire Clock;
    38. clock_div clock_div_u(
    39. .i_clk (i_clk),
    40. .i_rst (i_rst),
    41. .i_sel (1'b0),
    42. .o_clock1 (Clock_mb),
    43. .o_clock2 (Clock)
    44. );
    45. //======================================================================
    46. wire CLK_Year;
    47. wire[3:0]ym_Num1;
    48. wire[3:0]ym_Num2;
    49. wire[3:0]ym_Num3;
    50. wire[3:0]ym_Num4;
    51. wire[3:0]ym_Num5;
    52. wire[3:0]ym_Num6;
    53. wire[3:0]ym_Num7;
    54. wire[3:0]ym_Num8;
    55. year_month year_month_u(
    56. .i_clk (CLK_Year),
    57. .i_rst (i_rst),
    58. .i_sel (i_sel),
    59. .i_set (i_set),
    60. .o_Num1 (ym_Num1),
    61. .o_Num2 (ym_Num2),
    62. .o_Num3 (ym_Num3),
    63. .o_Num4 (ym_Num4),
    64. .o_Num5 (ym_Num5),
    65. .o_Num6 (ym_Num6),
    66. .o_Num7 (ym_Num7),
    67. .o_Num8 (ym_Num8)
    68. );
    69. //======================================================================
    70. wire[3:0]tm_Num1;
    71. wire[3:0]tm_Num2;
    72. wire[3:0]tm_Num3;
    73. wire[3:0]tm_Num4;
    74. wire[3:0]tm_Num5;
    75. wire[3:0]tm_Num6;
    76. wire[3:0]tm_Num7;
    77. wire[3:0]tm_Num8;
    78. times times_u(
    79. .i_clk (Clock),
    80. .i_rst (i_rst),
    81. .i_run (i_run),
    82. .i_sel (i_sel),
    83. .i_set (i_set),
    84. .o_Num1 (tm_Num1),
    85. .o_Num2 (tm_Num2),
    86. .o_Num3 (tm_Num3),
    87. .o_Num4 (tm_Num4),
    88. .o_Num5 (tm_Num5),
    89. .o_Num6 (tm_Num6),
    90. .o_CLK_Year (CLK_Year),
    91. .CNT ()
    92. );
    93. assign tm_Num7 = 4'd0;
    94. assign tm_Num8 = 4'd0;
    95. //======================================================================
    96. wire[3:0]be_Num1;
    97. wire[3:0]be_Num2;
    98. wire[3:0]be_Num3;
    99. wire[3:0]be_Num4;
    100. wire[3:0]be_Num5;
    101. wire[3:0]be_Num6;
    102. wire[3:0]be_Num7;
    103. wire[3:0]be_Num8;
    104. beer beer_u(
    105. .i_clk (Clock),
    106. .i_rst (i_rst),
    107. .i_sel (i_sel),
    108. .i_set (i_set),
    109. .i_N1 (tm_Num3),
    110. .i_N2 (tm_Num4),
    111. .i_N3 (tm_Num5),
    112. .i_N4 (tm_Num6),
    113. .o_N1 (be_Num3),
    114. .o_N2 (be_Num4),
    115. .o_N3 (be_Num5),
    116. .o_N4 (be_Num6),
    117. .o_bear (o_bear)
    118. );
    119. assign be_Num1 = 4'd0;
    120. assign be_Num2 = 4'd0;
    121. assign be_Num7 = 4'd0;
    122. assign be_Num8 = 4'd0;
    123. //======================================================================
    124. wire[3:0]mb_Num1;
    125. wire[3:0]mb_Num2;
    126. wire[3:0]mb_Num3;
    127. wire[3:0]mb_Num4;
    128. wire[3:0]mb_Num5;
    129. wire[3:0]mb_Num6;
    130. wire[3:0]mb_Num7;
    131. wire[3:0]mb_Num8;
    132. miaobiao miaobiao_u(
    133. .i_clk (Clock_mb),
    134. .i_rst (i_rst),
    135. .i_run (i_run),
    136. .i_pause (i_set),
    137. .i_clear (i_sel),
    138. .o_Num1 (mb_Num1),
    139. .o_Num2 (mb_Num2),
    140. .o_Num3 (mb_Num3),
    141. .o_Num4 (mb_Num4),
    142. .o_Num5 (mb_Num5),
    143. .o_Num6 (mb_Num6)
    144. );
    145. assign mb_Num7 = 4'd0;
    146. assign mb_Num8 = 4'd0;
    147. //=====================================================================
    148. reg[3:0]o_Num1;
    149. reg[3:0]o_Num2;
    150. reg[3:0]o_Num3;
    151. reg[3:0]o_Num4;
    152. reg[3:0]o_Num5;
    153. reg[3:0]o_Num6;
    154. reg[3:0]o_Num7;
    155. reg[3:0]o_Num8;
    156. always @(posedge i_clk or posedge i_rst)
    157. begin
    158. if(i_rst)
    159. begin
    160. o_Num1 <= 4'd0;
    161. o_Num2 <= 4'd0;
    162. o_Num3 <= 4'd0;
    163. o_Num4 <= 4'd0;
    164. o_Num5 <= 4'd0;
    165. o_Num6 <= 4'd0;
    166. o_Num7 <= 4'd0;
    167. o_Num8 <= 4'd0;
    168. end
    169. else begin
    170. if(i_Function_Controller == 2'b00)
    171. begin
    172. o_Num1 <= ym_Num1;
    173. o_Num2 <= ym_Num2;
    174. o_Num3 <= ym_Num3;
    175. o_Num4 <= ym_Num4;
    176. o_Num5 <= ym_Num5;
    177. o_Num6 <= ym_Num6;
    178. o_Num7 <= ym_Num7;
    179. o_Num8 <= ym_Num8;
    180. end
    181. if(i_Function_Controller == 2'b01)
    182. begin
    183. o_Num1 <= tm_Num1;
    184. o_Num2 <= tm_Num2;
    185. o_Num3 <= tm_Num3;
    186. o_Num4 <= tm_Num4;
    187. o_Num5 <= tm_Num5;
    188. o_Num6 <= tm_Num6;
    189. o_Num7 <= tm_Num7;
    190. o_Num8 <= tm_Num8;
    191. end
    192. if(i_Function_Controller == 2'b10)
    193. begin
    194. o_Num1 <= be_Num1;
    195. o_Num2 <= be_Num2;
    196. o_Num3 <= be_Num3;
    197. o_Num4 <= be_Num4;
    198. o_Num5 <= be_Num5;
    199. o_Num6 <= be_Num6;
    200. o_Num7 <= be_Num7;
    201. o_Num8 <= be_Num8;
    202. end
    203. if(i_Function_Controller == 2'b11)
    204. begin
    205. o_Num1 <= mb_Num1;
    206. o_Num2 <= mb_Num2;
    207. o_Num3 <= mb_Num3;
    208. o_Num4 <= mb_Num4;
    209. o_Num5 <= mb_Num5;
    210. o_Num6 <= mb_Num6;
    211. o_Num7 <= mb_Num7;
    212. o_Num8 <= mb_Num8;
    213. end
    214. end
    215. end
    216. ======================================================================
    217. //digit8 digit8_u(
    218. // .i_clk (i_clk),
    219. // .i_rst (i_rst),
    220. // .i_num1s (o_num1),
    221. // .i_num2s (o_num2),
    222. // .i_num3s (o_num3),
    223. // .i_num4s (o_num4),
    224. // .i_num5s (o_num5),
    225. // .i_num6s (o_num6),
    226. // .i_num7s (o_num7),
    227. // .i_num8s (o_num8),
    228. // .o_digit(o_digit),
    229. // .o_en (o_en)
    230. // );
    231. endmodule

    4.仿真结论

    第一个模块:秒表模块:

            这个模块是一个秒表计数器,技术最大到60分钟,最小为0.01秒。这个模块可以暂停,计时以及清零三个功能。

            这个模块的仿真结果如下所示:

    当输入的i_run信号为1的时候,秒表开始运行,从上面我们可以看到最高位Num6的计数结果,其余几位由于速度很快,所以被缩小了,看不清楚,当pause为1的时候,秒表停留在14:22:63,即14分22秒63.然后最后clear为高的时候,直接清零。

    第二个模块:时间模块:

             这个模块主要是一个以秒为计数单位的计数器,秒计数满60,分累加1,分计数满60的时候,小时累加1,小时计数满24的时候,产生一个时钟信号,用来确定日期加1。这个模块的仿真结果如下所示:

    第三个模块:年月日模块:

             这个模块主要是一个计数器,当计数器计数到24小时的时候,年月日模块计数器会自动加1,表示日期往前累积1日。并系统能够区分大小月和特殊的2月,以及年份的闰年或者非闰年。

            这里我们分两个小模块来设计,一个是日月模块,一个是年模块,当计数器计数到12月31日的时候,那么年模块则进一。即年份增加一。

           然后日月模块需要进行进行一个大的循环,技术满4年,则2月需要变为29天,否则为28天。

           这里,月份的仿真效果如下所示:

    从上面的仿真结果可知,当月份技术到12:31日的时候,会产生一个技术的时钟高电平,这个电平用来确定年份的计数器。

             关于年份的计数。就是当月份慢12-31的时候,年份计数器加1.这个模块比较简单,具体仿真效果如下所示:

    闹钟模块:

             这个模块,通过键盘输入,设置需要闹钟的时间,然后当系统的时钟模块的分和小时和闹钟模块的预设值匹配的时候,该模块会驱动蜂鸣器发出闹钟声音。

            闹钟模块,即通过设置闹钟的具体时间,然后后输入的时间进行对比,如果一直,那么输出一个高电平信号给蜂鸣器。发出声音。

    数码管输出模块:

             根据各个模块的数值,分别驱动8个数码管,进行数据的显示。这个模块只能在实际测试的时候使用,所以这里不给出仿真模块。

    全局模块:

           这个模块是对各个子模块的调用。

    分频模块:

            这个模块主要将系统的时钟进行分频,得到和实际时间相关的时钟频率,具体流程为通过设置一个是计数器,当计数器计数到一个预设值得时候,新的时钟频率输出1,其余时间输出0。通过这个过程,实现时钟的分频。

    A02-46

  • 相关阅读:
    Spring 如何使用JdbcTemplate类进行数据库操作呢?
    QTabBar实验
    期货-股票交易规则
    无监督re-ranker,Improving Passage Retrieval with Zero-Shot Question Generation
    springboot源码编译报错Unable to start the daemon process
    汽车数据安全事件频发,用户如何保护隐私信息?
    Nginx的Map模块
    二叉树和二叉堆和优先队列
    Docker harbor私有仓库部署与管理
    搭建一个自己的学术语音助手(1)
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/125288510