北邮数电实验下 简易自动售货机 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;