HDL项目设计自动售货机.docx
《HDL项目设计自动售货机.docx》由会员分享,可在线阅读,更多相关《HDL项目设计自动售货机.docx(25页珍藏版)》请在冰豆网上搜索。
HDL项目设计自动售货机
河海大学计算机与信息学院(常州)
课程设计报告
题目HDL课程设计自动售货机
专业、学号电信1062610302
授课班号278605
学生姓名李珊珊
指导教师奚吉
完成时间2012年8月30日
摘要
《HDL硬件描述语言》是一门技术性、应用性很强的学科,实验课教学是它的一个极为重要的环节。
因此通过自主设计自动售货机,让我们能够将课堂上学到的理论知识与实际应用结合起来,并且进一步加深对分析、解决实际的数字电路问题的认识,。
本设计主要利用QuartusII平台,采用VHDL硬件描述语言编程的设计方法设计系统核心电路的硬件程序,之后借助ModelSim软件进行软件仿真,经过验证可以实现功能后,再将程序通过QuartusⅡ平台进行调试,最后将生成的目标文件下载到实验台内的FPGA芯片以实现该系统,并结合实验箱进行具体的显示。
最终完成的自动售货机系统具有投币处理、商品选择、找零、异常退币等主要功能。
本次设计中,用七个开关依次分别表示三种币值和四种价格的小商品,用数码管显示退币。
当投币并选择商品后,若投币总值大于等于商品价格,则成功购买,对应所购买商品的LED灯亮,数码管显示退币金额;若投币总值小于商品价格,则显示异常,商品LED灯不亮,所投金额全部退回,数码管显示退币金额。
【关键词】自动售货机HDLQuartusIIFPGA
ABSTRACT
"TheHDLhardwaredescriptionlanguage"isatechnical,appliedsubject,experimentalteachingisoneofitsmostimportantlink.Therefore,throughindependentdesignaauto-vendingmachine,sothatwecantotheclassroomtheoreticalknowledgeandpracticalapplicationofcombined,andtofurtherdeepentheanalysis,solvepracticaldigitalcircuitproblems,.
ThisdesignmainlyusesQuartusIIplatform,usingVHDLhardwaredescriptionlanguageprogrammingdesignmethodfordesignofsystemcorecircuithardwareprogram,followedbyModelSimsoftwarethroughsoftwaresimulation,validationfunctioncanbeachieved,thentheprogramthroughtheQuartusⅡplatformindebugging,finallywillgeneratethetargetfiledownloadtoexperimentalplatformFPGAchiptorealizethesystem,andcombiningwiththeexperimentalboxforaspecificdisplay.Finalcompletionofavendingmachinesystemhavingacoinprocessing,productselection,change,refundandothermajorfunctionalabnormalities.
Inthisdesign,withsevenswitchesrespectivelyrepresentthethreecurrencyandfourkindsofpricesofcommodity,withdigitaldisplaybackcurrency.Whenthecoinandmerchandiseselection,ifthecoinvaluegreaterthanorequaltocommodityprices,successfulbuy,correspondingtopurchaseLEDlights,digitaltubedisplaytherefundamount;ifthecoinvaluelessthancommodityprices,commoditydisplayabnormalities,LEDlightisnotbright,theinvestmentamountofallreturned,digitaltubedisplaytherefundamount.
【Keywords】auto-vendingmachineHDLQuartusIIFPGA
系统设计
1.设计目标
(1)用四个发光二极管分别模拟售出价值为5角、1元、1.5元和2元的小商品,购买者可以通过开关选择任意一种标价中的小商品。
(2)灯亮时表示该小商品售出。
(3)用开关分别模拟5角、1元硬币和5元纸币投入,可以用几只发光二极管(或数码管)分别代表找回剩余的硬币。
(4)每次只能售出一种小商品,当所投硬币达到或超过购买者所选面值时,售出货物并找回剩余的硬币,回到初始状态;
(5)当所投硬币值不足面值时,可通过一个复位键退回所投硬币,回到初始状态。
2.设计方案比较
本设计可以通过多种方案来实现,例如采用数字逻辑电路制作,用IC器件连接焊接外围电路实现,这种电路很直观,简单方便。
但应用数字逻辑电路制作,使用的器件较多,连接复杂,体积大,功耗大。
电路中焊点和线路较多会,使成品的稳定度和精度大大降低。
在本设计中,主要采用另一种方案:
使用现场可编程逻辑器件(FPGA)制作,利用VerilogHDL硬件描述语言编程进行控制,然后利用QuartusⅡ平台实现。
采用FPGA实现,它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
还可以用软件QuartusⅡ5.0进行仿真和调试等。
设计人员可以充分利用HDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易。
3.系统框图
选择商品
找零
初始状态
币值不足
币值充足
投币
4.详细方案
根据题目的基本要求,自动售货机的问题实际就是状态转换的问题,不同的状态对应不同的输出。
我们设计的自动售货机有四个状态,即初始状态、选择商品状态、投币状态、找零状态。
初始状态:
各变量都设置为零,按下rst键后,一切恢复到初始状态。
选择商品状态:
分别有价格为0.5元、1元、1.5元和2元的商品,每次选择商品前,设置一个标志位表示选择商品状态。
此自动售货机每一次售货时只能一次选择一种商品,当同时选择两种以上时,选择商品无效,数码管显示清零,重新进行商品选择。
选择商品后,数码管显示所选商品价格。
投币状态:
当选好商品后,开始投币,同样有一标志位表示投币金额。
投币口只接受三种面值的钱币0.5元、1元和5元,可以同时投入多种面值钱币。
完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,就将全部投币金额退回;若确认购买商品,则进入下一状态:
找零状态。
找零状态:
投完币,并确认购买商品后,进入找零状态。
首先要将所投的金额与所选商品的价格做比较,若所投金额小于商品价格,则退回所投钱币;若大于等于商品价格,则两者做差,得到需要找零的钱。
实际过程中,我们将此问题分为两部分来实现:
输入部分和输出部分。
输入部分:
包括复位信号、选择商品信号和投币信号。
四种小商品的选择可以分别用四个输入端代替,三种币值可以分别用三个输入端表示。
时钟信号clk为每个时钟的上升沿触发系统的状态转换;复位信号为上升沿触发,按下后自动回复初始状态;选择信号为4个按键,表示4种不同价值的小商品,高电平有效;投币信号为3个按键,表示3种币值,高电平有效;确定信号为选择投币后按确定键才能判断输出。
输出部分:
包括币值显示信号、货物信号及找零信号。
其中,用相应的指示灯表示所选货物、投币币值,用数码管显示找零信号。
5.程序
moduleseller(b1,b2,b3,pri_5,pri_10,pri_15,pri_20,clk,rst,out1,out2,goods,money);
inputb1,b2,b3;
inputpri_5,pri_10,pri_15,pri_20;
inputrst;
inputclk;
outputout1,out2;
outputgoods;
outputmoney;
reg[0:
2]money;
reg[0:
3]goods;
reg[0:
6]out1;
reg[0:
6]out2;
always@(clk)
if(rst)
begin
money=3'b000;
out1=7'b0111111;
out2=7'b0111111;
goods=4'b0000;
end
else
begin
if(b1==1&&b2==0&&b3==0)
begin
money=3'b001;
if(pri_5==1)
begin
out1=7'b0111111;
out2=7'b0111111;
goods=4'b0001;
money=3'b000;
end
else
begin
out1=7'b1101101;
out2=7'b0111111;
goods=4'b0000;
money=3'b000;
end
end
if(b1==0&&b2==1&&b3==0)
begin
money=3'b010;
if(pri_5==1)
begin
out1=7'b1101101;
out2=7'b0111111;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b0111111;
out2=7'b0111111;
goods=4'b0010;
money=3'b000;
end
else
begin
out1=7'b0111111;
out2=7'b0000110;
goods=4'b0000;
money=3'b000;
end
end
end
if(b1==0&&b2==0&b3==1)
begin
money=3'b100;
if(pri_5==1)
begin
out1=7'b1101101;
out2=7'b1100110;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b1111111;
out2=7'b1100110;
goods=4'b0010;
money=3'b000;
end
else
begin
if(pri_15==1)
begin
out1=7'b1101101;
out2=7'b1001111;
goods=4'b0100;
money=3'b000;
end
else
begin
if(pri_20==1)
begin
out1=7'b0111111;
out2=7'b1001111;
goods=4'b1000;
money=3'b000;
end
else
begin
out1=7'b0111111;
out2=7'b1101101;
goods=4'b0000;
money=3'b000;
end
end
end
end
end
if(b1==1&&b2==1&&b3==0)
begin
money=3'b011;
if(pri_5==1)
begin
out1=7'b0111111;
out2=7'b0000110;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b1101101;
out2=7'b0111111;
goods=4'b0010;
money=3'b000;
end
else
begin
if(pri_15==1)
begin
out1=7'b0111111;
out2=7'b0111111;
goods=4'b0100;
money=3'b000;
end
else
begin
out1=7'b1101101;
out2=7'b0000110;
goods=4'b0000;
money=3'b000;
end
end
end
end
if(b1==1&&b2==0&&b3==1)
begin
money=3'b101;
if(pri_5==1)
begin
out1=7'b0111111;
out2=7'b1101101;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b1101101;
out2=7'b1100110;
goods=4'b0010;
money=3'b000;
end
else
begin
if(pri_15==1)
begin
out1=7'b0111111;
out2=7'b1100110;
goods=4'b0100;
money=3'b000;
end
else
begin
if(pri_20==1)
begin
out1=7'b1101101;
out2=7'b1001111;
goods=4'b1000;
money=3'b000;
end
else
begin
out1=7'b1101101;
out2=7'b1101101;
goods=4'b0000;
money=3'b000;
end
end
end
end
end
if(b1==0&&b2==1&&b3==1)
begin
money=3'b110;
if(pri_5==1)
begin
out1=7'b1101101;
out2=7'b1101101;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b0111111;
out2=7'b1101101;
goods=4'b0010;
money=3'b000;
end
else
begin
if(pri_15==1)
begin
out1=7'b1101101;
out2=7'b1100110;
goods=4'b0100;
money=3'b000;
end
else
begin
if(pri_20==1)
begin
out1=7'b0111111;
out2=7'b1100110;
goods=4'b1000;
money=3'b000;
end
else
begin
out1=7'b0111111;
out2=7'b1111101;
goods=4'b0000;
money=3'b000;
end
end
end
end
end
if(b1==1&&b2==1&&b3==1)
begin
money=3'b111;
if(pri_5==1)
begin
out1=7'b0111111;
out2=7'b1111101;
goods=4'b0001;
money=3'b000;
end
else
begin
if(pri_10==1)
begin
out1=7'b1101101;
out2=7'b1101101;
goods=4'b0010;
money=3'b000;
end
else
begin
if(pri_15==1)
begin
out1=7'b0111111;
out2=7'b1101101;
goods=4'b0100;
money=3'b000;
end
else
begin
if(pri_20==1)
begin
out1=7'b1101101;
out2=7'b1100110;
goods=4'b1000;
money=3'b000;
end
else
begin
out1=7'b1101101;
out2=7'b1111101;
goods=4'b0000;
money=3'b000;
end
end
end
end
end
end
endmodule
moduleseller(clk,rst,price,yes,money,goods,led_warn,bizhi,led);
inputclk,rst,yes;
input[2:
0]money;
input[3:
0]goods;
output[3:
0]led;
outputled_warn;
output[11:
0]bizhi;
output[11:
0]price;
regclk_500Hz;
reg[3:
0]led;
regled_warn;
reg[11:
0]bizhi;
reg[11:
0]price;
reg[31:
0]counter;
reg[9:
0]inprice,price_all;
reg[1:
0]flag=2'b00;
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;
price_all=0;
led_warn=0;
price=0;
end
else
begin
case(money)
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(goods)
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(yes==1)
begin
if(price_allbegin
led_warn=1;
price=0;
end
else
begin
price_all=price_all-inprice;
case(price)
5:
beginled=4'b0001;end
10:
beginled=4'b0010;end
15:
beginled=4'b0100;end
20:
beginled=4'b1000;end
endcase
end
end
end
always@(posedgeclk_500Hz)
begin
case(flag)
2'b00:
begin
bizhi<={4'b1110,led7(price_all%10),1'b1};
price<={4'b1110,led7(price%10),1'b1};
flag=2'b01;
end
2'b01:
begin
bizhi<={4'b1101,led7(price_all/10),1'b0};
price<={4'b1101,led7(price/10),1'b0};
flag=2'b00;
end
endcase
end
function[6:
0]led7;
input[3:
0]input;
begin
case(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
结果与讨论
1.调试步骤
(1)运行Quart