自动售货机设计.docx
《自动售货机设计.docx》由会员分享,可在线阅读,更多相关《自动售货机设计.docx(13页珍藏版)》请在冰豆网上搜索。
自动售货机设计
HDL(Verilog)课程设计报告(自动售货机)
2011-03-0221:
51:
23|分类:
电子、课程设计类|标签:
fpgaveriloghdl自动售货机quartus|字号大中小订阅
摘要
本设计是以现场可编程逻辑器件(FPGA)为核心的自动售货机,利用QuartusⅡ软件编写verilogHDL硬件描述语言程序以实现自动售货功能。
本设计主要以程序为主,硬件方面则使用实验箱,将程序各变量端口与实验箱管脚进行相应的配置,用八个开关分别代表商品价格、所投钱币价格及确认付款找零操作。
当选择好商品并投币后,数码管显示所选商品价格及投入钱币价格;按下确认付款开关,数码管显示应找多少钱,蜂鸣器响,对应商品LED灯亮。
若所投钱币不足所选商品价格,对应警告钱币不足的LED灯亮。
关键字:
FPGA、VerilogHDL、自动售货机、QuartusⅡ
Abstract
Thisdesignisanauto-vendingmachinebasedonfieldprogrammablelogicdevices(FPGA).WeuseQuartusⅡtowriteprocedureinverilogHDLwhichisalanguagetodescribehardware.Theprocedurewillrealizethefunctionofauto-vendingmachine.
Thisdesignismainlyaboutprocedure.Forthehardware,weuseexperimentalbox.Weallocateallvariablequantitiesintheproceduretothefeetinexperimentalbox.Weuseeightswitchrespectivelyrepresentcommoditypricesandthrowmoneypriceandconfirmpaymentchangeoperation.Whenchoosinggoodcommoditiesandcoin,digitalpipedisplayselectedcommoditypricesandmoneyprice.Whenpressingconfirmpaymentswitch,digitalpipedisplayshouldfindhowmuchmoney,buzzersounded,correspondingcommodityLEDlights.Ifthrowmoneyshortageselectedcommodityprices,correspondingwarningmoneyshortageofLEDlights.
Keywords:
FPGA、VerilogHDL、auto-vendingmachine、QuartusⅡ
目录
摘要I
第一章系统设计1
1.1系统设计1
1.2系统设计方案比较1
1.2.1总体设计1
1.2.1设计方案比较1
第二章详细设计2
2.1自动售货机状态描述2
2.2详细状态描述3
2.2.1初始状态3
2.2.2选商品状态3
2.2.3投币状态3
2.2.4找零状态3
第三章软件设计3
3.1程序总流程图3
3.2程序4
第四章结果与讨论7
4.1实验调试7
4.1.1调试步骤7
4.1.2实验现象7
4.2结果与分析8
总结8
参考文献8
附录9
第一章系统设计
1.1系统设计
(1)用四个发光二极管分别模拟售出价值为5角、1元、1.5元和2元的小商品,购买者可以通过开关选择任意一种标价中的小商品。
(2)灯亮时表示该小商品售出。
(3)用开关分别模拟5角、1元硬币和5元纸币投入,可以用几只发光二极管(或数码管)分别代表找回剩余的硬币。
(4)每次只能售出一种小商品,当所投硬币达到或超过购买者所选面值时,售出货物并找回剩余的硬币,回到初始状态;
(5)当所投硬币值不足面值时,可通过一个复位键退回所投硬币,回到初始状态。
1.2系统设计方案比较
1.2.1总体设计
采用FPGA来设计的原理图如图1.1所示.它由控制输入电路、FPGA、显示电路电路组成。
图1.1采用FPGA设计的自动售货机原理方框图
控制输入电路主要是为用户设计的,起到一个输入控制的作用。
FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现自动售货机运作的主要控制模块。
将编写好的HDL程序烧制到现场可编程逻辑器件FPGA中,然后通过控制输入电路把信号输入到FPGA,由八个开关控制输入信号即消费者选择商品和消费者投币及确认消费,动态数码管显示输出信号即找零环节和所选择的商品、消费者投币。
1.2.2设计方案比较
本设计可以通过多种方案来实现,下面就主要的三种方案进行阐述和比较。
方案一:
采用数字逻辑电路制作,用IC器件连接焊接外围电路实现,这种电路很直观,简单方便。
但应用数字逻辑电路制作,使用的器件较多,连接复杂,体积大,功耗大。
电路中焊点和线路较多会,使成品的稳定度和精度大大降低。
方案二:
使用现场可编程逻辑器件(FPGA)制作,利用VerilogHDL硬件描述语言编程进行控制,然后烧写实现。
方案三:
单片机现在已经达到很成熟的阶段了,它的应用也十分广泛。
采用单片机来实现自动售货机,它的原理方框图与用FPGA来实现的原理方框图类似,如图1.2所示。
图1.2采用单片机实现自动售货机的原理方框图
图1.1和图1.2的基本原理都相同,唯一不同的是一个是用FPGA来制作,一个是用单片机来实现。
采用单片机来实现自动售货机,主要的核心是单片机程序的设计。
方案比较:
对于自动售货机的设计,三个方案均可以实现,但是第一个方案中采用的是数字逻辑电路来制作,该电路硬件所需的器材多,体积庞大,比较复杂,而且精度和稳定度都不是很高。
第二个方案采用的是现场可编程逻辑器件来实现,它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
还可以用软件QuartusⅡ软件进行仿真和调试等。
可以充分利用HDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易.方案三也有它的优点,但同时也存在缺点。
它对设计者的要求比较高,设计者对软硬件必须十分熟悉[2]。
和方案二来比它的实验仿真没有方案二简单直观,调试也有一定的难度。
在外界环境相同的条件下,方案三设计出来的产品精度和稳定度要比方案二稍微差一些。
因此,自动售货机的设计我们选择方案二来实现。
第二章详细设计
2.1自动售货机状态描述
判断开关被按下的个数N。
若N>=2表示所选本次选择无效,返回初始状态;若N=1则显示所选商品,并继续执行下面的流程。
3个开关分别代表三种商品。
4个开关分别代表投入0.5元,1元,2元,5元,统计投入总额。
投入总额与商品价格做比较,如果总额<商品价格,退钱并返回初始状态如果总额>=商品价格,则继续执行下面的程序。
找零=总额-商品价格,数码管显示找零金额。
状态图如图2.1所示:
图2.1自动售货机状态图
2.2详细状态描述
2.2.1初始状态
各变量都设置为零,按下rst键后,一切恢复到初始状态。
2.2.2选商品状态
分别有价格为0.5元、1元、1.5元和2元的商品,每次选择商品前,设置一个标志位btn_sell表示选择商品状态。
此自动售货机每一次售货时只能一次选择一种商品,当同时选择两种以上时,选择商品无效,数码管显示清零,重新进行商品选择。
选择商品后,数码管显示所选商品价格。
2.2.3投币状态
当选好商品后,开始投币。
同样有一标志位btn_price表示投币金额。
投币口只接受三种面值的钱币0.5元、2元和5元,可以同时投入多种面值钱币。
投完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,就将全部投币金额退回;若确认购买商品,则进入下一状态——找零状态。
2.2.4找零状态
投完币,并确认购买商品后,进入找零状态。
首先要将所投的金额与所选商品的价格做比较,若所投金额小于商品价格,则退回所投钱币;若大于等于商品价格,则两者做差,得到需要找零的钱。
第三章软件设计
3.1程序总流程图
3.2程序
moduleauto_seller(clk,rst,dis_mony,dis_price,btn_ok,btn_mon,btn_sell,led_warn,led,beep);
inputclk,rst,btn_ok;
input[2:
0]btn_mon;//选择放入的钱
input[3:
0]btn_sell;//选择商品bbt_5,gz_10,kqs_15,kl_20
output[3:
0]led;//led_5,led_10,led_15,led_20
outputled_warn;//钱不足,指示灯
output[11:
0]dis_mony;//数码管显示投入面值,dia_mony[10:
7]=com位选,dis_mony[7:
0]=段码
output[11:
0]dis_price;//数码管显示价钱
outputbeep;
regclk_500Hz;
reg[3:
0]led;//led_5,led_10,led_15,led_20
regled_warn;//警告放入钱不足
reg[11:
0]dis_mony;
reg[11:
0]dis_price;
reg[31:
0]counter;
reg[9:
0]price,price_all;
reg[1:
0]flag=2'b00;//数码管显示标志位
regbeep=0;
parameterCOUNT1=25'd10000;
/*分频使数码管显示稳定*/
always@(posedgeclk)
begin
if(counter==0)
begin
counter<=COUNT1;
clk_500Hz<=~clk_500Hz;
end
else
counter<=counter-1;
end
always@(negedgerstorposedgeclk)
begin
if(!
rst)
begin
led=4'b0000;//LED灭
price_all=0;//价格清零
led_warn=0;
price=0;
beep=0;
end
else
begin/*三种面值共8种组合*/
case(btn_mon)
3'b001:
beginprice_all=5;end
3'b010:
beginprice_all=10;end
3'b100:
beginprice_all=50;end
3'b011:
beginprice_all=15;end
3'b101:
beginprice_all=55;end
3'b110:
beginprice_all=60;end
3'b111:
beginprice_all=65;end
default:
beginprice_all=0;end
endcase
case(btn_sell)
4'b0001:
beginprice=5;
end
4'b0010:
beginprice=10;
end
4'b0100:
beginprice=15;
end
4'b1000:
beginprice=20;
end
default:
beginprice=0;
end
endcase
if(btn_ok==1)
begin
if(price_allbegin
led_warn=1;
price=0;
end
else
begin//金钱足够
price_all=price_all-price;
beep=1;
case(price)//LED灯显示货物卖出
5:
beginled=4'b0001;end
10:
beginled=4'b0010;end
15:
beginled=4'b0100;end
20:
beginled=4'b1000;end
endcase
end
end
else
beep=0;
end
end
/*分频后将时钟给数码管,数码管分别显示放入钱的多少、商品价格*/
always@(posedgeclk_500Hz)
begin
case(flag)
2'b00:
begin
dis_mony<={4'b1110,led7(price_all%10),1'b1};
dis_price<={4'b1110,led7(price%10),1'b1};
flag=2'b01;
end
2'b01:
begin
dis_mony<={4'b1101,led7(price_all/10),1'b0};
dis_price<={4'b1101,led7(price/10),1'b0};
flag=2'b00;
end
endcase
end
/*数码管段码表*/
function[6:
0]led7;
input[3:
0]dis_input;
begin
case(dis_input)
0:
led7=~7'b111_1110;
1:
led7=~7'b011_0000;
2:
led7=~7'b110_1101;
3:
led7=~7'b111_1001;
4:
led7=~7'b011_0011;
5:
led7=~7'b101_1011;
6:
led7=~7'b101_1111;
7:
led7=~7'b111_0000;
8:
led7=~7'b111_1111;
9:
led7=~7'b111_0011;
default:
led7=~7'b111_1111;
endcase
end
endfunction
endmodule
第四章结果与讨论
4.1实验调试
4.1.1调试步骤
①运行QuartusII软件,新建工程。
②建立文本文件VerilogHDLFile。
在文件中写入程序。
保存,编译。
③分配管脚。
保存,编译。
④将生成的.sof文件写入FPGA试验箱中。
⑤根据要求选择几种买东西的可能情况,在实验箱上实验,观察记录结果。
4.1.2实验现象
⑴选择买0.5元的商品,投5元的金额,调试现象如下:
①选择0.5元商品数码管显示0.5,再选择一种商品,数码管显示清零,重新进行商品选择。
②按下5元投币键,对应数码管显示5.0。
③按下确认购买开关,找零时,对应数码管显示4.5,蜂鸣器响,对应0.5元商品的LED灯亮。
⑵选择1.5元的商品,投1元的金额,调试现象如下:
①选择1.5元的商品,对应数码管显示1.5。
②按下1元的投币键,对应数码管显示1。
③找零显示1元,退回所投的钱,表示警告的LED灯亮(交易不成功)。
4.2结果与分析
调试过程中出现的问题及原因:
①数码管显示不正确。
管脚配置不正确导致数码管显示异常。
②重新分配管脚后,仍为先前程序的操作结果。
重新配置管脚后,未运行程序,使得烧写进去的仍为原先的程序。
第五章总结
VHDL语言有限状态机设计控制电路,可大大降低设计难度和时间,提高设计效率和可靠性,利用语言的灵活性及功能强大的EDA工具,可以轻松完成硬件的功能扩充与升级,还可以实现更复杂的数字系统,整个设计过程相对于传统的设计方法,有较大的突破。
VHDL语言作为现代数字系统的重要设计工具,以其灵活、简洁的设计风格在电路设计中发挥着越来越重要的作用。
通过本次课程设计,我对VerilogHDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要要其实现的功能。
在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。
在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。
成功就是在不断摸索着前进中实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。
参考文献
[1]夏宇闻编著《Verilog数字系统教程》北京航空航天出版社
[2]梁瑞宇编写《FPGA设计实验指导书(VerilogHDL)》
[3]XX网站
附录
管脚分配:
I/O
管脚号
I/O
管脚号
btn_mon[0]
Pin_64
clk
Pin_28
btn_mon[1]
Pin_65
dis_price[0]
Pin_161
btn_mon[2]
Pin_66
dis_price[1]
Pin_143
btn_sell[0]
Pin_67
dis_price[2]
Pin_156
btn_sell[1]
Pin_68
dis_price[3]
Pin_159
btn_sell[2]
Pin_73
dis_price[4]
Pin_160
btn_sell[3]
Pin_74
dis_price[5]
Pin_162
btn_ok
Pin_75
dis_price[6]
Pin_144
dis_money[0]
Pin_179
dis_price[7]
Pin_158
dis_money[1]
Pin_173
dis_price[8]
Pin_163
dis_money[2]
Pin_175
dis_price[9]
Pin_164
dis_money[3]
Pin_177
dis_price[10]
Pin_165
dis_money[4]
Pin_178
dis_price[11]
Pin_166
dis_money[5]
Pin_180
beep
Pin_117
dis_money[6]
Pin_174
led[0]
Pin_2
dis_money[7]
Pin_176
led[1]
Pin_1
dis_money[8]
Pin_170
led[2]
Pin_61
dis_money[9]
Pin_169
led[3]
Pin_62
dis_money[10]
Pin_168
led_warn
Pin_63
dis_money[11]
Pin_167