地铁自动售票系统VHDL.docx

上传人:b****4 文档编号:4903217 上传时间:2022-12-11 格式:DOCX 页数:18 大小:533.88KB
下载 相关 举报
地铁自动售票系统VHDL.docx_第1页
第1页 / 共18页
地铁自动售票系统VHDL.docx_第2页
第2页 / 共18页
地铁自动售票系统VHDL.docx_第3页
第3页 / 共18页
地铁自动售票系统VHDL.docx_第4页
第4页 / 共18页
地铁自动售票系统VHDL.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

地铁自动售票系统VHDL.docx

《地铁自动售票系统VHDL.docx》由会员分享,可在线阅读,更多相关《地铁自动售票系统VHDL.docx(18页珍藏版)》请在冰豆网上搜索。

地铁自动售票系统VHDL.docx

地铁自动售票系统VHDL

 

数字系统课程设计---地铁售票模拟

 

一、设计要求:

功能描述:

用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。

功能要求:

售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5

角和1元的硬币,纸币的识别范围是1元、2元,5元,10元。

乘客可以连续多次投入钱币。

乘客可以选择的种类为2元和4元,乘客一次只能选择一个出站口。

购买车票时,乘客先选

择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出

票,并找出余额,本次交易结束,等待下一次的交易。

在投币期间,乘客可以按取消键取消

本次操作,钱币自动退出。

功能描述:

用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。

功能要求:

售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5

角和1元的硬币,纸币的识别范围是1元、2元,5元,10元。

乘客可以连续多次投入钱币。

乘客可以选择的种类为2元和4元,乘客一次只能选择一个出站口。

购买车票时,乘客先选

择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出

票,并找出余额,本次交易结束,等待下一次的交易。

在投币期间,乘客可以按取消键取消

本次操作,钱币自动退出。

 

二、课题分析

1.买车票时,乘客按“开始选择”按钮,接着选择出站口接着选择购票数量(根据提示,一次购票数限制在3张以内);然后按“开始投币”按钮,投入钱币;当投入的钱币达到所需金额时,售票机自动出票,并找出余额。

考虑到控制整个售票机的物理体积,余额将全部采用5角硬币的形式找出。

2.选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。

选择出站口的过程中,若按“取消”,则售票机直接回到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,再回到初始状态。

3.客一次只能选择一个出站口,根据乘坐的站数确定票价。

假设乘客购票所在站到终点站共有15站。

若乘坐1-8站,则票价为2元/张;若乘坐9-16站,则票价为4元/张。

16个站用长度位4的二进制向量编码表示,即0001表示乘坐1站,0010表示乘坐2站,依次类推,1111表示乘坐15站(到终点站)。

4.票机有2个进币端口。

硬币口可识别5角和1元2种硬币,拟用长度为2的一比特热位(one-hot)编码方式表示,即01表示5角,10表示1元。

纸币口类似,用长度为4的一比特热位编码方式表示。

乘客可以连续多次投入钱币,并且可以以任意顺序投入硬币和纸币。

5.票机设有钱币“暂存杆”,其有3个状态:

退币状态、等待状态、进币状态,分别用00、01、10表示。

退币状态下,“暂存杆”将乘客投入的钱币推出;等待状态下,投入的钱币被“暂存杆”挡住暂存;进币状态下,“暂存杆”将乘客投入的钱币推入售票机内部。

 

三、系统流程图:

 

 

四、系统状态图

 

五、程序源代码及注释

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysubwayis

port(

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;

architecturebehaveofsubwayis

typestate_typeis(initialize_state,select_state,insert_state,ticket_state,change_state);

--状态变量申明

signalstate:

state_type;--状态信号申明

begin

process(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;--记录投入钱币金额达到总票价的变量

begin

if(clk'eventandclk='1')then--时钟信号上升沿触发

casestateis

wheninitialize_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";--购票张数记录清零

total_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元票

type_temp:

='1';--记录已选择出站口

endif;

endif;

if((account_temp='0')and(type_temp='1'))then

--表示已选择出站口但尚未选择购票张数

caseticket_accountis

when"11"=>--选择3张票

temp_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';

whenothers=>

null;

endcase;

endif;

if((type_temp='1')and(account_temp='1'))then

--表示已选择出站口且已选择购票张数

if(insert_start='1')then--按下“开始投币”按钮

state<=insert_state;--系统进入投币状态

endif;

endif;

if(cancel='1')then--按下“取消”按钮

state<=initialize_state;--回到初始状态

endif;

wheninsert_state=>--投币状态

casenoteis--纸币识别

when"0001"=>--1元纸币

total_insert:

=total_insert+"00001010";

--重新计算投币总额

when"0010"=>

total_insert:

=total_insert+"00010100";

--2元纸币

when"0100"=>

total_insert:

=total_insert+"00110010";

--5元纸币

when"1000"=>

total_insert:

=total_insert+"01100100";

--10元纸币

whenothers=>

null;

endcase;

casecoinis--硬币识别

when"01"=>

total_insert:

=total_insert+"00000101";

--5角硬币

when"10"=>

total_insert:

=total_insert+"00001010";

--1元硬币

whenothers=>

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:

='1';--记录投入钱币金额达到总票价

endif;

whenticket_state=>--出票状态

--计算应找零金额

if(number="11")then

change:

=total_insert-price-price-price;

elsif(number="10")then

change:

=total_insert-price-price;

elsif(number="01")then

change:

=total_insert-price;

endif;

ticket_out<=temp_type+temp_account;--计算输出车票

ticket_gate<='1';--出票口打开

if(change>"00000000")then--判断是否还有找零

state<=change_state;--系统进入找零状态

else

state<=initialize_state;--找零完成,回到初始状态

endif;

whenchange_state=>--找零状态

--找零口打开时,可控制每个时钟上升沿推出一个5角的硬币

if(change>"00000000")then

change_gate<='1';--找零口打开

change:

=change-"00000101";--计算剩余应找零金额

else

change_gate<='0';--找零口关闭

state<=initialize_state;--系统回到初始状态

endif;

endcase;

endif;

endprocess;

endbehave;

 

六、程序调试

编译可以通过,无错误或警告,如图所示:

 

七、波形仿真:

在创建的波形仿真文件中,添加所有输入输出端口,并添加程序中涉及的重要变量进行仿真。

EndTime设定为10.0us,时钟周期设定为100ns,模拟完成乘客5次购票的过程,以期测试系统的所有功能是否正常。

全部的仿真波形截图如下:

 

下面将各次购票过程的波形仿真结果放大,逐一讨论检测。

1.

(1)乘客按下“开始选择”按钮(select_start='1'),钱币“暂存杆”进入等待状态(money_gate="01"),系统进入选择状态(state=select_state)。

(2)乘客选择出站口为第6站,系统得出单张票价price为20(2元);选择购买数量为2张,系统得出票数number为2。

进而得出总票价total_price为40(4元)。

(3)乘客按下“取消”按钮(cancel='1'),系统回到初始状态(state=initialize_state),钱币“暂存杆”推出(此刻无暂存钱币,仅表示初始化过程中的一个动作),然后再归为等待状态;其余变量全部清零。

此段仿真主要验证了在选择状态时“取消”按钮的功能正常。

系统全部恢复初始状态的时间在960.0ns左右(如图)

2.

(1)乘客在约1.15us时按下“开始选择”按钮,系统进入选择状态。

(2)乘客选择出站口为第11站,系统得出票价为4元;选择购买3张,系统得出票数为3张。

进而得出总票价为12元。

(3)乘客按下“开始投币”按钮(insert_start='1'),系统进入投币状态(state=insert_state)。

(4)乘客投入5元纸币(note="0100"),系统得出投入的总金额为5元(total_insert为50);投入1元硬币(coin="10"),系统得出投入的总金额为6元(total_insert为60)。

(5)乘客按下“取消”按钮,系统回到初始状态,钱币“暂存杆”推出,退出乘客投入的钱币,然后再归为等待状态;其余变量全部清零。

此段仿真主要验证了在投币状态时“取消”按钮的功能正常。

系统全部恢复初始状态的时间在2.36us左右(如图)。

 

3.

(1)乘客在约2.45us时按下“开始选择”按钮,系统进入选择状态。

(2)乘客选择出站口为第9站,系统得出票价为4元;选择购买3张,系统得出票数为3张。

进而得出总票价为12元。

(3)乘客按下“开始投币”按钮,系统进入投币状态。

(4)乘客投入10元纸币,系统得出投入的总金额为10元,再投入5元纸币,系统得出投入的总金额为15元。

(5)系统判断投入的总金额已经达到票价总额(total_insert>=total_price)。

(6)系统进入出票状态(ticket_state):

系统准备好4元的票3张(10100),出票口打开(ticket_gate='1')出票。

(7)系统进入找零状态(change_state):

找零口打开(change_gate='1')找零,每个时钟上升沿时出一个5角硬币,变量change实时显示剩余应找零金额。

(8)找零完毕,找零口关闭;出票口关闭。

系统回到初始状态。

此段仿真主要验证了连续投入单种介质钱币购票且找零的功能正常。

系统全部恢复初始状态的时间在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)系统进入找零状态:

找零口打开找零,每个时钟上升沿时出一个5角硬币,变量change实时显示剩余应找零金额。

(8)找零完毕,找零口关闭;出票口关闭。

系统回到初始状态。

此段仿真主要验证了连续混合投入硬币和纸币购票且找零的功能正常。

系统全部恢复初始状态的时间在7.36us左右(限于版面,未在下图中标出,向右移动水平进度条可定位)。

5.

(1)乘客在约7.55us时按下“开始选择”按钮,系统进入选择状态。

(2)乘客选择出站口为第3站,系统得出票价为2元;选择购买1张,系统得出票数为1张。

进而得出总票价为2元。

(3)乘客按下“开始投币”按钮,系统进入投币状态。

(4)乘客依次投入1元硬币、5角硬币、5角硬币,系统实时计算投入的总金额。

(5)系统判断投入的总金额已经达到票价总额。

(6)系统进入出票状态:

系统准备好1元的票1张,出票口打开出票。

(7)出票口关闭,系统回到初始状态。

此段仿真主要验证了投入钱币购票且无找零的功能正常。

系统全部恢复初始状态的时间在9.26us左右(如图)。

 

至此,系统各项功能的测试全部完毕。

六、芯片模型

 

七、感想与体会

本次设计基本实现了设计要求。

但由于有事耽搁,没有及时验收,望老师谅解。

在设计过程中,有两个细节值得一提:

一是“钱币暂存杆”的设计。

本人认为,当乘客投入钱币后,若其最终未购票,则此时的找零没有必要从退币口另行退出,而是应该直接将其投入的钱币退还,这是与工程实际相符的。

故作此设计,类似于一挡板,通过几个不同的位置(状态)实现功能要求。

二是找零全部采用5角的硬币。

本人认为,若采用多种票额复合找零的方式,无疑会大大增大自动售票机的物理体积(尤其是纸币),这与当今小型化、微型化的理念和趋势是相悖的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1