


免费预览已结束,剩余32页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字系统课程设计 “自动售货机”实验报告数字系统课程设计 “自动售货机”实验报告 目录一、实验目的及要求-3二、验收功能说明书-3三、自动售货机实现方案分析-5四、程序代码及注释-6五生成的Symbol File-22六系统功能仿真与结果分析-23七系统整体分析以及需要改进的方面-32八团队合作以及日程安排-32九实验总结-33一、实验目的及要求:1.实验目的:通过编写程序,熟悉VHDL语言,掌握Max Plus II、quarters II等软件的使用方法。2.设计要求:自动售货机:设计FPGA模块模拟自动售货机的工作过程,要求如下(1)售货机有两个进币孔,可以输入硬币和纸币,售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。乘客可以连续多次投入钱币。(2)顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。即有一个小键盘(0-9按键)来完成,比如输入15时要先输入1,再输入5。(3)顾客选择完商品后,可以选择需要的数量。然后可以继续选择商品及其数量,每次可以选择最多三个商品。然后显示出所需金额。顾客此时可以投币,并且显示已经投币的总币值。当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。在投币期间,顾客可以按取消键取消本次操作,钱币自动退出。二、验收功能说明书:1、自动购物系统工作流程:系统分为初始化状态、等待状态、商品选择状态、数量选择状态、付款状态、结算状态(initial_state,wait_state,goods_select_state,quantity_select_state,paying_state,dealing_state)。系统在reset_in复位键按下以后处于初始化状态(initial_state),此状态功能为:确定各种商品初始数量,便于接下来计数,判定顾客所选商品是否有货。Initial_state进行完以后,系统会将控制信号“flag”置一,当flag为1的时候,系统进入等待状态(wait_state)。系统处于等待状态(wait_state)时,指示灯LED_ wait_state亮。在按下goods_select键后,系统进入商品选择状态(goods_select_state),指示灯LED_ goods_select_state亮。通过小键盘(0-9按键)实现选择商品编号。商品选择状态(goods_select_state)之后进入数量选择状态(quantity_select_state),指示灯LED_ quantity_select_state亮。通过小键盘(0-9按键)实现选择商品数量。数量选择状态之后,通过按键goods_select进入商品选择状态(goods_select_state)继续选择,或者通过按键ok进入付款状态(paying_state),指示灯LED_ paying_state亮。进入付款状态(paying_state)后开始付款,如果投入足量的现金,则系统进入结算状态(dealing_state)。进入结算状态(dealing_state),指示灯LED_ dealing_state亮,给出所购商品及对应数量,然后找零。结束后进入等待状态。在付完足够的钱之前,都可以按cancel键取消购物。在投币过程中按cancel,系统将先进入结算状态(dealing_state),退出所付现金,然后进入等待状态。其他过程中按cancel,系统将跳回上一级。3、售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。乘客可以连续多次投入钱币。实现方法:由售货机外围的现金识别模块识别出币值后给对应引脚置高电平,然后再由我们的控制系统识别。各币值对应输入引脚:money_1:1 元money_5:5 元money_10:10元money_20:20元money_50:50元money_100: 100元4、顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。即有一个小键盘(0-9按键)来完成,比如输入15时要先输入1,再输入5。实现方法:本系统通过小键盘按键(0-9按键)实现选择商品编号。对于一位数的选择,例如如果是1号商品则按下“1”号键,再按下“ok”键,然后系统进入数量选择状态。对于两位数的选择,例如如果是14号商品则按下“1”号键,再按下“4”号键,不用按“ok”键,系统会自动进入数量选择状态。5、顾客选择完商品后,可以选择需要的数量。然后可以继续选择商品及其数量,每次可以选择最多三个商品,然后显示出所需金额。实现:数量选择同上。对于每次“可以选择最多三个商品”,本系统内设置了selectednum记录选择的次数,当超过三次,系统指示灯LED_mistake会被点亮,提示用户,并进入等待状态(wait_state)。对于“显示出所需金额”,在付款状态(paying_state)初,有计算所需总额的程序。在赋值给输出向量时,我们通过conv_std_logic_vector(money_own,7)将整型转换为STD_LOGIC_VECTOR型。三、自动售货机实现方案分析:1.根据实际需要设置六个状态,分别是:Initial_state;wait_state;goods_select_state;quantity_select_state;paying_state;dealing_state2.程序分为如下几个部分:(1)ENTITY SETUP:定义名为autoseller的实体,并将文件保存为autoseller.vhd;(2)INPUT DECLARATION:完成对输入端口的说明;(3)OUTPUT DECLARATION:完成对输出端口的说明;(4)State-Showing LED:设置五个LED指示灯,显示机器目前所处的状态及用于选择次数超过三次或钱已付足的提醒;(5)tips_ LED:设置一些LED灯用于指示用户完成指定操作。如:LED_mistake。(6)ARCHITECTURE SETUP:完成对结构体的定义;(7)Asynchronous_Reset_Synchrous_Release:对复位信号的处理,我们采用了异步复位、同步释放,即有效利用了FPGA的资源又可以避免系统异步释放可能产生的寄存器不定态;(7)State Machine:状态机,设置状态转移;(8)Operation of Specific Process:描述在每一个状态中的具体算法实现;(9)SHOWING STATE BY LED LIGHT:使得在任何一个状态下,对应的LED灯会被点亮3.状态转移图:initial_state当flag=1时wait_state当按下goods_select按钮时当按下cancel按钮goods_select_state选择一位数并按下ok按钮或选择两位数当数量选择错误quantity_select_statee当按下cancel按钮当按下goods_select按钮当按下ok按钮paying_state当按下cancel按钮或者已经投足够的钱当交易完成dealing_state四、程序代码及注释:-LIBRARY INCLUDE-LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL; -用于数据类型转换-ENTITY DIFINITION-ENTITY autoseller ISGENERIC(ct:INTEGER:=3); -定义一个常数ct其值为3,便于根据实际情况设置用于键盘消抖的记数值PORT(-INPUT SIGNALS-clk: IN STD_LOGIC; -clk时钟输入reset_in: IN STD_LOGIC; -系统复位按键ok: IN STD_LOGIC; -用于商品种类选择确定、数量选择确定cancel: IN STD_LOGIC; -取消按键select_goods: IN STD_LOGIC; -进入商品种类选择状态money_in_1: IN STD_LOGIC; money_in_5: IN STD_LOGIC;money_in_10: IN STD_LOGIC;money_in_20: IN STD_LOGIC;money_in_50: IN STD_LOGIC;money_in_100: IN STD_LOGIC; -1元、5元、10元、20元、50元、100元对应的与外部钱币识别模块的输入接口key_0: IN STD_LOGIC;key_1: IN STD_LOGIC;key_2: IN STD_LOGIC;key_3: IN STD_LOGIC;key_4: IN STD_LOGIC;key_5: IN STD_LOGIC;key_6: IN STD_LOGIC;key_7: IN STD_LOGIC;key_8: IN STD_LOGIC;key_9: IN STD_LOGIC; -设置10个数字按键,用来选择商品及其数量-OUTPUT DECLARATION-money_needed: BUFFER STD_LOGIC_VECTOR(6 downto 0); -unit yuan,以元为单位money_in: BUFFER STD_LOGIC_VECTOR(6 downto 0) ; -unit yuan,以元为单位money_out: BUFFER STD_LOGIC_VECTOR(6 downto 0); -unit yuan,以元为单位goods_out_num: BUFFER STD_LOGIC_VECTOR(1 downto 0);money_out_1: OUT STD_LOGIC;money_out_5: OUT STD_LOGIC;money_out_10: OUT STD_LOGIC;money_out_20: OUT STD_LOGIC;money_out_50: OUT STD_LOGIC;money_out_100: OUT STD_LOGIC; -1元、5元、10元、20元、50元、100元对应的与外部钱币识别模块的输入接口-STATE SHOWING LED-LED_wait: OUT STD_LOGIC; -LED_Indicator_Light-LED_goods_select: OUT STD_LOGIC;LED_quantity_select: OUT STD_LOGIC;LED_paying: OUT STD_LOGIC;LED_dealing: OUT STD_LOGIC;-TIPS LED-LED_money_enough: BUFFER STD_LOGIC;LED_mistake: BUFFER STD_LOGIC;LED_goods: OUT STD_LOGIC_VECTOR(15 downto 0);END autoseller;-architecture definition-ARCHITECTURE behave OF autoseller IS-设置状态机的五个状态-TYPE STATES IS (initial_state,wait_state,goods_select_state,quantity_select_state,paying_state,dealing_state);TYPE ARRAY16 IS ARRAY (1 TO 16) OF INTEGER ; -自定义的数组std_logic_vector(15 downto 0);SIGNAL STATE: STATES; -定义状态之间整体共享的传递信号SIGNAL finished: STD_LOGIC;SIGNAL too_many_selected: STD_LOGIC;SIGNAL temp_reset: STD_LOGIC;SIGNAL reset: STD_LOGIC;SIGNAL ok_signal: STD_LOGIC;SIGNAL goods_select_signal: STD_LOGIC;SIGNAL flag: STD_LOGIC;SIGNAL goods_store: ARRAY16;SIGNAL number_of_goods: ARRAY16;-BEGIN-Asynchronous_Reset_Synchrous_Release-reset1: PROCESS (clk,reset_in) -异步重置,同步释放-BEGINIF(reset_in=0)THEN -reset_in为低电平触发temp_reset=0; -先将低电平赋给temp_resetELSIF(clkevent AND clk=1)THENtemp_reset=1;END IF;END PROCESS reset1;reset2:PROCESS(clk,reset_in)BEGINIF(reset_in=0)THENreset=0;ELSIF(clkevent AND clk=1)THENreset=temp_reset; -待temp_reset高电平稳定时,reset信号变为高电平END IF;END PROCESS reset2;-STATE MECHINE-状态机部分state_mechine: PROCESS (clk,reset)BEGINIF(reset=0)THEN state IF(FLAG=1)THEN state=wait_state; ELSE stateIF(goods_select_signal=1)THEN -goods_select_signal is used to response the key select_goods state=goods_select_state; -在wait_state状态下,按下 goods_select按钮,系统进入到goods_select_state状态 ELSE state IF(cancel=1)THEN -在goods_select_state时,按下cancel,系统返 state=wait_state; -回到wait_state ELSIF(LED_mistake=1)THENstate=wait_state; -transfer this signal to the port LED_mistake to remind the usersELSIF(ok_signal=1)THEN -ok_signal=1(编号选好后,ok_signal置一),进入quantity_select_state state=quantity_select_state; ELSE state IF(cancel=1)THEN -在quantity_select_state时,按下cancel返回goods_select_state state=goods_select_state; ELSIF(ok=1)THEN-按下ok按键进入paying_state state=paying_state; ELSIF(goods_select_signal=1)THEN state=goods_select_state; ELSIF(LED_mistake=1)THEN state=wait_state; ELSE state IF(cancel=1)THEN -在paying_state状态下按下cancel按键进入dealing_state状态,退还顾客投入的钱 state=dealing_state; ELSIF(LED_money_enough=1)THEN state=dealing_state; -当顾客投入足额的钱时,系统自动进入dealing_state ELSE state IF(finished=1)THEN state=wait_state; -当完成交易后,系统返回wait_state ELSE state goods_store=(5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5);-商品初始存货量 number_of_goods=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); flag flag=0; -wait状态为系统各变量恢复初值 LED_money_enough=0; count:=0; count1:=0; test1:=0;test2:=0;test3:=0;test4:=0;test5:=0;test:=0; key_down:=0; money_own:=0; goods_select_signal=0; finished=0; money_needed=conv_std_logic_vector(0,7); - conv_std_logic_vector(0,7)数据类型转换 money_in=conv_std_logic_vector(0,7); money_out=conv_std_logic_vector(0,7); money_out_1=0; money_out_5=0; money_out_10=0; money_out_20=0; money_out_100=0; var_money_needed:=0; var_money_out:=0; selectednum:=0; number_of_goods=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); LED_goods=0000000000000000;if(select_goods=1) then -由wait_state进入goods_select_state goods_select_signalgoods_select_signal=0; -将goods_select_signal复位(在下面由数量选择到商品编号选择的时候此信号被置1)IF(test1=0)THEN -test1初值为0,执行完第一位键盘扫描后将会把test1置1IF(key_0=1)THEN -以下均为读键值IF(countct)THENcount:=count+1; -机械键盘毛刺消抖的记数变量ELSEtemp_key_value1:=0;key_down:=1;count:=0; -有键按下且通过消抖时,key_down置1,count复位END IF;ELSIF(key_1=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=1;key_down:=1;count:=0;END IF;ELSIF(key_2=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=2;key_down:=1;count:=0;END IF;ELSIF(key_3=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=3;key_down:=1;count:=0;END IF;ELSIF(key_4=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=4;key_down:=1;count:=0;END IF;ELSIF(key_5=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=5;key_down:=1;count:=0;END IF;ELSIF(key_6=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=6;key_down:=1;count:=0;END IF;ELSIF(key_7=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=7;key_down:=1;count:=0;END IF;ELSIF(key_8=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=8;key_down:=1;count:=0;END IF;ELSIF(key_9=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value1:=9;key_down:=1;count:=0;END IF;ELSE key_down:=0; -如果无键按下,key_down置零END IF;-以下部分实现在按键释放时,才执行对应操作,所以可以排除按键时间或长或短的影响-我们可以通过将key_down=1与 key_down=0顺序调换,实现在按键上升沿执行操作,-原理是相同的,可根据系统实际要求调整实现方案。IF(key_down=1 AND test=0)THENtest:=1;END IF;IF(key_down=0 AND test=1)THENtest1:=1;test:=0;test2:=1; -打开第二位数的读入END IF;END IF;IF(test2=1)THEN-在结束第一位的读入之时,我们打开了第二位的读入,但这时我们还必须检测顾客是否按下了ok键,如果按下,-在ok按键释放的时候我们执行selected_goods(selected_goods_time):=temp_key_value1;的操作,计算出其选择的编-号。 IF(ok=1 AND test3=0)THENtest3:=1; END IF; IF(ok=0 AND test3=1)THENtest3:=0;key_value:=temp_key_value1; -选择商品的序号是一位数,将temp_key_value1的值赋给变量key_valuetest1:=0;test2:=0;temp_key_value1:=0;temp_key_value2:=0;-为保证系统的稳定,在任务完成后将数据还原成初始值ok_signal=1; END IF;IF(key_0=1)THEN-以下同上键盘扫描原理相同IF(countct)THENcount:=count+1;ELSEtemp_key_value2:=0;key_down:=1;count:=0;END IF;ELSIF(key_1=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=1;key_down:=1;count:=0;END IF;ELSIF(key_2=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=2;key_down:=1;count:=0;END IF;ELSIF(key_3=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=3;key_down:=1;count:=0;END IF;ELSIF(key_4=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=4;key_down:=1;count:=0;END IF;ELSIF(key_5=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=5;key_down:=1;count:=0;END IF;ELSIF(key_6=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=6;key_down:=1;count:=0;END IF;ELSIF(key_7=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=7;key_down:=1;count:=0;END IF;ELSIF(key_8=1)THENIF(countct)THENcount:=count+1;ELSEtemp_key_value2:=8;key_down:=1;count:=0;END IF;ELSIF(key_9=1)THENIF(count16) then finished=1;LED_mistake=1; elsetest1:=0;test2:=0;temp_key_value1:=0;temp_key_value2:=0;ok_signal -数量选择状态 ok_signal=0; IF(test1=0 )THEN IF(key_0=1)THEN IF(countct)THEN -键盘消抖 count:=count+1; ELSIF(selectednum=3)THEN -判断选择商品总数量是否超过3 selectednum:=selectednum+0; number_of_goods(key_value)=0;-将被选择商品数量存于对应商品编号的数组元素里 goods_store(key_value)=goods_store(key_value)-number_of_goods(key_value); if(goods_store(key_value)0)then -判断库存量 LED_mistake=1; goods_select_signal=1; -库存不足,警示灯亮,自动返回商品选择状态goods_store(key_value)=goods_store(key_value)+0; else LED_goods(key_value-1)=1; -库存足够,对应的商品灯亮 end if; key_down:=1;count:=0; -按键按下,key_down为1 ELSE too_many_selected=1;LED_mistake=1; -选择商品总数量超过3,警示灯亮 END IF; ELSIF(key_1=1)THEN IF(countct)THEN count:=count+1; ELSIF(selectednum=2)THEN selectednum:=selectednum+1; number_of_goods(key_value)=1; goods_store(key_value)=goods_store(key_value)-number_of_goods(key_value); if(goods_store(key_value)0)then LED_mistake=1; goods_select_signal=1; goods_store(key_value)=goods_store(key_value)+1; else LED_goods(key_value-1)=1; end if; key_down:=1;count:=0; ELSE too_many_selected=1; LED_mistake=1; END IF; ELSIF(key_2=1)THEN IF(countct)THEN count:=count+1; EL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年计算机科学试题及答案解析
- 2025年护理学专业资格考试试题及答案解析
- 2025年汉语教师职业技能考试试题及答案解析
- 2025年国际贸易法务专家资格考试试题及答案解析
- 2025年导盲犬训练师面试高频题
- 课件中任务卡模板制作步骤
- 课件中video的缩写形式
- 2025年小美容院美容安全考核题及答案
- 三礼教学课件
- 2025年地震避险知识题库含全解
- 口服CCB类药品临床综合评价指标体系专家咨询调查表
- 第四节道亨slw2d架空送电线路评断面处理及定位设计系统部分操作说明
- 测振仪使用方法
- 2023-2024学年湖南省耒阳市小学语文六年级下册期末自测测试题
- 表- 邻二氯苯的理化性质和危险特性表
- 工程项目全过程造价管理课件PPT超详细
- 成人手术后疼痛处理专家共识
- 读书分享-《教育的情调》
- 《材料力学》说课-课件
- 物资采购付款报销单
- 政务云收费标准 云托管收费标准
评论
0/150
提交评论