基于VHDL的地铁售票控制系统设计1长沙理工大学《通信电路EDA》课程项目报告系别水利计通系专业通信工程班级通信1003班指导教师单树明项目组组长陈希超学号201085250327项目组成员黄诗扬学号201085250319项目组成员刘明睿学号201085250332项目组成员李明学号201085250334完成日期2012年11月8日基于VHDL的地铁售票控制系统设计2地铁售票控制系统设计1引言1.项目描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。2.项目要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1元的硬币,纸币的识别范围是1元、2元,5元,10元。乘客可以连续多次投入钱币。乘客可以选择的种类为2元和4元,乘客一次只能选择一个出站口。购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。2设计思想1.买车票时,乘客按“开始选择”按钮,接着选择出站口接着选择购票数量(根据提示,一次购票数限制在3张以内);然后按“开始投币”按钮,投入钱币;当投入的钱币达到所需金额时,售票机自动出票,并找出余额。考虑到控制整个售票机的物理体积,余额将全部采用5角硬币的形式找出。2.选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。选择出站口的过程中,若按“取消”,则售票机直接回到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,再回到初始状态。3.乘客一次只能选择一个出站口,根据乘坐的站数确定票价。假设乘客购票所在站到终点站共有15站。若乘坐1-8站,则票价为2元/张;若乘坐9-16站,则票价为4元/张。16个站用长度位4的二进制向量编码表示,即0001表示乘坐1站,0010表示乘坐2站,依次类推,1111表示乘坐15站(到终点站)。a)出票机有2个进币端口。硬币口可识别5角和1元2种硬币,拟用长度基于VHDL的地铁售票控制系统设计3为2的一比特热位(one-hot)编码方式表示,即01表示5角,10表示1元。纸币口类似,用长度为4的一比特热位编码方式表示。乘客可以连续多次投入钱币,并且可以以任意顺序投入硬币和纸币。b)出票机设有钱币“暂存杆”,其有3个状态:退币状态、等待状态、进币状态,分别用00、01、10表示。退币状态下,“暂存杆”将乘客投入的钱币推出;等待状态下,投入的钱币被“暂存杆”挡住暂存;进币状态下,“暂存杆”将乘客投入的钱币推入售票机内部。系统流程图:初始状态按“开始选择”选择出站口按“开始投币”投入钱币钱币足够找零口找零出票口出票按“取消”按“取消”退回钱币钱币入库选择购票数基于VHDL的地铁售票控制系统设计4程序源代码及注释libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysubwayisport(clk:instd_logic;--系统时钟select_start:instd_logic;--“开始选择”按钮insert_start:instd_logic;--“开始投币”按钮coin:instd_logic_vector(1downto0);--硬币入口note:instd_logic_vector(3downto0);--纸币入口cancel:instd_logic;--“取消”按钮ticket_stop:instd_logic_vector(3downto0);--出站口编号ticket_account:instd_logic_vector(1downto0);--购票张数money_gate:outstd_logic_vector(1downto0);--钱币“暂存杆”ticket_out:outstd_logic_vector(4downto0);--购买的车票ticket_gate:outstd_logic;--出票口change_gate:outstd_logic--找零口);endsubway;architecturebehaveofsubwayistypestate_typeis(initialize_state,select_state,insert_state,ticket_state,change_state);--状态变量申明signalstate:state_type;--状态信号申明基于VHDL的地铁售票控制系统设计5beginprocess(clk)variabletype_temp:std_logic;--记录是否已选择出站口的变量variableaccount_temp:std_logic;--记录是否已选择购票张数的变量variabletemp_type:std_logic_vector(4downto0);--记录票种的中间变量variabletemp_account:std_logic_vector(4downto0);--记录票数的中间变量variableprice:std_logic_vector(7downto0);--记录单张票价的变量variablenumber:std_logic_vector(1downto0);--记录票数的变量variabletotal_price:std_logic_vector(7downto0);--记录总票价的变量variabletotal_insert:std_logic_vector(7downto0);--记录投入钱币总额的变量variablechange:std_logic_vector(7downto0);--记录应找零金额的变量variablesign:std_logic;--记录系统是否已经过初始化的变量variabletemp:std_logic;--记录投入钱币金额达到总票价的变量beginif(clk'eventandclk='1')then--时钟信号上升沿触发casestateiswheninitialize_state=--初始状态if(sign='0')then--表示系统未经过初始化money_gate=00;--钱币“暂存杆”退出钱币ticket_out=00000;--购票记录清零ticket_gate='0';--出票口关闭change_gate='0';--找零口关闭temp_type:=00000;--票种记录清零temp_account:=00000;--票数记录清零type_temp:='0';account_temp:='0';price:=00000000;--单张票价记录清零number:=00;--购票张数记录清零基于VHDL的地铁售票控制系统设计6total_price:=00000000;--票价总额记录清零total_insert:=00000000;--投入钱币总额记录清零change:=00000000;--应找零金额记录清零sign:='1';--记录已完成系统初始化temp:='0';--投入达到总票价记录清零else--表示系统已经过初始化money_gate=01;--钱币“暂存杆”归为等待状态if(select_start='1')then--按下“开始选择”按钮sign:='0';state=select_state;--系统进入选择状态endif;endif;whenselect_state=--选择状态if(type_temp='0')then--表示尚未选择出站口if((ticket_stop=0001)and(ticket_stop=1000))then--乘坐站数不超过8站--由于整个系统中涉及的最小金额为5角,为表示方便,有关金额的量统一以“角”为单位--即5角为“5”,1元为“10”,2元为“20”,5元为“50”,10元为“100”price:=00010100;--票价为2元--用5位逻辑矢量表示票种和数量--其中前2位表示票种:10000表示4元票,01000表示2元票--后3位表示数量:10000表示3张,01000表示2张,00100表示1张--二者相加即可同时表示购买的票种和张数信息temp_type:=01000;--表示2元票type_temp:='1';--记录已选择出站口elsif((ticket_stop=1001)and(ticket_stop=1111))then--乘坐站数超过8站price:=00101000;--票价为4元temp_type:=10000;--表示4元票基于VHDL的地铁售票控制系统设计7type_temp:='1';--记录已选择出站口endif;endif;if((account_temp='0')and(type_temp='1'))then--表示已选择出站口但尚未选择购票张数caseticket_accountiswhen11=--选择3张票temp_account:=00100;--表示3张票number:=11;--购票张数为3total_price:=price+price+price;--计算总票价account_temp:='1';--记录已选择购票张数when10=--选择2张票temp_account:=00010;number:=10;total_price:=price+price;account_temp:='1';when01=--选择1张票temp_account:=00001;number:=01;total_price:=price;account_temp:='1';whenothers=null;endcase;endif;if((type_temp='1')and(account_temp='1'))then--表示已选择出站口且已选择购票张数if(insert_start='1')then--按下“开始投币”按钮state=insert_state;--系统进入投币状态基于VHDL的地铁售票控制系统设计8endif;endif;if(cancel='1')then--按下“取消”按钮state=initialize_state;--回到初始状态endif;wheninsert_state=--投币状态casenoteis--纸币识别when0001=--1元纸币total_insert:=total_insert+00001010;--重新计算投币总额when0010=total_insert:=total_insert+00010100;--2元纸币when0100=total_insert:=total_insert+00110010;--5元纸币when1000=total_insert:=total_insert+01100100;--10元纸币whenothers=null;endcase;casecoinis--硬币识别when01=total_insert:=total_insert+00000101;--5角硬币when10=total_insert:=total_insert+00001010;--1元硬币基于VHDL的地铁售票控制系统设计9whenothers=null;endcase;if(cancel='1')then--按下“取消”按钮state=initialize_state;--回到初始状态endif;if(temp='1')then--判断投入钱币金额达到总票价money_gate=10;--钱币“暂存杆”将钱币推入售票机内,表示接受投币state=ticket_state;--系统进入出票状态endif;if(total_insert=total_price)then--判断投入总金额是否已达到票价总额temp:=