北邮数电综合实验 加油机的设计.docx
《北邮数电综合实验 加油机的设计.docx》由会员分享,可在线阅读,更多相关《北邮数电综合实验 加油机的设计.docx(45页珍藏版)》请在冰豆网上搜索。
![北邮数电综合实验 加油机的设计.docx](https://file1.bdocx.com/fileroot1/2022-10/12/b8ce1268-a227-41ae-b530-a11295701159/b8ce1268-a227-41ae-b530-a112957011591.gif)
北邮数电综合实验加油机的设计
数字电路与逻辑设计实验
学院:
班级:
学号:
姓名:
时间:
一.任务要求
设计并实现一个简易加油机控制系统,能够完成定值加油、加油至油箱满等功能,并显示所加油量和钱数。
基本要求:
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