VHDL数字系统课程地铁售票系统设计报告_第1页
VHDL数字系统课程地铁售票系统设计报告_第2页
VHDL数字系统课程地铁售票系统设计报告_第3页
VHDL数字系统课程地铁售票系统设计报告_第4页
VHDL数字系统课程地铁售票系统设计报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE2-地铁模拟售票系统撰写日期:2013年9月13日目录一、设计课题要求及分析 -3-二、 流程图描述 -6-三、 状态机设计和状态转移图描述 -7-四、程序设计及解释 -7-五、程序调试和验证 -12-六、 结论 -14-七、 参考文献 -15-

一、设计课题要求及分析设计题目:地铁售票模拟系统功能描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。功能要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别1元的硬币,纸币的识别5元,10元。乘客可以连续多次投入钱币。乘客可以选择的种类为2元、3元和4元,乘客一次只能选择一个出站口。购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币未达到所需金额时,显示信号,提醒钱不够,需要继续投入钱币,如果投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。设计分析:经过分析,本地铁自动售票系统的设计需要实现以下几项主要功能:站点选择,票数选择,投币处理,出票及余额找零。本系统可以采用模块化设计和有限状态机的设计方案来实现。采用模块化设计方法即从整个系统的功能出发,将系统的整体逐步分解为若干个子系统和模块,然后用VHDL语言对各个模块进行编程,最后形成顶层文件,在QUARTUSⅡ环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。采用模块化设计的优点在于:对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。便于由多个设计者同时进行设计从而加速整个项目的开发进度;每个子模块都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。有限状态机(FiniteStateMachine,简称FSM)是指输出向量不仅依赖于当前输入向量,也依赖于过去输入向量序列的电路.一个有限状态机电路由寄存器逻辑(时序逻辑)和组合逻辑组成.有限状态机是数字逻辑电路以及数字系统的重要组成部分,尤其应用于数字系统核心部件的设计,以实现高效率高可靠性的逻辑控制。一般有限状态机的VHDL组成:说明部分:主要是设计者使用TYPE语句定义新的数据类型,如:TYPEstatesIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:states;主控时序逻辑部分:任务是负责状态机运转和在外部时钟驱动下实现内部状态转换的进程。时序进程的实质是一组触发器,因此,该进程中往往也包括一些清零或置位的输入控制信号,如Reset信号。主控组合逻辑部分:任务是根据状态机外部输入的状态控制信号(包括来自外部的和状态机内部的非进程的信号)和当前的状态值current_state来确定下一状态next_state的取值内容,以及对外部或对内部其他进程输出控制信号的内容。辅助逻辑部分:辅助逻辑部分主要是用于配合状态机的主控组合逻辑和主控时序逻辑进行工作,以完善和提高系统的性能。无论与基于VHDL的其它设计方案相比,还是与可完成相似功能的CPU相比,状态机都有其难以逾越的优越性,它主要表现在以下几方面:由于状态机的结构模式相对简单,设计方案相对固定,特别是可以定义符号化枚举类型的状态,这一切都为VHDL综合器尽可能发挥其强大的优化功能提供了有利条件。而且,性能良好的综合器都具备许多可控或不可控的专门用于优化状态机的功能。状态机容易构成性能良好的同步时序逻辑模块,这对于对付大规模逻辑电路设计中令人深感棘手的竞争冒险现象无疑是一个上佳的选择,加之综合器对状态机的特有的优化功能,使的状态机解决方案的优越性更为突出。状态机的VHDL设计程序层次分明,结构清晰,易读易懂,易排错和修改。在高速运算和控制方面,状态机更有其巨大的优势。由于在VHDL中,一个状态机可以由多个进程构成,一个结构体中可以包含多个状态机,而一个单独的状态机(或多个并行运行的状态机)以顺序方式的所能完成的运算和控制方面的工作与一个CPU类似。就运行速度而言,状态机状态变换周期只有一个时钟周期,而且,由于在每一状态中,状态机可以完成许多并行的运算和控制操作,所以,一个完整的控制程序,即使由多个并行的状态机构成,其状态数也是十分有限的。因此有理由认为,由状态机构成的硬件系统比CPU所能完成同样功能的软件系统的工作速度要高出两个数量级。就可靠性而言,状态机的优势也是十分明显的。首先是由于状态机的设计中能使用各种无懈可击的容错技术;其次是当状态机进入非法状态并从中跳出所耗的时间十分短暂,通常只有2个时钟周期,约数十个ns,尚不足以对系统的运行构成损害.应用VHDL设计状态机的具体步骤如下:(1)根据系统要求确定状态数量、状态转移的条件和各状态输出信号的赋值,并画出状态转移图;(2)按照状态转移图编写状态机的VHDL设计程序;(3)利用EDA工具对状态机的功能进行仿真验证。经过综合比较,决定采用状态机来实现本系统的设计,这样不仅思路很清楚而且可读性也非常强.利用状态机实现售票功能,仅需要一个模块,避免了考虑各模块相连时的控制问题。因此需要首先把整个系统的所有状态都给罗列出来,然后实现每个状态的内容,最后再利用一些变量将各个状态连接起来,实现整个系统的基本功能。状态机设计:根据以上的分析,地铁售票系统可以分为以下五个状态:(1)selstation:选站状态(2)selticket:选票状态(3)inputcoin:投币状态(4)ticketout:出票状态(5)givechange:找零状态而且系统每个状态完成以下功能:等待、选站状态:在该状态用户完成选站功能,选站完成后,tp不为零,自动进入选票状态。当无人使用时,系统也停留在该状态,等待下一个用户使用。选票状态:在该状态用户完成选票功能,选票完成后,tmoney不为零,自动进入投币状态。按cancelkey键可取消操作,系统回到等待、选站状态。投币状态:在该状态用户可投币,可多次投钱,可同时投硬币和纸币,但不可同时投一个以上硬币或一张以上纸币。用户投币后,在该状态系统内部完成计算投币总额的功能,并将计算结果跟所需钱数比较,若钱不够,回到投币状态,也可按cancelkey键将钱退出;若钱正好投够,进入出票状态.出票结束后,若钱有多余,则自动进入找钱状态。出票状态:在该状态完成出票功能,票每周期出一张,直到出够为止。票全部出完以后,自动进入出钱状态。找零状态:在该状态完成出币功能,若余额不为零,继续在此状态出币,若余额已为零,系统回到等待、选站状态。给出tp,tmoney,pmoney,num,en几个变量,控制状态间的转移。根据tp判断是否完成选站,根据tmoney判断是否完成选票,根据pmoney判断投币是否足够,根据num判断出票是否足够,根据en判断找钱是否结束.设计中输入有clk,reset,station,tn,lettuce,coin,cancelkey.其中clk是时钟周期信号,reset为系统复位信号,station是乘客所选的出站号,而tn表示乘客所选的票数,为方便设计,乘客一次购车票数限制在4张以内.Lettuce表示乘客投入的纸币,Coin表示乘客投的硬币,cancelkey是乘客在选票和投币期间用来取消操作的.设计中输出有Tout,Mout,MoneyInputAlarm,State.其中Tout表示出票,周期数即是出票数,Mout表示找出的零钱,若所投钱币总额恰好为车票总额,则Mout一直为0,MoneyInputAlarm表示所投金额不足时发出的警报,当继续投币至足额时MoneyInputAlarm会自动恢复为0,交易正常进行.State是用来标号各个状态的.加这个输出主要是考虑到调试程序时能更方便地观察到状态之间的转换,更容易发现问题,调试程序.流程图描述:系统上电后首先对于整个系统进行进行复位,处于等待乘客选站状态;当乘客选择了出站名之后,系统内部设定相应的票价(2元、3元和4元);然后系统进入选择购买票数同时计算出票价总额;选票完成后系统转到投币状态,系统对于乘客所投入的硬币(1元)和纸币(5元,10元)进行识别,在每次投币结束后累加投币总额,然后判断所投钱币是否足够,如果不足继续停留在投币状态;如果投币足够,系统进入到出票状态,每个周期出一张票,出票结束后进行余额找零;余额找零按照从大到小(10元,5元,1元)的原则逐额进行退钱,找零结束系统返回到初始等待选站状态;购票过程中,在选择了站点以后,乘客可以按下取消键(cancelkey=1),系统返回等待选站状态,可以进行重新选站或结束本次操作.在投币过程中,如果所投钱币未达到票价总额,乘客按下取消键后(cancelkey=1),系统转到余额找零状态逐额找零,找零结束后,重新回到等待选站状态。系统框图描述图1.系统流程图状态机设计和状态转移图描述状态转移图:图2.状态转移图程序设计及解释程序源代码及解释:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityAutoTicketSellisport(Reset:instd_logic;--系统复位信号Clk:instd_logic;--系统时钟Cancelkey:instd_logic;--取消操作键Station:instd_logic_vector(11downto0);--出站名Tn:instd_logic_vector(1downto0);--所购票数Coin:instd_logic_vector(1downto0);--硬币投币口Lettuce:instd_logic_vector(3downto0);--纸币投币口MoneyInputAlarm:outstd_logic;--投币不足报警信号Tout:outstd_logic;--出票Mout:outstd_logic_vector(3downto0);--余额找出State:outstd_logic_vector(2downto0)--系统状态指示);endAutoTicketSell;architecturebehaveofAutoTicketSellistypeFFis(selstation,selticket,inputcoin,ticketout,givechange);--定义系统转换状态(选站,选票,投币,出票,找零)beginprocess(clk,reset)variablenext_state:FF:=selstation;variableTp:integerrange0to4;--车票单价variabletmoney,pmoney,rmoney:integerrange0to20;--车票总额,投币总额,找零总额variablenum:integerrange0to3;--所购票数variableen:std_logic;--找零结束标志variablehalf:integerrange0to2;--表示投入1元硬币beginif(Clk'eventandClk='1')thenifReset='1'next_state:=selstation;--系统复位,回到初始选站状态elsecasenext_stateis whenselstation=>--选择出站名 State<="000";Tout<='0';Mout<="0000";MoneyInputAlarm<='0';tmoney:=0; pmoney:=0;rmoney:=0;--初始化清零casestationiswhen"000000000000"=>Tp:=0; when"000001000010"=>Tp:=2;when"000000000000"=>Tp:=0; when"000001000010"=>Tp:=2; when"000001000011"=>Tp:=2; when"000001000100"=>Tp:=2; when"000001000101"=>Tp:=2; when"000001000110"=>Tp:=2; when"000001000111"=>Tp:=2; when"000001001000"=>Tp:=2; when"000001001001"=>Tp:=2; when"000001001010"=>Tp:=3; when"000001001011"=>Tp:=3; when"000001001100"=>Tp:=3; when"000001001101"=>Tp:=4; when"000001001110"=>Tp:=4; when"000001001111"=>Tp:=4; when"000001010000"=>Tp:=4; when"000001010001"=>Tp:=2; when"000001010010"=>Tp:=2; when"000001010011"=>Tp:=2; when"000001010100"=>Tp:=2; when"000001010101"=>Tp:=3; when"000001010110"=>Tp:=3; when"000001010111"=>Tp:=3; when"000001011000"=>Tp:=3; when"000001011001"=>Tp:=4; when"000001011010"=>Tp:=4; when"000001011011"=>Tp:=4; when"000001011100"=>Tp:=4; when"000001011101"=>Tp:=4; when"000001011110"=>Tp:=4; when"000001011111"=>Tp:=4; when"000001100000"=>Tp:=2; when"000001100001"=>Tp:=2; when"000001100010"=>Tp:=2; when"000001100011"=>Tp:=2; when"000001100100"=>Tp:=2; when"000001100101"=>Tp:=2; when"000001100110"=>Tp:=2; when"000001100111"=>Tp:=2; when"000001101000"=>Tp:=2; when"000001101001"=>Tp:=3; when"000001101010"=>Tp:=3; when"000001101011"=>Tp:=3; when"000001101100"=>Tp:=3; when"000001101101"=>Tp:=4; when"000001101110"=>Tp:=4; when"000001101111"=>Tp:=4; when"000001110000"=>Tp:=4; when"000001110001"=>Tp:=4; when"000001110010"=>Tp:=4; when"000001110011"=>Tp:=4; when"000001110100"=>Tp:=4; when"000001110101"=>Tp:=4; when"000001110110"=>Tp:=4; when"000001110111"=>Tp:=4; whenothers=>null; endcase; ifTp/=0then next_state:=selticket;--选站结束,进入选票状态 else next_state:=selstation;--未选站,停留在选站状态 endif; whenselticket=>--选择票数 State<="001";if(Cancelkey='1')thennext_state:=selstation;--选票期间取消操作,回到选站状态else caseTnis when"00"=> tmoney:=tmoney+1*Tp;--计算票价 num:=1; when"01"=> tmoney:=tmoney+2*Tp; num:=2; when"10"=> tmoney:=tmoney+3*Tp; num:=3;when"11"=> tmoney:=tmoney+4*Tp; num:=4;--最多购4张票 whenothers=>null;endcase; iftmoney/=0then next_state:=inputcoin;--选票结束,进入投币状态 else next_state:=selticket;--未选票,停留在选票状态 endif;endif; wheninputcoin=>--进行投币 State<="010";caseLettuceis--投入纸币 when"0101"=>--5元 pmoney:=pmoney+5; when"1010"=>--10元 pmoney:=pmoney+10; whenothers=>null;--连续投币,并进行累加 endcase; caseCoinis--投入硬币 when"10"=>--1元 pmoney:=pmoney+1; whenothers=>null;--连续投币,并进行累加 endcase; if(Cancelkey='1')then--投币期间取消操作,退还所投钱币MoneyInputAlarm<='0';rmoney:=pmoney;next_state:=givechange;else if(pmoney<tmoney)then--比较投币总额与车票总额MoneyInputAlarm<='1'; next_state:=inputcoin;--投币不足,继续进入投币状态elseMoneyInputAlarm<='0'; next_state:=ticketout;--投币足够,进入出票状态 endif;endif; whenticketout=>--出票 State<="011"; casenumis when0=>null; when1=> Tout<='1';num:=num-1; when2=> num:=num-1; Tout<='1'; when3=> num:=num-1; Tout<='1';--每个时钟周期出一张票 endcase; if(num=0)thenrmoney:=pmoney-tmoney;next_state:=givechange;--出票结束,余额找出 elsenext_state:=ticketout;--继续出票 endif; whengivechange=>--余额找出,按从大到小原则退钱(10元,5元,1元,) State<="100";Tout<='0'; en:='0'; if(rmoney>=10)then--10元 rmoney:=rmoney-10; Mout<="1010"; elsif(rmoney>=5)then--5元 rmoney:=rmoney-5; Mout<="0101";elsif(rmoney>=1)then--1元 rmoney:=rmoney-1; Mout<="0001";elseMout<="0000";endif; en:='1';--余额找出结束标志 endif; ifen='1'then–找零结束,回到选站状态 next_state:=selstation; tmoney:=0; pmoney:=0; else next_state:=givechange;--继续找零 endif; whenothers=>--其他任何情况,均回到选站状态 next_state:=selstation; endcase; endif;endif; endprocess;endbehave;程序调试和验证程序编制完成后,对于系统的各项功能分别进行以下调试及仿真:(1)图3显示系统处于等待选站状态的波形系统开机上电后首先进行复位(Reset=1),所有输出均为零,系统处于等待选站状态(state=000).图3等待选站状态的波形(2)图4显示选站未选票的波形选择元通到下马坊(000010101101),系统计算票价为3元(Tp=3),系统进入选票状态(state=001)。其他所有输出仍为零。图4.4选站未选票的波形(3)图5显示选站和选票都完成的波形选择2张票(Tn=2)后,车票总额为6元(tmoney=6),系统进入投币状态(state=010),同时MoneyInputAlarm=1,提醒进行投币.图5.显示选站和选票都完成的波形图6显示投入10元纸币后的波形图6.投入10元纸币后的波形投入10元纸币后,MoneyInputAlarm变为0,表示投币足够,State由2变为3表示进入了出票状态,Tout在State3的2个周期都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论