源码系列:基于FPGA的自动售货机设计(附源工程)

设计要求

一听饮料需要2.5美元,规定只能投入一美元,0.5美元的硬币。

设计架构

设计框架图:

源码系列:基于FPGA的自动售货机设计(附源工程) - 第1张

设计代码

设计模块sell代码:

  1. module sell(clk,rst_n,one_dole,half_dole,descense,back_money);
  2. input clk;
  3. input rst_n;
  4. input one_dole; //输入1美元
  5. input half_dole; //输入0.5美元
  6. output reg descense; //是否买到的标志位
  7. output reg [2:0] back_money; //找回的钱
  8. parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10;
  9. reg [1:0] state;
  10. reg [4:0] money;
  11. reg [1:0] state_x;
  12. always @ (posedge clk or negedge rst_n)
  13. if(!rst_n)
  14. begin
  15. state_x <= s0;
  16. end
  17. else
  18. begin
  19. state_x <= state;
  20. end
  21. always @ (posedge clk or negedge rst_n)
  22. if(!rst_n)
  23. begin
  24. money <= 5'b0;
  25. state <= s0;
  26. end
  27. else
  28. begin
  29. case (state)
  30. s0:begin
  31. //判断投入的钱是多少
  32. if(one_dole)
  33. begin
  34. money <= money + 10;
  35. state <= s1;
  36. end
  37. else if(half_dole)
  38. begin
  39. money <= money + 5;
  40. state <= s1;
  41. end
  42. else
  43. begin
  44. state <= s0;
  45. money <= money;
  46. end
  47. end
  48. //判断和商品的价格是否一样
  49. s1:begin
  50. if(money < 25)
  51. begin
  52. state <= s0;
  53. end
  54. else
  55. begin
  56. state <= s0;
  57. money <= 5'b0;
  58. end
  59. end
  60. endcase
  61. end
  62. reg [1:0] state_s;
  63. always @ (posedge clk or negedge rst_n )
  64. if(!rst_n)
  65. begin
  66. descense <= 1'b0;
  67. back_money <= 3'b0;
  68. state_s <= s0;
  69. end
  70. else
  71. begin
  72. case (state_s)
  73. s0: begin
  74. if(money < 25) //判断输入的钱数
  75. begin
  76. back_money <= 3'b0;
  77. descense <= 1'b0;
  78. end
  79. else
  80. //找回的钱和买到的标志位
  81. begin
  82. back_money <= money - 25;
  83. descense <= 1'b1;
  84. state_s <= s1;
  85. end
  86. end
  87. s1: begin
  88. descense <= 1'b0;
  89. state_s <= s0;
  90. end
  91. endcase
  92. end
  93. endmodule

测试仿真

测试模块sell_tb代码:

  1. `timescale 1ns/1ps //时间精度
  2. module sell_tb();
  3. //定义我们的端口
  4. reg clk;
  5. reg rst_n;
  6. reg one_dole;
  7. reg half_dole;
  8. wire descense;
  9. wire [2:0] back_money;
  10. initial begin
  11. clk = 1'b1;
  12. rst_n = 1'b0;
  13. one_dole = 1'b0;
  14. half_dole = 1'b0;
  15. #200.1 rst_n = 1'b1;
  16. //模拟输入的钱数
  17. #200 one_dole = 1'b1;
  18. #20 one_dole = 1'b0;
  19. #200 one_dole = 1'b1;
  20. #20 one_dole = 1'b0;
  21. #200 one_dole = 1'b1;
  22. #20 one_dole = 1'b0;
  23. #1000.1
  24. #200 half_dole = 1'b1;
  25. #20 half_dole = 1'b0;
  26. #200 one_dole = 1'b1;
  27. #20 one_dole = 1'b0;
  28. #200 one_dole = 1'b1;
  29. #20 one_dole = 1'b0;
  30. # 1000 $stop; //停止仿真
  31. end
  32. always #10 clk = ~ clk;
  33. sell sell_dut( //例化端口
  34. .clk(clk),
  35. .rst_n(rst_n),
  36. .one_dole(one_dole),
  37. .half_dole(half_dole),
  38. .descense(descense),
  39. .back_money(back_money)
  40. );
  41. endmodule

仿真图:

源码系列:基于FPGA的自动售货机设计(附源工程) - 第2张

我们从仿真中可以看到当我们的钱数投够的时候,就给一个买到的标志位,如果投的超过商品的价格,那么我们就给一个买的标志位,然后找回我们投的多的钱。

本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/8779.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券