




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字电路与逻辑设计实验报告一、实验任务要求设计制作一个简易地铁自动售票系统。基本要求:a) 地铁票价统一为每张两元,只能投入币值为五元的人民币进行购票。b) 能够开机自检,检验显示器件正常。c) 通过按键开关BTN输入购票张数和投入的人民币张数并恰当显示相应信息。d) 设置适当的声音提示或显示提示表示取票和找零。e) 一次购票成功后系统能够恰当地转入下一次购票等待状态。f) 系统能够复位。提高要求:将投币种类增加为1元、5元和10元三种。二、 系统设计2、 设计思路a) 购买车票时,乘客按“开始购票”按钮开始购票;接着,选择车票的种类,即单价,分2元、4元、6元;选择购票数量,一次购票数限制在3张以内,选择1张、2张、3张;然后,进入投币阶段,投入钱币,投入的钱币设计为1元、5元、10元币种;当投入的钱币达到所需金额时,系统进入出票以及找零状态,售票机自动出票,并自动找出余额;然后,再次点击“开始购票”进行另一次购票。b) 选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。选择出站口的过程中,若按“取消”按钮,则售票机直接进入到找零状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,即进入找零状态,。c) 客人一次只能选择一个车票种类。3种票类型用3位二进制向量编码表示,即001表示选择2元车票,010表示选择2元车票,100选择2元车票。实验之前设计的是3种票类型用2位二进制码表示,因为考虑到仿真及下载到实验板模拟的方便,遂将之改为3位,使之每一个类型用一个按键控制。d) 票机的进币口可识别三种纸币,仿照c)中模式,拟用长度为3的二进制表示。乘客可以连续多次投入钱币,并且可以以任意顺序投入。纸币最多可以投入27元。e) 用5位二进制数表示5个状态,分别是状态程序标示代表状态00001Selstyle等待选择票种状态00010Selticket等待选择购票数量状态00100Inputmoney等待放入钱币状态01000Ticketout出票状态10000Givechagne找零状态3、 系统总体框图图1图2图3图4图5图64、 分模块设计经过分析, 本地铁自动售票系统的设计需要实现以下几项主要功能:票种选择, 票数选择, 投币处理, 出票及余额找零.本系统可以采用模块化设计和有限状态机的设计方案来实现。 采用模块化设计方法即从整个系统的功能出发, 将系统的整体逐步分解为若干个子系统和模块,然后用VHDL语言对各个模块进行编程,最后形成顶层文件,在Quartus环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。采用模块化设计的优点在于:对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。便于由多个设计者同时进行设计从而加速整个项目的开发进度;每个子模块都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。 有限状态机(Finite State Machine,简称FSM)是指输出向量不仅依赖于当前输入向量,也依赖于过去输入向量序列的电路.一个有限状态机电路由寄存器逻辑(时序逻辑)和组合逻辑组成. 有限状态机是数字逻辑电路以及数字系统的重要组成部分,尤其应用于数字系统核心部件的设计,以实现高效率高可靠性的逻辑控制。一般有限状态机的VHDL组成 :说明部分:主要是设计者使用TYPE语句定义新的数据类型,如: TYPE states IS (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=185+10=15),判断CastmoneyTotalmoney,系统依旧停留在第三个状态state=00100,MoneyInputAlarm=1代表钱币不足,6个数码管显示631500,等待放入钱币;f). 第三次投入钱币图12第三次投入钱币,Money=“010“代表投入5元,钱币足够(6*3=18Totalmoney,MoneyInputAlarm=0代表钱币已足,系统进入第四个状态, state=01000,Ticketout,出票状态;g). 系统自动出票系统自动出票,Tout=1显示在3个周期代表出票3张,系统进入第五个状态, state=10000,Givechagne,找零状态。h). 系统自动找零系统自动找零,Mout0=1持续两个周期代表检测restmoney1,依次找出2张1元的纸币,找零结束,6个数码管显示632032,State=”10000”代表状态停留在找零阶段。i).再次购买图13之后, Rebuy=1,代表再次购票,进入第一个状态state=00001,系统数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;j). 取消操作图14在c),d),e)之后,如果想取消交易,cancelkey=1,系统进入找零状态,如,在d)之后取消,自动找零,Mout1=1代表检测到restmoney5,找出一张5元的纸币,找零结束,6个数码管显示630505;k). 整个购票过程结束。四、 源程序1.主程序SubwayAutoTicketSellSystem.vhd-File Name : SubwayAutoTicketSellSystem.vhd-Description : Achieve the function of auto ticket selling-Limition : None-System : Vhdl9.0-Soft : Quartus2-9.0-Author : ChenDawen-Revision : Version 1.0 ,2012-10-31-libraryieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitySubwayAutoTicketSellSystem isport(Restart:instd_logic; - 系统复位信号Rebuy:instd_logic; -开始购票操作Clk:instd_logic; - 系统时钟 Cancelkey: in std_logic; - 取消操作键 Style: in std_logic_vector(2 downto 0); - 车票种类Tnum:instd_logic_vector(2 downto 0); - 所购票数 Money: in std_logic_vector(2 downto 0); -投币口MoneyInputAlarm:outstd_logic; - 投币不足报警信号Tout:outstd_logic; - 出票Mout:outstd_logic_vector(1downto 0); - 余额找出State:outstd_logic_vector(4 downto 0);- 系统状态指示- beep:outstd_logic; -蜂鸣器信号SG:outstd_logic_vector(6 downto 0); -段码BT:outstd_logic_vector(5 downto 0) -位码 ); end SubwayAutoTicketSellSystem;architecture behave of SubwayAutoTicketSellSystem iscomponent div_2K -引入div_2k分频模块port(clk_in: in std_logic;clk_out: out std_logic);end component;component div_500K -引入div_500k分频模块port(clk_in2: in std_logic; clk_out2: out std_logic);end component; component keyin -引入keyin防抖模块port(clk_in1:in std_logic;reset:instd_logic;resetn:outstd_logic);end component;type TT is (selstyle,selticket,inputmoney,ticketout,givechange) ; - 定义系统转换状态 (等待选择票种状态, 等待选择购票数量状态, 等待放入钱币状态, 出票状态, 找零状态)signal clk_tmp:std_logic;-临时时钟signal clk_tmp2:std_logic;-临时时钟2signalCNT6:INTEGER RANGE 0 TO 5;signalA:INTEGER RANGE 0 TO 5;signal Tstyle:std_logic_vector(6 downto 0);-车票单价显示signal Tnumber:std_logic_vector(6 downto 0); -车票数量显示signal Minput1:std_logic_vector(6 downto 0); -投入金额十位显示signal Minput2:std_logic_vector(6 downto 0); -投入金额个位显示signal Minput:std_logic_vector(4 downto 0); -投入金额计数signal Toutnum0:std_logic_vector(6 downto 0); -出票数量显示signal Toutnum:std_logic_vector(1 downto 0); -出票数量计数signal Changeout0:std_logic_vector(6 downto 0); -输出零钱数显示signal Changeout:std_logic_vector(3 downto 0); -输出零钱数量计数signal Moneyn:std_logic_vector(2 downto 0); -防抖之后实际投币输入beginu1:div_2k port map(clk_in=CLK,clk_out=clk_tmp); -各种映射u2:div_500k port map(clk_in2=CLK,clk_out2=clk_tmp2); u4:keyin port map(clk_in1=CLK_tmp2,reset=money(0),resetn=moneyn(0);u5:keyin port map(clk_in1=clk_tmp2,reset=money(1),resetn=moneyn(1);u6:keyin port map(clk_in1=clk_tmp2,reset=money(2),resetn=moneyn(2);-以下为数码管显示程序模块-process(CNT6)begincase CNT6 is -3线至6线译码器 when 0 = BT = 011111 ; A BT = 101111 ; A BT = 110111 ; A BT = 111011 ; A BT = 111101 ; A BT = 111110 ; A NULL ;end case ;end process;process(clk_tmp)beginif clk_tmpevent and clk_tmp= 1 then -实现模6计数器 if CNT6 = 5 then CNT6 = 0;else CNT6 SG SG SG SG SG SG NULL ;end case ;end process; process(Minput) -投入金额数码管显示begincaseMinput iswhen 11011 = Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =1101101;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =1111110;Minput2 Minput1 =0110000;Minput2 Minput1 =0110000;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 Minput1 =1111110;Minput2 null ;end case;end process; process(Changeout) -找零金额数码管显示begincaseChangeout iswhen 1001 = Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 Changeout0 null ;end case;end process;process(Toutnum) -出票数量数码管显示begincaseToutnum iswhen 11 = Toutnum0 Toutnum0 Toutnum0 Toutnum0 null ;end case;end process;-以上为数码管显示程序模块-process(clk_tmp,restart) -下载时候所用时钟频率 -process(clk,restart) -仿真时候所用时钟频率variablenext_state: TT; variable Tm: integer range 0 to 6; - 车票单价 variable totalmoney,castmoney,restmoney: integer range 0 to 27; - 车票总额,投币总额,找零总额variable num : integer range 0 to 3; - 所购票数 variable empty:std_logic; - 找零结束标志beginif (clk_tmp event and clk_tmp=1) then -下载时候所用时钟频率- if (clk_tmp event and clk_tmp=1) then-仿真时候所用时钟频率 State=00001; -系统等待状态if Restart=1 then-以下为系统复位初始化- Tout=0;Mout=00;MoneyInputAlarm=0;totalmoney:=0;castmoney:=0; restmoney:=0;Tstyle=1111110; -数码管显示0Tnumber=1111110; -数码管显示0Minput=00000; -数码管显示0Toutnum=00; -数码管显示0Changeout - 选择出票种 case style is - 共3种车票类型when 000 = Tm:=0;Tstyle Tm:=2;Tstyle Tm:=4;Tstyle Tm:=6; Tstylenull;end case;if Tm/=0 then next_state := selticket; - 选票种结束,进入选票数状态elsenext_state := selstyle; - 未选票种,停留在选票种状态end if ; when selticket = - 选择票数State -001代表选择1张车票totalmoney := totalmoney+ 1*Tm; - 计算票价num:=1;Tnumber -010代表选择2张车票totalmoney := totalmoney+ 2*Tm;num:=2;Tnumber -100代表选择3张车票totalmoney := totalmoney+ 3*Tm;num:=3; - 最多购3张票Tnumbernull;end case;iftotalmoney /=0 then next_state := inputmoney; - 选票结束,进入投币状态elsenext_state := selticket; - 未选票,停留在选票状态end if ;end if; when inputmoney = - 进行投币State=00100; -等待放入钱币状态if Moneyn(0)=1 then -下载时所用投币按键1元- if Money(0)=1 then -仿真时所用投币按键1元castmoney := castmoney+1; -投币钱数计数增加1Minput=minput+00001; -投币数码管显示增加1elsifMoneyn(1)=1 then -下载时所用投币按键5元- elsif Money(1)=1 then -仿真时所用投币按键5元castmoney := castmoney+5; -投币钱数计数增加5Minput=minput+00101; -投币数码管显示增加5elsifMoneyn(2)=1 then -下载时所用投币按键10元- elsif Money(2)=1 then -仿真时所用投币按键10元castmoney := castmoney+10;-投币钱数计数增加10Minput=minput+01010; -投币数码管显示增加10 - 连续投币,并进行累加end if; if (Cancelkey=1) then - 投币期间取消操作,直接进入找零状态退还所投钱币MoneyInputAlarm=0;restmoney:=castmoney;next_state:=givechange;elseif (castmoneytotalmoney)then - 比较投币总额与车票总额MoneyInputAlarm=1; -投币不足警报亮next_state :=inputmoney; - 投币不足,继续进入投币状态elseMoneyInputAlarm - 出票 Statenull; when 1 = Tout =1; - 每个时钟周期出一张票num :=num-1; -出票数减1Toutnumnum :=num-1; -出票数减1 Tout =1;Toutnumnum := num-1; -出票数减1 Tout =1; Toutnum=toutnum+01;-数码管显示出票数加1end case; if (num=0)then restmoney :=castmoney-totalmoney;next_state :=givechange; - 出票结束,余额找出elsenext_state :=ticketout; - 继续出票end if ;- beep=1;-蜂鸣器工作- beep - 余额找出,按从大到小原则退钱(10元,5元,1元) State=10000; -等待找零状态 Tout=5)then - 5元restmoney:=restmoney-5;-找零减5Mout=10; -找零数码管显示加5Changeout=1)then - 1元restmoney:=restmoney-1;-找零减1Mout=01; -找零数码管显示加1Changeout=changeout+0001 after 3000ms;elseMout=00; empty:=1; - 余额找出结束标志end if ; if empty=1 then - 找零结束,回到选站状态-next_state :=selstyle;-totalmoney:=0;-castmoney:=0;-elsenext_state := givechange; - 继续找零end if ;- beep=1;-蜂鸣器工作- beep - 其他任何情况,均回到选站状态-next_state := selstyle; if rebuy=1 then -再次购票 next_state := selstyle; State=00001; -各种清零Tstyle=1111110; Tout=0;Mout=00;totalmoney:=0;castmoney:=0; restmoney:=0;Tnumber=1111110;Minput=00000;Toutnum=00;Changeout=0000 ;elsenext_state := givechange;end if;end case ;end if;end if;end process; end behave;2.2k分频模块div_2k.vhd-File Name : div_2k.vhd-Description : Help to achieve the function of auto ticket selling-Limition : None-System : Vhdl_9.0-Soft : Quartus2_9.0-Author : ChenDawen-Revision : Version 1.0 ,2012-10-31LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;useieee.std_logic_unsigned.all;entity div_2k isport(clk_in:instd_logic;clk_out:outstd_logic);end div_2k;architecture a of div_2k issignaltemp:integer range 0 to 1999;beginp1:process(clk_in)beginifclk_inevent and clk_in=1 thenif temp=1999 thentemp=0;else temp=temp+1;end if;end if;end process p1;p2:process(temp)beginif temp=1999 thenclk_out=1;elseclk_out=0;end if;end process p2;end a;3.500k分频模块div_500k.vhd-File Name : div_500k.vhd-Description : Help to achieve the function of auto ticket selling-Limition : None-System : Vhdl_9.0-Soft : Quartus2_9.0-Author : ChenDawen-Revision : Version 1.0 ,2012-10-31LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;useieee.std_logic_unsigned.all;entity div_500k is -防抖信号分频为100Hzport(clk_in2:in std_logic; clk_out2:outstd_logic);end div_500k;architecture c of div_500k issignaltemp:integer range 0 to 4999999;beginp1:process(clk_in2)beginif clk_in2event and clk_in2=1 thenif temp=4999999 thentemp=0;else temp=temp+1;end if;end if;end process p1;p2:process(temp)b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 看房租赁协议书
- 小吃经营安全协议书
- 市场服务推广协议书
- 工厂电工免责协议书
- 社保代签协议书
- 实体开店合伙协议书
- 工程防水施工协议书
- 液氨购买协议书
- 白芷买卖协议书
- 工程中介担保协议书
- 新编应用文写作全套教学课件
- 四川省凉山州2022-2023学年七年级下学期期末历史试题
- JBT 1306-2024 电动单梁起重机(正式版)
- QBT 2262-1996 皮革工业术语
- 《工程建设标准强制性条文电力工程部分2023年版》
- 心理干预各论家庭治疗
- 《输变电工程无人机倾斜摄影测量技术规程》
- 医疗废物的分类及管理
- 2024氢气长管拖车安全使用技术规范
- 《大学生创业基础系列课程》课件-第14-4课-创业营销理论-1学时
- 垃圾中转站安全培训
评论
0/150
提交评论