1、地铁自动售票系统VHDL数字系统课程设计-地铁售票模拟一、 设计要求:功能描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。功能要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、2 元,5 元,10 元。乘客可以连续多次投入钱币。乘客可以选择的种类为2 元和4 元,乘客一次只能选择一个出站口。购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。功能描述:用于模仿地铁
2、售票的自动售票,完成地铁售票的核心控制功能。功能要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、2 元,5 元,10 元。乘客可以连续多次投入钱币。乘客可以选择的种类为2 元和4 元,乘客一次只能选择一个出站口。购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。二、 课题分析1 买车票时,乘客按“开始选择”按钮,接着选择出站口接着 选择购票数量(根据提示,一次购票数限制在3
3、张以内);然后按“开始投币”按钮,投入钱币;当投入的钱币达到所需金额时,售票机自动出票,并找出余额。考虑到控制整个售票机的物理体积,余额将全部采用5角硬币的形式找出。2 选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。选择出站口的过程中,若按“取消”,则售票机直接回到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,再回到初始状态。3 客一次只能选择一个出站口,根据乘坐的站数确定票价。假设乘客购票所在站到终点站共有15站。若乘坐1-8站,则票价为2元张;若乘坐9-16站,则票价为4元张。16个站用长度位4的二进制向量编码表示,即0001表示乘坐1站,001
4、0表示乘坐2站,依次类推,1111表示乘坐15站(到终点站)。4 票机有2个进币端口。硬币口可识别5角和1元2种硬币,拟用长度为2的一比特热位(one-hot)编码方式表示,即01表示5角,10表示1元。纸币口类似,用长度为4的一比特热位编码方式表示。乘客可以连续多次投入钱币,并且可以以任意顺序投入硬币和纸币。5 票机设有钱币“暂存杆”,其有3个状态:退币状态、等待状态、进币状态,分别用00、01、10表示。退币状态下,“暂存杆”将乘客投入的钱币推出;等待状态下,投入的钱币被“暂存杆”挡住暂存;进币状态下,“暂存杆”将乘客投入的钱币推入售票机内部。三、系统流程图:四、 系统状态图五、程序源代码
5、及注释library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity subway isport( clk :in std_logic; -系统时钟 select_start :in std_logic; -“开始选择”按钮 insert_start :in std_logic; -“开始投币”按钮 coin :in std_logic_vector(1 downto 0); -硬币入口 note :in std_logic_vector(3 downto 0); -纸币入口 cancel :in
6、std_logic; -“取消”按钮 ticket_stop :in std_logic_vector(3 downto 0); -出站口编号 ticket_account :in std_logic_vector(1 downto 0); -购票张数 money_gate :out std_logic_vector(1 downto 0); -钱币“暂存杆” ticket_out :out std_logic_vector(4 downto 0); -购买的车票 ticket_gate :out std_logic; -出票口 change_gate :out std_logic -找零口)
7、;end subway;architecture behave of subway is type state_type is (initialize_state,select_state,insert_state,ticket_state,change_state); -状态变量申明 signal state:state_type; -状态信号申明 begin process(clk) variable type_temp :std_logic; -记录是否已选择出站口的变量 variable account_temp :std_logic; -记录是否已选择购票张数的变量 variable
8、 temp_type :std_logic_vector(4 downto 0); -记录票种的中间变量 variable temp_account :std_logic_vector(4 downto 0); -记录票数的中间变量 variable price :std_logic_vector(7 downto 0); -记录单张票价的变量 variable number :std_logic_vector(1 downto 0); -记录票数的变量 variable total_price :std_logic_vector(7 downto 0); -记录总票价的变量 variable
9、 total_insert :std_logic_vector(7 downto 0);- 记录投入钱币总额的变量 variable change :std_logic_vector(7 downto 0); -记录应找零金额的变量 variable sign :std_logic; -记录系统是否已经过初始化的变量 variable temp :std_logic; -记录投入钱币金额达到总票价的变量 begin if (clkevent and clk=1) then -时钟信号上升沿触发 case state is when initialize_state= -初始状态 if(sign
10、=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; -购票张数记录清零 total_price:=00000000; -票价总额记录清零 total_insert:
11、=00000000; -投入钱币总额记录清零 change:=00000000; -应找零金额记录清零 sign:=1; -记录已完成系统初始化 temp:=0 ; -投入达到总票价记录清零 else -表示系统已经过初始化 money_gate=01; -钱币“暂存杆”归为等待状态 if (select_start=1) then -按下“开始选择”按钮 sign:=0; state -选择状态 if(type_temp=0) then -表示尚未选择出站口 if(ticket_stop=0001)and(ticket_stop=1001)and(ticket_stop -选择3张票 tem
12、p_account:=00100;-表示3张票 number:=11; -购票张数为3 total_price:=price+price+price; -计算总票价 account_temp:=1; -记录已选择购票张数 when 10= -选择2张票 temp_account:=00010; number:=10; total_price:=price+price; account_temp:=1; when 01= -选择1张票 temp_account:=00001; number:=01; total_price:=price; account_temp:=1; when others
13、=null; end case; end if; if(type_temp=1)and(account_temp=1) then -表示已选择出站口且已选择购票张数 if(insert_start=1) then -按下“开始投币”按钮 state=insert_state; -系统进入投币状态 end if; end if; if(cancel=1) then -按下“取消”按钮 state -投币状态 case note is -纸币识别 when 0001= -1元纸币total_insert:=total_insert+00001010; -重新计算投币总额 when 0010=tot
14、al_insert:=total_insert+00010100; -2元纸币 when 0100=total_insert:=total_insert+00110010; -5元纸币 when 1000=total_insert:=total_insert+01100100; -10元纸币 when others=null; end case; case coin is -硬币识别 when 01=total_insert:=total_insert+00000101; -5角硬币 when 10=total_insert:=total_insert+00001010; -1元硬币 when
15、 others=null; end case; if(cancel=1) then -按下“取消”按钮 state=initialize_state; -回到初始状态 end if;if(temp=1) then -判断投入钱币金额达到总票价 money_gate=10;-钱币“暂存杆”将钱币推入售票机内,表示接受投币 state=total_price) then-判断投入总金额是否已达到票价总额 temp:=1; -记录投入钱币金额达到总票价 end if; when ticket_state= -出票状态 -计算应找零金额 if(number=11) then change:=total
16、_insert-price-price-price; elsif(number=10) then change:=total_insert-price-price; elsif(number=01) then change:=total_insert-price; end if; ticket_out=temp_type+temp_account; -计算输出车票 ticket_gate00000000) then -判断是否还有找零 state=change_state; -系统进入找零状态 else state -找零状态-找零口打开时,可控制每个时钟上升沿推出一个5角的硬币 if(cha
17、nge00000000) then change_gate=1; -找零口打开 change:=change-00000101;-计算剩余应找零金额 else change_gate=0; -找零口关闭 state=total_price)。(6)系统进入出票状态(ticket_state):系统准备好4元的票3张(10100),出票口打开(ticket_gate=1)出票。(7)系统进入找零状态(change_state):找零口打开(change_gate=1)找零,每个时钟上升沿时出一个5角硬币,变量change实时显示剩余应找零金额。(8)找零完毕,找零口关闭;出票口关闭。系统回到初始
18、状态。此段仿真主要验证了连续投入单种介质钱币购票且找零的功能正常。系统全部恢复初始状态的时间在4.56us左右(如图)。4(1)乘客在约4.75us时按下“开始选择”按钮,系统进入选择状态。 (2)乘客选择出站口为第12站,系统得出票价为4元;选择购买2张,系统得出票数为2张。进而得出总票价为8元。 (3)乘客按下“开始投币”按钮,系统进入投币状态。 (4)乘客依次投入5角硬币、5角硬币、5元纸币、5角硬币、1元硬币、2元纸币,系统实时计算投入的总金额。 (5)系统判断投入的总金额已经达到票价总额。(6)系统进入出票状态:系统准备好4元的票2张,出票口打开出票。(7)系统进入找零状态:找零口打
19、开找零,每个时钟上升沿时出一个5角硬币,变量change实时显示剩余应找零金额。(8)找零完毕,找零口关闭;出票口关闭。系统回到初始状态。此段仿真主要验证了连续混合投入硬币和纸币购票且找零的功能正常。系统全部恢复初始状态的时间在7.36us左右(限于版面,未在下图中标出,向右移动水平进度条可定位)。5(1)乘客在约7.55us时按下“开始选择”按钮,系统进入选择状态。 (2)乘客选择出站口为第3站,系统得出票价为2元;选择购买1张,系统得出票数为1张。进而得出总票价为2元。 (3)乘客按下“开始投币”按钮,系统进入投币状态。 (4)乘客依次投入1元硬币、5角硬币、5角硬币,系统实时计算投入的总
20、金额。 (5)系统判断投入的总金额已经达到票价总额。(6)系统进入出票状态:系统准备好1元的票1张,出票口打开出票。(7)出票口关闭,系统回到初始状态。此段仿真主要验证了投入钱币购票且无找零的功能正常。系统全部恢复初始状态的时间在9.26us左右(如图)。至此,系统各项功能的测试全部完毕。六、 芯片模型七、 感想与体会本次设计基本实现了设计要求。但由于有事耽搁,没有及时验收,望老师谅解。在设计过程中,有两个细节值得一提:一是“钱币暂存杆”的设计。本人认为,当乘客投入钱币后,若其最终未购票,则此时的找零没有必要从退币口另行退出,而是应该直接将其投入的钱币退还,这是与工程实际相符的。故作此设计,类似于一挡板,通过几个不同的位置(状态)实现功能要求。二是找零全部采用5角的硬币。本人认为,若采用多种票额复合找零的方式,无疑会大大增大自动售票机的物理体积(尤其是纸币),这与当今小型化、微型化的理念和趋势是相悖的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1