HDL项目设计自动售货机.docx

上传人:b****6 文档编号:6166810 上传时间:2023-01-04 格式:DOCX 页数:25 大小:87.79KB
下载 相关 举报
HDL项目设计自动售货机.docx_第1页
第1页 / 共25页
HDL项目设计自动售货机.docx_第2页
第2页 / 共25页
HDL项目设计自动售货机.docx_第3页
第3页 / 共25页
HDL项目设计自动售货机.docx_第4页
第4页 / 共25页
HDL项目设计自动售货机.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

HDL项目设计自动售货机.docx

《HDL项目设计自动售货机.docx》由会员分享,可在线阅读,更多相关《HDL项目设计自动售货机.docx(25页珍藏版)》请在冰豆网上搜索。

HDL项目设计自动售货机.docx

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_all

begin

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1