找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2404|回复: 0
收起左侧

FPGA的秒表程序设计( 跑表模块+防抖模块+测试模块)

[复制链接]
ID:353926 发表于 2019-4-9 09:52 | 显示全部楼层 |阅读模式
防抖模块:
  1. module button_scan(clk, bin, bout);
  2. input                        clk;
  3. input                        bin;
  4. output                        bout;
  5. reg                        bout;
  6. parameter cnt = 200;
  7. reg                [ 1: 0]        state = 0;
  8. reg                [31: 0] dcnt;
  9. always@(posedge clk)
  10. case(state)
  11.         0:        begin        //不稳定0
  12.                 if(bin)                state <= 1;
  13.                 else                 state <= dcnt>=dcnt?2:0;
  14.                 end
  15.         1:        begin        //稳定1
  16.                 if(!bin)       
  17.                         begin
  18.                                 state        <= 0;       
  19.                                 dcnt        <= 0;
  20.                         end
  21.                 end
  22.         2:        begin        //稳定0
  23.                 if(bin)       
  24.                         begin
  25.                                 state        <= 3;       
  26.                                 dcnt        <= 0;
  27.                         end
  28.                 end
  29.         3:        begin        //不稳定1
  30.                 if(!bin)        state        <= 2;       
  31.                 else                state        <= dcnt>=dcnt?1:3;
  32.                 end
  33. endcase
  34. always@(state)
  35. case(state)
  36.         0:        bout         <= bout;
  37.         1:        bout        <= 1;
  38.         2:  bout        <= 0;
  39.         3:  bout        <= bout;       
  40.         default:         bout <= bout;
  41. endcase
  42. endmodule
复制代码

跑表模块:
  1. module  button(clk,sw,LED0,LED1,LED);
  2. input        clk;
  3. input        [3:0]        sw;
  4. output        [7:0]        LED0;
  5. output        [7:0]        LED1;
  6. output        [7:0]        LED;
  7. reg        [7:0]        LED0;
  8. reg        [7:0]        LED1;
  9. reg        [7:0]        LED;
  10. reg        [31: 0] cnt0; //记时50 000 000个周期为一秒
  11. reg        [31: 0] cnt1;
  12. reg        [31: 0] cnt2;
  13. reg        [31: 0] cnt3;
  14. reg        [31: 0] cnt4;
  15. reg        [ 3: 0] codein0;
  16. reg        [ 3: 0] codein1;
  17. reg        [ 3: 0] codein2;
  18. reg        [ 2: 0] codein3;
  19. reg        codein4;
  20. reg     clk1;
  21. reg     be;
  22. reg     [23:0]  t0,t1,t2,t3,t4,t5,t6,t7,t8,t9;
  23. reg        [7:0]        aLED0;
  24. reg        [7:0]        aLED1;
  25. reg     [7:0]        aLED;
  26. reg     [3:0]   p,q;
  27. defparam sw0.cnt = 250;
  28. defparam sw1.cnt = 250;
  29. defparam sw2.cnt = 250;
  30. defparam sw3.cnt = 250;
  31. button_scan sw0(.clk(clk), .bin(sw[0]), .bout(bsw0));
  32. button_scan sw1(.clk(clk), .bin(sw[1]), .bout(bsw1));
  33. button_scan sw2(.clk(clk), .bin(sw[2]), .bout(bsw2));
  34. button_scan sw3(.clk(clk), .bin(sw[3]), .bout(bsw3));
  35. initial
  36.    begin
  37.         t0<=24'b1111_1111_1100_0000_1100_0000;
  38.         t1<=24'b1111_1111_1100_0000_1100_0000;
  39.         t2<=24'b1111_1111_1100_0000_1100_0000;
  40.         t3<=24'b1111_1111_1100_0000_1100_0000;
  41.         t4<=24'b1111_1111_1100_0000_1100_0000;
  42.         t5<=24'b1111_1111_1100_0000_1100_0000;
  43.         t6<=24'b1111_1111_1100_0000_1100_0000;
  44.         t7<=24'b1111_1111_1100_0000_1100_0000;
  45.         t8<=24'b1111_1111_1100_0000_1100_0000;
  46.         t9<=24'b1111_1111_1100_0000_1100_0000;
  47.    end
  48. always@(posedge bsw0)
  49. begin
  50. be=~be;
  51. end
  52. always@(posedge bsw2)
  53. begin
  54.    p<=p+1;
  55.    if(p<=9)
  56.      case(p)
  57.       0:t0<={LED,LED1,LED0};
  58.       1:t1<={LED,LED1,LED0};
  59.       2:t2<={LED,LED1,LED0};
  60.       3:t3<={LED,LED1,LED0};
  61.       4:t4<={LED,LED1,LED0};
  62.       5:t5<={LED,LED1,LED0};
  63.       6:t6<={LED,LED1,LED0};
  64.       7:t7<={LED,LED1,LED0};
  65.       8:t8<={LED,LED1,LED0};
  66.       9:t9<={LED,LED1,LED0};
  67.       endcase
  68.    else
  69.    p<=0;
  70. end
  71. always @(posedge bsw3)
  72. begin
  73.    q<=q-1;
  74.    if(q<=9&&q>=0)
  75.       case(q)
  76.      0:    {aLED,aLED1,aLED0}<=t0;
  77.      1:    {aLED,aLED1,aLED0}<=t1;
  78.      2:   {aLED,aLED1,aLED0}<=t2;
  79.      3:   {aLED,aLED1,aLED0}<=t3;
  80.      4:    {aLED,aLED1,aLED0}<=t4;
  81.      5:   {aLED,aLED1,aLED0}<=t5;
  82.      6:    {aLED,aLED1,aLED0}<=t6;
  83.      7:    {aLED,aLED1,aLED0}<=t7;
  84.      8:    {aLED,aLED1,aLED0}<=t8;
  85.      9:    {aLED,aLED1,aLED0}<=t9;
  86.       endcase
  87.    else
  88.    q<=9;
  89. end
  90. always @(posedge clk)
  91. begin
  92.         if(!bsw1)
  93.         begin
  94.         codein0<=0;
  95.         end
  96.         else
  97.         begin
  98.         if(cnt0>=50_000_0&&be)
  99.         begin
  100.                 cnt0 <= 0;
  101.                 if(codein0 >= 9)
  102.                 begin
  103.                         codein0 <= 0;
  104.                 end
  105.                 else
  106.                 begin
  107.                         codein0 <= codein0 + 1;
  108.                 end
  109.         end
  110.         else
  111.         begin
  112.                 cnt0 <= cnt0 + 1;
  113.                 codein0 <= codein0;
  114.         end               
  115.    end
  116. end
  117. always @(posedge clk)
  118. begin
  119.         if(!bsw1)
  120.         begin
  121.         codein1<=0;
  122.         end
  123.         else
  124.         begin
  125.         if(cnt1>=50_000_00&&be)
  126.         begin
  127.                 cnt1 <= 0;
  128.                 if(codein1 >= 9)
  129.                 begin
  130.                         codein1 <= 0;
  131.                 end
  132.                 else
  133.                 begin
  134.                         codein1 <= codein1 + 1;
  135.                 end
  136.         end
  137.         else
  138.         begin
  139.                 cnt1 <= cnt1 + 1;
  140.                 codein1 <= codein1;
  141.         end               
  142. end
  143. end
  144. always @(posedge clk)
  145. begin
  146.         if(!bsw1)
  147.         begin
  148.         codein2<=0;
  149.         end
  150.         else
  151.         begin
  152.         if(cnt2>=50_000_000&&be)
  153.        
  154.         begin
  155.                 cnt2 <= 0;
  156.                 if(codein2 >= 9)
  157.                 begin
  158.                         codein2 <= 0;
  159.                 end
  160.                 else
  161.                 begin
  162.                         codein2 <= codein2 + 1;
  163.                 end
  164.         end
  165.        
  166.         else
  167.         begin
  168.                 cnt2 <= cnt2 + 1;
  169.                 codein2 <= codein2;
  170.         end               
  171. end
  172. end
  173. always @(posedge clk)
  174. begin
  175.         if(!bsw1)
  176.         begin
  177.         codein3<=0;
  178.         end
  179.         else
  180.         begin
  181.         if(cnt3>=500_000_000&&be)
  182.         begin
  183.                 cnt3 <= 0;
  184.                 if(codein3 >= 5)
  185.                 begin
  186.                         codein3 <= 0;
  187.                 end
  188.                 else
  189.                 begin
  190.                         codein3 <= codein3 + 1;
  191.         end
  192.         end
  193.         else
  194.         begin
  195.                 cnt3 <= cnt3 + 1;
  196.                 codein3 <= codein3;
  197.         end               
  198. end
  199. end
  200. always @(posedge clk)
  201. begin
  202.         if(!bsw1)
  203.         begin
  204.         codein4<=0;
  205.         end
  206.         else
  207.         begin
  208.         if(cnt4>=3000_000_000&&be)
  209.         begin
  210.                 cnt4 <= 0;
  211.                 if(codein4 >= 1)
  212.                 begin
  213.                         codein4 <= 0;
  214.                 end
  215.                 else
  216.                 begin
  217.                         codein4 <= codein4 + 1;
  218.         end
  219.         end
  220.         else
  221.         begin
  222.                 cnt4 <= cnt4 + 1;
  223.                 codein4 <= codein4;
  224.         end               
  225. end
  226. end
  227. always @(codein0)
  228. if(!bsw1)
  229. begin
  230. LED0<=aLED0;
  231. end
  232. else
  233. begin
  234.         case(codein0)
  235.         4'h0:        LED0 = 8'b1100_0000;
  236.         4'h1:        LED0 = 8'b1111_1001;
  237.         4'h2:        LED0 = 8'b1010_0100;
  238.         4'h3:        LED0 = 8'b1011_0000;
  239.         4'h4:        LED0 = 8'b1001_1001;
  240.         4'h5:        LED0 = 8'b1001_0010;
  241.         4'h6:        LED0 = 8'b1000_0010;
  242.         4'h7:        LED0 = 8'b1111_1000;
  243.         4'h8:        LED0 = 8'b1000_0000;
  244.         4'h9:        LED0 = 8'b1001_0000;
  245.         default: LED0 = 8'b0111_1111;       
  246.         endcase
  247. end
  248. always @(codein1)
  249. if(!bsw1)
  250. begin
  251. LED1<=aLED1;
  252. end
  253. else
  254. begin
  255.         case(codein1)
  256.         4'h0:        LED1 = 8'b1100_0000;
  257.         4'h1:        LED1 = 8'b1111_1001;
  258.         4'h2:        LED1 = 8'b1010_0100;
  259.         4'h3:        LED1 = 8'b1011_0000;
  260.         4'h4:        LED1 = 8'b1001_1001;
  261.         4'h5:        LED1 = 8'b1001_0010;
  262.         4'h6:        LED1 = 8'b1000_0010;
  263.         4'h7:        LED1 = 8'b1111_1000;
  264.         4'h8:        LED1 = 8'b1000_0000;
  265.         4'h9:        LED1 = 8'b1001_0000;
  266.         default: LED1 = 8'b0111_1111;       
  267.         endcase
  268. end
  269. always @(codein2)
  270. if(!bsw1)
  271. begin
  272. LED[3:0]<=aLED[3:0];
  273. end
  274. else
  275. begin
  276.         case(codein2)
  277.         4'h0:        LED[3:0] = 4'b1111;
  278.         4'h1:        LED[3:0] = 4'b1110;
  279.         4'h2:        LED[3:0] = 4'b1101;
  280.         4'h3:        LED[3:0] = 4'b1100;
  281.         4'h4:        LED[3:0] = 4'b1011;
  282.         4'h5:        LED[3:0] = 4'b1010;
  283.         4'h6:        LED[3:0] = 4'b1001;
  284.         4'h7:        LED[3:0] = 4'b1000;
  285.         4'h8:        LED[3:0] = 4'b0111;
  286.         4'h9:        LED[3:0] = 4'b0110;
  287.         default: LED[3:0] = 8'b0000;       
  288.         endcase
  289. end
  290. always @(codein3)
  291. if(!bsw1)
  292. begin
  293. LED[6:4]<=aLED[6:4];
  294. end
  295. else
  296. begin
  297.         case(codein3)
  298.         3'h0:        LED[6:4] = 4'b111;
  299.         3'h1:        LED[6:4] = 4'b110;
  300.         3'h2:        LED[6:4] = 4'b101;
  301.         3'h3:        LED[6:4] = 4'b100;
  302.         3'h4:        LED[6:4] = 4'b011;
  303.         3'h5:        LED[6:4] = 4'b010;
  304.         default: LED[6:4] = 8'b000;       
  305.         endcase
  306. end
  307. always @(codein4)
  308. if(!bsw1)
  309. begin
  310. LED[7]<=aLED[7];
  311. end
  312. else
  313. begin
  314.         case(codein4)
  315.         1'h0:        LED[7] = 1'b1;
  316.         1'h1:        LED[7] = 1'b0;
  317.         default: LED[7] = 1'b0;       
  318.         endcase
  319. end
  320. endmodule
复制代码

测试模块:
  1. `timescale 1ms/1ms
  2. `include”button.v”
  3. module buttontest;
  4. reg clk;
  5. reg bsw0;
  6. reg bsw1;
  7. reg bsw2;
  8. reg bsw3;
  9. reg [7:0] LED0;
  10. reg [7:0] LED1;
  11. reg [7:0] LED;
  12. initial begin
  13. bsw0=1;bsw3=1;
  14. #175 bsw0=0;   #75 bsw0=1;
  15. #20  bsw2=0;   # 20 bsw2=1;
  16. #20  bsw2=0;   # 20 bsw2=1;
  17. # 20 bsw2=0;   # 20 bsw2=1;
  18. # 20 bsw2=0;   # 20 bsw2=1;
  19. # 20 bsw2=0;   # 20 bsw2=1;
  20. # 20 bsw2=0;   # 20 bsw2=1;
  21. # 20 bsw2=0;   # 20 bsw2=1;
  22. # 20 bsw2=0;   # 20 bsw2=1;
  23. # 20 bsw2=0;   # 20 bsw2=1;
  24. # 20 bsw2=0;   #20  bsw2=1;
  25. #600 bsw3=0 ;  #610 bsw3=1;
  26. # 10000 $stop;
  27. always #5 clk=~clk;
  28. end
  29. button button(clk,bsw0,bsw1,bsw2,bsw3,LED0,LED1,LED);
  30. endmodule
复制代码

全部资料51hei下载地址:
跑表1.rar (5.64 KB, 下载次数: 21)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表