加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 设计要求
    • 设计架构
    • 设计代码
    • 测试仿真
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

2024/12/30
453
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来基于FPGA的自动售货机设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“ 自动售货机设计源码”,可获取源码文件。话不多说,上货。

设计要求

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

设计架构

设计框架图:

设计代码

设计模块sell代码:

module sell(clk,rst_n,one_dole,half_dole,descense,back_money);  input clk;  input rst_n;  input one_dole;      //输入1美元  input half_dole;    //输入0.5美元    output reg descense;      //是否买到的标志位  output reg [2:0] back_money;    //找回的钱
  parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10;    reg [1:0] state;  reg [4:0] money;    reg [1:0] state_x;  always @ (posedge clk or negedge rst_n)        if(!rst_n)      begin        state_x <= s0;      end    else      begin        state_x <= state;      end        always @ (posedge clk or negedge rst_n)    if(!rst_n)      begin        money <= 5'b0;          state <= s0;      end    else      begin        case (state)          s0:begin              //判断投入的钱是多少              if(one_dole)                    begin                  money <= money + 10;                  state <= s1;                end              else if(half_dole)                begin                  money <= money + 5;                  state <= s1;                end              else                  begin                  state <= s0;                  money <= money;                end            end          //判断和商品的价格是否一样          s1:begin              if(money < 25)                begin                  state <= s0;                end              else                begin                  state <= s0;                  money <= 5'b0;                end            end        endcase      end    reg [1:0] state_s;  always @ (posedge clk or negedge rst_n )    if(!rst_n)      begin        descense <= 1'b0;        back_money <= 3'b0;        state_s <= s0;      end    else      begin        case (state_s)          s0: begin              if(money < 25)    //判断输入的钱数                begin                  back_money <= 3'b0;                  descense <= 1'b0;                  end              else                //找回的钱和买到的标志位                begin                  back_money <= money - 25;                    descense <= 1'b1;                  state_s <= s1;                end            end          s1: begin              descense <= 1'b0;              state_s <= s0;            end        endcase      endendmodule 

测试仿真

测试模块sell_tb代码:

`timescale 1ns/1ps    //时间精度
module sell_tb();    //定义我们的端口  reg clk;  reg rst_n;  reg one_dole;      reg half_dole;
  wire descense;  wire [2:0] back_money;    initial begin      clk = 1'b1;      rst_n = 1'b0;      one_dole = 1'b0;      half_dole = 1'b0;      #200.1 rst_n = 1'b1;            //模拟输入的钱数            #200   one_dole = 1'b1;      #20  one_dole = 1'b0;            #200  one_dole = 1'b1;      #20  one_dole = 1'b0;            #200   one_dole = 1'b1;      #20  one_dole = 1'b0;            #1000.1      #200   half_dole = 1'b1;      #20  half_dole = 1'b0;            #200   one_dole = 1'b1;      #20  one_dole = 1'b0;            #200  one_dole = 1'b1;      #20  one_dole = 1'b0;            # 1000 $stop;    //停止仿真    end        always #10 clk = ~ clk;     sell sell_dut(    //例化端口      .clk(clk),      .rst_n(rst_n),      .one_dole(one_dole),      .half_dole(half_dole),      .descense(descense),      .back_money(back_money)    );endmodule 

仿真图:

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

相关推荐

电子产业图谱

任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。