FPGA实验报告.docx
- 文档编号:27281902
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:28
- 大小:334.42KB
FPGA实验报告.docx
《FPGA实验报告.docx》由会员分享,可在线阅读,更多相关《FPGA实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
FPGA实验报告
基于FPGA的自动售货机系统设计
设计者:
电子信息工程(3)班
07130314陈林
07130307刘开欢
071303徐闯
日期:
2016年1月4日
摘要:
随着我国商品市场的不断繁荣和城市现代化程度的不断提高,自动售货机也已悄然步入了我国的大中城市。
丰富了中国的商业产业结构,开创了一个全新的自动销售和自助服务时代。
该设计是在VHDL的基础上对自动售货机进行设计来实现其基本功能的,采用Altera的开发软件QuartsII.通过在该平台进行数字电路设计和仿真的方法,介绍自动售货机的基本原理和主要功能。
文章简述了自动售货机的设计要求、设计思路,并给出总体设计框图,写出VHDL程序代码,将代码在QuartusII软件平台上进行编译仿真,波形符合设计要求。
最终成品具有商品选择、投币处理、出货找零等主要功能。
整个系统的开发体现了在QuartusII软件平台上用VHDL设计数字控制系统的实用性。
关键词:
FPGAEDA自动售货机VHDL
1方案设计与论证………………………………………………………………4
2自动售货机控制电路总体设计…………………………………………………5
3自动售货机控制电路各模块信号分析…………………………………………
4仿真与测试分析…………………………………………………………………
参考文献………………………………………………………………………………
附录……………………………………………………………………………………
第一章:
方案设计与论证
第二章:
自动售货机控制电路总体设计
2.1设计思想
2.1.1功能要求
(1)该系统能完成对货物信息的存储、进程控制、钱币处理、余额计算和显示功能。
(2)自动售货机能够销售4种商品:
热狗(1元),汉堡包(4元),双层汉堡包(8元),饮料(3元)数量无限。
自动售货机允许投入1元,2元,5元硬币:
当总币值等于顾客需要的商品单价时,机器送出需要的商品:
若总币值大于顾客需要的商品单价时,机器除提供所需商品外,并将余币退出;若总币值小于顾客需要的商品单价时,机器退出顾客投入的硬币。
设机器内1元和2元的找零硬币无限。
(3)如果投入的硬币达到或大于所购商品的价格,自动售货机会发出一个指示信号使接受硬币的装置不再接收新的硬币。
(4)每次投币的时间有限制,不得超过30秒,在时间到时,总币值不足顾客购买的商品单价时,自动售货机按不足钱数处理,退还全部硬币。
或者在设定时间内,总币值不足顾客购买的商品单价时,若需要取消交易则可按取消键,售货机按不足钱数处理,退还全部硬币。
(5)当顾客完成一次购买后或按错按钮后,需要设置一个重新开始按钮,使整个系统恢复到初始状态。
(6)顾客一次只能购买一种商品的一个,若需要更多商品,需要重复操作。
2.1.2总体思想
自动售货机包括四个商品,依据四种商品分别设为四个按钮,A1,A3,A4,A8。
当顾客选择其中的一种商品时,售货机发送出一个信号按钮不再生效,用一个LED灯显示。
设置三个按钮:
a1,a2,a5来表示投入的硬币是1元、2元、5元。
当顾客投入的硬币大于或等于售价时将不再接受硬币,用一个LED灯显示。
当顾客确定某种商品且投入了足额的硬币,投币时限到时,投币窗口找零,用七段显示管显示找零数,同时送出商品,指示灯out亮。
2.1.3控制状态的设计
此售货机分为三种状态,每一个状态能完成一定得功能:
初始状态,投币状态,找零状态。
(1)初始状态:
当售货机通电后进入初始状态,顾客购买时,可根据选择xuan_rg,xuan_yl,xuan_hb,xuan_schb键购买商品,从而进入下一状态。
当顾客购买错误或不再购买时按下start重新进入初始状态。
(2)投币状态:
在这个状态时xuan_rg,xuan_yl,xuan_hb,xuan_schb键失效。
投入钱(1元,2元,5元),当投入硬币等于或者超过商品价格时进入下一状态。
投币时间为30秒超过30秒,售货机拒绝接受钱币。
(3)找零状态:
投币结束,售货机自动判别总钱数,若在时限到来之际,总钱数少于顾客所需商品的单价,则退出钱币,用LED显示退钱数。
若大于或等于商品数则通过控制系统找零,用LED显示找零数,送出商品。
出货找零,表示一次工作已经结束,等待下一个信号到来,进行新的售货。
2.1.4设计流程图
图4.1流程图
第三章:
自动售货机控制电路各模块信号分析
3.1模块分类
此售货机模块包括:
投币处理模块,商品选择模块,投币模块,分频模块,控制器模块,计时模块,LED灯显示模块,找零模块,出货模块,如图4.2所示。
图4.2模块示意图
3.1.1投币模块
自动售货机能够自动计算投入的钱币数目,需要提供一个寄存器来记录并保存投入的总币值。
此模块有六个输入信号以及两个输出信号:
qian1,qian2,qian5为不同数额钱币输入信号;en1为主控模块所发出的信号,当en1信号为1的时候,投币模块开始工作;reset为恢复初始信号,当reset信号为1的时候投币模块不进行工作;en为给计时器的输出信号,当en为1的时候计时器开始工作;bi为输出的钱币数目。
如图4.2所示。
投币模块的作用相当于一个计数的寄存器,在清零的状态下可以准确的计算投币数额,记录并保存总币值。
图4.2.投币模块
投币模块主要程序如下:
libraryieee;
useieee.std_logic_1164.all;
entitytoubiis
port(a1,a2,a5,en1,clk,reset:
instd_logic;
bi:
outintegerrange0to15;
en:
outstd_logic);
endtoubi;
architectureaoftoubiis
signalstate:
integerrange0to1;
begin
process
variableqian:
integerrange0to15;
begin
waituntilclk='1'andclk'event;
ifreset='1'thenstate<=0;bi<=0;qian:
=0;en<='0';
else
casestateis
when0=>
ifen1='1'thenifa1='1'thenstate<=1;bi<=1;qian:
=1;en<='1';
elsifa2='1'thenstate<=1;bi<=2;qian:
=2;en<='1';
elsifa5='1'thenstate<=1;qian:
=5;bi<=5;en<='1';
endif;
endif;
when1=>
ifen1='1'thenifa1='1'thenqian:
=qian+1;bi<=qian;en<='1';
elsifa2='1'thenqian:
=qian+2;bi<=qian;en<='1';
elsifa5='1'thenqian:
=qian+5;bi<=qian;en<='1';
endif;
endif;
endcase;
endif;
endprocess;
enda;
通过程序所得到的仿真图如下所示:
1当reset输入为0,输入5元,2元,1元时,输出结果为7。
仿真结果如图4.3所示:
图4.3reset输入为0时的仿真结果
2当reset输入为1时,输入5元,2元,1元,bi输出应为0。
仿真结果如图4.4所示:
图4.4reset输入为1时的仿真结果
3.1.2商品选择模块
自动售货机的商品选择模块,通过自动售货机上的四个选择按键完成商品选择,在接收到对应四个商品之一的一个选择信号时进行编译,将被选择的商品进行编码,输入到主控模块中,在主控模块中与所接受的钱币进行对与计算。
输入信号为a1,a2,a3,a8。
而xuan_rg,xuan_hb,xuan_yl,xuan_schb为四个输出信号,与出货模块连接。
reset与en2信号来自主控模块,当reset为1时模块进入初始状态,进行选择。
当en2为1时,商品可以进行选择,当en2为0时,四个商品选择键无效。
商品选择模块如图4.5所示。
图4.5商品选择模块
商选择模块主要程序如下:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYyimaIS
PORT
(a1,a3,a4,a8,en2,reset:
INSTD_LOGIC;
xuan_rg,xuan_yl,xuan_hb,xuan_schb:
OUTSTD_LOGIC;
d:
OUTintegerrange0to8);
ENDyima;
ARCHITECTUREaOFyimaIS
BEGIN
process(a1,a3,a4,a8)
begin
ifreset='0'then
ifa1='1'anden2='1'then
d<=1;xuan_rg<='1';xuan_yl<='0';xuan_hb<='0';xuan_schb<='0';
elsifa3='1'then
d<=3;xuan_yl<='1';xuan_rg<='0';xuan_hb<='0';xuan_schb<='0';
elsifa4='1'anden2='1'then
d<=4;xuan_hb<='1';xuan_yl<='0';xuan_schb<='0';
elsifa8='1'anden2='1'then
d<=8;xuan_schb<='1';xuan_yl<='0';xuan_rg<='0';xuan_hb<='0';
elsed<=0;xuan_schb<='0';xuan_yl<='0';xuan_rg<='0';xuan_hb<='0';
endif;
elsed<=0;xuan_schb<='0';xuan_yl<='0';xuan_rg<='0';xuan_hb<='0';
endif;
endprocess;
ENDa;
通过程序所得仿真结果如下:
1.当reset输入为1,en2输入为0,a8输入为1时,d输出应当为0,仿真结果如图4.6所示:
图4.6reset输入为1,en2输入为0,a8输入为1时的仿真结果
2当reset输入为0,en2输入为0,a8输入为1时,d输出为0,仿真结果如图4.7所示:
图4.7reset输入为0,en2输入为0,a8输入为1时的仿真结果
3当reset输入为0,en2输入为1,a8输入为1时,d输出为8,xuan_schb输出为1,仿真结果如图4.8所示:
图4.8en2输出为2时的仿真结果
3.1.3分频模块
分频模块是用来将外来的时钟信号进行分频,有硬件系统已经知道,选用的时钟信号是由外部的6MHZ的晶振提供的,通过分频模块进行分频以后将得到周期为1HZ的信号。
由于仿真所需时间过长,本文选择100.0ns为一周期的信号,分频后为6.0us为一周期的信号,时钟输入信号为clk,输出信号为newclk,分频模块如图4.9所示。
图4.9分频模块
分频模块主要程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYfenpiIS
PORT(CLK:
INSTD_LOGIC;
NEWCLK:
OUTSTD_LOGIC);
ENDfenpi;
ARCHITECTUREaOFfenpiIS
SIGNALQ:
INTEGERRANGE0TO14;
SIGNALDIVCLK:
STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFQ<14THENQ<=Q+1;
ELSEDIVCLK<=NOTDIVCLK;Q<=0;
ENDIF;
ENDIF;
ENDPROCESS;
NEWCLK<=DIVCLK;
ENDa;
通过程序所得到的仿真结果如下:
当clk第15输出为上升沿时,newclk输出为1,仿真结果如图4.10所示:
图4.10newclk输出为1时的仿真结果
3.1.4计数模块
由于课题要求自动售货机控制系统有定时系统,并限定在30s内完成投币,30s之后投币无效,因此需要设定一个计数模块对投币时间进行限制。
en为接受信号,当投币开始时投币模块发出信号,计数模块开始工作,当计数到30时向控制模块发出t信号。
Clr为控制器发送给计数模块的一个信号,当clr为1时,计数器归零。
Clk为分频模块发送的时钟信号。
计数模块如图4.11所示。
图4.11计数模块
计数模块主要程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjishuis
port(clk,en,clr:
instd_logic;
t:
outstd_logic);
endjishu;
architectureaofjishuis
signalbcd1n:
std_logic_vector(3downto0);
signalbcd10n:
std_logic_vector(2downto0);
begin
process(clk,clr,en)
begin
if(clr='1')then
bcd1n<="0000";
elsif(clk'eventandclk='1')then
if(en='1')then
if(bcd1n="1001")then
bcd1n<="0000";
else
bcd1n<=bcd1n+'1';
endif;
endif;
endif;
endprocess;
process(clk,en,clr)
begin
if(clr='1')then
bcd10n<="000";
elsif(clk'eventandclk='1')then
if(en='1'andbcd1n="1001")then
if(bcd10n="011")then
bcd10n<="000";
else
bcd10n<=bcd10n+'1';
endif;
endif;
endif;
endprocess;
process(en,bcd10n)
begin
if(en='1'andbcd10n="011")then
t<='1';
else
t<='0';
endif;
endprocess;
enda;
此段程序为十位计数的情况,当bcd为011(30)时发生进位,然后bcd10n归零。
通过程序所得的仿真结果如下:
1当en为1时,clr为0时,t在clk第30个上升沿输出为1,仿真结果如图4.12所示:
图4.12t输出为1时的仿真结果
2当en为1时,clr为1时,t输出为0,仿真结果如图4.13所示:
图4.13t输出为0时的仿真结果
3.1.5出货模块
出货模块是自动售货机给出相关货物的信号,本课题要求货物为四个商品,因此出货模块有5个输入信号,xuan_rg,xuan_sb,xuan_yl,xuan_schb,为所购商品的输入信号,en为控制模块所给的信号当en=1时出货模块开始工作,然后对顾客所选择货物进行出货。
出货模块有四个输出信号为所选择的货物的输出信号。
出货模块如图4.14。
图4.14出货模块
出货模块主要程序如下:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYchuhuoIS
PORT
(xuan_rg,xuan_hb,xuan_yl,xuan_schb,en3:
INSTD_LOGIC;
chu_rg,chu_hb,chu_yl,chu_schb:
OUTSTD_LOGIC);
ENDchuhuo;
ARCHITECTUREaOFchuhuoIS
BEGIN
process
begin
ifen3='0'then
chu_rg<='0';chu_hb<='0';chu_schb<='0';chu_yl<='0';
else
ifxuan_rg='1'then
chu_rg<='1';chu_hb<='0';chu_schb<='0';chu_yl<='0';
elsifxuan_hb='1'then
chu_rg<='0';chu_hb<='1';chu_schb<='0';chu_yl<='0';
elsifxuan_schb='1'then
chu_rg<='0';chu_hb<='0';chu_schb<='1';chu_yl<='0';
elsifxuan_yl='1'then
chu_rg<='0';chu_hb<='0';chu_schb<='0';chu_yl<='1';
elsechu_rg<='0';chu_hb<='0';chu_schb<='0';chu_yl<='0';
endif;
endif;
endprocess;
ENDa;
出货模块的仿真结果如下:
1当输入信号en为1,xuan_rg信号为1时,chu_rg信号为1,仿真结果如图4.15所示:
图4.15chu_rg信号为1时的仿真结果
2当输入信号en为0,xuan_rg信号为1时,chu_rg信号为0,仿真结果如图4.16所示:
图4.16chu_rg信号为0时的仿真结果
3.1.6显示模块
显示模块的作用是对购物结束后的所需找零数目进行显示。
找零显示模块的输入端接收来自控制模块的输入信号,输出端外接LED显示灯,由于找零的数目为范围为0至8,因此只需要一个LED显示灯,输出信号为a,b,c,d,e,f,g。
找零显示模块如图4.17。
图4.17显示模块
显示模块程序如下:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYzhaolingIS
PORT(
Di:
INintegerrange0to9;
a:
OUTSTD_LOGIC;
b:
OUTSTD_LOGIC;
c:
OUTSTD_LOGIC;
d:
OUTSTD_LOGIC;
e:
OUTSTD_LOGIC;
f:
OUTSTD_LOGIC;
g:
OUTSTD_LOGIC
);
ENDzhaoling;
ARCHITECTUREaOFzhaolingIS
BEGIN
Process(di)
typedata_outisarray(0to6)ofstd_logic;
variableoutp:
data_out;
begin
CASEdiIS
WHEN0=>outp:
="1111110";
WHEN1=>outp:
="0110000";
WHEN2=>outp:
="1101101";
WHEN3=>outp:
="1111001";
WHEN4=>outp:
="0110011";
WHEN5=>outp:
="1011011";
WHEN6=>outp:
="1111110";
WHEN7=>outp:
="1011111";
WHEN8=>outp:
="1111111";
WHEN9=>outp:
="1111011";
WHENOTHERS=>null;
ENDCASE;
a<=outp(0);
b<=outp
(1);
c<=outp
(2);
d<=outp(3);
e<=outp(4);
f<=outp(5);
g<=outp(6);
endprocess;
ENDa;
当输入信号di为2时,g输出为1,f输出为0,e输出为1,d输出为1,c输出为0,b输出为1,a输出为1,仿真结果如图4.18所示
图4.18di输入为2时的仿真结果
3.1.7主控模块
主控模块为自动售货机控制系统的核心部分,在主控模块中将输入的钱币数目(b)与商品的价格(d)进行对比,然后进行找零并发出出货信号。
输入信号t为计时信号,当时间超过30s时,商品不再接受货币。
Clk为控制系统的时钟信号。
输出信号di,c分别为找零显示模块的输入信号与找零信号。
en为控制出货模块的信号,当en值为1时,确认出货模块可以输出商品。
Start为复位信号,当start值为1时,自动售货机回到初始状态。
Clr为计数模块的控制信号,当收货完成后,clr输出为1,计数模块回到初始状态归零。
En1与en2分别为投币模块与商品选择模块的控制信号,当en1为0时,投币模块不工作,当en2为0时商品选择模块不工作。
主控模块如图4.19。
图4.19主控模块
主控模块主要程序如下:
libraryieee;
useieee.std_logic_1164.all;
packagestate_packis
typestateis(qa,qb);
endstate_pack;
libraryieee;
useieee.std_logic_1164.all;
usework.state_pack.all;
entityzhukongis
port(start,clk,t:
instd_logic;
d,b:
inintegerrange0to13;
en1,en2,reset,clr,en3:
outstd_logic;
c:
outintegerrange0to13;
di:
outintegerrange0to9);
endzhukong;
architectureaofzhukongis
signalcurrent_state:
state:
=qa;
begin
process
variablevar:
integerrange0to13;
begin
waituntilclk='1'andclk'event;
ifstart='1'then
current_state<=qa;
c<=b;en1<='0';reset<='1';en2<='0';clr<='1';en3<='0';di<=0;
else
casecurrent_stateis
whenqa=>ifd=0then
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 实验 报告