北邮VHDL实验地铁

上传人:仙*** 文档编号:32152790 上传时间:2021-10-13 格式:DOC 页数:11 大小:470KB
返回 下载 相关 举报
北邮VHDL实验地铁_第1页
第1页 / 共11页
北邮VHDL实验地铁_第2页
第2页 / 共11页
北邮VHDL实验地铁_第3页
第3页 / 共11页
点击查看更多>>
资源描述
基于VHDL的地铁自动售票系统设计 班级:xxxxxxx姓名:xxxxxx 学号:xxxxxxxxx 班内序号:15 日期:2012.11.11 1、 实验要求1.地铁票价统一为每张两元,可以投入币值为1元、5元和10元三种币种进行购票。2.能够开机自检,检验显示器件正常。3.通过按键开关BTN输入购票张数和投入的人民币张数并恰当显示相应信息。4.设置适当的声音提示或显示提示表示取票和找零。5.一次购票成功后系统能够恰当地转入下一次购票等待状态。6.系统能够复位。二、系统设计3、 仿真波形及分析售票系统上电后首先进行复位(Reset=1),然后等待乘客选择票数(Tn=0-7) 。在选票完成后, 系统输出报警信号 (MoneyInputAlarm=1), 提醒乘客进行投币。之后系统对于乘客投入的纸币进行识别,识别范围是1元,5元,10元(Money10,Money5,Money1),乘客可以连续多次投入钱币,系统自动进行累加。当投入的钱币未达到所需金额时,报警信号仍然继续维持(MoneyInputAlarm=1),提醒钱不够,需要继续投入钱币。当投入的钱币达到所需金额时,报警信号取消(MoneyInputAlarm=0),售票机自动出票(Tout=1) 。如果投入的钱币有余, 系统自动计算余额 (Rmoney) 。本次交易结束,系统自动进入选站状态等待下一次的交易。在投币期间,如果乘客按复位键(Reset=1)取消本次操作,钱币自动退出。4、 源程序library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity AddDiv is port( BT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); Reset:in std_logic; - 系统复位信号 clk:in std_logic; - 系统时钟 Tn:in std_logic_vector(6 downto 0); - 所购票数 Money10:in std_logic; - 投币10元 Money5:in std_logic; - 投币5元 money1:in std_logic; -投币1元 MoneyInputAlarm:out std_logic; - 投币不足报警信号 Tout : out std_logic;- 出票 LED:out std_logic_vector(6 downto 0); State:out std_logic_vector(2 downto 0) - 系统状态指示 ); end AddDiv;architecture behave of AddDiv iscomponent div_2K - 2000分频器,用来使7段数码管闪烁port(clk_in: in std_logic; clk_out: out std_logic);end component;component div_50M -50分频器,用来处理投币按键port(clk_in_50M: in std_logic; clk_out_50M: out std_logic);end component; SIGNAL CNT6:INTEGER RANGE 0 TO 5; - 扫频使6个七段数码管轮流亮的信号 SIGNAL tmplight:INTEGER RANGE 0 TO 9; - 控制所有数码管显示的信号 constant numh:integer:=0; - 票数显示高位 signal numl:integer range 0 to 9; - 票数显示低位 signal pmoneyh:integer range 0 to 2; - 所付钱数显示高位 signal pmoneyl:integer range 0 to 9; - 所付钱数显示低位 constant rmoneyh:integer:=0; - 找钱显示高位 signal rmoneyl:integer range 0 to 9; - 找钱显示低位 SIGNAL clk_tmp: STD_LOGIC; 2000M分频输出 SIGNAL clk_money: STD_LOGIC;type FF is (selticket,inputcoin,givechange) ; - 定义系统转换状态 (选站, 选票, 投币, 出票, 找零) begin u1:div_2k port map(clk_in=CLK,clk_out=clk_tmp); u2:div_50M port map(clk_in_50M=clk,clk_out_50M=clk_money);main: process(Reset,clk_money) variable next_state: FF:=selticket; variable tmoney,pmoney,rmoney,num: integer range 0 to 20; - 车票总额,投币总额,找零总额 begin IF clk_moneyEVENT AND clk_money= 1 THEN case next_state is when selticket = - 选择票数 Tout=0; MoneyInputAlarm=0; numl=0; pmoneyh=0; pmoneyl=0; rmoneyl=0; num:=0; tmoney:=0; pmoney:=0; rmoney:=0; - 初始化清零 State tmoney :=2; - 计算票价 num:=1; when 0100000 = tmoney :=4; - 计算票价 num:=2; when 0010000 = tmoney :=6; - 计算票价 num:=3; when 0001000 = tmoney :=8; - 计算票价 num:=4; when 0000100 = tmoney :=10; - 计算票价 num:=5; when 0000010 = tmoney :=12; - 计算票价 num:=6; when 0000001 = tmoney :=14; - 计算票价 num:=7; when others =null; end case; numl0) then next_state := inputcoin; - 选票结束,进入投币状态 else next_state := selticket; - 未选票,停留在选票状态 end if ; end if; when inputcoin = - 进行投币 State=010; if (money10=1) then pmoney:=pmoney+10; -计算已付的款 end if; if (money5=1) then pmoney:=pmoney+5; end if; if (money1=1) then pmoney:=pmoney+1; end if; if pmoney10 then -把已付的款转换成七段数码管显示的高低位 pmoneyh = 0; pmoneyl =pmoney; elsif pmoney20 then pmoneyh = 1; pmoneyl =pmoney-10; else pmoneyh = 2; pmoneyl =pmoney-20; end if; if (pmoneytmoney)then - 比较投币总额与车票总额 MoneyInputAlarm =1; -缺钱警告 next_state :=inputcoin; - 投币不足,继续进入投币状态 else MoneyInputAlarm - 余额找出 State0)then Tout=1; rmoney :=pmoney-tmoney; else Tout=0; end if ; rmoneyl - 其他任何情况,均回到选站状态 next_state := selticket; end case ; end if; end process main; show: process(clk_tmp) BEGIN IF clk_tmpEVENT AND clk_tmp= 1 THEN -实现模6计数器 if CNT6 = 5 thenCNT6 = 0;elseCNT6 BT = 011111 ; tmplight BT = 101111 ; tmplight BT = 110111 ; tmplight BT = 111011 ; tmplight BT = 111101 ; tmplight BT = 111110 ; tmplight NULL ; END CASE ; -用6个数码管轮流输出 case tmplight is WHEN 0 = LED LED LED LED LEDLEDLEDLED LED LED= 1111011;end case; end if; end process show;end behave;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;entity div_2K isport(clk_in:in std_logic; clk_out:out std_logic);end div_2K; architecture a of div_2K issignal temp:integer range 0 to 1999;begin p1:process(clk_in)begin if clk_inevent and clk_in=1 then if temp=999 then clk_out=1; temp=temp+1; elsif temp=1999 then temp=0; clk_out=0; else temp=temp+1; clk_out=0; end if;end if;end process p1;end a;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;entity div_50M isport(clk_in_50M:in std_logic; clk_out_50M:out std_logic);end div_50M; architecture b of div_50M issignal temp:integer range 0 to 49999999;begin p1:process(clk_in_50M)begin if clk_in_50Mevent and clk_in_50M=1 then if temp=24999999 then clk_out_50M=1; temp=temp+1; elsif temp=49999999 then temp=0; clk_out_50M=0; else temp=temp+1; clk_out_50M=0; end if;end if;end process p1;end b;5、 功能说明 本自动售票机系统共分3个状态:选票状态,付款状态,出票找零状态。在选票状态,用7个拨码开关分别表示17张票,选中后自动进入付款状态;用3个按键分别控制投币10元、5元、1元,且控制按键进程的时钟为25M分频,即每按键0.5s投入一张纸币。当投币数小于应付票款数时,警报灯亮,当投币数大于应付票款数时自动进入出票找零状态,灯亮显示出票,系统自动计算找零数。当复位键按下时系统回到选票状态。与此同时,六个七段数码管分别显示票数、付款数、找零数。6、 元器件清单硬件:MAX II EPM1270T144C5软件:Quartus II 9.07、 故障及问题分析1.本实验处理的最关键问题是如何使6个七段数码管在同一扫频周期里显示不同状态里的变量值。经仔细研究七段数码管扫描静态显示实验发现,可以把所有需要显示的信号用一个中间变量tmplignt表示,并对扫描显示的进程“show”中的每个扫频脉冲分别把6个需要显示的变量赋予tmplight。2.起初处理按键时由于main进程和show进程用同一个时钟,造成当时钟频率过高是按键无法一次一次输入;而当时钟频率过低时又不能是数码管扫描显示达到视觉残留的效果。故最终分频两次,一个25M分频用以处理按键,一个2000分频用以扫描显示。3.选票功能本来要用三个拨码开关2进制实现,然而后来发现想实现拨码开关“110”的状态及有两个及以上高电平的功能由于拨码的延时根本无法实现。最终选择用7个拨码开关实现选7张票。8、 总结和结论有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点,结构模式相对简单,容易构成性能良好的同步时序逻辑模块,且VHDL表述丰富多样。在高速运算和控制方面,更有其巨大的优势。就可靠性而言,状态机的优势也是十分明显的。本次实验让我体会到VHDL走出了实验室,真正用在了生活中。这帮助我在以后的编程、设计过程中会变得更加人性化,想问题更周到。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!