基于FPGA的自动售货机.docx
- 文档编号:29252295
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:24
- 大小:80.34KB
基于FPGA的自动售货机.docx
《基于FPGA的自动售货机.docx》由会员分享,可在线阅读,更多相关《基于FPGA的自动售货机.docx(24页珍藏版)》请在冰豆网上搜索。
基于FPGA的自动售货机
第1章绪论
本文研究内容
本次设计的是一个货物自动贩卖机。
货物自动贩卖机主要是由以下几个部分构成,电源电路、数码显示、时钟脉冲、投币脉冲、闸门时间控制等,各部件形成一个简单的饮料自动提取机系统。
本设计采用EDA技术,通过FPGA实现了数字电子钟电路的设计,并完成对电路的功能进行仿真。
目的与意义
本系统用于模拟现实生活中的自动售货贩卖机。
可以模拟四种商品的买卖、存贮、控制等等功能。
并模拟买家模式和管理模式,可以分开进行商品买卖的模拟和商品上架的模拟。
第2章系统设计方案
饮料自动提取机总体设计方案
自动售货机控制系统设计主要有四个功能模块,一个为货币:
该模块能完成硬币处理,余额计算。
一个为分频模块:
功能主要是实现各个部分的操作。
一个为售货器模块:
该模块主要是负责进行货物的管理。
最后一个是控制模块:
主要负责进行商品买卖控制。
图2.1饮料提取机的系统组成框图
设计思路:
首先,我们对于物品存储进行模拟,共有商品买卖和商品管理两个模式。
在买卖模式中,顾客可以通过选择所需商品并进行确认,之后进入投币模式。
在投币模式中,本系统由对外部投入硬币的检测来产生脉冲,对产生的脉冲进行计数,并尝试添加防抖动控制。
我们一共设置了三种货币,0.1元、0.5元、1元三种货币。
我们设定,当顾客确定所需购买的商品时,直到顾客投入所需的钱数,或者退出消费,否则将会一直等待下去。
当投入钱币数足够时,系统会自动出货,并完成找零。
在管理模式中,商家可以查看并选择各种商品,对商品的库存和单价进行修改。
当确定修改某种商品后,有两种模式进行选择,一个是修改物品的库存数量,当修改后再进入买卖模式,会立刻在LED数码管上显示出来。
另一种是修改物品的单价,两个模式可以通过按键进行修改和切换。
第3章货物自动贩卖机的基本原理
货物自动贩卖机功能
本系统由对外部投入硬币的检测来产生脉冲,并对产生的脉冲进行计数,其中0表示投入的是0.1元的硬币,1表示投入的是0.5元的硬币,2表示投入的是1元的硬币。
每次根据投入的硬币不同而分别计数,并将投入的总金额用两位数码管显示出来,当达到了交易金额时,out产生一个正脉冲,此正脉冲控制闸门打开,物品掉出来,当超出了交易金额,则out1会产生一个正脉冲,饮料售卖机找回多余的钱。
货物自动贩卖机的基本组成
货物自动贩卖机主要是由以下几个部分构成,电源电路、数码显示、时钟脉冲、投币脉冲、闸门时间控制等,各部件形成一个简单的自动售货机系统。
其实现主要的功能是对投币信号的计数与计算,判断是否达到所买物品的价格,如果不足的显示所投的钱数,货物自动贩卖机将会进入等待状态,直至达到金额或者取消此次交易。
投币信号产生的设计
自动售货机的所有信号均由同步时钟信号CLK的正边沿触发,由于售货机的硬币接收器一般是一个机械装置,投币时产生的信号要比同步信号慢得多,一般可以持续好几个周期。
必须对投币输入信号进行处理,使每一次投币时在CLK脉冲周期内只能产生一个脉冲作为功能控制模块的投币驱动信号。
时钟电路的设计
在功能实现模块中,售货机在放出饮料的时候需要延时三秒钟,程序中count1数3000下,因此需要1KHZ的时钟脉冲,设计中为同步时钟,所以此时钟脉冲电路为芯片提供“脉搏”。
图中是一种1KHz脉冲发生电路。
它由集成电路CD4060和晶振、电阻和电容等元件组成。
CD4060是14位二进制串行计数、分频器和振荡器。
CD4060内部分为两部分,其中一部分是14级计数/分频器,其分频系数为16~16348;另一部分既可与外接电阻和电容构成RC振荡器,又可与外接晶体构成高精度的晶体振荡器。
在采用一定频率的晶振组成晶振振荡器,其震荡信号经过CD4060内部分频后,在Q输出相应频率的脉冲信号。
设计中需要1000hz的时钟脉冲,所以外接30720Hz的晶振,在Q5端输出大约是1000HZ的时钟脉冲。
数码显示的设计
在买卖模式中,数码管初始显示两部分内容:
单价和数量。
当进行确认是,确认信号会让信号灯亮起表示进入确认状态。
这时会进入投币模式。
该模式会有数码管统计已投入金额的总数。
当投入金额可以购买物品时,系统会根据控制模块算出余额并显示出来。
在管理模式中,数码管初始显示两部分内容:
单价和数量。
当进行确认是,确认信号会让信号灯亮起表示进入确认状态。
这时会进入商品数量管理模式,初始会显示该商品的库存量,可以通过按键控制其数量。
同样可以进过按键切换为单价控制。
这时显示该商品单价,可以通过按键控制其单价升降。
第4章货物自动贩卖机软件设计
软件实现功能综述
在XilinxISEDesignSuite13.4软件平台上建立计数器电路的顶层电路文件并完成编译和仿真。
用Verilog编写automat.v文件及注释。
XilinxISEDesignSuite13.4软件提供完整、易于操作的图形用户界面可以完成整个设计流程中的各个阶段,并提供完整的命令行界面解决方案,使用命令行流程可以降低内存要求,并可使用脚本或标准的命令行选项和命令控制XilinxISEDesignSuite13.4软件。
投币功能的设计
clk为时钟信号,a0记录投入1角硬币的个数,a1记录投入0.5元硬币的个数,a2记录投入1元硬币的个数。
out控制售卖机闸门是否打开,out为高电平时闸门打开,out1为找零信号,为高电平时,饮料售卖机找回余额。
显示功能的设计
clk为时钟信号,a0记录投入1角硬币的个数,a1记录投入0.5元硬币的个数,a2记录投入1元硬币的个数。
数码管部分不太清楚……不是自己负责的……
取货功能的设计
clk为时钟信号,a0记录投入1角硬币的个数,a1记录投入0.5元硬币的个数,a2记录投入1元硬币的个数,out为高电平时闸门打开,out1为找零信号,为高电平时,饮料售卖机找回余额
代码段:
主模块:
`timescale1ns/1ps
//////////////////////////////////////////////////////////////////////////////////
//Company:
//Engineer:
//
//CreateDate:
21:
17:
4406/30/2014
//DesignName:
//ModuleName:
automat
//ProjectName:
//TargetDevices:
//Toolversions:
//Description:
//
//Dependencies:
//
//Revision:
//Revision0.01-FileCreated
//AdditionalComments:
//
//////////////////////////////////////////////////////////////////////////////////
//参数:
//clk时钟read普通
(1)/商家(0)读取choose商品选择coin投币(货币选择)start商品确定submit完成投币reset重新开始(清零)
moduleautomat(
inputclk,
inputread,
input[4:
0]choose,
input[2:
0]coin,
inputsubmit,
inputreset,
outputstate,
outputchooseNum,
outputpriceNow,
output[7:
0]nodes,
output[5:
0]catChoose
);
//分频时钟
regf_1000=0;
regf_100=0;
regf_1=0;
regf_0=0;
reg[3:
0]f_s0=0;
reg[6:
0]f_s1=0;
reg[13:
0]f_s2=0;
reg[13:
0]f_s3=0;
//价格表
reg[6:
0]pList[4:
0];
//库存表
reg[6:
0]sList[4:
0];
//当前选择的商品编号,0表示没有正确选择
reg[2:
0]chooseNum=0;
//按下确认键后,应该要支付的钱和库存
reg[6:
0]priceNow,stockNow;
//投入1毛5毛1元硬币及总共投入的钱
wire[6:
0]t1,t2,t3;
reg[6:
0]tall;
//退还的钱
reg[6:
0]reCoin;
//状态00为开始阶段,01为商品选择阶段,10为商品确认,开始投币状态,11为投币完成,开始出货找钱状态
reg[1:
0]state;
//输入状态0为调整价格1为调整库存
reginState;
//面值
parameterval1=5'b00001,val2=5'b00101,val3=5'b01010;
initial
begin
state=0;
inState=0;
pList[0]=0;pList[1]=7'b11100;pList[2]=7'b11001;pList[3]=7'b101101;pList[4]=7'b1101;
sList[0]=0;sList[1]=20;sList[2]=20;sList[3]=12;sList[4]=30;
end
/*****分频模块*****/
always@(posedgeclk)
begin
if(f_s0>9)
begin
f_1000=~f_1000;
f_s0=0;
end
else
f_s0=f_s0+1;
if(f_s1>99)
begin
f_100=~f_100;
f_s1=0;
end
else
f_s1=f_s1+1;
if(f_s2>9999)
begin
f_1=~f_1;
f_s2=0;
end
else
f_s2=f_s2+1;
if(f_s3>12000)
begin
f_0=~f_0;
f_s3=0;
end
else
f_s3=f_s3+1;
end
countCoincnt1(f_1000,read,coin[0],reset,val1,t1);
countCoincnt2(f_1000,read,coin[1],reset,val2,t2);
countCoincnt3(f_1000,read,coin[2],reset,val3,t3);
ledDisplayled(f_1000,state,priceNow,stockNow,tall,reCoin,nodes,catChoose);
always@(posedgef_1000)
begin
//普通读取模式
if(read==1)
begin
//清零状态,按键按下时清零1次
if(reset==1)
begin
chooseNum=0;
state=2'b00;
end
//商品可选取阶段
if(state<2)
begin
case(choose)
5'b00001:
chooseNum=1;
5'b00010:
chooseNum=2;
5'b00100:
chooseNum=3;
5'b01000:
chooseNum=4;
5'b00000:
;
//商品确认,且有有效的商品选择,进入10开始投币状态
5'b10000:
begin
if(state==2'b01)
state=2'b10;
end
default:
chooseNum=0;
endcase
priceNow=pList[chooseNum];
stockNow=sList[chooseNum];
//如果有库存,说明是有效的选择
if(stockNow>0)
begin
if(state==2'b00)
state=2'b01;
end
else
state=2'b00;
//在LED上显示当前商品的价格库存
end
else
//投币状态
if(state==2)
begin
tall=t1+t2+t3;
//投币不够
if(tall begin //显示投币数量 end else //投币足够 begin //开始找零,出商品 state=3; reCoin=tall-priceNow; sList[chooseNum]=sList[chooseNum]-1; //取下商品时触发reset按钮 end end end else //商家读取模式 begin state=2'b01; chooseNum=1; case(choose) 5'b00001: chooseNum=1; 5'b00010: chooseNum=2; 5'b00100: chooseNum=3; 5'b01000: chooseNum=4; 5'b00000: ; default: chooseNum=1; endcase if(coin[2]==1) inState=~inState; if(inState==0) begin if(coin[1]==1) pList[chooseNum]=pList[chooseNum]+1; if(coin[0]==1) pList[chooseNum]=pList[chooseNum]-1; end else begin if(coin[1]==1) sList[chooseNum]=sList[chooseNum]+1; if(coin[0]==1) sList[chooseNum]=sList[chooseNum]-1; end priceNow=pList[chooseNum]; stockNow=sList[chooseNum]; end end endmodule 货币计数段: `timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// //Company: //Engineer: // //CreateDate: 21: 18: 4006/30/2014 //DesignName: //ModuleName: countCoin //ProjectName: //TargetDevices: //Toolversions: //Description: // //Dependencies: // //Revision: //Revision0.01-FileCreated //AdditionalComments: // ////////////////////////////////////////////////////////////////////////////////// modulecountCoin( inputclk, inputen, inputen2, inputclr, input[4: 0]delta, outputreg[6: 0]total ); parameterTimeone=30; reg[4: 0]cnt; initial begin total=0; end always@(posedgeclk) begin if(clr) total=0; else begin/* if(cnt>Timeone) begin cnt=0; total=total+delta; end else if(en&&en2) cnt=cnt+1;*/ if(en&&en2) total=total+delta; end end endmodule P.S.一共三段,分别计数0.1,0.5,1三种不同的货币值。 此外我们添加了防抖动部分,但是实际效果一般,因为每次按键时的各项参数都不同,最终取简单测试下最好的阈值30作为最后的结果。 硬件显示部分: `timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// //Company: //Engineer: // //CreateDate: 22: 29: 1207/01/2014 //DesignName: //ModuleName: ledDisplay //ProjectName: //TargetDevices: //Toolversions: //Description: // //Dependencies: // //Revision: //Revision0.01-FileCreated //AdditionalComments: // ////////////////////////////////////////////////////////////////////////////////// //nodes为数码管连通信号cat为位选信号 moduleledDisplay( inputclk, input[1: 0]state, input[6: 0]price, input[6: 0]stock, input[6: 0]coin, input[6: 0]reCoin, outputreg[7: 0]nodes, outputreg[5: 0]catChoose ); reg[4: 0]price0,price1,stock0,stock1,stock2,re0,re1,showNum; reg[2: 0]cat; initial begin cat=0; end always@(posedgeclk) begin case(state) 2'b00: begin if(cat==5) showNum=0; else showNum=10; end 2'b01: begin price0=price%10; price1=price/10; stock0=stock%10; stock1=(stock/10)%10; stock2=stock/100; case(cat) //存量 5: showNum=stock2; 4: showNum=stock1; 3: showNum=stock0; //价格 1: showNum=price1; 0: showNum=price0; default: showNum=10; endcase end 2'b10: begin price0=coin%10;price1=coin/10; case(cat) 1: showNum=price1; 0: showNum=price0; default: showNum=10; endcase end 2'b11: begin price0=coin%10;price1=coin/10; re0=reCoin%10;re1=reCoin/10; case(cat) 1: showNum=price1; 0: showNum=price0; 5: showNum=re1; 4: showNum=re0; default: showNum=10; endcase end endcase //showNum转为数码管编码 if(cat! =1) begin case(showNum) 0: nodes=8'b00111111; 1: nodes=8'b00000110; 2: nodes=8'b01011011; 3: nodes=8'b01001111; 4: nodes=8'b01100110; 5: nodes=8'b01101101; 6: nodes=8'b01111101; 7: nodes=8'b00000111; 8: nodes=8'b01111111; 9: nodes=8'b01101111; 10: nodes=0; endcase end else begin case(showNum) 0: nodes=8'b10111111; 1: nodes=8'b10000110; 2: nodes=8'b11011011; 3: nodes=8'b11001111; 4: nodes=8'b11100110; 5: nodes=8'b11101
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 自动 售货