ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:3.22MB ,
资源ID:3388117      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3388117.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字电路与逻辑设计实验报告.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数字电路与逻辑设计实验报告.docx

1、数字电路与逻辑设计实验报告数字电路与逻辑设计实验报告一、实验任务要求设计制作一个简易地铁自动售票系统。基本要求:a) 地铁票价统一为每张两元,只能投入币值为五元的人民币进行购票。b) 能够开机自检,检验显示器件正常。c) 通过按键开关BTN输入购票张数和投入的人民币张数并恰当显示相应信息。d) 设置适当的声音提示或显示提示表示取票和找零。e) 一次购票成功后系统能够恰当地转入下一次购票等待状态。f) 系统能够复位。提高要求:将投币种类增加为1元、5元和10元三种。二、 系统设计2、 设计思路a) 购买车票时,乘客按“开始购票”按钮开始购票;接着,选择车票的种类,即单价,分2元、4元、6元;选择

2、购票数量,一次购票数限制在3张以内,选择1张、2张、3张;然后,进入投币阶段,投入钱币,投入的钱币设计为1元、5元、10元币种;当投入的钱币达到所需金额时,系统进入出票以及找零状态,售票机自动出票,并自动找出余额;然后,再次点击“开始购票”进行另一次购票。b) 选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。选择出站口的过程中,若按“取消”按钮,则售票机直接进入到找零状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,即进入找零状态,。c) 客人一次只能选择一个车票种类。3种票类型用3位二进制向量编码表示,即001表示选择2元车票,010表示选择2元车票,100

3、选择2元车票。实验之前设计的是3种票类型用2位二进制码表示,因为考虑到仿真及下载到实验板模拟的方便,遂将之改为3位,使之每一个类型用一个按键控制。d) 票机的进币口可识别三种纸币,仿照c)中模式,拟用长度为3的二进制表示。乘客可以连续多次投入钱币,并且可以以任意顺序投入。纸币最多可以投入27元。e) 用5位二进制数表示5个状态,分别是状态程序标示代表状态00001Selstyle等待选择票种状态00010Selticket等待选择购票数量状态00100Inputmoney等待放入钱币状态01000Ticketout出票状态10000Givechagne找零状态3、 系统总体框图图1图2图3图4

4、图5图64、 分模块设计经过分析, 本地铁自动售票系统的设计需要实现以下几项主要功能:票种选择, 票数选择, 投币处理, 出票及余额找零.本系统可以采用模块化设计和有限状态机的设计方案来实现。 采用模块化设计方法即从整个系统的功能出发, 将系统的整体逐步分解为若干个子系统和模块,然后用VHDL语言对各个模块进行编程,最后形成顶层文件,在Quartus环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。采用模块化设计的优点在于:对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。便于由多个设计者同时进行设计从而加速整个项目的开发进度;每个子模块

5、都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。 有限状态机(Finite State Machine,简称FSM)是指输出向量不仅依赖于当前输入向量,也依赖于过去输入向量序列的电路.一个有限状态机电路由寄存器逻辑(时序逻辑)和组合逻辑组成. 有限状态机是数字逻辑电路以及数字系统的重要组成部分,尤其应用于数字系统核心部件的设计,以实现高效率高可靠性的逻辑控制。一般有限状态机的VHDL组成 :说明部分:主要是设计者使用TYPE语句定义新的数据类型,如: TYPE states IS (st0,

6、st1, st2, st3, st4, st5); SIGNALpresent_state, next_state: states;主控时序逻辑部分:任务是负责状态机运转和在外部时钟驱动下实现内部状态转换的进程。时序进程的实质是一组触发器,因此,该进程中往往也包括一些清零或置位的输入控制信号,如Reset信号。主控组合逻辑部分:任务是根据状态机外部输入的状态控制信号(包括来自外部的和状态机内部的非进程的信号)和当前的状态值current_state来确定下一状态next_state的取值内容,以及对外部或对内部其他进程输出控制信号的内容。辅助逻辑部分:辅助逻辑部分主要是用于配合状态机的主控组合

7、逻辑和主控时序逻辑进行工作,以完善和提高系统的性能。无论与基于VHDL的其它设计方案相比,还是与可完成相似功能的CPU相比,状态机都有其难以逾越的优越性,它主要表现在以下几方面:由于状态机的结构模式相对简单,设计方案相对固定,特别是可以定义符号化枚举类型的状态,这一切都为VHDL综合器尽可能发挥其强大的优化功能提供了有利条件。而且,性能良好的综合器都具备许多可控或不可控的专门用于优化状态机的功能。状态机容易构成性能良好的同步时序逻辑模块,这对于对付大规模逻辑电路设计中令人深感棘手的竞争冒险现象无疑是一个上佳的选择,加之综合器对状态机的特有的优化功能,使的状态机解决方案的优越性更为突出。状态机的

8、VHDL设计程序层次分明,结构清晰,易读易懂,易排错和修改。在高速运算和控制方面,状态机更有其巨大的优势。由于在VHDL中,一个状态机可以由多个进程构成,一个结构体中可以包含多个状态机,而一个单独的状态机(或多个并行运行的状态机)以顺序方式的所能完成的运算和控制方面的工作与一个CPU类似。就运行速度而言,状态机状态变换周期只有一个时钟周期,而且,由于在每一状态中,状态机可以完成许多并行的运算和控制操作,所以,一个完整的控制程序,即使由多个并行的状态机构成,其状态数也是十分有限的。因此有理由认为,由状态机构成的硬件系统比CPU所能完成同样功能的软件系统的工作速度要高出两个数量级。就可靠性而言,状

9、态机的优势也是十分明显的。首先是由于状态机的设计中能使用各种无懈可击的容错技术;其次是当状态机进入非法状态并从中跳出所耗的时间十分短暂,通常只有2个时钟周期,约数十个ns,尚不足以对系统的运行构成损害.应用VHDL 设计状态机的具体步骤如下:(1)根据系统要求确定状态数量、状态转移的条件和各状态输出信号的赋值,并画出状态转移图;(2)按照状态转移图编写状态机的VHDL 设计程序;(3)利用EDA 工具对状态机的功能进行仿真验证。 经过综合比较,决定采用状态机来实现本系统的设计,这样不仅思路很清楚而且可读性也非常强. 利用状态机实现售票功能。 需要首先把整个系统的所有状态都给罗列出来,然后实现每

10、个状态的内容,最后再利用一些变量将各个状态连接起来,实现整个系统的基本功能.Kinin模块是用来防抖的,由于按键动作的时刻和按下的时间长短是随机的。并且存在由开关簧片反弹导致的电平抖动,抖动的时间一般小于20mS,因此必须为每个按键开关设置一个消抖和同步电路,此电路可有多种形式。按一次键,只产生一个脉冲,脉冲宽度为防抖动时钟的脉宽。在投币的时候,由于要多次投币,多次按键,使之在按键的时候,每按一次,程序只会执行一次。防抖动时钟的频率为100HZ左右,接下来得为其设置一个分频系数为500k的分频。div_500k是系数为500k的分频,为的是把实验板50mHz的频率分为100Hz,使防抖电路正常

11、工作。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张,系统进

12、入第三个状态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,Money

13、InputAlarm=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元的纸币,找零结

14、束,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.v

15、hd-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; entitySubwayAuto

16、TicketSellSystem 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;

17、- 投币不足报警信号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 SubwayAutoTicke

18、tSellSystem is component 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:out

19、std_logic); end component;type TT is (selstyle,selticket,inputmoney,ticketout,givechange) ; - 定义系统转换状态 (等待选择票种状态, 等待选择购票数量状态, 等待放入钱币状态, 出票状态, 找零状态) signal clk_tmp:std_logic; -临时时钟 signal clk_tmp2:std_logic; -临时时钟2 signal CNT6:INTEGER RANGE 0 TO 5;signal A:INTEGER RANGE 0 TO 5;signal Tstyle:std_logic

20、_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

21、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=

22、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 = 01111

23、1 ; 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) -投入金额数码管显示 begin

24、 caseMinput 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;Minput

25、2 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) -找零金额数码管显示 begin caseChangeout is when 1001 =

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

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