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

上传人:b****3 文档编号:3388117 上传时间:2022-11-22 格式:DOCX 页数:44 大小:3.22MB
下载 相关 举报
数字电路与逻辑设计实验报告.docx_第1页
第1页 / 共44页
数字电路与逻辑设计实验报告.docx_第2页
第2页 / 共44页
数字电路与逻辑设计实验报告.docx_第3页
第3页 / 共44页
数字电路与逻辑设计实验报告.docx_第4页
第4页 / 共44页
数字电路与逻辑设计实验报告.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

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

《数字电路与逻辑设计实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设计实验报告.docx(44页珍藏版)》请在冰豆网上搜索。

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

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

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

 

一、实验任务要求

设计制作一个简易地铁自动售票系统。

基本要求:

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个状态,分别是

状态

程序标示

代表状态

00001

Selstyle

等待选择票种状态

00010

Selticket

等待选择购票数量状态

00100

Inputmoney

等待放入钱币状态

01000

Ticketout

出票状态

10000

Givechagne

找零状态

3、系统总体框图

图1

图2

图3

图4

图5

图6

4、分模块设计

经过分析,本地铁自动售票系统的设计需要实现以下几项主要功能:

票种选择,票数选择,投币处理,出票及余额找零.

本系统可以采用模块化设计和有限状态机的设计方案来实现。

采用模块化设计方法即从整个系统的功能出发,将系统的整体逐步分解为若干个子系统和模块,然后用VHDL语言对各个模块进行编程,最后形成顶层文件,在QuartusⅡ环境下进行编译与仿真,检查所编程序是否运行正确。

如果出现错误,需要进行修改,直到完全通过为止。

采用模块化设计的优点在于:

对设计的描述从上到下逐步由粗略到详细,符合常规的逻辑思维习惯。

便于由多个设计者同时进行设计从而加速整个项目的开发进度;每个子模块都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。

有限状态机(FiniteStateMachine,简称FSM)是指输出向量不仅依赖于当前输入向量,也依赖于过去输入向量序列的电路.一个有限状态机电路由寄存器逻辑(时序逻辑)和组合逻辑组成.有限状态机是数字逻辑电路以及数字系统的重要组成部分,尤其应用于数字系统核心部件的设计,以实现高效率高可靠性的逻辑控制。

一般有限状态机的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类似。

就运行速度而言,状态机状态变换周期只有一个时钟周期,而且,由于在每一状态中,状态机可以完成许多并行的运算和控制操作,所以,一个完整的控制程序,即使由多个并行的状态机构成,其状态数也是十分有限的。

因此有理由认为,由状态机构成的硬件系统比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=18>5+10=15),判断Castmoney

 

f).第三次投入钱币

图12

第三次投入钱币,Money=“010“代表投入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,依次找出2张1元的纸币,找零结束,6个数码管显示632032,State=”10000”代表状态停留在找零阶段。

i).再次购买

图13

之后,Rebuy=‘1‘,代表再次购票,进入第一个状态state=00001,系统数据清零,Selstyle,等待选择票种状态,6个数码管显示000000;

 

j).取消操作

图14

 

在c),d),e)之后,如果想取消交易,cancelkey=’1’,系统进入找零状态,如,在d)之后取消,自动找零,Mout[1]=‘1‘代表检测到restmoney>5,找出一张5元的纸币,找零结束,6个数码管显示630505;

k).整个购票过程结束。

 

四、源程序

1.主程序SubwayAutoTicketSellSystem.vhd

---------------------------------------------

--FileName:

SubwayAutoTicketSellSystem.vhd

--Description:

Achievethefunctionofautoticketselling

--Limition:

None

--System:

Vhdl9.0

--Soft:

Quartus2-9.0

--Author:

ChenDawen

--Revision:

Version1.0,2012-10-31

--------------------------------------------

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitySubwayAutoTicketSellSystemis

port(

Restart:

instd_logic;--系统复位信号

Rebuy:

instd_logic;--开始购票操作

Clk:

instd_logic;--系统时钟

Cancelkey:

instd_logic;--取消操作键

Style:

instd_logic_vector(2downto0);--车票种类

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;

architecturebehaveofSubwayAutoTicketSellSystemis

componentdiv_2K--引入div_2k分频模块

port(clk_in:

instd_logic;

clk_out:

outstd_logic);

endcomponent;

componentdiv_500K--引入div_500k分频模块

port(clk_in2:

instd_logic;

clk_out2:

outstd_logic);

endcomponent;

componentkeyin--引入keyin防抖模块

port(clk_in1:

instd_logic;

reset:

instd_logic;

resetn:

outstd_logic);

endcomponent;

typeTTis(selstyle,selticket,inputmoney,ticketout,givechange);

--定义系统转换状态(等待选择票种状态,等待选择购票数量状态,等待放入钱币状态,出票状态,找零状态)

signalclk_tmp:

std_logic;--临时时钟

signalclk_tmp2:

std_logic;--临时时钟2

signalCNT6:

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);--防抖之后实际投币输入

begin

u1:

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));

--------------------以下为数码管显示程序模块-----------

process(CNT6)

begin

caseCNT6is--3线至6线译码器

when0=>BT<="011111";A<=0;--A为位码

when1=>BT<="101111";A<=1;

when2=>BT<="110111";A<=2;

when3=>BT<="111011";A<=3;

when4=>BT<="111101";A<=4;

when5=>BT<="111110";A<=5;

whenothers=>NULL;

endcase;

endprocess;

process(clk_tmp)

begin

ifclk_tmp'eventandclk_tmp='1'then--实现模6计数器

ifCNT6=5then

CNT6<=0;

else

CNT6<=CNT6+1;

endif;

endif;

endprocess;

process(A)

begin

caseAis--实现数码管的显示功能

when0=>SG<=Tstyle;

when1=>SG<=Tnumber;

when2=>SG<=Minput1;

when3=>SG<=Minput2;

when4=>SG<=Toutnum0;

when5=>SG<=Changeout0;

whenothers=>NULL;

endcase;

endprocess;

process(Minput)--投入金额数码管显示

begin

caseMinputis

when"11011"=>Minput1<="1101101";Minput2<="1110000";--27

when"11010"=>Minput1<="1101101";Minput2<="1011111";--26

when"11001"=>Minput1<="1101101";Minput2<="1011011";--25

when"11000"=>Minput1<="1101101";Minput2<="0110011";--24

when"10111"=>Minput1<="1101101";Minput2<="1111001";--23

when"10110"=>Minput1<="1101101";Minput2<="1101101";--22

when"10101"=>Minput1<="1101101";Minput2<="0110000";--21

when"10100"=>Minput1<="1101101";Minput2<="1111110";--20

when"10011"=>Minput1<="0110000";Minput2<="1111011";--19

when"10010"=>Minput1<="0110000";Minput2<="1111111";--18

when"10001"=>Minput1<="0110000";Minput2<="1110000";--17

when"10000"=>Minput1<="0110000";Minput2<="1011111";--16

when"01111"=>Minput1<="0110000";Minput2<="1011011";--15

when"01110"=>Minput1<="0110000";Minput2<="0110011";--14

when"01101"=>Minput1<="0110000";Minput2<="1111001";--13

when"01100"=>Minput1<="1111110";Minput2<="1101101";--12

when"01011"=>Minput1<="0110000";Minput2<="0110000";--11

when"01010"=>Minput1<="0110000";Minput2<="1111110";--10

when"01001"=>Minput1<="1111110";Minput2<="1111011";--09

when"01000"=>Minput1<="1111110";Minput2<="1111111";--08

when"00111"=>Minput1<="1111110";Minput2<="1110000";--07

when"00110"=>Minput1<="1111110";Minput2<="1011111";--06

when"00101"=>Minput1<="1111110";Minput2<="1011011";--05

when"00100"=>Minput1<="1111110";Minput2<="0110011";--04

when"00011"=>Minput1<="1111110";Minput2<="1111001";--03

when"00010"=>Minput1<="1111110";Minput2<="1101101";--02

when"00001"=>Minput1<="1111110";Minput2<="0110000";--01

when"00000"=>Minput1<="1111110";Minput2<="1111110";--00

whenothers=>null;

endcase;

endprocess;

process(Changeout)--找零金额数码管显示

begin

caseChangeoutis

when"1001"=>

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 韩语学习

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

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