1基于VHDL的地铁售票模拟系统设计报告东南大学信息科学与工程学院2015-9-232目录1.封面……………………………………………………………12.目录……………………………………………………………23.导言……………………………………………………………34.正文……………………………………………………………4(1)程序结构介绍……………………………………………4①主进程……………………………………………4②分频进程…………………………………………5③译码显示进程……………………………………5④键盘选择进程……………………………………5(2)设计中遇到的问题及解决………………………………55.结论与改进……………………………………………………66.人员及任务分配………………………………………………67.致谢……………………………………………………………78.附录……………………………………………………………79.参考文献………………………………………………………163一、导言在2015年短学期中,我组成员在“数字系统课程设计”课程中成功按题目要求设计完成了目标系统——基于VHDL的地铁售票模拟系统。本文将介绍我组设计过程与结果。设计题目如下:设计FPGA模块模拟地铁售票的工作过程,要求功能描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。(1)地铁售票机有两个进币孔,可以输入硬币和纸币,售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是1元的硬币,纸币的识别范围是5元,10元,20元。乘客可以连续多次投入钱币。(2)乘客买票时可以有两种选择,第一种,乘客已经知道所需费用,直接选择票价,可选2元、3元或4元。第二种,不知道票价,选择出站口,系统以目的地与当前站的站数来进行计算价格(地铁共有16个站,为0-15号站,当前站为0号站,然后通过判断当前站号与目标站号的差来判断需要的钱数。差距在4站及其以内,价格为2元,5-10站,价格为3元,11-15站,价格为4元)。(3)得到票价单价后,选择所需购买的票数,然后进行投币,投入4的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。我组在基本掌握VHDL语言后,自行设计模块,尽可能地完善了编程的精简度与模块化,同时完成了以上所有功能。二、正文1、程序结构介绍本系统由四个进程组成,分别为主进程、分频进程、译码显示进程、键盘选择进程组成。(1)主进程主进程为分为4个状态,按主进程流程顺序分别为选票价/选站状态、选票数状态、付款找零状态、退币状态(可跳过);①选票价/选站状态以RESET开关复位为开始,用一个开关控制直接选择2、3、4元或者站台(0-15站)两种模式,三个按钮选票价,四个开关选站;②推动状态开关进入第二个状态,默认票数为1,可以通过两个按键分别控制加一,减一;③再次推动状态开关,系统计算出应付总价,四个按钮代表投币1元、5元、10元、20元,投币过程中,显示的应付价钱会根据已付价钱递减,直到降到0,出票灯亮,若多付,显示找零金额;④在支付过程中,若尚未出票,再推动状态开关可以退票,显示5退票金额,退票灯亮;另外,在售票全过程中,拨动reset开关,所有数据归位,回到一个状态。(2)分频进程分频进程主要是为数码管显示设定的。查询芯片手册得知,四段数码管使能端在一个周期内循环为低电平,且此周期要求在1-16ms。将100Mhz时钟信号扩大500000倍则时钟周期为5ms满足要求。设置自增变量i,当i500000者将分频后时钟设‘0’,否则将时钟设‘1’最后归零,达到分频效果。(3)译码显示进程译码显示进程包含了数据选择和译码两项功能,首先根据状态机的输出,选择需要显示的量,然后经过转化为整形数计算,分离出变量的十位和个位,再转化为译码值显示。(4)键盘选择进程键盘选择进程主要用于在不同状态将键盘按键值输入不同的模块。2、设计中遇到的问题及解决(1)在键盘输入过程中,涉及到累加或递减的环节,容易因始终过快或者键盘抖动出现。在读取用户按键时,采用分频法进行消抖。在键盘选择进程中添加了消抖模块,对已分频的始终再进行50分频,从而消除了键盘抖动。(2)在状态开关的使用方面,考虑到如果检测开关为是否值为’1’,用户在每次使用这两个开关时,都必须先拨上,再回拨以方便下次使6用,极不方便,因而将思路改为通过判断这两个开关的当前状态是否与上一个状态不同来确定用户是否确认或取消。(3)为方便用户,本系统设置了复位键(reset),当处在非投币及找零状态,按下复位键可直接跳转至开始状态,重新进行选择。同时,我组利用多个led灯的点亮提示用户当前售票机所处的状态,使售票机更实用。三、结论与改进本系统完成了0-15号站台/2-4元票价及1-14购买数量的两次选择、投币退币功能、按键实时显示、所需金额显示、找零金额显示等全部基本功能。要使系统更为完善,仍可做一下改进1)将返回上一层功能调试完成。2)考虑某种票价找零金额不足无法退币的情况。3)当商品的种类与价格不一致,可以考虑将用户对象分为管理员及购买者,管理员可对商品价格进行更改。四、人员及任务分工此次设计任务由信息科学与工程学院学生共同完成。其中,主要负责主模块编写以及最终设计报告的撰写,主要负责分频代码编写以及总体波形仿真任务,主要负责数码管显示程序编写。最后大家合作对整个程序进行梳理调通。7五、致谢设计本系统之前,在vhdl基本语法及ise程序的基本运用方面,老师曾细心教授。设计过程中,在时序仿真文件的编写及数码管显示原理上,老师也耐心为我们讲解。在此我组人员表示诚挚感谢。六、附录100%原创程序!:1)选站/选票价libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;USEIEEE.std_logic_unsigned.ALL;--Uncommentthefollowinglibrarydeclarationifusing--arithmeticfunctionswithSignedorUnsignedvalues--useIEEE.NUMERIC_STD.ALL;--Uncommentthefollowinglibrarydeclarationifinstantiating--anyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityxuanzhanisPort(reset,clk,moshi,zhuangtai:inSTD_LOGIC;zhantai:inSTD_LOGIC_VECTOR(3downto0);piaojia:inSTD_LOGIC_VECTOR(2downto0);piaojiaqueren:outSTD_LOGIC_VECTOR(7downto0));endxuanzhan;architectureBehavioralofxuanzhanisbeginPROCESS(zhuangtai,moshi,zhantai,piaojia,clk)beginifclk'eventandclk='1'thenifreset='1'thenpiaojiaqueren=00000010;endif;ifzhuangtai='1'thenifmoshi='0'then8casezhantaiiswhen0000=piaojiaqueren=00000010;when0001=piaojiaqueren=00000010;when0010=piaojiaqueren=00000010;when0011=piaojiaqueren=00000010;when0100=piaojiaqueren=00000010;when0101=piaojiaqueren=00000011;when0110=piaojiaqueren=00000011;when0111=piaojiaqueren=00000011;when1000=piaojiaqueren=00000011;when1001=piaojiaqueren=00000011;when1010=piaojiaqueren=00000011;when1011=piaojiaqueren=00000100;when1100=piaojiaqueren=00000100;when1101=piaojiaqueren=00000100;when1110=piaojiaqueren=00000100;whenothers=piaojiaqueren=00000100;endcase;elseifpiaojia(0)='1'thenpiaojiaqueren=00000010;elsifpiaojia(1)='1'thenpiaojiaqueren=00000011;elsifpiaojia(2)='1'thenpiaojiaqueren=00000100;endif;endif;endif;endif;ENDPROCESS;endBehavioral;2)选票数libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;USEIEEE.std_logic_unsigned.ALL;--Uncommentthefollowinglibrarydeclarationifusing--arithmeticfunctionswithSignedorUnsignedvalues--useIEEE.NUMERIC_STD.ALL;--Uncommentthefollowinglibrarydeclarationifinstantiating--anyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitypiaoshuisPort(reset,clk,zhuangtai:inSTD_LOGIC;piaoshujia:inSTD_LOGIC;9piaoshuqueren:outSTD_LOGIC_VECTOR(7downto0);piaoshujian:inSTD_LOGIC);endpiaoshu;architectureBehavioralofpiaoshuissignalpiaoshu:std_logic_vector(7downto0):=00000001;beginPROCESS(zhuangtai,piaoshujia,piaoshujian,clk)beginifclk'eventandclk='1'thenifreset='1'thenpiaoshu=00000001;endif;ifzhuangtai='1'thenif(piaoshu1110andpiaoshu0000)thenifpiaoshujia='1'thenpiaoshu=piaoshu+1;endif;endif;if(piaoshu1111andpiaoshu0001)thenifpiaoshujian='1'thenpiaoshu=piaoshu-1;endif;endif;piaoshuqueren=piaoshu;endif;endif;ENDPROCESS;endBehavioral;3)付款找零及退款libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;USEIEEE.std_logic_unsigned.ALL;USEIEEE.std_logic_arith.ALL;--Uncommentthefollowinglibrarydeclarationifusing--arithmeticfunctionswithSignedorUnsigned