加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 設計要求
    • 設計架構(gòu)
    • 設計代碼
    • 測試仿真
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

源碼系列:基于FPGA的自動售貨機設計(附源工程)

2024/12/30
433
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。

今天給大俠帶來基于FPGA的自動售貨機設計,附源碼,獲取源碼,請在“FPGA技術江湖”公眾號內(nèi)回復“?自動售貨機設計源碼”,可獲取源碼文件。話不多說,上貨。

設計要求

一聽飲料需要2.5美元,規(guī)定只能投入一美元,0.5美元的硬幣。

設計架構(gòu)

設計框架圖:

設計代碼

設計模塊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)    //判斷輸入的錢數(shù)                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;            //模擬輸入的錢數(shù)            #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 

仿真圖:

我們從仿真中可以看到當我們的錢數(shù)投夠的時候,就給一個買到的標志位,如果投的超過商品的價格,那么我們就給一個買的標志位,然后找回我們投的多的錢。

相關推薦

電子產(chǎn)業(yè)圖譜

任何技術的學習就好比一個江湖,對于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。