自动售货机课程设计.docx
《自动售货机课程设计.docx》由会员分享,可在线阅读,更多相关《自动售货机课程设计.docx(12页珍藏版)》请在冰豆网上搜索。
自动售货机课程设计
存档资料成绩:
华东交通大学理工学院
课程设计报告书
所属课程名称《电子(通信)系统设计》
题目 自动售货机系统设计
分院 电信分院
专业班级09级电信综合班
学 号 20090210420123
学生姓名 朱文斌
指导教师 赵魏
2012年12月28日
华东交通大学理工学院
课程设计(论文)任务书
专业09通信班级1班姓名朱文斌
一、课程设计(论文)题目自动售货机系统设计
二、课程设计(论文)工作:
自2012年12月17日起至2012年12月28日止。
三、课程设计(论文)的内容要求:
1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。
出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。
此累加器只有商家可以控制清零。
学生签名:
朱文斌
2012年12月28日
课程设计(论文)评阅意见
序号
项目
等 级
优秀
良好
中等
及格
不及格
1
课程设计态度评价
2
出勤情况评价
3
任务难度评价
4
工作量饱满评价
5
设计中创新性评价
6
论文书写规范化评价
7
综合应用能力评价
综合评定等级
评阅人赵巍 职称讲师
2012年12月28日
目 录
第1章课程设计内容及要求........................2
第2章程序设计目的..............................5
第3章程序实现思路..............................6
第4章程序清单(或正文)........................8
第5章课程设计心得.............................15
第6章参考文献.................................16
第2章
程序设计目的
1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。
出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。
此累加器只有商家可以控制清零。
6)此售货机要设有一个由商家控制的整体复位控制。
第3章程序实现思路
3.1此次设计的自动售货机的功能简介
基本原理:
硬件实现中,顾客首先按键来选择自己想购买的货物,自动售货机会用数码管显示出来,然后顾客再选择货币种类,自动售货机也用数码管显示出来,顾客投币,自动售货机通过货币识别器来识别货币,顾客按确认键3s之后,自动售货机马上做出判断,投入的钱大于价格,则送出此货物,并找零,否则就会报警持续3s,自动售货机自动恢复初始状态等待为下一顾客服务,同时,它还会为商家做卖货额累加功能,并且这显示只能由商家来清零(商家通过整体复位来清零)
那么,基于硬件电路,软件来实现的时候就尽量模仿此按键、显示部分、以及各功能,在本文中用state、state_next、sure、give、clk、reset、goods1、goods2、goods3、goods4、j、display、profit、i、warning、readya、readyb、readyc、readyd、readye、readyf来实现模拟,并且这些变量名称通俗易懂,并且程序已全部给出。
3.2实现自动售货机的功能的设计思路
变量选择:
货物选择有四种,货币选择有四种,这样可以用编码形式设置成两位即可,但是考虑到与state作为引发条件,故两位不够,为了简便,本文用四位独热码编码方式;设计要求三次显示出货物选择、货币选择、找零显示,当然设置成三个数码管肯定可以,但是为来节约成本,就用一个两位的数码管显示即可,但此时要求数码管时分时使用;卖货额累加显示用八位的,以便在硬件中方便用数码管显示(当然需要7448显示译码器);另外售出的货物用四个数表示,送出的就为1,此功能与实际要求中四个不同颜色的指示灯显示匹配;实际要求还有说3s,故得引入时钟信号,但实现此功能只需要示意即可,用5个时钟周期示意。
程序构建:
本文模块是分步实现,所以得借助中间变量来引发下一次操作,一共六步,大概需要六个变量,结合引发功能,故用wait语句来实现,当wait()中括号内的条件满足则执行,否则循环等待,按照此想法,故每个子模块中都用到wait语句;另外,此程序明显要求多路选择,故用case语句,满足case()中对应条件,则执行对应的语句,实现对应的功能,此过程中还得用到辅助变量,本文可用j来实现,为case语句结合使用;当然if、else语句少不了;阻塞语句和非阻塞语句使用,他们只有是立即赋值还是等到下一时钟上升沿来到时再赋值,本文因为考虑到实时性,故主要用到阻塞赋值。
测试文件生成:
本来严格的需要用自动生成测试文件,这样可靠性更高,但是结合本文具体设计而言,手工写测试文件足已(程序代码不是很大),考虑到之前.v文件每个模块基本上都用到时钟的上升沿,这个引发条件就迫使测试文件中state和state_next中一直有效,等到sure按下3s后再清零,这使得硬件实现中得考虑这问题(用D触发器等们实现锁存等功能)
第4章程序清单或正文
程序代码:
mescale1ns/100ps
moduleAUTOTELLER(clk,state,state_next,sure,reset,give,goods1,goods2,goods3,goods4,warning,display,profit);
inputclk,state,state_next,sure,reset,give;
outputgoods1,goods2,goods3,goods4,warning,display,profit;
wireclk;
wirereset;
wiresure;
wire[3:
0]state;
wire[3:
0]state_next;
wire[3:
0]give;
reg[2:
0]j;
regreadya;
regreadyb;
regreadyc;
regreadyd;
regreadye;
regreadyf;
integeri;
reggoods1;
reggoods2;
reggoods3;
reggoods4;
regwarning;
reg[3:
0]display;
reg[7:
0]profit;
always@(posedgeclk)//商家整体复位
if(!
reset)
begin
display=4'b0000;
profit=8'b00000000;
j=3'b000;
warning=1'b0;
goods1=1'b0;
goods2=1'b0;
goods3=1'b0;
goods4=1'b0;
readya=1'b0;
readyb=1'b0;
readyc=1'b0;
readyd=1'b0;
readye=1'b0;
readyf=1'b0;
end
always@(posedgeclk)//顾客货品选择模拟以及显示
if(state!
=4'b0000)
begin
readya<=1'b1;
case(state)
4'b1000:
display=4'b0001;
4'b0100:
display=4'b0010;
4'b0010:
display=4'b0101;
4'b0001:
display=4'b1010;
endcase
end
always@(posedgeclkorposedgereadya)//顾客货币选择以及显示
begin
wait(readya)
begin
case(state_next)
4'b1000:
begin
display=4'b0001;
j=3'b001;
readyb=1'b1;
end
4'b0100:
begin
display=4'b0010;
j=3'b010;
readyb=1'b1;
end
4'b0010:
begin
display=4'b0101;
j=3'b011;
readyb=1'b1;
end
4'b0001:
begin
display=4'b1010;
j=3'b100;
readyb=1'b1;
end
default:
begin
display=4'b0000;
j=3'b000;
readyb=1'b0;
end
endcase
end
end
always@(posedgeclkorposedgereadyb)//投入货币不足引起警告准备找零显示
begin
wait(readyb)
begin
readya=1'b0;
if(sure)
begin
readyc=1'b1;
if(givebegin
i=5;
readyd=1'b1;
end
else
begin
display=give-display;
readye=1'b1;
end
end
end
end
always@(posedgeclk)//货物送出及商家卖货额累加显示
begin
wait(readye)
begin
case(j)
3'b001:
begin
goods1=1'b1;
profit=profit+8'b00000001;
end
3'b010:
begin
goods2=1'b1;
profit=profit+8'b00000010;
end
3'b011:
begin
goods3=1'b1;
profit=profit+8'b00000101;
end
3'b100:
begin
goods4=1'b1;
profit=profit+8'b00001010;
end
endcase
end
end
always@(posedgeclk)//3s警告或者是按键3s后自动复位准备下一位顾客操作
begin
wait(readyc)
begin
readyb=1'b0;
if(i>=1)
begin
if(readyd)
begin
warning<=1'b1;
i=i-1;
end
else
i=i+0;
end
else
begin
readyd=1'b0;
readyc=1'b0;
readyf=1'b1;
warning=1'b0;
goods1=1'b0;
goods2=1'b0;
goods3=1'b0;
goods4=1'b0;
end
end
end
always@(posedgeclk)
begin
wait(readyf)
begin
readye=1'b0;
end
end
第5章 课程设计心得
通过本次课程设计,我对VerilogHDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要要其实现的功能。
在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。
在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。
成功就是在不断摸索着前进中实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。
第6章 参考文献(资料)
[1]夏宇闻编著《Verilog数字系统教程》北京航空航天出版社
[2]梁瑞宇编写《FPGA设计实验指导书(VerilogHDL)》
[3]XX网站