北邮数电实验下 简易自动售货机 实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013~2014第一学期数字电路与逻辑设计

实验报告

一.设计课题及任务要求

1.设计课题:简易自动售货机

2.任务要求:

设计一个简易的自动售货机,能够完成钱数处理、找零、显示、退币等功能。

基本要求:

·用2 个数码管(disp5,disp4)显示钱数,以元为单位。用3 个按键(btn0,btn1,btn2)分别表示一元、五元、十元,每按一次按键,增加一次相应的钱数,上限99元。

·再用3 个按键(btn3,btn4,btn5)分别对应3 种商品,其中,商品甲售价3 元、商品乙售价8 元、商品丙售价12 元;

·买东西时,先输入钱币,再按对应的商品键。每按一次商品键,钱数要相应地减少, 同时蜂鸣器提示购买成功。剩余钱数大于3 元可继续按商品键再次购买;当剩余钱数少于3 元时,表示钱数的数码管

disp5,disp4 显示为零, 同时用数码管disp0 显示退出的钱数。

·买东西时,按下商品键,若输入的钱数少于商品的价格,表示钱数的数码管disp5, disp4 显示为零,同时用数码管(disp1、disp0)显示退出的钱数,并用蜂鸣器表示购买失败。

·按下商品键时,用数码管disp2 表示当前购买的商品,1 代表商品甲,2 代表商品乙,3 代表商品丙。


·用btn7 做为退出功能键,退出键可以随时按下,按下后,数码管(disp5,disp4)显示为零,同时数码管(disp1、disp0)显示退出的钱数,表示结束购买,钱款全部退出。

提高要求:

·用点阵设计显示投币动画、出货动画,购买成功/失败动画;

·允许随时输入钱币,购买时,钱款不足有声光报警并等待追加钱币或选择别的商品;

二.系统设计

1.设计思路

根据程序实现的功能,可将其分为分频、防抖、逻辑运算、数码管显示、点阵图形显示五大模块。将其串联起来即可完成整体功能。

其中,分频模块将芯片50M的时钟信号分为各模块所需的不同频率的时钟。防抖模块用增加按键延时以避免长按按键执行多次指令的情况,逻辑运算模块对余额进行加减计算实现要求中加钱、买东西等功能。数码管显示模块把运算模块的结果通过数码管进行显示。在购买失败时,使能点阵图形显示模块及蜂鸣器,令点阵显示“X”来提示错误,同时蜂鸣器响。

2.程序框图

3.分块设计

以下五个模块通过敏感信号串联,实现完整功能。

·分频模块:

分频器的原理是对输入的时钟信号脉冲进行计数,(占空比为50%时),在计数达到模值一半时,输出信号翻转,从而完成输出频率比输入信号低的脉冲,即分频。在本实验中,防抖模块需要用到200Hz

时钟,数码管需要50KHz时钟,点阵需要2.5MHz时钟。通过设置时

钟翻转时temp的值来改变分频比N。[N=2*(temp+1)]

·防抖模块:

在程序执行过程中会持续扫描按键输入,当按键持续按下时则会进行多次信号输入,但实际情况只按下按键一次。为避免此问题,需要使按键信号输入到之后程序前通过防抖模块,即用一个模20计数器

计数时钟周期,在一个周期内只输出一个有效电平。

·逻辑运算模块:

此模块是算法的核心模块。以200Hz时钟和七个按键作为输入,设置变量sum和money0、money1(余额的各位和十位)。当检测到

btn0~btn2之一按下时,根据对应按键判断sum,若大于等于99、95、90,则余额显示99,若小于该数,sum加上1、5、10元(99元封顶)。同理,btn3~btn5之一按下时,判断sum,若大于等于3,扣除相应

钱数,若小于3,退出钱数sum赋值给disp0。同时,购买商品种类1、2、3赋值给disp2。当btn7按下时,disp1和disp0显示sum,

同时disp2、disp4和disp5清零。其中,数码管的赋值用sum做除

法及取余后得到的money1和money0实现。

·数码管显示模块:

首先使用分频系数为1000的分频器产生50KHz的时钟。用模5计

数器产生5个计数状态,决定数码管接通的电路和二极管点亮的数字,在时钟频率很高时可以同时显示5个数字。将逻辑运算模块中赋值过的disp0、disp1、disp2、disp4和disp5赋值给DOUT7,数码管选

通信号赋值给CatL。

·点阵图形显示模块:

首先使用分频系数为20的分频器产生2.5MHz的时钟。r为模8计数器,产生8个计数状态,决定点阵选通的行和该行中点亮的点(行低电平选通,列高电平选通)。当扫描频率达到一定大小时,8x8点阵会同时点亮。

三.仿真波形及波形分析

由于整个程序功能较复杂,故进行分块仿真。

1.分频模块仿真

由于50M时钟频率太高,在仿真时对输入时钟频率和分频系数做了修改。(f=500KHz,分频系数N=10)。仿真图如下,实现了分频。

2.防抖模块仿真

在仿真时,需将end time设置长一些,才能看到防抖的结果。仿真图如下,延时为100ms。持续按下btn1,仅输出一个有效脉冲。

3.逻辑运算模块仿真

可以看到当按下不同按键,sum的值会相应按键功能进行加减。例如,按下btn0时,sum为1,再次按下btn0,sum累加为2。

4.数码管显示模块仿真

输出为0、1、2、4、5。扫描频率高时,五个数码管循环一起显示数字。

5.点阵图形显示模块仿真

点阵模块仿真类似数码管仿真情况。扫描频率高时,八行点阵循环一起显示。

四.源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

useieee.std_logic_unsigned.all;

ENTITY sIS

PORT(bn0,bn1,bn2,bn3,bn4,bn5,bn7:IN STD_LOGIC; --按键输入信号

clk,reset:IN STD_LOGIC; --50M时钟输入信号

DOUT7: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --数码管七段选通信号

CatL: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --数码管选通信号

col,row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵行列选通信号

beep:out STD_LOGIC --蜂鸣器输出信号

);

END s;

ARCHITECTURE behave OF s IS

SIGNAL disp0,disp1,disp2,disp4,disp5:STD_LOGIC_VECTOR(6 DOWNTO 0); --数码管选通信号SIGNAL btn0,btn1,btn2,btn3,btn4,btn5,btn7,enable:STD_LOGIC:='0'; --通过防抖模块后各按键SIGNAL clk_50k,clk_200,clk_2500k:STD_LOGIC; --50MHz、200Hz、2.5MHz时钟信号SIGNAL Q:STD_LOGIC_VECTOR(3 downto 0); --数码管显示模块模5计数器

SIGNAL temp1:INTEGER RANGE 0 TO 499; --时钟计数器

SIGNAL temp2:INTEGER RANGE 0 TO 9; --时钟计数器SIGNAL temp:INTEGER RANGE 0 TO 124999; --时钟计数器signal r:STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵中间变量

SIGNAL count_BTN0:INTEGER RANGE 0 TO 20; --防抖计数器

SIGNAL count_BTN1:INTEGER RANGE 0 TO 20; --防抖计数器

SIGNAL count_BTN2:INTEGER RANGE 0 TO 20; --防抖计数器

SIGNAL count_BTN3:INTEGER RANGE 0 TO 20; --防抖计数器

SIGNAL count_BTN4:INTEGER RANGE 0 TO 20; --防抖计数器

SIGNAL count_BTN5:INTEGER RANGE 0 TO 20; --防抖计数器SIGNAL count_BTN7:INTEGER RANGE 0 TO 20; --防抖计数器

BEGIN

p1:PROCESS(clk,reset) --200Hz分频

BEGIN

IF reset='0' THEN

temp<=0;

ELSIF clk'event AND clk='1' THEN

IF temp=124999 THEN --分频系数(124999+1)*2=250000

temp<=0;clk_200<=NOT clk_200;

ELSE

temp<=temp+1;

END IF;

相关文档
最新文档