数电综合实验Word下载.docx
《数电综合实验Word下载.docx》由会员分享,可在线阅读,更多相关《数电综合实验Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
![数电综合实验Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/23/088965a6-8877-465a-957d-9ab8187b1eda/088965a6-8877-465a-957d-9ab8187b1eda1.gif)
最后,在基本功能完成之后,我开始考虑提高要求部分的功能,由于第一项要求较难,所以我首先依次利用多个LED灯实现了功能显示、状态显示、时间提示、结束提示等功能。
最后,在认真思考之后完成了最后一个功能:
进度条功能的添加。
总体框图:
是是
否
是
分块设计(基本功能):
时间设定部分:
在此部分,若开始键及复位键未按下,则不断检测各输入按键是否按下,之后根据检测结果控制各位数字的变化,并将该数字送显。
倒计时控制及数码管显示部分:
在此部分,若开始键按下,则时间需减1/秒,且需不断检测复位键是否按下以及倒计时是否结束。
火力控制部分:
在此部分,若未开始,则需不断检测火力控制键是否按下并送显。
三、仿真波形及波形分析
上面的就是时间设定以及显示的波形。
从上图中可以看出随着time1、time2、time3、time4的上升沿,f各位的数值在不断变化,而sell则岁clk的上升沿3~0依次显‘0’,说明各位在依次点亮,而f与数码管显示数字是相对应的。
所以相关输入检测代码以及数码管显示代码是正确的。
上面的就是火力设定以及送显的波形。
从上图中可以看出s对应的是各行依次扫描送‘0’,而q对应的则是各行图案,且当输入改变时,所显示图案改变。
所以相关输入检测代码以及点阵显示代码是正确的。
四、源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--实体定义
ENTITYs31s1IS
PORT(
clk:
INSTD_LOGIC;
--pin18输入时钟信号
huoliin:
--火力调整按钮输入
time1in,time2in,time3in,time4in:
INSTD_LOGIC;
--时间设定四位调整按钮输入
startin,resetin:
--开始、复位按钮输入
gongnengin:
--功能键对应输入
sell:
OUTSTD_LOGIC_VECTOR(5downto0);
--数码管显示扫描选择输出
f:
OUTSTD_LOGIC_VECTOR(6downto0);
--数码管显示控制输出
r:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--点阵显示列控制(列red)
g:
--点阵显示列控制(列grenn)
fengming:
OUTSTD_LOGIC;
--蜂鸣器对应输出
weiboout:
OUTSTD_LOGIC:
='
1'
;
--微波加热功能对应输出(LED)
shaokaoout:
0'
--烧烤加热功能对应输出(LED)
zuihou:
--提示加热进入最后一分钟输出(LED)
shijianjieshu:
--加热结束,LED闪烁提示(与蜂鸣器一致)
daiji:
--说明当前处于待机状态,可以调整工作状态的LED输出
jiare:
--说明当前处于加热状态的LED输出
LED1:
LED2:
s:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
--点阵显示行扫描输出
ENDs31s1;
--ARCHITECTURE定义
ARCHITECTUREaOFs31s1IS
TYPEall_stateIS(S0,S1,S2);
SIGNALstate:
all_state:
=S2;
--火力状态信号
SIGNALsaomiaolie:
integerrange0to7;
--点阵显示扫描选择控制信号
SIGNALtimenow1:
integerrange0to5:
=5;
--数码管第一位(分十位)(倒计时逻辑部分使用)
SIGNALtimenow2:
integerrange0to9:
=9;
--数码管第二位(分个位)
SIGNALtimenow3:
--数码管第三位(秒十位)
SIGNALtimenow4:
--数码管第四位(秒个位)
SIGNALtimenow11:
--数码管第一位(分十位)(时间设定部分使用)
SIGNALtimenow21:
SIGNALtimenow31:
SIGNALtimenow41:
SIGNALtimewei:
integerrange0to3;
SIGNALCOUNT:
integerrange0to24999;
--产生clock过程中用到的信号
SIGNALCOUNT1:
integerrange0to100;
--产生延迟过程中用到的信号
SIGNALCOUNT2:
integerrange0to360000:
=0;
--产生clock1过程中用到的信号
SIGNALtimezong:
SIGNALtimepast1:
SIGNALtimepast2:
SIGNALtimepast:
SIGNALq:
STD_LOGIC_VECTOR(7DOWNTO0);
--点阵显示列控制信号
SIGNALclock:
STD_LOGIC;
--1Hz时钟信号
SIGNALclock1:
--100Hz时钟信号
SIGNALkaishi:
STD_LOGIC:
--表示已经开始,进入加热状态
SIGNALjieshu:
--表示倒计时结束
SIGNALsheding:
--表示reset键被按下,进入设定状态
SIGNALfengmingjishu:
--使用蜂鸣器的时候使用的计数
SIGNALfengming1:
--表示蜂鸣器使能,当前蜂鸣器处于使用状态
SIGNALweibo:
--控制功能输出时使用
SIGNALshaokao:
SIGNALLED1s:
SIGNALLED2s:
SIGNALresetmp11,resetmp21,time1:
--防抖部分使用
SIGNALresetmp12,resetmp22,time2:
SIGNALresetmp13,resetmp23,time3:
SIGNALresetmp14,resetmp24,time4:
SIGNALresetmp15,resetmp25,huoli:
SIGNALresetmp16,resetmp26,start:
SIGNALresetmp17,resetmp27,reset:
SIGNALresetmp18,resetmp28,gongneng:
BEGIN
--倒计时部分代码--
PROCESS(clk,COUNT)--由输入时钟进行分频产生1HZ时钟clock、100HZ时钟clock1
BEGIN
IF(clk'
EVENTANDclk='
)THEN
COUNT<
=COUNT+1;
COUNT2<
=COUNT2+1;
IF(COUNT=24999)THEN
clock<
=NOTclock;
ENDIF;
IFCOUNT2=249THEN
clock1<
=NOTclock1;
ENDIF;
ENDPROCESS;
PROCESS(clk,kaishi,timenow1,timenow2,timenow3,timenow4)--倒计时逻辑控制部分
CASEkaishiIS
WHEN'
=>
IF(clock'
EVENTANDclock='
IFtimenow4=0THEN
IFtimenow3=0THEN
IFtimenow2=0THEN
IFtimenow1=0THEN
jieshu<
--即若时间各位均变为0的时候,此时对应的状态是倒计时结束
ELSEtimenow1<
=timenow1-1;
--一下各种情况对应各种借位
timenow2<
timenow3<
timenow4<
ELSEtimenow2<
=timenow2-1;
ELSEtimenow3<
=timenow3-1;
ELSEtimenow4<
=timenow4-1;
timenow1<
=timenow11;
=timenow21;
=timenow31;
=timenow41;
ENDCASE;
IFCOUNT1=100THEN
PROCESS(clk,timewei)--数码管扫描一次部分
CASEtimeweiIS
WHEN3=>
sell<
="
111110"
CASEtimenow4IS--即第四位送显
WHEN0=>
f<
0111111"
--sell<
--3F
WHEN1=>
0000110"
--06
WHEN2=>
1011011"
--5B
1001111"
--4F
WHEN4=>
1100110"
--66
WHEN5=>
1101101"
--6D
WHEN6=>
1111101"
--7D
WHEN7=>
0000111"
--07
WHEN8=>
1111111"
--7F
WHEN9=>
1101111"
--6F
ENDCASE;
111101"
CASEtimenow3IS
111011"
CASEtimenow2IS
WHEN9=>
110111"
CASEtimenow1IS
ENDPROCESS;
PROCESS(clk,timewei)--改变控制数码管扫描的信号timewei
IF(clk'
eventandclk='
IF(timewei=3)THEN
timewei<
else
=timewei+1;
--设定时间部分代码--
--数码管显示部分在倒计时部分的PROCESS部分已有代码是重复利用的所以不需重新写
PROCESS(time1,start)--第一位时间设定
IFstart='
THEN
IF(time1'
eventandtime1='
IF(timenow11=5)THEN
timenow11<
ELSE
=timenow11+1;
IF(sheding='
ORjieshu='
PROCESS(time2,start)
IFstart='
IF(time2'
eventandtime2='
IF(timenow21=9)THEN
timenow21<
=timenow21+1;
PROCESS(time3,start)
IF(time3'
eventandtime3='
IF(timenow31=5)THEN
timenow31<
=timenow31+1;
PROCESS(time4,start)
IF(time4'
eventandtime4='
IF(timenow41=9)THEN
timenow41<
=timenow41+1;
--火力控制部分代码--
PROCESS(clk,saomiaolie)--改变控制点阵扫描的信号saomiaolie
IFsaomiaolie=7THEN
saomiaolie<
ELSEsaomiaolie<
=saomiaolie+1;
PROCESS(clk,state,saomiaolie)--点阵扫描一次部分
CASEstateIS
WHENS0=>
CASEsaomiaolieIS
WHEN0=>
扫描第一行
s<
01111111"
--0
q<
00111100"
WHEN1=>
10111111"
--1
01111110"
WHEN2=>
11011111"
--2
11111111"
WHEN3=>
11101111"
--3
00011000"
WHEN4=>
11110111"
--4
WHEN5=>
11111011"
--5
00000000"
WHEN6=>
11111101"
--6
WHEN7=>
11111110"
--7
WHENS1=>
00100100"
WHENS2=>