大侠好,欢迎来到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)beginstate_x <= s0;endelsebeginstate_x <= state;endalways @ (posedge clk or negedge rst_n)if(!rst_n)beginmoney <= 5'b0;state <= s0;endelsebegincase (state)s0:begin//判断投入的钱是多少if(one_dole)beginmoney <= money + 10;state <= s1;endelse if(half_dole)beginmoney <= money + 5;state <= s1;endelsebeginstate <= s0;money <= money;endend//判断和商品的价格是否一样s1:beginif(money < 25)beginstate <= s0;endelsebeginstate <= s0;money <= 5'b0;endendendcaseendreg [1:0] state_s;always @ (posedge clk or negedge rst_n )if(!rst_n)begindescense <= 1'b0;back_money <= 3'b0;state_s <= s0;endelsebegincase (state_s)s0: beginif(money < 25) //判断输入的钱数beginback_money <= 3'b0;descense <= 1'b0;endelse//找回的钱和买到的标志位beginback_money <= money - 25;descense <= 1'b1;state_s <= s1;endends1: begindescense <= 1'b0;state_s <= s0;endendcaseendendmodule
测试仿真
测试模块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 beginclk = 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; //停止仿真endalways #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
仿真图:
我们从仿真中可以看到当我们的钱数投够的时候,就给一个买到的标志位,如果投的超过商品的价格,那么我们就给一个买的标志位,然后找回我们投的多的钱。
阅读全文
1555