当前位置:   article > 正文

FPGA项目(二)--基于FPGA的自动贩卖机_基于fpga项目

基于fpga项目

        先陈述下本次设计实现的功能:用FPGA实现了自动贩卖机。首先可以通过拨码开关选择货物,货物价格有三种,分别为2元,2.5元,3元,然后还是通过拨码开关,输入投币金额,面额为0.5元,1元,2元。当投币金额小于货物价格时,数码管显示所投金额,当投币金额大于货物价格时,数码显示找零的金额,同时蜂鸣器报警。

        先给张实物图:

         接下来介绍设计的思路。本次开发板是基于EP4CE6E22C8N的Cyclone IV系列的FPGA、(型号)的FLASH芯片和50MHz的晶振,通过对板子的元器件进行控制,从而实现特定功能。拨动开关的管脚配置和电路原图如下:

 

        从图中可以看出,当拨码开关拨上时,管脚电平为1。所以可以根据检测电平变换,来决定货物的价格。 本次代码的接口定义如下:

        

        其中三位宽的chose用于选择货物价格。选择价格的代码如下:

         

         接下来,程序执行的核心是一个二段式状态机。状态机代码如下:

        

         状态机执行流程:首先s0状态是输入投币金额,用三个变量分别保存并且记录输入的金额,最后用一个加法式子算出总的投币金额

        

        s1状态是判断所投金额有没有大于货物价格,如果没有大于货物价格,那么继续回到s0状态,继续进行投币。如果所投金额大于货物价格,那么就执行到s2状态。

        s2状态,主要执行蜂鸣器响的操作,然后在数码管上显示出找零的金额。

         在本模块调用了数码管显示模块,将要显示的数据(货物价格、投币金额/找零金额)显示在数码管上。

         在这个模块,取出要显示数据的各个位。举个例子,要显示的货物价格是25(2.5元),那么首先取出十位数字2,再取出个位数字5。将数字传递给显示模块,接下来的任务就是显示模块显示数据了。

        显示模块的代码:

  1. module seg(
  2. input sys_clk,sys_rest,
  3. input [15:0] data,
  4. output reg [3:0] sel,
  5. output reg [6:0] seg_led
  6. );
  7. parameter CLK_NUM=4'd10;
  8. parameter MSNUM=14'd5000;
  9. reg [3:0] CNT_NUM;
  10. reg CLK;
  11. reg [12:0] MSCNT;
  12. reg MS_flag;
  13. reg [3:0] num_display;
  14. reg [15:0] num;
  15. reg [2:0] sel_num; //选择哪一位数码管被点亮
  16. //wire define
  17. wire [3:0] data0 ; // 个位数
  18. wire [3:0] data1 ; // 十位数
  19. wire [3:0] data2 ; // 百位数
  20. wire [3:0] data3 ; // 千位数
  21. //提取显示数值所对应的十进制数的各个位
  22. assign data0 = data[3:0]; // 个位数
  23. assign data1 = data[7:4]; // 十位数
  24. assign data2 = data[11:8]; // 百位数
  25. assign data3 = data[15:12]; // 千位数
  26. always @(posedge sys_clk or negedge sys_rest) begin
  27. if(!sys_rest)
  28. begin
  29. CNT_NUM<=4'd0;
  30. CLK<=1'd1;
  31. end
  32. else if(CNT_NUM<=CLK_NUM/2-1'b1)
  33. begin
  34. CLK<=~CLK;
  35. CNT_NUM<=4'd0;
  36. end
  37. else
  38. begin
  39. CNT_NUM<=CNT_NUM+1;
  40. CLK<=CLK;
  41. end
  42. end
  43. always @(posedge CLK or negedge sys_rest) begin
  44. if(!sys_rest)
  45. num<=16'd0;
  46. else
  47. begin
  48. num[15:12] <= data3; //则依次给4位数码管赋值
  49. num[11:8] <= data2;
  50. num[ 7:4] <= data1;
  51. num[ 3:0] <= data0;
  52. end
  53. end
  54. always @(posedge CLK or negedge sys_rest) begin //产生1ms脉冲
  55. if(!sys_rest)
  56. begin
  57. MSCNT<=13'd0;
  58. MS_flag<=1'b0;
  59. end
  60. else if(MSCNT==MSNUM-1)
  61. begin
  62. MSCNT<=13'd0;
  63. MS_flag<=1'b1;
  64. end
  65. else
  66. begin
  67. MSCNT<=MSCNT+1;
  68. MS_flag<=1'b0;
  69. end
  70. end
  71. always @(posedge CLK or negedge sys_rest) begin
  72. if(!sys_rest)
  73. sel_num<=0;
  74. else if(MS_flag)
  75. begin
  76. if(sel_num<3'd3)
  77. sel_num<=sel_num+1;
  78. else
  79. sel_num<=0;
  80. end
  81. else
  82. sel_num<=sel_num;
  83. end
  84. always @(posedge CLK or negedge sys_rest) begin
  85. if(!sys_rest)
  86. sel<=4'b1111;
  87. else
  88. begin
  89. case(sel_num)
  90. 3'd0: begin
  91. sel<= 4'b1110; //显示数码管最低位
  92. num_display<=num[3:0];
  93. end
  94. 3'd1: begin
  95. sel<= 4'b1101; //显示数码管第1
  96. num_display<=num[7:4];
  97. end
  98. 3'd2: begin
  99. sel<= 4'b1011; //显示数码管第2
  100. num_display<=num[11:8];
  101. end
  102. 3'd3: begin
  103. sel<= 4'b0111; //显示数码管第3
  104. num_display<=num[15:12];
  105. end
  106. default sel<= 4'b1111;
  107. endcase
  108. end
  109. end
  110. always @(posedge CLK or negedge sys_rest) begin
  111. if(!sys_rest)
  112. seg_led<=7'b100000;
  113. else
  114. begin
  115. case(num_display)
  116. 4'h0 : seg_led <= 7'b1000000;
  117. 4'h1 : seg_led <= 7'b1111001;
  118. 4'h2 : seg_led <= 7'b0100100;
  119. 4'h3 : seg_led <= 7'b0110000;
  120. 4'h4 : seg_led <= 7'b0011001;
  121. 4'h5 : seg_led <= 7'b0010010;
  122. 4'h6 : seg_led <= 7'b0000010;
  123. 4'h7 : seg_led <= 7'b1111000;
  124. 4'h8 : seg_led <= 7'b0000000;
  125. 4'h9 : seg_led <= 7'b0010000;
  126. 4'd10: seg_led <= 7'b1111111; //不显示任何字符
  127. default : seg_led <= 7'b1000000;
  128. endcase
  129. end
  130. end
  131. endmodule

         这样就大功告成啦。后续会给出完整工程项目!

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

闽ICP备14008679号