北邮数电综合实验 加油机的设计.docx

上传人:b****1 文档编号:755760 上传时间:2022-10-12 格式:DOCX 页数:45 大小:619.89KB
下载 相关 举报
北邮数电综合实验 加油机的设计.docx_第1页
第1页 / 共45页
北邮数电综合实验 加油机的设计.docx_第2页
第2页 / 共45页
北邮数电综合实验 加油机的设计.docx_第3页
第3页 / 共45页
北邮数电综合实验 加油机的设计.docx_第4页
第4页 / 共45页
北邮数电综合实验 加油机的设计.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

北邮数电综合实验 加油机的设计.docx

《北邮数电综合实验 加油机的设计.docx》由会员分享,可在线阅读,更多相关《北邮数电综合实验 加油机的设计.docx(45页珍藏版)》请在冰豆网上搜索。

北邮数电综合实验 加油机的设计.docx

北邮数电综合实验加油机的设计

数字电路与逻辑设计实验

 

学院:

班级:

学号:

姓名:

时间:

 

一.任务要求

设计并实现一个简易加油机控制系统,能够完成定值加油、加油至油箱满等功能,并显示所加油量和钱数。

基本要求:

1、油价固定设为5元/升。

2、用2个按键(btn7、btn6)分别表示一百元、十元,用btn5做加油开始键,用btn0做系统复位键。

用3个数码管(disp2、disp1、disp0)显示钱数,以元为单位,上限990元;用数码管(disp5、disp4、disp3)显示加油量,精确到0.1升,最大显示99.9升。

3、定值加油时,先输入钱币,数码管同时显示钱数,按加油键,开始加油。

加油过程中,钱数及加油量的显示从零开始递增,直到钱数到达预定值。

并用发光二极管表示购买成功。

加油过程中,所有按键按下无效。

4、加油至油箱满:

在钱币数为零的状态下,按加油键,钱数及加油量的显示从零开始递增,直到油箱加满。

自行设计一个随机数发生器,控制加油量自动停止在30升至50升之间,精确到0.1升。

加油过程中,所有按键按下无效。

5、复位键(btn0)按下后,系统复位,此时数码管显示钱币数及加油量均为零。

提高要求:

1、用小键盘输入价格,用点阵显示加油机各种状态及动画。

2、设定不同的油品、油价。

3、油库管理功能。

4、自拟其它功能。

二.系统设计

设计思路

自动加油机的程序主要的难点在于计数器的实现与不同状态的控制,先让投币计数器器计数投入的钱数,并用数码管显示出来,当加油键按下时,数码管显示归零,并让左右三个数码管同时开始从零计数,由于是五元一升,即当油量加两个数时,价钱加一个数,当价钱等于投币计数器传过来的值时,停止计数,显示动画,提示加油成功。

总体框图

2k分频器

投币计数器

加油计数器

数码管显示器

10元

100元

Cp

clk

clk

clk

jiayou

money

点阵

音乐

chooseoil

对每个模块都有一个复位,所以省略。

分块说明

(1)输入部分:

输入部分有六个输入端,分别为时钟输入,10元按键,100元按键,加油键,复位键,以及附加功能中的选择油品的开关。

复位信号为高电平有效,当reset=‘1’时,所以都清为0。

(2)处理部分:

主要处理的部分为加油计数器部分,当有reset=‘1’信号后,投币计数器向加油计数器传入及时的钱数值,当有jiayou=‘1’信号后,加油计数器的输出钱数值归零,并开始计数,直到钱数等于预定钱数。

在加满油的功能上,设定一个用时钟控制的计数器,当加油键按下且输入的钱数等于零时,加油键按下的时机就从计数器中把值赋给钱数,然后开始加油,后面的类似。

(3)输出部分:

输出的部分不单单只有数码管的输出,还有点阵与音乐的输出,在数码管的输出中,我通过六个数来控制六个数码管的值并输出,而点阵则是通过复位与加油键的控制输出三种不同状态的动画(我姑且把它起名为欢迎加油,正在加油,谢谢加油三种状态),音乐在加油成功后播放音乐,为我国经典的小提琴曲《梁祝》,让人在愉悦的心情中付钱。

三.仿真波形

1.投币计数模块

10元投币计数,其中mpo3,mpo2,mpo1分别表示moneypayout的缩写,为钱输出的百位十位与个位。

100元投币的计数

从10元计数器可以看出,最多钱可记到990:

2.加油计数模块

首先,chooseoil=‘0’当加油键没有按时,money3out=mpi3,money2out=mpi2,money1out=mpi1,这个是把付钱给用户看,而oil3out,oil2out,oil1out为9,5,0,这个意思是95号油的显示,95号油的油价为5元一升,当加油键按下时,moneyout3,moneyout2,moneyout1,oilout3,oilout2,oilout1归零并开始计数。

当计数到规定钱数时,停止计数,给点阵与音乐控制一个不同的信号,让他们改变状态。

这里为了仿真方便起见,只选择输入10元时。

(mpi为moneypayin的缩写)

当chooseoil=‘1’时,加的即为97号油,97号油我设定是十元一升,此时,moneyout与oilout计数是同步的。

并且注意到开始加油键没有按下时,oil3out,oil2out为9,7.说明此时已经变成了97号油。

加油至邮箱满:

当moneypayin=0时,设定一个计数器,在加油过程中通过加油键的按下瞬间把值传给钱数,接着就是与上面一样的加油计数方式。

3.数码管显示模块

我用了六个数值同时控制六个数码管的显示。

具体我们可以看到不同的为显示我想让它显示的地方,不妨把oil3in,oil2in,oilin设为123,money3in,money2in,money1in设为246.

4.点阵显示模块

点阵在前面已经提到分为状态一:

欢迎加油;状态二:

正在加油;状态三:

谢谢加油三种状态。

状态一,在点阵上显示英文字母HELLO和一个^_^的笑脸的动画,为了让LL区分开,我把它做成闪烁的形式。

H

E

L

O

笑脸

当加油机正在加油时,此时en1传入1,en2传入0,在点阵上显示“加油”两个字的动画。

“加”字:

“油”字:

当en1=“0”且en2=“1”时,进入第三状态:

谢谢加油,此时,点阵显示动画的“THANKS”和一个笑脸,其中笑脸与欢迎加油一样,故略去。

T

H

A

N

K

S

音乐模块由于控制过于简单且仿真波形没有实质性意义,故略去。

四.VHDL源程序

1.2k分频器

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydiv2kis

port(clk_in:

instd_logic;

clk_out:

outstd_logic);

end;

architecturefenpinofdiv2kis

signalcnt:

integerrange0to999;--当记到999时反转

signalclk_tmp:

std_logic;

begin

process(clk_in)

begin

if(clk_in'eventandclk_in='1')then

ifcnt=999then

cnt<=0;clk_tmp<=notclk_tmp;

else

cnt<=cnt+1;

endif;

endif;

endprocess;

clk_out<=clk_tmp;

end;

2.投币计数器

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitypayis

port(

clk:

instd_logic;

reset:

instd_logic;

pay100,pay10:

instd_logic;

money:

outintegerrange0to990;

mpo3,mpo2,mpo1:

outstd_logic_vector(3downto0));

endpay;

architecturepaymoneyofpayis

signalmoneypay:

integerrange0to990;

signalmoney3,money2,money1:

std_logic_vector(3downto0);

begin

mpo3<=money3;

mpo2<=money2;

mpo1<=money1;

process(clk)

begin

if(clk'eventandclk='1')then

ifreset='1'then

moneypay<=0;money3<="0000";money2<="0000";money1<="0000";--复位

elsif(pay100='1'andpay10='0')then

if(moneypay<=890)then

moneypay<=moneypay+100;--投100元

money3<=money3+1;

endif;

elsif(pay100='0'andpay10='1')then

if(moneypay<=980)then

if(money2="1001")then

money3<=money3+1;money2<="0000";

moneypay<=moneypay+10;--投10元

elsemoney2<=money2+1;

moneypay<=moneypay+10;

endif;

endif;

else

moneypay<=moneypay;money3<=money3;money2<=money2;

endif;

elsemoneypay<=moneypay;

endif;

money<=moneypay;

endprocess;

endpaymoney;

3.加油计数器

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjiayoucountis

port(

reset:

instd_logic;

jiayou,clk:

instd_logic;

chooseoil:

instd_logic;

dianzhenout1:

outstd_logic;

dianzhenout2:

outstd_logic;

moneypayin:

inintegerrange0to990;

mpi3,mpi2,mpi1:

instd_logic_vector(3downto0);

money3out,money2out,money1out:

outstd_logic_vector(3downto0);

oil3out,oil2out,oil1out:

outstd_logic_vector(3downto0);

musiccontrol:

outstd_logic);

endjiayoucount;

architecturesimpleofjiayoucountis

signaldeng:

integerrange0to1999;

signalmoney3,money2,money1:

std_logic_vector(3downto0);

signaloil3,oil2,oil1:

std_logic_vector(3downto0);

signalcnt2:

integerrange0to1;

signalmpc:

integerrange0to990;

signalxiaobiao:

std_logic;

signalmoneyrd1,moneyrd2:

integerrange0to990;

signalcnt100:

integerrange150to250;

signalcnt200:

integerrange300to500;

begin

process(clk)

begi

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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