简易地铁自动售票系统设计方案Word格式文档下载.docx
- 文档编号:20779328
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:44
- 大小:2.25MB
简易地铁自动售票系统设计方案Word格式文档下载.docx
《简易地铁自动售票系统设计方案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《简易地铁自动售票系统设计方案Word格式文档下载.docx(44页珍藏版)》请在冰豆网上搜索。
01000
Ticketout
出票状态
10000
Givechagne
找零状态
3、系统总体框图
图1
图2
图3
图4
图5
图6
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工具对状态机的功能进行仿真验证。
经过综合比较,决定采用状态机来实现本系统的设计,这样不仅思路很清楚而且可读性也非常强.利用状态机实现售票功能。
需要首先把整个系统的所有状态都给罗列出来,然后实现每个状态的内容,最后再利用一些变量将各个状态连接起来,实现整个系统的基本功能.
Kinin模块是用来防抖的,由于按键动作的时刻和按下的时间长短是随机的。
并且存在由开关簧片反弹导致的电平抖动,抖动的时间一般小于20mS,因此必须为每个按键开关设置一个消抖和同步电路,此电路可有多种形式。
按一次键,只产生一个脉冲,脉冲宽度为防抖动时钟的脉宽。
在投币的时候,由于要多次投币,多次按键,使之在按键的时候,每按一次,程序只会执行一次。
防抖动时钟的频率为100HZ左右,接下来得为其设置一个分频系数为500k的分频。
div_500k是系数为500k的分频,为的是把实验板50mHz的频率分为100Hz,使防抖电路正常工作。
div_2k是系数为2k的分频,为的是把实验板50mHz的频率分为25000Hz,每个数码管工作频率到2000Hz左右。
三、仿真波形及波形分析
a).系统复位
图7
系统复位,Restart='
1'
;
系统进入第一个状态state=00001,系统所有数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;
b).选择车票种类
图8
选择车票种类,style=“100“代表买单价为6元的车票,系统进入第二个状态state=00010,Selticket,等待选择购票数量状态,6个数码管显示600000;
c).选择车票数量
图9
选择车票数量,Tnum=“100“代表购票3张,系统进入第三个状态state=00100,Inputmoney,等待放入钱币状态,MoneyInputAlarm=‘1‘代表钱币不足,6个数码管显示630000;
d).投入钱币
图10
投入钱币,Money=”010”代表投入5元,钱币不足,系统依旧停留在第三个状态state=00100,MoneyInputAlarm=‘1‘代表钱币不足,6个数码管显示630500,等待放入钱币;
e).第二次投入钱币
图11
第二次投入钱币,Money=”100”代表投入10元,但钱币依旧不足(6*3=18>
5+10=15),判断Castmoney<
Totalmoney,系统依旧停留在第三个状态state=00100,MoneyInputAlarm=’1’代表钱币不足,6个数码管显示631500,等待放入钱币;
f).第三次投入钱币
图12
第三次投入钱币,Money=“010“代表投入5元,钱币足够(6*3=18<
5+10+5=20),判断Castmoney>
Totalmoney,MoneyInputAlarm=‘0‘代表钱币已足,系统进入第四个状态,state=01000,Ticketout,出票状态;
g).系统自动出票
系统自动出票,Tout=‘1‘显示在3个周期代表出票3张,系统进入第五个状态,state=10000,Givechagne,找零状态。
h).系统自动找零
系统自动找零,Mout[0]=’1’持续两个周期代表检测restmoney>
1,依次找出2张1元的纸币,找零结束,6个数码管显示632032,State=”10000”代表状态停留在找零阶段。
i).再次购买
图13
之后,Rebuy=‘1‘,代表再次购票,进入第一个状态state=00001,系统数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;
j).取消操作
图14
在c),d),e)之后,如果想取消交易,cancelkey=’1’,系统进入找零状态,如,在d)之后取消,自动找零,Mout[1]=‘1‘代表检测到restmoney>
5,找出一张5元的纸币,找零结束,6个数码管显示630505;
k).整个购票过程结束。
四、源程序
1.主程序SubwayAutoTicketSellSystem.vhd
---------------------------------------------
--FileName:
SubwayAutoTicketSellSystem.vhd
--Description:
Achievethefunctionofautoticketselling
--Limition:
None
--System:
Vhdl9.0
--Soft:
Quartus2-9.0
--Author:
ChenDawen
--Revision:
Version1.0,2012-10-31
--------------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitySubwayAutoTicketSellSystemis
port(
Restart:
instd_logic;
--系统复位信号
Rebuy:
--开始购票操作
Clk:
--系统时钟
Cancelkey:
instd_logic;
--取消操作键
Style:
instd_logic_vector(2downto0);
--车票种类
Tnum:
instd_logic_vector(2downto0);
--所购票数
Money:
--投币口
MoneyInputAlarm:
outstd_logic;
--投币不足报警信号
Tout:
--出票
Mout:
outstd_logic_vector(1downto0);
--余额找出
State:
outstd_logic_vector(4downto0);
--系统状态指示
--beep:
--蜂鸣器信号
SG:
outstd_logic_vector(6downto0);
--段码
BT:
outstd_logic_vector(5downto0)--位码
);
endSubwayAutoTicketSellSystem;
architecturebehaveofSubwayAutoTicketSellSystemis
componentdiv_2K--引入div_2k分频模块
port(clk_in:
clk_out:
outstd_logic);
endcomponent;
componentdiv_500K--引入div_500k分频模块
port(clk_in2:
clk_out2:
componentkeyin--引入keyin防抖模块
port(clk_in1:
reset:
resetn:
outstd_logic);
typeTTis(selstyle,selticket,inputmoney,ticketout,givechange);
--定义系统转换状态(等待选择票种状态,等待选择购票数量状态,等待放入钱币状态,出票状态,找零状态)
signalclk_tmp:
std_logic;
--临时时钟
signalclk_tmp2:
--临时时钟2
signalCNT6:
INTEGERRANGE0TO5;
signalA:
signalTstyle:
std_logic_vector(6downto0);
--车票单价显示
signalTnumber:
--车票数量显示
signalMinput1:
--投入金额十位显示
signalMinput2:
--投入金额个位显示
signalMinput:
std_logic_vector(4downto0);
--投入金额计数
signalToutnum0:
--出票数量显示
signalToutnum:
std_logic_vector(1downto0);
--出票数量计数
signalChangeout0:
--输出零钱数显示
signalChangeout:
std_logic_vector(3downto0);
--输出零钱数量计数signalMoneyn:
std_logic_vector(2downto0);
--防抖之后实际投币输入
begin
u1:
div_2kportmap(clk_in=>
CLK,clk_out=>
clk_tmp);
--各种映射
u2:
div_500kportmap(clk_in2=>
CLK,clk_out2=>
clk_tmp2);
u4:
keyinportmap(clk_in1=>
CLK_tmp2,reset=>
money(0),resetn=>
moneyn(0));
u5:
clk_tmp2,reset=>
money
(1),resetn=>
moneyn
(1));
u6:
money
(2),resetn=>
moneyn
(2));
--------------------以下为数码管显示程序模块-----------
process(CNT6)
caseCNT6is--3线至6线译码器
when0=>
BT<
="
011111"
;
A<
=0;
--A为位码
when1=>
101111"
=1;
when2=>
110111"
=2;
when3=>
111011"
=3;
when4=>
111101"
=4;
when5=>
111110"
=5;
whenothers=>
NULL;
endcase;
endprocess;
process(clk_tmp)
begin
ifclk_tmp'
eventandclk_tmp='
then--实现模6计数器
ifCNT6=5then
CNT6<
=0;
else
=CNT6+1;
endif;
endif;
process(A)
begin
caseAis--实现数码管的显示功能
when0=>
SG<
=Tstyle;
when1=>
=Tnumber;
when2=>
=Minput1;
when3=>
=Minput2;
when4=>
=Toutnum0;
when5=>
=Changeout0;
whenothers=>
endcase;
process(Minput)--投入金额数码管显示
begin
caseMinputis
when"
11011"
=>
Minput1<
="
1101101"
;
Minput2<
1110000"
--27
11010"
1011111"
--26
11001"
1011011"
--25
11000"
0110011"
--24
10111"
1111001"
--23
10110"
--22
10101"
0110000"
--21
10100"
1111110"
--20
10011"
1111011"
--19
10010"
1111111"
--18
10001"
--17
10000"
--16
01111"
--15
01110"
--14
01101"
--13
01100"
--12
01011"
--11
01010"
--10
01001"
--09
01000"
--08
00111"
--07
00110"
--06
00101"
--05
00100"
--04
00011"
--03
00010"
--02
00001"
--01
00000"
--00
null;
endcase;
endprocess;
process(C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 地铁 自动 售票 系统 设计方案