下载此文档

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


文档分类:高等教育 | 页数:约26页 举报非法文档有奖
1/26
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/26 下载此文档
文档列表 文档介绍
该【数字电路与逻辑设计实验报告 】是由【青山代下】上传分享,文档一共【26】页,该文档可以免费在线阅读,需要了解更多关于【数字电路与逻辑设计实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..一、实验任务要求设计制作一个简易地铁自动售票系统。基本要求: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的二进制表示。乘客可以1/26:..,并且可以以任意顺序投入。纸币最多可以投入27元。e)用5位二进制数表示5个状态,分别是状态程序标示代表状态00001Selstyle等待选择票种状态00010Selticket等待选择购票数量状态00100Inputmoney等待放入钱币状态01000Ticketout出票状态10000Givechagne找零状态3、系统总体框图图1图2图3图4图5图64、分模块设计经过分析,本地铁自动售票系统的设计需要实现以下几项主要功能:票种选择,票数选择,投币处理,。采用模块化设计方法即从整个系统的功能出发,将系统的整体逐步分解为若干个子系统和模块,然后用VHDL语言对各个模块进行编程,最后形成顶层文件,在QuartusⅡ环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。采用模块化设计的优点在于:对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维****惯。便于由多个设计者同时进行设计从而加速整个项目的开发进度;每个子模块都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。有限状态机〔FiniteStateMachine,简称FSM是指输出向量不仅依赖于当前输入向量,<时序逻辑>,尤其应用于数字系统核心部件的设计,以实现高效率高可靠性的逻辑控制。2/26:..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类似。就运行速度而言,状态机状态变换周期只有一个时钟周期,而且,由于在每一状态中,状态机可以完成许多并行的运算和控制操作,所以,一个完整的控制程序,即使由多个并行的状态机构成,3/26:..因此有理由认为,由状态机构成的硬件系统比CPU所能完成同样功能的软件系统的工作速度要高出两个数量级。就可靠性而言,状态机的优势也是十分明显的。首先是由于状态机的设计中能使用各种无懈可击的容错技术;其次是当状态机进入非法状态并从中跳出所耗的时间十分短暂,通常只有2个时钟周期,约数十个ns,:〔1根据系统要求确定状态数量、状态转移的条件和各状态输出信号的赋值,并画出状态转移图;〔2按照状态转移图编写状态机的VHDL设计程序;〔3利用EDA工具对状态机的功能进行仿真验证。经过综合比较,决定采用状态机来实现本系统的设计,。需要首先把整个系统的所有状态都给罗列出来,然后实现每个状态的容,最后再利用一些变量将各个状态连接起来,,由于按键动作的时刻和按下的时间长短是随机的。并且存在由开关簧片反弹导致的电平抖动,抖动的时间一般小于20mS,因此必须为每个按键开关设置一个消抖和同步电路,此电路可有多种形式。按一次键,只产生一个脉冲,脉冲宽度为防抖动时钟的脉宽。在投币的时候,由于要多次投币,多次按键,使之在按键的时候,每按一次,程序只会执行一次。防抖动时钟的频率为100HZ左右,接下来得为其设置一个分频系数为500k的分频。div_500k是系数为500k的分频,为的是把实验板50mHz的频率分为100Hz,使防抖电路正常工作。div_2k是系数为2k的分频,为的是把实验板50mHz的频率分为25000Hz,每个数码管工作频率到2000Hz左右。三、仿真波形及波形分析a>.系统复位图7系统复位,Restart='1';系统进入第一个状态state=00001,系统所有数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;b>.选择车票种类图84/26:..代表买单价为6元的车票,系统进入第二个状态state=00010,Selticket,等待选择购票数量状态,6个数码管显示600000;c>.选择车票数量图9选择车票数量代表购票3,系统进入第三个状态state=00100,Inputmoney,等待放入钱币状态,MoneyInputAlarm=‘1‘代表钱币不足,6个数码管显示630000;d>.投入钱币图10投入钱币代表投入5元,钱币不足,系统依旧停留在第三个状态state=00100,MoneyInputAlarm=‘1‘代表钱币不足,6个数码管显示630500,等待放入钱币;e>.第二次投入钱币图11第二次投入钱币代表投入10元,但钱币依旧不足〔6*3=18>5+10=15,判断Castmoney<Totalmoney,系统依旧停留在第三个状态state=00100,MoneyInputAlarm=’1’代表钱币不足,6个数码管显示631500,等待放入钱币;f>.第三次投入钱币图12第三次投入钱币代表投入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,依次找出21元的纸币,找零结束,6个数码管显示代表状态停留在找零阶段。i>.再次购买图135/26:..,Rebuy=‘1‘,代表再次购票,进入第一个状态state=00001,系统数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;j>.取消操作图14在c,d,e之后,如果想取消交易,cancelkey=’1’,系统进入找零状态,如,在d之后取消,自动找零,Mout[1]=‘1‘代表检测到restmoney>5,找出一5元的纸币,找零结束,6个数码管显示630505;k>.整个购票过程结束。四、-----------------------------------------------FileName:--Description:Achievethefunctionofautoticketselling--Limition:None--System:--Soft:Quartus2---Author:ChenDawen--Revision:,2012-10-31--------------------------------------------libraryieee;;;entitySubwayAutoTicketSellSystemisport<Restart:instd_logic;--系统复位信号Rebuy:instd_logic;--开始购票操作Clk:instd_logic;--系统时钟Cancelkey:instd_logic;--取消操作键6/26:..车票种类Tnum:instd_logic_vector<2downto0>;--所购票数Money:instd_logic_vector<2downto0>;--投币口MoneyInputAlarm:outstd_logic;--投币不足报警信号Tout:outstd_logic;--出票Mout:outstd_logic_vector<1downto0>;--余额找出State:outstd_logic_vector<4downto0>;--系统状态指示--beep:outstd_logic;--蜂鸣器信号SG:outstd_logic_vector<6downto0>;--段码BT:outstd_logic_vector<5downto0>--位码>;endSubwayAutoTicketSellSystem;architecturebehaveofSubwayAutoTicketSellSystemiscomponentdiv_2K--引入div_2k分频模块port<clk_in:instd_logic;clk_out:outstd_logic>;ponent;componentdiv_500K--引入div_500k分频模块port<clk_in2:instd_logic;clk_out2:outstd_logic>;ponent;componentkeyin--引入keyin防抖模块port<clk_in1:instd_logic;reset:instd_logic;resetn:outstd_logic>;ponent;typeTTis<selstyle,selticket,inputmoney,ticketout,givechange>;--定义系统转换状态<等待选择票种状态,等待选择购票数量状态,等待放入钱币状态,出票状态,找零状态>signalclk_tmp:std_logic;--临时时钟7/26:..signalclk_tmp2:std_logic;--临时时钟2T6:INTEGERRANGE0TO5;signalA:INTEGERRANGE0TO5;signalTstyle:std_logic_vector<6downto0>;--车票单价显示signalTnumber:std_logic_vector<6downto0>;--车票数量显示signalMinput1:std_logic_vector<6downto0>;--投入金额十位显示signalMinput2:std_logic_vector<6downto0>;--投入金额个位显示signalMinput:std_logic_vector<4downto0>;--投入金额计数signalToutnum0:std_logic_vector<6downto0>;--出票数量显示signalToutnum:std_logic_vector<1downto0>;--出票数量计数signalChangeout0:std_logic_vector<6downto0>;--输出零钱数显示signalChangeout:std_logic_vector<3downto0>;--输出零钱数量计数signalMoneyn:std_logic_vector<2downto0>;--防抖之后实际投币输入beginu1: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:keyinportmap<clk_in1=>clk_tmp2,reset=>money<1>,resetn=>moneyn<1>>;u6:keyinportmap<clk_in1=>clk_tmp2,reset=>money<2>,resetn=>moneyn<2>>;--------------------以下为数码管显示程序模块-----------T6>beginT6is--3线至6线译码器--A为位码8/26:..endcase;endprocess;process<clk_tmp>beginifclk_tmp'eventandclk_tmp='1'then--实现模6计数器T6=5thenCNT6<=0;elseCNT6<=CNT6+1;endif;endif;endprocess;process<A>begincaseAis--实现数码管的显示功能when0=>SG<=Tstyle;when1=>SG<=Tnumber;when2=>SG<=Minput1;when3=>SG<=Minput2;when4=>SG<=Toutnum0;when5=>SG<=Changeout0;whenothers=>NULL;endcase;endprocess;process<Minput>--投入金额数码管显示begincaseMinputis9/26:..whenothers=>null;10/26:..endcase;endprocess;process<Changeout>--找零金额数码管显示begincaseChangeoutiswhenothers=>null;endcase;endprocess;process<Toutnum>--出票数量数码管显示begincaseToutnumiswhenothers=>null;endcase;endprocess;11/26:..以上为数码管显示程序模块----------process<clk_tmp,restart>--下载时候所用时钟频率--process<clk,restart>--仿真时候所用时钟频率variablenext_state:TT;variableTm:integerrange0to6;--车票单价variabletotalmoney,castmoney,restmoney:integerrange0to27;--车票总额,投币总额,找零总额variablenum:integerrange0to3;--所购票数variableempty:std_logic;--找零结束标志beginif<clk_tmp'eventandclk_tmp='1'>then--下载时候所用时钟频率--if<clk_tmp'eventandclk_tmp='1'>then--仿真时候所用时钟频率系统等待状态ifRestart='1'then-------------以下为系统复位初始化--------------Tout<='0';MoneyInputAlarm<='0';totalmoney:=0;castmoney:=0;restmoney:=0;数码管显示0数码管显示0数码管显示0数码管显示0数码管显示0-------------以上为系统复位初始化--------------next_state:=selstyle;--系统复位,回到初始选站状态else12/26:..whenselstyle=>--选择出票种casestyleis--共3种车票类型代表未选择代表选择单价2元车票代表选择单价2元车票代表选择单价2元车票whenothers=>null;endcase;ifTm/=0thennext_state:=selticket;--选票种结束,进入选票数状态elsenext_state:=selstyle;--未选票种,停留在选票种状态endif;whenselticket=>--选择票数等待选择购票数量状态if<Cancelkey='1'>thennext_state:=givechange;--选票期间取消操作,直接进入找零状态elsecaseTnumis代表选择1车票totalmoney:=totalmoney+1*Tm;--计算票价num:=1;数码管显示1代表选择2车票13/26:..totalmoney:=totalmoney+2*Tm;num:=2;数码管显示2代表选择3车票totalmoney:=totalmoney+3*Tm;num:=3;--最多购3票数码管显示3whenothers=>null;endcase;iftotalmoney/=0thennext_state:=inputmoney;--选票结束,进入投币状态elsenext_state:=selticket;--未选票,停留在选票状态endif;endif;wheninputmoney=>--进行投币等待放入钱币状态ifMoneyn<0>='1'then--下载时所用投币按键1元--ifMoney<0>='1'then--仿真时所用投币按键1元castmoney:=castmoney+1;--投币钱数计数增加1投币数码管显示增加1elsifMoneyn<1>='1'then--下载时所用投币按键5元--elsifMoney<1>='1'then--仿真时所用投币按键5元castmoney:=castmoney+5;--投币钱数计数增加5投币数码管显示增加5elsifMoneyn<2>='1'then--下载时所用投币按键10元--elsifMoney<2>='1'then--仿真时所用投币按键10元castmoney:=castmoney+10;--投币钱数计数增加10投币数码管显示增加1014/26:..连续投币,并进行累加endif;if<Cancelkey='1'>then--投币期间取消操作,直接进入找零状态退还所投钱币MoneyInputAlarm<='0';restmoney:=castmoney;next_state:=givechange;elseif<castmoney<totalmoney>then--比较投币总额与车票总额MoneyInputAlarm<='1';--投币不足警报亮next_state:=inputmoney;--投币不足,继续进入投币状态elseMoneyInputAlarm<='0';--投币不足警报灭next_state:=ticketout;--投币足够,进入出票状态endif;endif;whenticketout=>--出票等待出票状态casenumiswhen0=>null;when1=>Tout<='1';--每个时钟周期出一票num:=num-1;--出票数减1数码管显示出票数加1when2=>num:=num-1;--出票数减1Tout<='1';数码管显示出票数加1when3=>15/26:..num:=num-1;--出票数减1Tout<='1';数码管显示出票数加1endcase;if<num=0>thenrestmoney:=castmoney-totalmoney;next_state:=givechange;--出票结束,余额找出elsenext_state:=ticketout;--继续出票endif;--beep<='1';--蜂鸣器工作--beep<='0'after500ms;--延时500ms蜂鸣器停止工作whengivechange=>--余额找出,按从大到小原则退钱<10元,5元,1元>等待找零状态Tout<='0';empty:='0';if<restmoney>=5>then--5元restmoney:=restmoney-5;--找零减5找零数码管显示加5elsif<restmoney>=1>then--1元restmoney:=restmoney-1;--找零减1找零数码管显示加1elseempty:='1';--余额找出结束标志endif;ifempty='1'then--找零结束,回到选站状态16/26:..next_state:=selstyle;--totalmoney:=0;--castmoney:=0;--elsenext_state:=givechange;--继续找零endif;--beep<='1';--蜂鸣器工作--beep<='0'after500ms;--延时500ms蜂鸣器停止工作--whenothers=>--其他任何情况,均回到选站状态--next_state:=selstyle;ifrebuy='1'then--再次购票next_state:=selstyle;各种清零Tout<='0';totalmoney:=0;castmoney:=0;restmoney:=0;elsenext_state:=givechange;endif;endcase;endif;endif;17/26:..endbehave;-----------------------------------------------FileName:--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:--Soft:--Author:ChenDawen--Revision:,2012-10-31LIBRARYIEEE;;;entitydiv_2kisport<clk_in:instd_logic;clk_out:outstd_logic>;enddiv_2k;architectureaofdiv_2kissignaltemp:integerrange0to1999;beginp1:process<clk_in>beginifclk_in'eventandclk_in='1'theniftemp=1999thentemp<=0;elsetemp<=temp+1;endif;endif;18/26:..p2:process<temp>beginiftemp=1999thenclk_out<='1';elseclk_out<='0';endif;endprocessp2;enda;-----------------------------------------------FileName:--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:--Soft:--Author:ChenDawen--Revision:,2012-10-31LIBRARYIEEE;;;entitydiv_500kis--防抖信号分频为100Hzport<clk_in2:instd_logic;clk_out2:outstd_logic>;enddiv_500k;architecturecofdiv_500kissignaltemp:integerrange0to4999999;begin19/26:..beginifclk_in2'eventandclk_in2='1'theniftemp=4999999thentemp<=0;elsetemp<=temp+1;endif;endif;endprocessp1;p2:process<temp>beginiftemp=4999999thenclk_out2<='1';elseclk_out2<='0';endif;endprocessp2;endc;-----------------------------------------------FileName:--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:--S

数字电路与逻辑设计实验报告 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数26
  • 收藏数0 收藏
  • 顶次数0
  • 上传人青山代下
  • 文件大小2.19 MB
  • 时间2024-04-13