当前位置:   article > 正文

FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)_使用小脚丫fpga开发板设计简易数字时钟

使用小脚丫fpga开发板设计简易数字时钟

一、实现功能

1. 能正常完成时钟的时、分、秒走时;

2. 使用LED闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为1Hz

3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住K4键显示“小时”,按下K3显示秒针;

4. 关上开关sw2,使用K1K2键调整时间,分别为“+”和“-”,则K1K2调整“分钟”,当K4按下,则K1K2调整“小时”,当K3按下,则K1K2调整“秒针”;

5. 整点报时:当时间到达每个整点,则全彩LED以某种固定颜色按1Hz频率闪烁相应次数(按24小时制);

6. 闹钟设置,将sw3开关设置为1,开始设置固定时钟和分钟,当时间计时到达时,八个led灯闪烁一分钟;

二、实验

1.整体结构

2.主函数 

  1. // Module Function:时钟设计
  2.  
  3. module time_clock (clk,rst,seg_led_1,seg_led_2,led,key,sw2,sw3,led_rgb1,led_rgb2);
  4.  
  5.     input clk,rst;
  6.     input [3:0]key;
  7.     input sw2,sw3;
  8.     output reg [8:0] seg_led_1;
  9.     output reg [8:0] seg_led_2;    
  10.     output reg [7:0] led;
  11.     output reg [2:0] led_rgb1=3'b 111;
  12.     output reg [2:0] led_rgb2=3'b 111;
  13.     
  14.         
  15.         reg   [3:0] cnt1 ;                               //定义了一个4位的计数器
  16.         reg   [3:0] count1;
  17.         reg   [3:0] count_set_1;
  18.         reg   [3:0] cnt2 ;
  19.         reg   [3:0] count2;
  20.         reg   [3:0] count_set_2;
  21.         reg   [3:0] cnt3 ;                               //定义了一个4位的计数器
  22.         reg   [3:0] count3;
  23.         reg   [3:0] count_set_3;
  24.         reg   [3:0] cnt4 ;
  25.         reg   [3:0] count4;
  26.         reg   [3:0] count_set_4;
  27.         reg   [3:0] cnt5 ;                               //定义了一个4位的计数器
  28.         reg   [3:0] count5;
  29.         reg   [3:0] count_set_5;
  30.         reg   [3:0] cnt6 ;
  31.         reg   [3:0] count6;
  32.         reg   [3:0] count_set_6;
  33.         reg   [30:0]count_1s;
  34.         reg   [30:0]count_05s;
  35.         reg [15 : 0] count;
  36.         reg [15 : 0] count0;
  37.         reg [8:0] seg [9:0]; 
  38.      
  39.         wire clk1s;                                     //定义一个中间变量,表示分频得到的时钟,用作计数器的触发        
  40.         
  41.         
  42.         //间隔脉冲模块,产生一个   秒针    时钟信号
  43.         parameter N1 = 12000000;
  44.     always@(posedge clk) begin
  45.     if(!rst) 
  46.         count_1s <= 0;
  47.     else if(count_1s == N1-1)
  48.         count_1s<=0;
  49.     else
  50.         count_1s<= count_1s + 1;
  51.     end
  52.     //间隔脉冲模块,产生一个调整  间隔     信号时钟信号
  53.     parameter N2 = 1500000;
  54.     always@(posedge clk) begin
  55.     if(!rst) 
  56.         count_05s <= 0;
  57.     else if(count_05s == N2-1)
  58.         count_05s<= 0;
  59.     else
  60.         count_05s<= count_05s + 1;
  61.     end
  62.        
  63.      
  64.     divide #(.WIDTH(32),.N(12000000)) u2 (         //传递参数
  65.             .clk(clk),
  66.             .rst_n(rst),                   //例化的端口信号都连接到定义好的信号
  67.             .clkout(clk1s)
  68.             );   
  69.      
  70.      
  71.        always @(posedge clk or negedge rst)
  72. begin
  73.             
  74.             if (!rst) //---------------------------------------------异步清零
  75.                  begin
  76.                     cnt1 <= 0;
  77.                     cnt2<=0;
  78.                     cnt3 <= 0;
  79.                     cnt4<=0;
  80.                     cnt5 <= 0;
  81.                     cnt6<=0;
  82.                  end
  83.             //----------------------------------------开始计时
  84.         else
  85.         begin
  86.             if(sw2==1)//sw2调整时间的开关   1:开始计时   0:调整时间    sw3为闹钟设置开关 设置闹钟模式sw3:1  退出设置闹钟模式sw3:0 
  87.             begin
  88.                             if(count_1s==N1-1 )
  89.                                 begin
  90.                                 //秒
  91.                                      if((cnt2==5)&&(cnt1==9))
  92.                                         begin
  93.                                             cnt1<=0;
  94.                                             cnt2<=0;
  95.                                         //分钟
  96.                                             if((cnt4==5)&&(cnt3==9))
  97.                                                 begin
  98.                                                     cnt3<=0;
  99.                                                     cnt4<=0;
  100.                                                     //小时
  101.                                                     if((cnt6==2)&&(cnt5==3))
  102.                                                         begin
  103.                                                         cnt5<=0;
  104.                                                         cnt6<=0;
  105.                                                         end
  106.                                                     else if(cnt5==9)
  107.                                                         begin
  108.                                                         cnt5<=0;
  109.                                                         cnt6<=cnt6+1;
  110.                                                         end
  111.                                                      else
  112.                                                         begin
  113.                                                         cnt5<=cnt5+1;
  114.                                                         end
  115.                                                     //小时
  116.                                                 end
  117.                                             else if(cnt3==9)
  118.                                                 begin
  119.                                                 cnt3<=0;
  120.                                                 cnt4<=cnt4+1;
  121.                                                 end
  122.                                              else
  123.                                                 begin
  124.                                                 cnt3<=cnt3+1;
  125.                                                 end
  126.                                         end
  127.                                         //分钟
  128.                                     else if(cnt1==9)
  129.                                         begin
  130.                                         cnt1<=0;
  131.                                         cnt2<=cnt2+1;
  132.                                         end
  133.                                      else
  134.                                         begin
  135.                                         cnt1<=cnt1+1;
  136.                                         end
  137.                                         
  138.                                 //秒
  139.                                 end
  140.                             
  141.                     
  142.                            
  143.             end
  144.             //-------------------------------------------------------------------暂停调整时间
  145.             if(sw2==0 && sw3==0)
  146.             begin
  147.                 if(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针
  148.                     begin
  149.                         if(  key[0]==0 )
  150.                             begin
  151.                                 if(count_05s==N2-1)
  152.                                 begin
  153.                                     if((cnt4==5)&&(cnt3==9))
  154.                                             begin
  155.                                             cnt3<=0;
  156.                                             cnt4<=0;
  157.                                             end
  158.                                     else if(cnt3==9 )
  159.                                             begin
  160.                                             cnt3<=0;
  161.                                             cnt4<=cnt4+1;
  162.                                             end
  163.                                     else
  164.                                             begin
  165.                                             cnt3<=cnt3+1;
  166.                                             end
  167.                                 end
  168.                                 
  169.                                 
  170.                             end
  171.                         else if(key[1]==0)
  172.                          
  173.                             begin
  174.                                 if(count_05s==N2-1)
  175.                                 begin
  176.                                     if(cnt3==0 && cnt4==0)
  177.                                         begin
  178.                                         cnt3<=9;
  179.                                         cnt4<=5;
  180.                                         end
  181.                                     else if(cnt3==0)
  182.                                         begin
  183.                                         cnt3<=9;
  184.                                         cnt4<=cnt4-1;
  185.                                         end
  186.                                     else
  187.                                         cnt3<=cnt3-1;
  188.                                 end
  189.                             
  190.                     end
  191.                     else
  192.                         begin
  193.                         cnt3<=cnt3;
  194.                         cnt4<=cnt4;
  195.                         end
  196.                     end
  197.             
  198.                 else if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针
  199.                     begin
  200.                         if(  key[0]==0 )
  201.                             begin
  202.                                 if(count_05s==N2-1)
  203.                                 begin
  204.                                     if((cnt6==2)&&(cnt5==3))
  205.                                             begin
  206.                                             cnt5<=0;
  207.                                             cnt6<=0;
  208.                                             end
  209.                                     else if(cnt5==9)
  210.                                             begin
  211.                                             cnt5<=0;
  212.                                             cnt6<=cnt6+1;
  213.                                             end
  214.                                     else
  215.                                             begin
  216.                                             cnt5<=cnt5+1;
  217.                                             end
  218.                                 end
  219.                             end
  220.                         else if(key[1]==0)
  221.                          
  222.                             begin
  223.                                 if(count_05s==N2-1)
  224.                                 begin
  225.                                     if(cnt5==0 && cnt6==0)
  226.                                         begin
  227.                                         cnt5<=3;
  228.                                         cnt6<=2;
  229.                                         end
  230.                                     else if(cnt5==0)
  231.                                         begin
  232.                                         cnt5<=9;
  233.                                         cnt6<=cnt6-1;
  234.                                         end
  235.                                     else
  236.                                         cnt5<=cnt5-1;
  237.                                 end
  238.                                 
  239.                             end
  240.                         else
  241.                             begin
  242.                             cnt5<=cnt5;
  243.                             cnt6<=cnt6;
  244.                             end
  245.                     end
  246.                 else if(key[2]==0 && key[3]==1)//-----------------------------------------------调整秒针
  247.                     begin
  248.                         if(  key[0]==0 )
  249.                             begin
  250.                                 if(count_05s==N2-1)
  251.                                 begin
  252.                                     if((cnt2==5)&&(cnt1==9))
  253.                                             begin
  254.                                             cnt1<=0;
  255.                                             cnt2<=0;
  256.                                             end
  257.                                     else if(cnt1==9)
  258.                                             begin
  259.                                             cnt1<=0;
  260.                                             cnt2<=cnt2+1;
  261.                                             end
  262.                                     else
  263.                                             begin
  264.                                             cnt1<=cnt1+1;
  265.                                             end
  266.                                 end
  267.                             end
  268.                         else if(key[1]==0)
  269.                          
  270.                             begin
  271.                                 if(count_05s==N2-1)
  272.                                 begin
  273.                                     if(cnt1==0 && cnt2==0)
  274.                                         begin
  275.                                         cnt1<=9;
  276.                                         cnt2<=5;
  277.                                         end
  278.                                     else if(cnt1==0)
  279.                                         begin
  280.                                         cnt1<=9;
  281.                                         cnt2<=cnt2-1;
  282.                                         end
  283.                                     else
  284.                                         cnt1<=cnt1-1;
  285.                                 end
  286.                                 
  287.                             end
  288.                         else
  289.                             begin
  290.                             cnt1<=cnt1;
  291.                             cnt2<=cnt2;
  292.                             end
  293.                     end
  294.                 
  295.             end
  296.             //-----------------------------------------------设置闹钟 
  297.          
  298.             if(sw3==1 )
  299.             begin
  300.                 if(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针
  301.                     begin
  302.                         if(  key[0]==0 )
  303.                             begin
  304.                                 if(count_05s==N2-1)
  305.                                 begin
  306.                                     if((count_set_4==5)&&(count_set_3==9))
  307.                                             begin
  308.                                             count_set_3<=0;
  309.                                             count_set_4<=0;
  310.                                             end
  311.                                     else if(count_set_3==9 )
  312.                                             begin
  313.                                             count_set_3<=0;
  314.                                             count_set_4<=count_set_4+1;
  315.                                             end
  316.                                     else
  317.                                             begin
  318.                                             count_set_3<=count_set_3+1;
  319.                                             end
  320.                                 end
  321.                                 
  322.                                 
  323.                             end
  324.                         else if(key[1]==0)
  325.                          
  326.                             begin
  327.                                 if(count_05s==N2-1)
  328.                                 begin
  329.                                     if(count_set_3==0 && count_set_4==0)
  330.                                         begin
  331.                                         count_set_3<=9;
  332.                                         count_set_4<=5;
  333.                                         end
  334.                                     else if(count_set_3==0)
  335.                                         begin
  336.                                         count_set_3<=9;
  337.                                         count_set_4<=count_set_4-1;
  338.                                         end
  339.                                     else
  340.                                         count_set_3<=count_set_3-1;
  341.                                 end
  342.                             
  343.                     end
  344.                     else
  345.                         begin
  346.                         count_set_3<=count_set_3;
  347.                         count_set_4<=count_set_4;
  348.                         end
  349.                     end
  350.             
  351.                 else if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针
  352.                     begin
  353.                         if(  key[0]==0 )
  354.                             begin
  355.                                 if(count_05s==N2-1)
  356.                                 begin
  357.                                     if((count_set_6==2)&&(count_set_5==3))
  358.                                             begin
  359.                                             count_set_5<=0;
  360.                                             count_set_6<=0;
  361.                                             end
  362.                                     else if(count_set_5==9)
  363.                                             begin
  364.                                             count_set_5<=0;
  365.                                             count_set_6<=count_set_6+1;
  366.                                             end
  367.                                     else
  368.                                             begin
  369.                                             count_set_5<=count_set_5+1;
  370.                                             end
  371.                                 end
  372.                             end
  373.                         else if(key[1]==0)
  374.                          
  375.                             begin
  376.                                 if(count_05s==N2-1)
  377.                                 begin
  378.                                     if(count_set_5==0 && count_set_6==0)
  379.                                         begin
  380.                                         count_set_5<=3;
  381.                                         count_set_6<=2;
  382.                                         end
  383.                                     else if(count_set_5==0)
  384.                                         begin
  385.                                         count_set_5<=9;
  386.                                         count_set_6<=count_set_6-1;
  387.                                         end
  388.                                     else
  389.                                         count_set_5<=count_set_5-1;
  390.                                 end
  391.                                 
  392.                             end
  393.                         else
  394.                             begin
  395.                             count_set_5<=count_set_5;
  396.                             count_set_6<=count_set_6;
  397.                             end
  398.             
  399.                     end
  400.             
  401.             
  402.             end
  403.         end         
  404. end
  405.  //--------------------------------------------------------------------数码管显示
  406.         
  407.                                 //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial
  408.     initial                                                      //initial和always不同,其中语句只执行一次
  409.         begin
  410.           seg[0] = 9'h3f;                                           //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字  0
  411.           seg[1] = 9'h06;                                           //7段显示数字  1
  412.           seg[2] = 9'h5b;                                           //7段显示数字  2
  413.           seg[3] = 9'h4f;                                           //7段显示数字  3
  414.           seg[4] = 9'h66;                                           //7段显示数字  4
  415.           seg[5] = 9'h6d;                                           //7段显示数字  5
  416.           seg[6] = 9'h7d;                                           //7段显示数字  6
  417.           seg[7] = 9'h07;                                           //7段显示数字  7
  418.           seg[8] = 9'h7f;                                           //7段显示数字  8
  419.           seg[9] = 9'h6f;                                           //7段显示数字  9
  420.      end
  421. always @(posedge clk)
  422. begin 
  423.     if(sw3==0)
  424.     begin
  425.         if(key[2]==1 && key[3]==0)
  426.             begin
  427.             count5<=cnt5;
  428.             count6<=cnt6;
  429.             seg_led_1<=seg[count6];
  430.             seg_led_2<=seg[count5]; 
  431.     
  432.             end
  433.         else if(key[2]==0 && key[3]==1)
  434.         begin
  435.             count1<=cnt1;
  436.             count2<=cnt2;
  437.             seg_led_1<=seg[count2];
  438.             seg_led_2<=seg[count1]; 
  439.         end
  440.         else
  441.         begin
  442.             count4<=cnt4;
  443.             count3<=cnt3;
  444.             seg_led_1<=seg[count4];
  445.             seg_led_2<=seg[count3]; 
  446.         end
  447.     end
  448.     else
  449.     begin
  450.         if(key[2]==1 && key[3]==0)
  451.             begin
  452.             count5<=count_set_5;
  453.             count6<=count_set_6;
  454.             seg_led_1<=seg[count6];
  455.             seg_led_2<=seg[count5]; 
  456.     
  457.             end
  458.         else if(key[2]==0 && key[3]==1)
  459.         begin
  460.             count1<=count_set_1;
  461.             count2<=count_set_2;
  462.             seg_led_1<=seg[count2];
  463.             seg_led_2<=seg[count1]; 
  464.         end
  465.         else
  466.         begin
  467.             count4<=count_set_4;
  468.             count3<=count_set_3;
  469.             seg_led_1<=seg[count4];
  470.             seg_led_2<=seg[count3]; 
  471.         end
  472.     end
  473.     
  474. end
  475. //--------------------------------------------整点--三色灯闪烁
  476. always @(posedge clk1s)
  477. begin
  478.     led_rgb2[0]<=~led_rgb2[0];//--------------------------------------------三色灯秒钟闪烁
  479.     if(cnt3==0 && cnt4==0)
  480.         begin
  481.             led_rgb1[0]<=~led_rgb1[0];
  482.         end
  483.     else
  484.         begin
  485.             led_rgb1[0]<=1;
  486.             
  487.         end
  488.         
  489. end
  490. //-------------------------------------------闹钟闪烁
  491. always @(posedge clk1s)
  492. begin
  493.     if(count_set_3 == cnt3 && count_set_4 == cnt4 && count_set_5 == cnt5 &&  count_set_6 == cnt6)
  494.     begin
  495.             
  496.             led<=~led;
  497.     end  
  498.     else
  499.     begin
  500.             led<=8'b 11111111;
  501.     end
  502. end
  503.   
  504. endmodule

3.分频器

  1. // Module Function:任意整数时钟分频
  2. module divide ( clk,rst_n,clkout);
  3. input clk,rst_n; //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
  4. output clkout; //输出信号,可以连接到LED观察分频的时钟
  5. //parameter是verilog里常数语句
  6. parameter WIDTH = 24; //计数器的位数,计数的最大值为 2**WIDTH-1
  7. parameter N = 12_000_000; //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
  8. reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
  9. reg clk_p,clk_n; //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
  10. //上升沿触发时计数器的控制
  11. always @ (posedge clk or negedge rst_n ) //posedge和negedge是verilog表示信号上升沿和下降沿
  12. //当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
  13. begin
  14. if(!rst_n)
  15. cnt_p<=0;
  16. else if (cnt_p==(N-1))
  17. cnt_p<=0;
  18. else cnt_p<=cnt_p+1; //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
  19. end
  20. //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
  21. always @ (posedge clk or negedge rst_n)
  22. begin
  23. if(!rst_n)
  24. clk_p<=0;
  25. else if (cnt_p<(N>>1)) //N>>1表示右移一位,相当于除以2去掉余数
  26. clk_p<=0;
  27. else
  28. clk_p<=1; //得到的分频时钟正周期比负周期多一个clk时钟
  29. end
  30. //下降沿触发时计数器的控制
  31. always @ (negedge clk or negedge rst_n)
  32. begin
  33. if(!rst_n)
  34. cnt_n<=0;
  35. else if (cnt_n==(N-1))
  36. cnt_n<=0;
  37. else cnt_n<=cnt_n+1;
  38. end
  39. //下降沿触发的分频时钟输出,和clk_p相差半个时钟
  40. always @ (negedge clk)
  41. begin
  42. if(!rst_n)
  43. clk_n<=0;
  44. else if (cnt_n<(N>>1))
  45. clk_n<=0;
  46. else
  47. clk_n<=1; //得到的分频时钟正周期比负周期多一个clk时钟
  48. end
  49. assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //条件判断表达式
  50. //当N=1时,直接输出clk
  51. //当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
  52. //当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
  53. endmodule

4.广角分配

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号