北邮VHDL实验地铁_第1页
北邮VHDL实验地铁_第2页
北邮VHDL实验地铁_第3页
北邮VHDL实验地铁_第4页
北邮VHDL实验地铁_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于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) 。在选票完成后,

2、 系统输出报警信号 (moneyinputalarm=1), 提醒乘客进行投币。之后系统对于乘客投入的纸币进行识别,识别范围是1元,5元,10元(money10,money5,money1),乘客可以连续多次投入钱币,系统自动进行累加。当投入的钱币未达到所需金额时,报警信号仍然继续维持(moneyinputalarm=1),提醒钱不够,需要继续投入钱币。当投入的钱币达到所需金额时,报警信号取消(moneyinputalarm=0),售票机自动出票(tout=1) 。如果投入的钱币有余, 系统自动计算余额 (rmoney) 。本次交易结束,系统自动进入选站状态等待下一次的交易。在投币期间,如果乘

3、客按复位键(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元 mone

4、y5: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:

5、 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; - 票数显示高位

6、 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

7、(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

8、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

9、; 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

10、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 =pmon

11、ey; 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 ; r

12、moneyl - 其他任何情况,均回到选站状态 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 ;

13、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_o

14、ut: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

15、;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 t

16、hen 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投入一张纸币。当投币

17、数小于应付票款数时,警报灯亮,当投币数大于应付票款数时自动进入出票找零状态,灯亮显示出票,系统自动计算找零数。当复位键按下时系统回到选票状态。与此同时,六个七段数码管分别显示票数、付款数、找零数。6、 元器件清单硬件:max ii epm1270t144c5软件:quartus ii 9.07、 故障及问题分析1.本实验处理的最关键问题是如何使6个七段数码管在同一扫频周期里显示不同状态里的变量值。经仔细研究七段数码管扫描静态显示实验发现,可以把所有需要显示的信号用一个中间变量tmplignt表示,并对扫描显示的进程“show”中的每个扫频脉冲分别把6个需要显示的变量赋予tmplight。2.起初处理按键时由于main进程和show进程用同一个时钟,造成当时钟频率过高是按键无法一次一次输入;而当时钟频率过低时又不能是数码管扫描显示达到视觉残留的效果。故最终分频两次,一个25m分频用以处理按键,一个2000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论