当前位置:   article > 正文

FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)_正点原子超越者 fpga闹钟例程

正点原子超越者 fpga闹钟例程

2019   电子科学与技术 专业FPGA课程设计

报   告

2022  年 5 月 20 日

多功能数字电子钟的设计

摘要

电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

本文是用verilog语言来描述一个基于FPGA的多功能数字电子时钟的设计,该设计具备时间显示,准确计时,时间校准, 定时闹钟等功能。本文首先介绍了需要完成的工作,然后介绍了系统整体设计以及源代码开发过程。源代码首先在Quartus软件上进行仿真、综合,通过后下载到正点原子新启点开发板上,在FPGA器件上的试验结果表明上述功能全部正确,工作稳定良好。

关键词EDA;数字闹钟;verilog

Abstract

Electronic design automation (EDA) is a technology to realize the automatic design of electronic system or electronic products. The design results using EDA technology can be verified by FPGA / CPLD or directly made into application specific integrated circuit (ASIC).

This paper uses Verilog language to describe the design of a multifunctional digital electronic clock based on FPGA. The design has the functions of time display, accurate timing, time calibration, timing alarm clock and so on. This paper first introduces the work to be completed, and then introduces the overall design of the system and the source code development process. The source code is first simulated and synthesized on quartus software, and then downloaded to the punctual atom xinqidian development board. The test results on FPGA devices show that all the above functions are correct and work stably.

Keywords: EDA; Digital alarm clock; verilog

一、概述所作题目的意义,拟完成的工作

1.1选题意义

数字钟是一种以数字电路为基础,综合了模拟电路和电路基础知识设计出的一种时间数字显示装置。它具有结构简单、设计方便、稳定性强等优点,已广泛应用于各种公共场所,成为人们日常生活的必需品,给人们的生活、学习、工作带来很大的方便。由于数字集成电路的发展和石英品体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。随着科学技术及人们生活观念的改变,数字钟的设计显示出新的发展趋势:体积更加小巧;功能更加强大,如增加了定时控制,闹铃,仿广播电台等功能;设计的外表更加的时尚、美观,适合人们的审美观点的改变。因此,更为先进的电子钟的研究有着良好的发展前景和市场潜力。

数字钟不仅仅是一个数字电路,它在其他领域也有相当大的发展空间,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

1.2 拟完成的工作

1、能够用数码管或液晶屏显示时、分和秒(采用24小时进制);

2、具有按键校时功能,对小时和分单独校时,对分校时时,停止向小时进位;

3、具有闹钟功能,闹钟铃声为自主设计的用蜂鸣器发出的声音;

4、通过按键设置闹钟功能,且自动停闹和手动操作停闹; 

5、其它创意设计:增加闹钟模式开启指示灯和闹铃提示灯;可以作为秒表使用。

二、系统整体设计

2.1 系统方框图设计

2.2 功能介绍

本系统分为分频模块、计时模块、闹钟模块、秒表模块、控制模块、显示模块六个模块:分频模块给计时秒表闹钟模块提供时钟信号,控制模块控制计时秒表闹钟模块,通过显示模块的段选和位选进行显示。

三、代码实现

3.1 顶层模块

  1. clock_top.v
  2. module clock(
  3.             //input
  4.             clk,//时钟信号
  5.             rst_n,//复位
  6.             key,
  7. mkey,
  8. button,
  9.             //output
  10.             data, //a-g段
  11. data_db,
  12.             weixuan,//位选
  13. beep,
  14. LED,
  15. nled,
  16. bled,
  17.            );
  18. input clk;//时钟信号
  19. input rst_n;//复位
  20. input [2:0] key;
  21. input mkey;
  22. input button;
  23. output [3:0] LED;
  24. output nled;
  25. output bled;
  26. output [6:0] data;//段选
  27. output data_db;
  28. output [7:0] weixuan;//位选
  29. output beep;
  30. wire beep_1;
  31. wire [1:0] H_data1;
  32. wire [3:0] H_data2;
  33. wire [2:0] H_data3;
  34. wire [3:0] H_data4;
  35. wire [2:0] H_data5;
  36. wire [3:0] H_data6;
  37. wire [3:0] H_data7;
  38. wire [3:0] H_data8;
  39. wire [1:0] N_data1;
  40. wire [3:0] N_data2;
  41. wire [2:0] N_data3;
  42. wire [3:0] N_data4;
  43. wire [1:0] C_data1;
  44. wire [3:0] C_data2;
  45. wire [2:0] C_data3;
  46. wire [3:0] C_data4;
  47. wire [2:0] C_data5;
  48. wire [3:0] C_data6;
  49. wire [3:0] C_data7;
  50. wire [3:0] C_data8;
  51. wire [3:0] pin_status_ctrl;
  52. key    U1( .clk(clk),
  53.   .rst_n(rst_n),
  54.   .key(key),
  55.   .pin_status_ctrl(pin_status_ctrl)
  56.   );
  57. model U2(.clk(clk),.rst_n(rst_n),.pin_status_ctrl(pin_status_ctrl),
  58.                .H_data1(H_data1),
  59.    .H_data2(H_data2),
  60.    .H_data3(H_data3),
  61.    .H_data4(H_data4),
  62.    .H_data5(H_data5),
  63.    .H_data6(H_data6),
  64.    .H_data7(H_data7),
  65.    .H_data8(H_data8),
  66. .Display_Model(Display_Model),
  67. .N_data1(N_data1),//闹钟
  68.    .N_data2(N_data2),
  69.    .N_data3(N_data3),
  70.    .N_data4(N_data4),
  71. .LED(LED),
  72.                );
  73. weixuan U3( .clk(clk),.rst_n(rst_n),.weixuan(weixuan));
  74. duanxuan  U4(.clk(clk),.rst_n(rst_n),
  75. .C_data1(C_data1),//实际显示
  76. .C_data2(C_data2),
  77. .C_data3(C_data3),
  78. .C_data4(C_data4),
  79. .C_data5(C_data5),
  80. .C_data6(C_data6),
  81. .C_data7(C_data7),
  82. .C_data8(C_data8),
  83. .data(data),
  84. .data_db(data_db)
  85. );
  86. xianshi     U5(
  87.                  .clk(clk),
  88.         .rst_n(rst_n),
  89.   .mkey(mkey),
  90.         .H_data1(H_data1),//时钟
  91.      .H_data2(H_data2),
  92.      .H_data3(H_data3),
  93.      .H_data4(H_data4),
  94.      .H_data5(H_data5),
  95.      .H_data6(H_data6),
  96.      .H_data7(H_data7),
  97.      .H_data8(H_data8),
  98.   
  99.      .Display_Model(Display_Model),//显示模式
  100.   
  101.      .N_data1(N_data1),//闹钟
  102.      .N_data2(N_data2),
  103.      .N_data3(N_data3),
  104.      .N_data4(N_data4),
  105.   
  106.   .C_data1(C_data1),//实际显示
  107.   .C_data2(C_data2),
  108.   .C_data3(C_data3),
  109.   .C_data4(C_data4),
  110.   .C_data5(C_data5),
  111.   .C_data6(C_data6),
  112.   .C_data7(C_data7),
  113.   .C_data8(C_data8),
  114.                  );
  115.   
  116. beep U6( .clk(clk),.beep_1(beep_1),.beep(beep), .bled(bled),
  117.  );
  118. naozhong    U7( .clk(clk),
  119. .rst_n(rst_n),
  120.                .button(button),
  121.      .H_data1(H_data1),//时钟
  122.      .H_data2(H_data2),
  123.      .H_data3(H_data3),
  124.      .H_data4(H_data4),
  125.     .N_data1(N_data1),//闹钟
  126.      .N_data2(N_data2),
  127.      .N_data3(N_data3),
  128.      .N_data4(N_data4),
  129.     
  130.   .beep_1(beep_1),
  131. .nled(nled),
  132.                );
  133. endmodule

模块仿真:

3.2 各底层模块

3.2.1 beep.v(蜂鸣器控制)

  1. module beep(
  2.               clk,
  3.   beep_1,
  4.   beep,
  5.   bled); //模块名称beep
  6. input clk; //系统时钟50MHz
  7. input beep_1;
  8. output beep; //蜂鸣器输出端
  9. output bled;
  10. reg bled;
  11. reg beep_r; //寄存器
  12. reg[27:0]count;
  13. assign beep = beep_r; //脉冲输出
  14. always@(posedge clk)
  15. if(beep_1==1'b1)
  16.   begin
  17. count <= count + 1'b1;
  18.   end
  19. always @(count[20])
  20. begin
  21. if(beep_1==1'b0)
  22. beep_r = 0;
  23. else
  24. beep_r = !(count[13]&count[24]&count[27]);
  25. bled = (count[13]&count[24]&count[27]);
  26. end
  27. endmodule

模块仿真:

3.2.2 key.v (按键控制)

  1. module key(
  2.            clk,
  3.   rst_n,
  4.   key,
  5.   
  6.   pin_status_ctrl
  7.   );
  8. input clk;
  9. input rst_n;
  10. input [2:0] key;
  11. output [2:0] pin_status_ctrl;
  12. parameter T20MS = 25'd1_000_000;
  13. reg[2:0] key_rst;  //
  14. always @(posedge clk or negedge rst_n)//在时钟的上升沿或复位的下降沿会执行下面的操作
  15.     if(!rst_n) key_rst <= 3'b111;//如果复位键按下则三位二进制数111赋值给key_rst
  16.     else key_rst <= key;
  17. reg[2:0] key_rst_r;
  18. always @(posedge clk or negedge rst_n)
  19.     if(!rst_n) key_rst_r <= 3'b111;
  20.     else key_rst_r <= key_rst;//如果复位键没按下把key_rst的值赋值给key_rstr
  21.   
  22. wire[2:0] key_en;
  23. assign key_en = key_rst_r & (~key_rst);//key_en等于key_rst_r与
  24. /************************************************/
  25. //按键消抖动
  26. /************************************************/
  27. reg[19:0] cnt;             //
  28. always @(posedge clk or negedge rst_n)
  29.     if(!rst_n) cnt <= 20'd0;
  30.     else if(key_en) cnt <= 20'd0;//如果key_en等于1清零
  31.     else cnt <= cnt + 1'b1;//cnt+1
  32. //每隔20ms就取按键上的值   每20ms接收一次键值  (倒数第二个)
  33. reg[2:0] pin_status;
  34. always @(posedge clk or negedge rst_n)//clk信号上升沿到来时执行
  35.     if(!rst_n) pin_status <= 3'b111;//如果复位键按下则将三位二进制数111赋值给pin_status
  36.     else if(cnt == T20MS) pin_status <= key;//??
  37. //
  38. reg[2:0] pin_status_r;
  39. always @(posedge clk or negedge rst_n)
  40.     if(!rst_n) pin_status_r <= 3'b111;
  41.     else pin_status_r <= pin_status;
  42. //20MS的值与后20MS的值  判断有没有按键按下 (最后一个)
  43. wire[2:0]  pin_status_ctrl;//wier常用来表示以“assign”关键字指定的组合逻辑信号
  44. assign pin_status_ctrl = pin_status_r & (~pin_status);//
  45. endmodule

模块仿真:

3.2.3 duanxuan.v(段选控制)

  1. module duanxuan( clk,
  2.  rst_n,
  3.  C_data1,//实际显示
  4.  C_data2,
  5.  C_data3,
  6.  C_data4,
  7.  C_data5,
  8.  C_data6,
  9.  C_data7,
  10.  C_data8,
  11.   
  12.   data,
  13.   data_db
  14.  );
  15. input clk;
  16. input rst_n;
  17. input [1:0] C_data1;
  18. input [3:0] C_data2;
  19. input [2:0] C_data3;
  20. input [3:0] C_data4;
  21. input [2:0] C_data5;
  22. input [3:0] C_data6;
  23. input [3:0] C_data7;
  24. input [3:0] C_data8;
  25. output [6:0] data;
  26. output data_db;
  27. /************************************************************/
  28. reg[24:0] cnt; //声明cnt是一个18位的寄存器
  29. reg[2:0] count;
  30. parameter T5MS = 25'd100_000;//定义参数T5MS为
  31. parameter   T_fenMiao     = 25'd500_000;//500_000
  32. parameter   SEG_NUM0     = 8'hc0,//c0,
  33.             SEG_NUM1     = 8'hf9,//f9,
  34.             SEG_NUM2     = 8'ha4,//a4,
  35.             SEG_NUM3     = 8'hb0,//b0,
  36.             SEG_NUM4     = 8'h99,//99,
  37.             SEG_NUM5     = 8'h92,//92,
  38.             SEG_NUM6     = 8'h82,//82,
  39.             SEG_NUM7     = 8'hf8,//F8,
  40.             SEG_NUM8     = 8'h80,//80,
  41.             SEG_NUM9     = 8'h90;//90,
  42. /************************************************************/
  43. //分秒计数器
  44. reg [24:0] Cnt_FenMiao;
  45. always @(posedge clk or negedge rst_n)
  46.     if(!rst_n) Cnt_FenMiao <= 25'd0;
  47.     else if(Cnt_FenMiao == T_fenMiao)
  48.      Cnt_FenMiao <= 25'd0;
  49.     else
  50.         Cnt_FenMiao <= Cnt_FenMiao + 1'b1;    
  51. /************************************************************/
  52. always @(posedge clk or negedge rst_n)// 意思是在时钟的上升沿或复位的下降沿会执行下面的操作
  53.     if(!rst_n) cnt <= 25'd0;//如果复位则
  54.     else if(cnt == T5MS)
  55.         cnt <= 25'd0;  
  56.     else
  57.         cnt <= cnt + 1'b1;
  58. /************************************************************/
  59. //数据编码
  60. /************************************************************/
  61. //数码管一要显示的列表数据(0~2
  62. reg [6:0] S_data1_temp;
  63. always @(posedge clk or negedge rst_n)
  64.     if(!rst_n) S_data1_temp <= 7'h3f;
  65.     else
  66.         case(C_data1)
  67.             3'd0:    S_data1_temp <= SEG_NUM0;
  68.             3'd1:    S_data1_temp <= SEG_NUM1;
  69.             3'd2:    S_data1_temp <= SEG_NUM2;
  70.             default: S_data1_temp <= SEG_NUM0;
  71.         endcase
  72.   
  73.   
  74. /***********************************/
  75. //数码管二要显示的列表数据(0~9
  76. reg [6:0] S_data2_temp;
  77. always @(posedge clk or negedge rst_n)
  78.     if(!rst_n) S_data2_temp <= 7'h3f;
  79.     else
  80.         case(C_data2)
  81.             4'd0:    S_data2_temp <= SEG_NUM0;
  82.             4'd1:    S_data2_temp <= SEG_NUM1;
  83.             4'd2:    S_data2_temp <= SEG_NUM2;
  84.             4'd3:    S_data2_temp <= SEG_NUM3;
  85.             4'd4:    S_data2_temp <= SEG_NUM4;
  86.             4'd5:    S_data2_temp <= SEG_NUM5;
  87.             4'd6:    S_data2_temp <= SEG_NUM6;
  88.             4'd7:    S_data2_temp <= SEG_NUM7;
  89.             4'd8:    S_data2_temp <= SEG_NUM8;
  90.             4'd9:    S_data2_temp <= SEG_NUM9;
  91.             default: S_data2_temp <= SEG_NUM0;
  92.         endcase
  93. //数码管三要显示的列表数据(0~5)
  94. reg [6:0] S_data3_temp;
  95. always @(posedge clk or negedge rst_n)
  96.     if(!rst_n) S_data3_temp <= 7'h3f;
  97.     else
  98.         case(C_data3)
  99.             3'd0:    S_data3_temp <= SEG_NUM0;
  100.             3'd1:    S_data3_temp <= SEG_NUM1;
  101.             3'd2:    S_data3_temp <= SEG_NUM2;
  102.             3'd3:    S_data3_temp <= SEG_NUM3;
  103.             3'd4:    S_data3_temp <= SEG_NUM4;
  104.             3'd5:    S_data3_temp <= SEG_NUM5;
  105.             default: S_data3_temp <= SEG_NUM0;
  106.         endcase   
  107. /***********************************/
  108. //数码管四要显示的列表数据(0~9
  109. reg [6:0] S_data4_temp;
  110. always @(posedge clk or negedge rst_n)
  111.     if(!rst_n) S_data4_temp <= 7'h3f;
  112.     else
  113.         case(C_data4)
  114.             4'd0:    S_data4_temp <= SEG_NUM0;
  115.             4'd1:    S_data4_temp <= SEG_NUM1;
  116.             4'd2:    S_data4_temp <= SEG_NUM2;
  117.             4'd3:    S_data4_temp <= SEG_NUM3;
  118.             4'd4:    S_data4_temp <= SEG_NUM4;
  119.             4'd5:    S_data4_temp <= SEG_NUM5;
  120.             4'd6:    S_data4_temp <= SEG_NUM6;
  121.             4'd7:    S_data4_temp <= SEG_NUM7;
  122.             4'd8:    S_data4_temp <= SEG_NUM8;
  123.             4'd9:    S_data4_temp <= SEG_NUM9;
  124.             default: S_data4_temp <= SEG_NUM0;
  125.         endcase
  126. //数码管五要显示的列表数据(0~5)
  127. reg [6:0] S_data5_temp;
  128. always @(posedge clk or negedge rst_n)
  129.     if(!rst_n) S_data5_temp <= 7'h3f;
  130.     else
  131.         case(C_data5)
  132.             3'd0:    S_data5_temp <= SEG_NUM0;
  133.             3'd1:    S_data5_temp <= SEG_NUM1;
  134.             3'd2:    S_data5_temp <= SEG_NUM2;
  135.             3'd3:    S_data5_temp <= SEG_NUM3;
  136.             3'd4:    S_data5_temp <= SEG_NUM4;
  137.             3'd5:    S_data5_temp <= SEG_NUM5;
  138.             default: S_data5_temp <= SEG_NUM0;
  139.         endcase
  140.   
  141.   
  142. /***********************************/
  143. //数码管六要显示的列表数据(0~9
  144. reg [6:0] S_data6_temp;
  145. always @(posedge clk or negedge rst_n)
  146.     if(!rst_n) S_data6_temp <= 7'h3f;
  147.     else
  148.         case(C_data6)
  149.             4'd0:    S_data6_temp <= SEG_NUM0;
  150.             4'd1:    S_data6_temp <= SEG_NUM1;
  151.             4'd2:    S_data6_temp <= SEG_NUM2;
  152.             4'd3:    S_data6_temp <= SEG_NUM3;
  153.             4'd4:    S_data6_temp <= SEG_NUM4;
  154.             4'd5:    S_data6_temp <= SEG_NUM5;
  155.             4'd6:    S_data6_temp <= SEG_NUM6;
  156.             4'd7:    S_data6_temp <= SEG_NUM7;
  157.             4'd8:    S_data6_temp <= SEG_NUM8;
  158.             4'd9:    S_data6_temp <= SEG_NUM9;
  159.             default: S_data6_temp <= SEG_NUM0;
  160.         endcase
  161. /*****************************************/
  162. //数码管七要显示的列表数据(0~9)
  163. reg [6:0] S_data7_temp;        
  164. always @(posedge clk or negedge rst_n)
  165.     if(!rst_n) S_data7_temp <= 7'h3f;
  166.     else
  167.         case(C_data7)
  168.             4'd0:    S_data7_temp <= SEG_NUM0;
  169.             4'd1:    S_data7_temp <= SEG_NUM1;
  170.             4'd2:    S_data7_temp <= SEG_NUM2;
  171.             4'd3:    S_data7_temp <= SEG_NUM3;
  172.             4'd4:    S_data7_temp <= SEG_NUM4;
  173.             4'd5:    S_data7_temp <= SEG_NUM5;
  174.             4'd6:    S_data7_temp <= SEG_NUM6;
  175.             4'd7:    S_data7_temp <= SEG_NUM7;
  176.             4'd8:    S_data7_temp <= SEG_NUM8;
  177.             4'd9:    S_data7_temp <= SEG_NUM9;
  178.             default: S_data7_temp <= SEG_NUM0;
  179.         endcase   
  180. /***********************************/
  181. //数码管八要显示的列表数据(0~9
  182. reg [6:0] S_data8_temp;
  183. always @(posedge clk or negedge rst_n)
  184.     if(!rst_n) S_data8_temp <= 7'h3f;
  185.     else
  186.         case(C_data8)
  187.             4'd0:    S_data8_temp <= SEG_NUM0;
  188.             4'd1:    S_data8_temp <= SEG_NUM1;
  189.             4'd2:    S_data8_temp <= SEG_NUM2;
  190.             4'd3:    S_data8_temp <= SEG_NUM3;
  191.             4'd4:    S_data8_temp <= SEG_NUM4;
  192.             4'd5:    S_data8_temp <= SEG_NUM5;
  193.             4'd6:    S_data8_temp <= SEG_NUM6;
  194.             4'd7:    S_data8_temp <= SEG_NUM7;
  195.             4'd8:    S_data8_temp <= SEG_NUM8;
  196.             4'd9:    S_data8_temp <= SEG_NUM9;
  197.             default: S_data8_temp <= SEG_NUM0;
  198.         endcase
  199. assign data_db = data_dp;
  200. assign data = data_temp;   
  201. /**********************************************/    
  202. reg[6:0] data_temp;
  203. reg data_dp;
  204. always @(posedge clk or negedge rst_n)//在时钟的上升沿或复位的下降沿会执行下面的操作
  205.      if(!rst_n) begin
  206.      data_temp <= 7'b1111111;
  207.     end
  208.     else if(cnt == T5MS)
  209.  begin
  210.        case(count) //选择数码管显示位
  211. 3'd0:begin
  212.      //weixuan_r = 8'b01111111; //选择第一个数码管显示
  213.  data_temp = S_data1_temp;
  214.  data_dp = 1'b1;
  215.      end
  216. 3'd1:begin
  217.      //weixuan_r = 8'b10111111; //选择第二个数码管显示
  218.  data_temp = S_data2_temp;
  219.  data_dp = 1'b0;
  220.      end
  221. 3'd2:begin
  222.      //weixuan_r = 8'b11011111; //选择第三个数码管显示
  223.   data_temp = S_data3_temp;
  224.   data_dp = 1'b1;
  225.      end
  226. 3'd3:begin
  227.      //weixuan_r = 8'b11101111; //选择第四个数码管显示
  228.   data_temp = S_data4_temp;
  229.   data_dp = 1'b0;
  230.      end
  231. 3'd4:begin
  232.      //weixuan_r = 8'b11110111; //选择第五个数码管显示
  233.   data_temp = S_data5_temp;
  234.   data_dp = 1'b1;
  235.      end
  236. 3'd5:begin
  237.      //weixuan_r = 8'b11111011; //选择第六个数码管显示
  238.   data_temp = S_data6_temp;
  239.   data_dp = 1'b0;
  240.      end
  241. 3'd6:begin
  242.      //weixuan_r = 8'b11111101; //选择第七个数码管显示
  243.   data_temp = S_data7_temp;
  244.   data_dp = 1'b1;
  245.      end
  246. 3'd7:begin
  247.      //weixuan_r = 8'b11111110; //选择第八个数码管显示
  248.   data_temp = S_data8_temp;
  249.   data_dp = 1'b1;
  250.      end
  251.    endcase
  252.      count <= count + 1'b1;
  253.    end
  254. endmodule

模块仿真:

3.2.4 weixuan.v(位选控制)

  1. module weixuan(
  2.                clk,
  3. rst_n,
  4. weixuan
  5. );
  6. input clk;
  7. input rst_n;
  8. output[7:0] weixuan;
  9. parameter T5MS = 25'd100_000;//定义参数T5MS为
  10. /**********************************************/
  11. reg[7:0] weixuan_r;//声明select__wei是一个三位的寄存器
  12. reg[24:0] cnt; //声明cnt是一个18位的寄存器
  13. reg[2:0] count;
  14. /*******************************************************/
  15. assign weixuan = weixuan_r;
  16. /**********************************************/    
  17. //5ms计时
  18. always @(posedge clk or negedge rst_n)// 意思是在时钟的上升沿或复位的下降沿会执行下面的操作
  19.     if(!rst_n) cnt <= 25'd0;//如果复位则
  20.     else if(cnt == T5MS)
  21.         cnt <= 25'd0;  
  22.     else
  23.         cnt <= cnt + 1'b1;
  24. always @(posedge clk or negedge rst_n)//在时钟的上升沿或复位的下降沿会执行下面的操作
  25.      if(!rst_n) begin
  26.       weixuan_r <= 8'b11111111;
  27.     end
  28.     else if(cnt == T5MS)
  29.  begin
  30.        case(count) //选择数码管显示位
  31. 3'd0:begin
  32.      weixuan_r = 8'b01111111; //选择第一个数码管显示
  33.      end
  34. 3'd1:begin
  35.      weixuan_r = 8'b10111111; //选择第二个数码管显示
  36.      end
  37. 3'd2:begin
  38.      weixuan_r = 8'b11011111; //选择第三个数码管显示
  39.        end
  40. 3'd3:begin
  41.      weixuan_r = 8'b11101111; //选择第四个数码管显示
  42.      end
  43. 3'd4:begin
  44.      weixuan_r = 8'b11110111; //选择第五个数码管显示
  45.        end
  46. 3'd5:begin
  47.      weixuan_r = 8'b11111011; //选择第六个数码管显示
  48.        end
  49. 3'd6:begin
  50.      weixuan_r = 8'b11111101; //选择第七个数码管显示
  51.      end
  52. 3'd7:begin
  53.      weixuan_r = 8'b11111110; //选择第八个数码管显示
  54.      end
  55.    endcase
  56.      count <= count + 1'b1;
  57.    end
  58. endmodule

模块仿真:

3.2.5 xiaoshi.v (时显示) 

  1.  module xianshi(
  2.                  clk,
  3.         rst_n,
  4.   mkey,
  5.   
  6.         H_data1,
  7.      H_data2,
  8.      H_data3,
  9.      H_data4,
  10.      H_data5,
  11.      H_data6,
  12.      H_data7,
  13.      H_data8,
  14.   
  15.      Display_Model,//显示模式  0是时钟,1是闹钟设置
  16.   
  17.      N_data1,//闹钟
  18.      N_data2,
  19.      N_data3,
  20.      N_data4,
  21.   C_data1,//实际显示
  22.   C_data2,
  23.   C_data3,
  24.   C_data4,
  25.   C_data5,
  26.   C_data6,
  27.   C_data7,
  28.   C_data8,
  29.         );
  30. input clk;
  31. input rst_n;   
  32. input mkey;
  33. input [1:0] H_data1;
  34. input [3:0] H_data2;
  35. input [2:0] H_data3;
  36. input [3:0] H_data4;
  37. input [2:0] H_data5;
  38. input [3:0] H_data6;
  39. input [3:0] H_data7;
  40. input [3:0] H_data8;
  41. input Display_Model;
  42. input [1:0] N_data1;
  43. input [3:0] N_data2;
  44. input [2:0] N_data3;
  45. input [3:0] N_data4;
  46. output[1:0] C_data1;//实际显示
  47. output[3:0] C_data2;
  48. output[2:0] C_data3;
  49. output[3:0] C_data4;
  50. output[2:0] C_data5;  
  51. output[3:0] C_data6;
  52. output[3:0] C_data7;
  53. output[3:0] C_data8;
  54. reg [1:0] b_data1;
  55. reg [3:0] b_data2;
  56. reg [2:0] b_data3;
  57. reg [3:0] b_data4;
  58. reg [2:0] b_data5;
  59. reg [3:0] b_data6;
  60. reg [3:0] b_data7;
  61. reg [3:0] b_data8;
  62. parameter T5MS = 25'd100_000;//定义参数T5MS 扫描周期
  63. //定时发送数据
  64. reg [24:0] cnt;    
  65. reg [3:0] num;//每隔5MS,num加1
  66. always @(posedge clk or negedge rst_n)
  67.     if(!rst_n) begin
  68.         cnt <= 25'd0;
  69.         num <= 2'd0;
  70.     end
  71.     else if(cnt == T5MS) begin
  72.         num <= num + 1'b1;
  73.         cnt <= 25'd0;
  74.     end
  75.     else
  76.         cnt <= cnt + 1'b1;
  77. /******************************************/
  78. //通过Display_Model来确定是要送秒表数据还是时钟数据
  79. always @(posedge clk or negedge rst_n)
  80.     if(!rst_n)
  81.     begin
  82.                  b_data1 <= 1'd0;
  83.   b_data2 <= 3'd0;
  84.   b_data3 <= 2'd0;
  85.   b_data4 <= 3'd0;
  86.   b_data5 <= 2'd0;
  87.   b_data6 <= 3'd0;
  88.   b_data7 <= 3'd0;
  89.   b_data8 <= 3'd0;
  90. end
  91.     else
  92.  begin
  93. if(!mkey)//显示秒表 分秒10ms
  94. begin
  95.  case(num)
  96. 3'd0:    b_data1 <= Display_Model ? N_data2:H_data3;//每5ms给第一个数码管送数据 ,为闹钟模式时,显示闹钟值
  97. 3'd1:    b_data2 <= Display_Model ? N_data3:H_data4;//5ms给第二个数码管送数据
  98. 3'd2:    b_data3 <= Display_Model ? N_data4:H_data5;//每5ms给第三个数码管送数据
  99. 3'd3:    b_data4 <= H_data6;
  100. 3'd4:    b_data5 <= H_data7;
  101. 3'd5:    b_data6 <= H_data8;
  102. endcase
  103. end
  104. if(mkey)//显示时钟,时分秒
  105. begin
  106.   case(num)
  107. 3'd0:    b_data1 <= Display_Model ? N_data1:H_data1;//每5ms给第一个数码管送数据 ,为闹钟模式时,显示闹钟值
  108. 3'd1:    b_data2 <= Display_Model ? N_data2:H_data2;//5ms给第二个数码管送数据
  109. 3'd2:    b_data3 <= Display_Model ? N_data3:H_data3;//每5ms给第三个数码管送数据
  110. 3'd3:    b_data4 <= Display_Model ? N_data4:H_data4;//5ms给第四个数码管送数据
  111. 3'd4:    b_data5 <= H_data5;
  112. 3'd5:    b_data6 <= H_data6;
  113. 3'd6:    b_data7 <= H_data7;
  114. 3'd7:    b_data8 <= H_data8;
  115. endcase
  116. end
  117. end
  118. assign C_data1 = b_data1;
  119. assign C_data2 = b_data2;
  120. assign C_data3 = b_data3;
  121. assign C_data4 = b_data4;
  122. assign C_data5 = b_data5;
  123. assign C_data6 = b_data6;
  124. assign C_data7 = b_data7;
  125. assign C_data8 = b_data8;
  126. endmodule

模块仿真:

3.2.6naozhong.v(闹钟控制)

  1. module naozhong(
  2.               clk,
  3.   rst_n,
  4.   button,
  5.   H_data1,
  6.   H_data2,
  7.   H_data3,
  8.   H_data4,
  9.   
  10.   N_data1,
  11.   N_data2,
  12.   N_data3,
  13.   N_data4,
  14.   beep_1,
  15.   nled,
  16.   );
  17. input clk;
  18. input rst_n;   
  19. input button;
  20. output nled;
  21. reg nled;
  22. input [1:0] H_data1;
  23. input [3:0] H_data2;
  24. input [2:0] H_data3;
  25. input [3:0] H_data4;
  26. input [1:0] N_data1;
  27. input [3:0] N_data2;
  28. input [2:0] N_data3;
  29. input [3:0] N_data4;
  30. output beep_1;
  31. reg beep;
  32. assign beep_1 = beep;
  33. reg  flag1;
  34. reg  Y1,Y2,Y3,Y4;
  35. reg [2:0] Yout;
  36. always @(H_data1 or N_data1)
  37.      begin
  38.     if (H_data1 ==N_data1)
  39.    Y1 <= 1'b1;
  40. else
  41.       Y1 <= 1'b0;
  42.   end
  43. always @(H_data2 or N_data2)
  44.      begin
  45.     if (H_data2 == N_data2)
  46.    Y2 <= 1'b1;
  47. else
  48.       Y2 <= 1'b0;
  49.   end
  50.   
  51. always @(H_data3 or N_data3)
  52.      begin
  53.     if (H_data3 == N_data3)
  54.    Y3 <= 1'b1;
  55. else
  56.       Y3 <= 1'b0;
  57.   end   
  58.   
  59. always @(H_data4 or N_data4)
  60.      begin
  61.     if (H_data4 == N_data4)
  62.    Y4 <= 1'b1;
  63. else
  64.       Y4 <= 1'b0;
  65.   end   
  66.   
  67. always @(posedge clk or negedge rst_n)
  68.     if(!rst_n)
  69.   begin
  70. nled = 0;
  71. flag1 = 1'b0;
  72. beep = 1'b0;
  73.   end
  74.     else
  75.  begin
  76.  if(button==1)
  77.   begin
  78.      Yout =Y1+Y2+Y3+Y4;
  79.     flag1 <= 1'b1;
  80.  nled =1;
  81.     if(Yout==3'd4 )
  82.       beep = 1'b1;
  83. else
  84. beep = 1'b0;//一分钟响铃
  85.      end
  86. else
  87. begin
  88. nled =0;
  89. beep = 1'b0;//一分钟响铃
  90. end
  91.  end
  92. endmodule

模块仿真:

3.2.7 model.v(模式选择)

  1. module model(
  2.               clk,
  3.   rst_n,
  4.   pin_status_ctrl,
  5.   H_data1,
  6.   H_data2,
  7.   H_data3,
  8.   H_data4,
  9.   H_data5,
  10.   H_data6,
  11.   H_data7,
  12.   H_data8,
  13.   
  14.   Display_Model,
  15.   Time_model,
  16.   N_data1,
  17.   N_data2,
  18.   N_data3,
  19.   N_data4,
  20.   LED
  21.   );
  22. input clk;
  23. input rst_n;   
  24. input [2:0] pin_status_ctrl;//按键输入
  25. output [3:0] LED;//模式指示灯
  26. reg [3:0] LED;
  27. output [1:0] H_data1;//计时器数据
  28. output [3:0] H_data2;
  29. output [2:0] H_data3;
  30. output [3:0] H_data4;
  31. output [2:0] H_data5;
  32. output [3:0] H_data6;
  33. output [3:0] H_data7;
  34. output [3:0] H_data8;
  35. output Display_Model;
  36. output [1:0] N_data1;//闹钟数据
  37. output [3:0] N_data2;
  38. output [2:0] N_data3;
  39. output [3:0] N_data4;
  40. parameter   T_fenMiao     = 25'd500_000;//500_000 系统时钟50MHZ时钟分频 即50 000 000 /500 000 = 100hz  0.01s 记100次为1s
  41. //分秒计数器
  42. reg [24:0] Cnt_FenMiao;
  43. always @(posedge clk or negedge rst_n)
  44.     if(!rst_n) Cnt_FenMiao <= 25'd0;
  45.     else if((Cnt_FenMiao == T_fenMiao)||(!isCount))
  46.      Cnt_FenMiao <= 25'd0;
  47.     else
  48.         Cnt_FenMiao <= Cnt_FenMiao + 1'b1;    
  49. /************************************************************/
  50.   
  51. //模式控制
  52. //0计时模式,1,调分,2调时,304,闹钟分,5,闹钟时
  53. reg[2:0] Time_model;
  54. output[2:0] Time_model;
  55. always @(posedge clk or negedge rst_n)
  56.     if(!rst_n) Time_model <= 3'd0;
  57.     else if(pin_status_ctrl[0])
  58.         begin
  59.             if(Time_model == 3'd5)
  60.                 Time_model <= 3'd0;
  61.             else
  62.             Time_model <= Time_model + 1'd1;
  63.         end
  64.   
  65. reg Display_Model;
  66. reg isCount;//控制时间计数器   为0,停止计数,默认给1
  67. reg [1:0] flag;//用来标志reg1小时十位是否到了2,到了2,reg2个位只能加到4
  68. reg [1:0] n_flag;
  69. //时钟
  70. reg [1:0] reg1;
  71. reg [3:0] reg2;
  72. reg [2:0] reg3;
  73. reg [3:0] reg4;
  74. reg [2:0] reg5;
  75. reg [3:0] reg6;
  76. reg [3:0] reg7;
  77. reg [3:0] reg8;
  78. //闹钟
  79. reg [1:0] n_reg1;
  80. reg [3:0] n_reg2;
  81. reg [2:0] n_reg3;
  82. reg [3:0] n_reg4;
  83. always @(posedge clk or negedge rst_n)
  84.     if(!rst_n) begin
  85.         isCount <= 1'b0;
  86.         LED = 4'B0000;
  87.         reg1 <= 2'd0;
  88.         reg2 <= 4'd0;
  89.         reg3 <= 3'd0;
  90.         reg4 <= 4'd0;
  91.         reg5 <= 3'd0;
  92.         reg6 <= 4'd0;
  93.   reg7 <= 4'd0;
  94.         reg8 <= 4'd0;
  95.   n_reg1 <= 2'd0;
  96.         n_reg2 <= 4'd0;
  97.         n_reg3 <= 3'd0;
  98.         n_reg4 <= 4'd0;
  99.     end
  100.     else
  101.         case(Time_model)
  102.         //时钟正常开始跑
  103.             3'd0:
  104.             begin
  105.                  Display_Model <= 1'b0;//显示时钟
  106.                  isCount <= 1'b1;//启动计数
  107.   LED = 4'B0000;
  108.                  if(Cnt_FenMiao == T_fenMiao)
  109.                 begin
  110.                     reg8 <= reg8 + 1'b1;
  111.   
  112.                     if(reg8 == 4'd9)
  113.                     begin
  114.                         reg8 <= 4'd0;
  115.                         reg7 <= reg7 + 1'b1;
  116.                         if(reg7 == 4'd9)
  117.                         begin
  118.                             reg7 <= 4'd0;
  119.                             reg6 <= reg6 +1'b1;
  120.  if(reg6 == 4'd9)
  121.  begin
  122.      reg6 <=4'd0;
  123.   reg5 <= reg5 +1'b1;
  124.   if(reg5 == 3'd5)
  125.   begin
  126.       reg5 <= 3'd0;
  127.       reg4 <= reg4 +1'b1;
  128. if(reg4==4'd9)
  129. begin
  130.     reg4 <= 4'd0;
  131.  reg3 <=reg3 +1'b1;
  132.  if(reg3==3'd5)
  133.  begin
  134.    reg3 <= 3'd0;
  135.                                           if(reg1 == 2'd2)
  136.                                           begin
  137.                                              reg2 <= reg2 + 1'b1;
  138.                                              if(reg2 == 4'd3)
  139.                                              begin
  140.                                                  reg2 <= 4'd0;                
  141.                                                  reg1 <= 2'd0;                            
  142.                                              end
  143.                                           end
  144.                                           else
  145.                                           begin
  146.                                               reg2 <= reg2 + 1'b1;
  147.                                               if(reg2 == 4'd9)
  148.                                               begin
  149.                                                 reg2 <= 4'd0;
  150.                                                 reg1 <= reg1 + 1'b1;
  151.                                               end
  152.                                            end
  153.  end
  154. end
  155.     
  156.   end
  157.   
  158.  end
  159.                         end
  160.                         
  161.                     end
  162.                 end
  163.             end
  164.             //调分模式               
  165.             3'd1:
  166.             begin
  167.                 isCount <= 1'b1;
  168.   LED = 4'B0001;
  169.                 if(pin_status_ctrl[2])//
  170.                 begin
  171.                     reg4 <= reg4 + 1'b1;
  172.                     if(reg4 == 4'd9)
  173.                     begin
  174.                         reg4 <= 4'd0;
  175.                         reg3 <= reg3 + 1'b1;
  176.                         if(reg3 > 3'd5)
  177.                             reg3 <= 3'd0;
  178.                     end
  179.                 end
  180.                 else if(pin_status_ctrl[1])//
  181.                     begin
  182.                         reg4 <= reg4 - 1'b1;
  183.                         if(reg4 == 4'd0)
  184.                             begin
  185.                                 reg4 <= 4'd9;
  186.                                 reg3 <= reg3 - 1'b1;
  187.                                 if(reg3 == 3'd0)
  188.                                     reg3 <= 3'd5;//这里写反了之前
  189.                             end
  190.                     end
  191.             end
  192.             //调时模式
  193.             3'd2:
  194.             begin
  195.                 isCount <= 1'b1;
  196.   LED = 4'B0010;
  197.                 if(pin_status_ctrl[2])//加
  198.                 begin
  199.                     if(flag == 2'd2)
  200.                     begin
  201.                         reg2 <= reg2 + 1'b1;
  202.                         if(reg2 >= 4'd3)
  203.                         begin
  204.                             reg2 <= 4'd0;
  205.                             reg1 <= 2'd0;
  206.                             flag <= 2'd0;
  207.                         end
  208.                     end
  209.                     else
  210.                     begin
  211.                         reg2 <= reg2 + 1'b1;
  212.                         if(reg2 == 4'd9)
  213.                         begin
  214.                             flag <= flag + 1'b1;
  215.                             reg2 <= 4'd0;
  216.                             reg1 <= reg1 + 1'b1;
  217.                             if(reg1 == 2'd2)
  218.                             begin
  219.                                 reg1 <= 2'd0;
  220.                             end
  221.                         end
  222.                     end
  223.                 end
  224.                 else if(pin_status_ctrl[1])//
  225.                     begin
  226.                         reg2 <= reg2 - 1'b1;
  227.                         if(reg2 == 4'd0)
  228.                             begin
  229.                                 reg2 <= 4'd9;
  230.                                 reg1 <= reg1 - 1'b1;
  231.                                 if(reg1 == 2'd2)
  232.                                     reg1 <= 2'd0;
  233.                             end
  234.                     end
  235.             end    
  236.             
  237.             3'd3:
  238. begin
  239.                     isCount <= 1'b1;//时间计数还得继续接着跑
  240.    LED = 4'B0010;
  241.        if(pin_status_ctrl[1])
  242.          begin
  243.   if(reg5 >= 3'd3)
  244.      begin
  245.         reg4 <= reg4 + 1'b1;
  246.                  reg5 <= 3'd0;
  247.                  reg6 <= 4'd0;
  248.                  reg7 <= 4'd0;
  249.                  reg8 <= 4'd0;
  250. end
  251. else
  252.    begin
  253.   reg5 <= 3'd0;
  254.                  reg6 <= 4'd0;
  255.                  reg7 <= 4'd0;
  256.                  reg8 <= 4'd0;
  257.    end
  258.          end
  259.                 end
  260. 3'd4://设置闹钟分
  261. begin
  262.     Display_Model <= 1'b1;//显示闹钟
  263.  LED = 4'B0100;
  264.  if(pin_status_ctrl[2])//
  265.                 begin
  266.                     n_reg4 <= n_reg4 + 1'b1;
  267.                     if(n_reg4 == 4'd9)
  268.                     begin
  269.                         n_reg4 <= 4'd0;
  270.                         n_reg3 <= n_reg3 + 1'b1;
  271.                         if(n_reg3 > 3'd5)
  272.                             n_reg3 <= 3'd0;
  273.                     end
  274.                 end
  275.                 else if(pin_status_ctrl[1])//
  276.                     begin
  277.                         n_reg4 <= n_reg4 - 1'b1;
  278.                         if(n_reg4 == 4'd0)
  279.                             begin
  280.                                 n_reg4 <= 4'd9;
  281.                                 n_reg3 <= n_reg3 - 1'b1;
  282.                                 if(n_reg3 == 3'd5)
  283.                                    n_reg3 <= 3'd0;
  284.                             end
  285.                     end
  286. end  
  287. 3'd5://设置闹钟小时
  288. begin
  289. LED = 4'B1000;
  290.       if(pin_status_ctrl[2])//
  291.                 begin
  292.                     if(n_flag == 2'd2)
  293.                     begin
  294.                         n_reg2 <= n_reg2 + 1'b1;
  295.                         if(n_reg2 >= 4'd3)
  296.                         begin
  297.                             n_reg2 <= 4'd0;
  298.                             n_reg1 <= 2'd0;
  299.                             n_flag <= 2'd0;
  300.                         end
  301.                     end
  302.                     else
  303.                     begin
  304.                         n_reg2 <= n_reg2 + 1'b1;
  305.                         if(n_reg2 == 4'd9)
  306.                         begin
  307.                             n_flag <= n_flag + 1'b1;
  308.                             n_reg2 <= 4'd0;
  309.                             n_reg1 <= n_reg1 + 1'b1;
  310.                             if(n_reg1 == 2'd2)
  311.                             begin
  312.                                 n_reg1 <= 2'd0;
  313.                             end
  314.                         end
  315.                     end
  316.                 end
  317.                 else if(pin_status_ctrl[1])//减
  318.                     begin
  319.                         n_reg2 <= n_reg2 - 1'b1;
  320.                         if(n_reg2 == 4'd0)
  321.                             begin
  322.                                 n_reg2 <= 4'd9;
  323.                                 n_reg1 <= n_reg1 - 1'b1;
  324.                                 if(n_reg1 == 2'd2)
  325.                                     n_reg1 <= 2'd0;
  326.                             end
  327.                     end
  328. end
  329.   
  330.         endcase
  331. /************************************************/
  332. assign H_data1 = reg1;
  333. assign H_data2 = reg2;
  334. assign H_data3 = reg3;
  335. assign H_data4 = reg4;
  336. assign H_data5 = reg5;
  337. assign H_data6 = reg6;
  338. assign H_data7 = reg7;
  339. assign H_data8 = reg8;
  340. assign N_data1 = n_reg1;
  341. assign N_data2 = n_reg2;
  342. assign N_data3 = n_reg3;
  343. assign N_data4 = n_reg4;
  344. /************************************************/
  345. endmodule

模块仿真:

3.3 系统总原理框图

3.4 仿真波形

秒仿真波形

分仿真波形

时仿真波形

调整时间的控制仿真波形

闹钟仿真波形

时间与闹钟显示切换仿真波形

四、实物调试效果  

4.1 硬件管脚分配说明

4.2 实物及现象

元件说明:

按键:从左到右依次为R1(复位按键),K0(模式选择按键),K1(数值减按键),K2(数值加按键),K3(显示分,秒,毫秒按键)。

LED灯(贴片):从左到右依次是LED1(指示设置闹钟小时位),LED2(指示设置闹钟分钟位),LED3(调时或者校秒指示灯,按下K1是秒数大于30则秒数加一,秒数小于30则秒数清零),LED4(调分指示灯)。

红色LED(直插式):LED(上)为闹钟模式开启指示灯,LED(下)为按照蜂鸣器发声频率闪烁的闹铃提示灯。

黄色杜邦线:代替拨码开关,一端连接在F3引脚上,另外一端接3.3V时闹钟模式开,LED(上)亮,接GND时闹钟模式关,LED(上)灭。

操作现象说明:

开发板上电默认从零开始显示时,分,秒并正常走时,按下R1时复位清零。按下K0一次进入调分模式,LED4指示灯亮,这时可按需求按下K1或K2来校准分钟。按下K0两次进入调时模式,LED3指示灯亮,这时可按需求按下K1或K2来校准小时。按下K0三次进入校秒模式,LED3指示灯亮,这时可按需求按下K1或K2来校准秒数。按下K0四次进入设置闹钟分钟位模式,LED2指示灯亮,这时可按需求按下K1或K2来设置闹钟定时时间。按下K0五次进入设置闹钟小时位模式,LED1指示灯亮,这时可按需求按下K1或K2来设置闹钟定时时间。按下K3不动时,数码管显示分,秒,毫秒。

  • 课程设计的体会

本次从查阅文献,到可实施方案的设计,VerilogHDL的编写,有以下体会

  首先:在设计思路上存在严重模糊,逻辑混乱,尤其在顶层模块的设计时不能理清模块之间的相互关系,对一些基本概念缺乏准确的认识;

  其次:对软件的安装及操作环境的不熟悉导致实验进行的缓慢;

  第三:没有好好学VerilogHDL语言常常犯一些低级的语法错误,即使是一个标点、匹配问题、数据类型定义错了都会导致一连串的错误,故在编程时一定要倍加仔细;

  第四:在仿真波形的观察与分析上明显感到专业知识的不够,尤其在对分频,扫描,译码,显示电路这块由于扫描频率、延时单位、时间精度及运行时间没有设计好导致无法观察实验意达到的波形及显示结果;

  第五:经过不断地查找资料和尝试,我们做出了基础功能,但是在小组成员间的相互鼓励和勇敢向前,积极进取的学习态度下,我们进一步做出了多功能数字电子钟的功能扩展另外并加上了自己的一些小设计。实验是检验原理方案的唯一方法,只有通过不断的尝试、观察、分析才能得到正确的实验结果。

  最后:此次FPGA课程设计让我们收获良多,学习了数字系统自上而下的设计方法,进一步熟悉层次电路的设计方法。自顶而下的电子设计方法能使程序之间条理理清晰,分工明确,便于设计。同时也培养了自己动手设计实验的能力及对计算机软件编程应用方面的兴趣也为今后的学习打好基础。

在验证功能中,也纠正了自己的一些疑惑。

(1)实验过程中发现数码管部分管子的时不亮时微亮导致数字的显示不清晰。分析数码管的扫描频率为系统脉冲50MHz,而FPGA数码管的扫描频率不支持太高频率或者是数码管的管脚不支持太高频,而把扫描频率降下来即可。

(2)在观察实验的过程中将parameter  T_fenMiao  = 25'd500_000;//500_000 系统时钟50MHZ时钟分频 即50 000 000 /500 000 = 100hz  0.01s 记100次为1s,修改数据可以让时间按照自己想要的速度走秒,方便观察实验结果。

在这次课程设计中,我们也遇到了一些十分棘手的问题,靠查找资料,求教同学完成了这次课程设计。这也让我们明白了团队合作的重要性,谢谢老师和我的小伙伴们。

、参考文献

[1]刘睿劼. 基于FPGA的多功能数字钟设计[J]. 电脑与电信, 2009(05):77-79.

[2]蒋昕怡. EDA设计(Ⅱ) 多功能数字钟[J]. 数码设计(上), 2018.

[3]吴小红. 基于FPGA的多功能数字钟的设计与实现[J]. 电子测试, 2018, 000(022):19-20,22.

[4]方润生、邓佳宁、于海霞. 基于FPGA多功能数字钟的设计[J]. 电子世界, 2020(17):2.

重点说明:!!!!!!!!!!!!!!!

        本设计参考了网上的电子时钟代码,并在基础上加了一些自己的功能,程序中存在一些bug,只为了完成课程设计,达到要求就行,不喜勿喷,如果对你有用的话请不要忘记给我一个免费的赞哦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!报告为小组成员完成

代码+报告地址

网盘链接:https://pan.baidu.com/s/1BRbhQ2dcf18EwlXxKyldfg

解压码请点赞收藏后私信哈,报告皆为我女朋友所著,切勿完全抄袭,尊重他人劳动成果。谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

CSDN资源链接:https://download.csdn.net/download/ryncgh/85423178?spm=1001.2014.3001.5503

数字时钟完整演示

VID_20220519_101757

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/722010
推荐阅读
相关标签
  

闽ICP备14008679号