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

2020-12-29 17:49:23 浏览数 (1)

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

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

设计要求

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

设计架构

设计框架图:

设计代码

设计模块sell代码:

代码语言:javascript复制
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
      end
endmodule 

测试仿真

测试模块sell_tb代码:

代码语言:javascript复制
`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 

仿真图:

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

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

0 人点赞