基于FPGA的自动售饮料机设计.docx
- 文档编号:7026857
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:19
- 大小:926.86KB
基于FPGA的自动售饮料机设计.docx
《基于FPGA的自动售饮料机设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的自动售饮料机设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于FPGA的自动售饮料机设计
摘要1
摘要
本文介绍了以FPGA技术为核心,运用VerilogHDL语言功能的编程实现,通过QuartusⅡ对完成的设计进行仿真验证,以及使用CycloneⅢ开发板进行硬件的实现,对一个典型的自动售饮料机进行设计开发,实现相应的硬币识别,分析判断,取饮料,找零等基本的功能。
使有关的设计方法思路得到一个很好的证实与实现。
关键词:
自动售饮料机;FPGA;VerilogHDL;QuartusⅡ;CycloneⅢ
Abstract
ThispaperintroducestheFPGAtechnologyasthecore,theuseofVerilogHDLlanguagefunctionsfortheprogramming,throughtheQuartusⅡtofinishthedesignsimulationresults,anduseofCycloneⅢdevelopmentboardtherealizationofhardware,foratypicalvendingdrinkmachinestocarryonthedesigndevelopment,realizethecorrespondingCOINSrecognition,theanalysisjudgment,takebeverage,suchasthefunctionofthebasicchange.Makethedesignmethodideasgetagoodproofandrealized.
Keywords:
VendingDdrinkMmachines;FPGA;VerilogHDL;QuartusⅡ;CycloneⅢ
0引言
随着电子技术和计算机技术的飞速发展,电子线路的设计工作也日益显得重要。
经过人工设计、制作实验板、调试再修改的多次循环才定型的传统产品设计方法必然被计算机辅助设计所取代,因为这种费时费力又费资源的设计调试方法既增加了产品开发的成本,又受到实验工作场地及仪器设备的限制。
为了克服上述困难,加拿大InteractiveImageTechnologies公司推出的基于Windows操作系统的EDA软件。
他可以将不同类型的电路组合成混合电路进行仿真。
此外,从另一角度来看,随着计算机技术和集成电路技术的发展,现代电子与电工设计,已经步入了电子设计自动化(EDA)的时代,采用虚拟仿真的手段对电子产品进行前期工作的调试,已成为一种发展的必然趋势。
通过对实际电子线路的仿真分析,从而提高对电路的分析、设计和创新能力。
数字集成电路本身在不断地进行更新换代。
它由早期的电子管、晶体管、小中规模集成电路、发展到超大规模集成电路(VLSIC,几万门以上)以及许多具有特定功能的专用集成电路。
但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。
系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。
FPGA(现场可编程门阵列)与CPLD(复杂可编程逻辑器件)都是可编程逻辑器件,它们是在PAL,GAL等逻辑器件的基础之上发展起来的。
同以往的PAL,GAL等相比较,FPGA/CPLD的规模比较大,它可以替代几十甚至几千块通用IC芯片。
这样的FPGA/CPLD实际上就是一个子系统部件。
本次EDA课程设计就是利用VerilogHDL来设计基于FPGA来设计一个自动售饮料机,机器设有2个投币孔,可以接受一元和五角的硬币,每瓶饮料2.5元,找零和投币显示等功能。
设计按照EDA课程设计的流程,源代码的编写,前仿真,综合,然后布局布线,后仿真,前、后仿真验证成功后,下载到FPGA实验箱上进行验证。
本此设计综合利用QuartusⅡ等设计软件进行课程设计。
1自动售饮料机设计要求
1.1功能示意图
图1.1自动售饮料机的功能示意图
1.2功能描述
机器设有2个投币孔,可以接受一元和五角的硬币(用两个按键模拟代替,按下按键有效时,对应的各个指示灯亮),每瓶饮料2.5元。
投入硬币数不够2.5元时,系统不送出饮料;投入硬币数刚好够2.5元时,系统送出饮料(提示投币者取走饮料-----用发光二级管发光模拟代替,售出饮料成功-----用发光二级管发光模拟代替);投入硬币数是3元时,系统送出饮料(提示投币者取走饮料-----用发光二级管发光模拟代替,售出饮料成功-----用发光二级管发光模拟代替),并找零0.5元(找零并提示投币者取走找零-----用发光二级管发光模拟代替)。
多于3元时,计入下一个判断循环。
按下复位按键,对应的有效输入指示灯亮,蜂鸣器发出提示音。
币值显示的是当前售饮料机内的硬币总面值,当有找零时,找零显示显示找零币值(0.5元),提醒投币者取走零钱。
设计按照EDA课程设计的流程,源代码的编写,前仿真,综合,然后布局布线,后仿真,前、后仿真验证成功后,下载到FPGA实验箱上进行验证。
本此设计综合利用QuartusⅡ等设计软件进行课程设计。
2自动售饮料机设计方案
2.1设计思路功能框图
图2.1功能实现框图
2.2功能模块介绍
(1)输入模块:
为硬币投入检测的传感器信号,此处用按键模拟代替。
附加复位按键。
(2)分频消抖模块:
分频器和消抖延时配合共同实现按键消抖的功能。
分频器5/2倍频后为50MHZ,作为输入给延时模块,与其程序配合完成消抖。
(3)逻辑控制模块:
输入的信号经过消抖后进入控制模块,进行逻辑判断。
(详见设计要求)
(4)显示输出模块:
蜂鸣器为复位按键的有效提示信号,按下复位按钮蜂鸣器响一声。
指示灯为发光二级管,为3个按键(0.5元、1元和复位)的按下有效指示灯信号。
输出为找零,取饮料,售出饮料,实际设计机械原理以及电动机的知识,此处分别也用3个灯代替模拟。
显示为CycloneⅢ开发板自带数码管显示币值(LCDA,LCDB),找零(LCDC)。
2.3功能实现电路总图
图2.2功能实现电路总图
3自动售饮料机设计实现
3.1逻辑控制模块
3.1.1程序流程图
图3.1.1程序流程图
3.1.2引脚分配
表3.1.1主程序输入输出信号分配列表
输入信号
输出信号
代码
名称
引脚
代码
名称
引脚
clk
时钟输入
PIN22
half_out
找零信号
PIN2
reset
系统复位信号
PIN64
dispense
机器售出一瓶饮料
PIN1
half_dollar
投入五角硬币
PIN59
collect
提示投币者取走饮料
PIN144
one_dollar
投入一元硬币
PIN60
seg1
LCDA数码管显示
固定
seg2
LCDB数码管显示
固定
seg3
LCDC数码管显示
固定
3.1.3顶层封装图
图3.1.2顶层封装图
3.1.4小结
(1)原程序仿真可以实现,但硬件无法实现,需经过如下纠正:
if(!
half_dollar)更改为{temp1,half_dollar}==2'b10,同理将之后的条件判断语句按如此改变。
旨在突出下降沿判断为激励有效信号,安全可靠性提高,硬件实现准确。
(2)CycloneⅢ系列:
按键本身无触发状态下是高电平,按下是低电平;二极管是高电平触发发光。
数码管LCDA、LCDB是BCD码控制的,LCDC是七段式端口的通俗控制方式,高电平有效发光。
(3)在使用有限状态机是,赋值语句采用“<=”,而不是“=”。
3.2分频消抖模块
3.2.1消抖方法
对于本部分,尝试了很多的消抖方法。
最后采取了一个成熟的经验证的消抖程序。
分频与延时的结合。
通常的消抖方式分为:
(1)延时方式去除毛刺。
通过变量的累积,是程序循环进行达到延时目的,跳过抖动时刻,但是参数值往往难以控制,每个按键的制作工艺不同,抖动程度难以准确判断。
(2)逻辑方式去除毛刺。
通过D触发器的级联传递原理设计,触发器数目越多,延时效果越好。
(3)定时方式去除毛刺。
对高电平和低电平脉宽计数,达到设定数目值,才判断为高/低电平。
本设计采用5/2的倍频输入,经过延时程序,提高精度,延时效果明显,使用成熟。
3.2.2引脚分配
表3.2.1消抖输入输出信号分配列表
输入信号
输出信号
代码
名称
引脚
代码
名称
引脚
clk
时钟输入
PIN22
temp1
1元投币有效指示信号
PIN10
temp2
0.5元投币有效指示信号
PIN11
temp3
复位有效指示信号
PIN7
3.2.3顶层封装图
图3.2.15/2倍频的分频器
图3.2.2延时消抖顶层封装
3.3输出及显示模块
3.3.1蜂鸣器
执行整个程序的时间很短,远远小于时钟周期,所以,程序运行原理:
每有个上升沿到来,程序就从上到下执行一次。
蜂鸣器的发生可用过软件实现,也可以用分频器的方式直接实现,不需要程序编写。
纯软件实现发生,人能听到的频率300HZ--20KHZ,取2KHZ,10000=20*1000000/2000。
图3.3.1蜂鸣器发声驱动程序顶层封装
表3.3.1蜂鸣器输入输出信号分配列表
输入信号
输出信号
代码
名称
引脚
代码
名称
引脚
clk
时钟输入
PIN22
p
蜂鸣器激励信号
PIN143
reset
系统复位信号
PIN64
3.3.2数码管
应用CycloneⅢ开发板自带数码管显示。
币值显示使用(LCDA,LCDB),这两个数码管是直接通过4位二进制BCD码控制,在程序编写时直接给其赋值即可,每个数码管只需绑定4个引脚即可。
找零显示使用(LCDC),这个数码管是七段式普通控制,需要分别对a,b,c,d,e,f,g,h进行绑定。
高电平有效发光。
表3.3.2数码管端口引脚分配列表
LCDA(seg1[3.0])
LCDB(seg2[3.0])
LCDC(seg3[7.0])
代码
引脚
代码
引脚
代码
引脚
代码
引脚
seg1[3]
PIN43
seg2[3]
PIN34
seg3[7]
PIN58
seg3[3]
PIN52
seg1[2]
PIN44
seg2[2]
PIN38
seg3[6]
PIN55
seg3[2]
PIN51
seg1[2]
PIN46
seg2[1]
PIN39
seg3[5]
PIN54
seg3[1]
PIN50
seg1[0]
PIN32
seg2[0]
PIN42
seg3[4]
PIN53
seg3[0]
PIN49
3.3.3二极管
发光二极管,高电平有效发光。
表3.3.3二极管端口引脚分配列表
输出信号
指示信号
代码
名称
引脚
代码
名称
引脚
half_out
找零信号
PIN2
half_dollar
投入五角硬币
PIN11
dispense
售出一瓶饮料
PIN1
one_dollar
投入一元硬币
PIN10
collect
提示取走饮料
PIN144
reset
复位信号
PIN7
4自动售饮料机结果仿真与验证
4.1QuartusⅡ软件仿真设置
输入:
clk(表示时钟输入)
reset(为系统复位信号)
half_dollar(代表投入五角硬币)
one_dollar(代表投入一元硬币)
输出:
half_out(表示找零信号)
dispense(表示机器售出一瓶饮料)
collect(该信号用于提示投币者取走饮料)
clock设置:
时间范围0—50us,时间间隔1us,如图4.1。
图4.1.1clock设置
4.2仿真波形图
饮料2.5元,投入硬币数不够2.5元时,系统不送出饮料;投入硬币数刚好够2.5元或多于2.5元时,系统送出饮料;投入硬币数是3元时,系统送出饮料,并找零0.5元。
多于3元时,计入下一个判断循环。
先投入5角,再投入1元,共1.5元。
再复位。
仿真波形图如图4.2.1和图4.2.2。
图4.2.1投入1.5元仿真前波形图
图4.2.2投入1.5元仿真后波形图
先投入5角,投入1元,再投入1元,共2.5元。
再复位。
仿真波形图如图4.2.3和图4.2.4。
图4.2.3投入2.5元仿真前波形图
图4.2.4投入2.5元仿真后波形图
先投入1元,投入1元,再投入1元,共3元。
再复位。
仿真波形图如图4.2.5和图4.2.6。
图4.2.5投入3元仿真前波形图
图4.2.6投入3元仿真后波形图
4.3硬件实现
图4.3.1初始状态
图4.3.2售出饮料
图4.3.3售出饮料并找零
5总结
本课程设计延续上学期的相关设计---自动售饮料机。
上学期主要是完成程序的编写和仿真。
本学期是完成硬件实现与功能完善。
但是经过自己的实践探索,硬件实现远远没有想象的那么简单。
仿真是很理想的状态,硬件实现确实很实际的条件下,所以依旧按照原来的程序是无法实现的。
在对程序进行修改和按键消抖等辅助操作改进后多次尝试才得以实现。
这使我深刻认识到理论与现实的差距。
基于FPGA的自动售饮料机的设计,图书馆和互联网资料繁多,不仅程序思路一致,程序实现方式也不谋而合。
QuartusⅡ仿真(理想状态)结果正确,硬件实现过程艰难,之后对程序改动后才可硬件实现。
例如,按键消抖,程序的时序偏差等。
经过进一步的深入学习探索,对本设计课题有了更好的认识与理解。
由于在学期末时间比较紧张,有关本课程设计的功能有待进一步完善。
比如,可以识别多种饮料,可以通过液晶显示更多的饮料信息(饮料的价格,种类),可以同时选择购买不同的饮料,可以在投入金额不足时自动退钱,可以增加语音模块等等功能。
虽然本次设计实现的功能比较基本简练,但是也是花费了大量的时间。
因为本身最初的程序是有问题的,仿真可以实现,硬件无法实现。
本以为是按键消抖的原因,因此在消抖的问题上尝试了不同的方法,花费了大量的时间。
但是最后才发觉问题出在程序上,触发信号的时序与实际情况不吻合,硬件实现错误。
在修改程序后才找到问题的根源,顺利实现硬件测试模拟。
所以实际上本次设计和自己的预期还是有一定的差距。
但是,我们在这不断地探索实践中学到了很珍贵的经验。
我们的努力使我们在实践中对这么学科有了更深的认识!
致谢
感谢潘老师,课堂实验的时候向老师问了很多问题,老师都耐心解答,同
时我也从和潘老师的交流中学到了很多有关FPGA学习和论文发表研究方面的经验。
另外感谢刘强同学,在程序调试过程中给与我很大的帮助,同时还有平时给予我帮助的同学老师们,谢谢你们!
!
!
参考文献
[1]潘松,黄继业,潘明.EDA技术实用教程与VerilogHDL版(第四版)..北京:
科学出版社,2010.7.
[2]王金明.数字系统设计与VerilogHDL[M].电子工业出版社.2009.1.
[3]王金明,冷自强.EDA技术与Verilog设计[M].北京:
科学出版社,2008.8.
[4]潘松,黄继业.EDA技术与VHDL[M].北京:
清华大学出版社,2007.
[5]姜雪松,张海风.可编程逻辑器件和EDA设计技术[M].北京:
机械工业出版社,2006.
[6]潘松,黄继业.EDA技术实用教程(第二版).科学出版社,2005.2.
[7]廖日坤,CPLD/FPGA嵌入式应用开发技术白金手册[M].北京:
中国电力出版社,2005.
[8]杨刚.现代电子技术-VHDL与数字系统设计[M].电子工业出版社,2004.4.
[9]褚振勇,翁木云.FPGA设计及应用[M].西安:
电子科技大学出版社,2002.
附录1功能主程序
/*信号定义:
clk:
表示时钟输入;
reset:
为系统复位信号;
half_dollar:
代表投入五角硬币;
one_dollar:
代表投入一元硬币;
half_out:
表示找零信号;
dispense:
表示机器售出一瓶饮料;
collect:
该信号用于提示投币者取走饮料;
seg1:
LCDA数码管显示;
seg2:
LCDB数码管显示;
seg3:
LCDC数码管显示;*/
modulesell(one_dollar,half_dollar,collect,half_out,dispense,reset,clk,seg1,seg2,seg3);
parameteridle=0,one=2,half=1,two=3,three=4;
//idle、one,half,two,three为中间状态变量,代表投入硬币的几种情况
inputone_dollar,half_dollar,reset,clk;
outputcollect,half_out,dispense,seg1,seg2,seg3;
reg[2:
0]D;//D为当前售饮料机的钱币状态
regtemp1,temp2;
regcollect,half_out,dispense;
reg[3:
0]seg1;reg[3:
0]seg2;reg[7:
0]seg3;
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begindispense<=0;collect<=0;half_out<=0;D<=idle;
temp1<=0;temp2<=0;
{seg1,seg2}<=8'b0000_0000;{seg3}<=8'b11111101;end
else
begintemp1<=half_dollar;temp2<=one_dollar;//初始状态赋值
case(D)
idle:
if({temp1,half_dollar}==2'b10)//0元状态下检测下降沿
beginD<=half;
{seg1,seg2}<=8'b0000_0101;{seg3}<=8'b11111101;//数码管显示
dispense<=0;collect<=0;half_out<=0;end//循环时输出置0
elseif({temp2,one_dollar}==2'b10)
beginD<=one;
{seg1,seg2}<=8'b0001_0000;{seg3}<=8'b11111101;
dispense<=0;collect<=0;half_out<=0;end
half:
if({temp1,half_dollar}==2'b10)//0.5元状态下检测下降沿
beginD<=one;
{seg1,seg2}<=8'b0001_0000;{seg3}<=8'b11111101;end
elseif({temp2,one_dollar}==2'b10)
beginD<=two;
{seg1,seg2}<=8'b0001_0101;{seg3}<=8'b11111101;end
one:
if({temp1,half_dollar}==2'b10)//1元状态下检测下降沿
beginD<=two;
{seg1,seg2}<=8'b0001_0101;{seg3}<=8'b11111101;end
elseif({temp2,one_dollar}==2'b10)
beginD<=three;
{seg1,seg2}<=8'b0010_0000;{seg3}<=8'b11111101;end
two:
if({temp1,half_dollar}==2'b10)//1.5元状态下检测下降沿
beginD<=three;
{seg1,seg2}<=8'b0010_0000;{seg3}<=8'b11111101;end
elseif({temp2,one_dollar}==2'b10)
begindispense<=1;collect<=1;D<=idle;
{seg1,seg2}<=8'b0010_0101;{seg3}<=8'b11111101;end//售出饮料
three:
if({temp1,half_dollar}==2'b10)//2元状态下检测下降沿
begindispense<=1;collect<=1;D<=idle;
{seg1,seg2}<=8'b0010_0101;{seg3}<=8'b11111101;end//售出饮料
elseif({temp2,one_dollar}==2'b10)
begindispense<=1;collect<=1;half_out<=1;D<=idle;
{seg1,seg2}<=8'b0011_0000;{seg3}<=8'b10110110;end//售出饮料
endcase
end
end
endmodule
附录2复位键蜂鸣器提示音程序
modulesound(clk,p,key);
inputclk,key;outputp;
regp,key1;reg[20:
0]count;
always@(posedgeclk)//判断按键是否按下
beginif(key==1)key1<=1;
elsekey1<=0;end
always@(posedgeclk)//计数循环延时
beginif(count==10000)//if语句没有数的限制,100000都可以,for语句就有限制
begincount<=0;if(key1==0)p<=~p;end
else
count<=count+1;end
endmodule
附录3消抖延时程序
moduledelay(CLK_50MHz,keyin,keyout);
inputCLK_50MHz;inputkeyin;
outputkeyout;
reg[23:
0]count_high=0;reg[23:
0]count_low=0;regkey_reg=1;
assignkeyout=key_reg;
always@(posedgeCLK_50MHz)
if(keyin==1'b0)count_low<=count_low+24'h1;
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 自动 饮料机 设计