基于VHDL的空调控制器设计.docx
- 文档编号:8061579
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:37
- 大小:561.02KB
基于VHDL的空调控制器设计.docx
《基于VHDL的空调控制器设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的空调控制器设计.docx(37页珍藏版)》请在冰豆网上搜索。
基于VHDL的空调控制器设计
数字系统设计与硬件描述语言
期末考试作业
题目:
空调控制器的设计
学院:
电子信息工程学院
专业:
物联网工程
学号:
3014204328
XX:
X涵凯
2021-12-14
一、选题设计描述
1.功能介绍
设计内容为空调控制器,可实现空调的开关、模式切换、温度控制、风速控制、定时设置。
模式默认为制冷,可切换为制热、除湿。
温度默认为26度,可按“温度+〞、“温度-〞调节,每次调节1度,最高30度,最低16度。
风速默认为中挡,可按“风速+〞、“风速-〞切换为低挡、高挡、睡眠模式。
睡眠模式中,在低挡与停顿间循环。
定时设置默认关闭,开启时默认30分钟,可按“定时+〞、“定时-〞调节,每次调节30分钟,最高24小时,最低30分钟。
定时倒计时完毕时,关闭空调。
定时开启时,可按“取消定时〞关闭定时。
空调控制器模拟界面如下:
2.算法简介
1〕空调控制器
其输入与输出在主程序kt中已标明,在此不做介绍。
2〕单脉冲模块
这是非常重要以及核心的模块。
当a产生一个上升沿时,输出一个单脉冲,脉冲将持续到经过一个clk上升沿后的clk下降沿。
3〕开关模块
a连接空调的开关,b连接开关控制模块的输出,c为空调各工作模块的开关信号,d连接数码管显示开关状况。
当定时时间完毕,b输入一个单脉冲,空调关闭。
4〕开关控制模块
此模块的作用是保证开关模块能够正常工作。
开关翻开时,a输入一个单脉冲,重置c。
b连接定时模块,当定时完毕,b输入一个单脉冲,使c输出1,使开关模块输出0
5〕温度模块
a连接开关模块,b为温度+1,c为温度-1,输出为温度的十位和个位。
6〕风速模块
a连接开关模块,b为风速+1,c为风速-1。
di,zhong,gao为抵挡、中挡、高挡的状态〔无睡眠模式,因为睡眠模式是抵挡-停顿模式〕。
其他连接数码管,显示睡眠模式、抵挡、中挡、高挡的状态。
7〕模式模块
b连接开关模块,c为切换模式,输出类似于模式模块。
8〕定时模块
a连接开关模块,b为定时模块开启,c为取消定时,up、down为定时时间+、-。
clk1为空调时钟,clk2为模拟的倒计时时钟〔周期1分钟〕。
clk2周期远大于clk1。
当时间倒计时完毕时,sw1输出1,使开关控制模块控制开关关闭。
其他输出连接倒计时模块。
9〕倒计时模块
a连接开关模块,clk连接定时模块的clk2,输入时间发生变化时,重新倒计时。
倒计时完毕时,finish输出1,使定时模块的sw1输出1。
10〕数码管模块
a连接开关模块,此为7段译码器。
11〕计数器模块
此为六位计数器。
a连接睡眠模式开关,rst为睡眠模式翻开时的重置信号,每6次输出一次1。
二、程序源代码及说明
1〕空调控制器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYktIS
PORT(switchin,modeset,fanup,fandown,tempup,tempdown,timerop,timercancel,timerup,timerdown,clk1,clk2:
INSTD_LOGIC;
--电源开关、模式切换、风速+、风速-、温度+、温度-、定时、取消定时、定时+、定时-、时钟信号、倒计时时钟信号
cools,heats,drys,dis,zhongs,gaos:
OUTSTD_LOGIC;--通向空调内部的制冷、制热、除湿、抵挡、中挡、高挡状态输出
switchstate,tempd,temps,coolstate,heatstate,drystate,distate,zhongstate,gaostate,sleepstate,hdstate,hsstate,tdstate,tsstate:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
--由数码管显示的开关、温度、制冷、制热、除湿、抵挡、中挡、高挡、睡眠状态和倒计时剩余时间
ENDENTITYkt;
ARCHITECTUREbehaveOFktIS
PONENTswitch--开关模块
PORT(a,b,clk:
INSTD_LOGIC;--b受定时模块的控制,时间减为0时,关闭开关
c:
OUTSTD_LOGIC;
d:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输送给数码管
ENDPONENTswitch;
PONENTcontrol--开关控制模块
PORT(a,b,clk:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDPONENTcontrol;
PONENTfan--风速模块
PORT(a,b,c,clk:
INSTD_LOGIC;
di,zhong,gao:
OUTSTD_LOGIC;--由于high和low是敏感词汇,所以此处用拼音,可以看到此处没有睡眠模式,是因为睡眠模式其实是抵挡-停顿模式
ssleep,sdi,szhong,sgao:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--不同于发给空调内部的信号,睡眠模式的状态应显示在外
ENDPONENTfan;
PONENTBCD7--数码管模块
PORT(a:
INSTD_LOGIC;
b:
INSTD_LOGIC_VECTOR(3DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(0TO6));
ENDPONENTBCD7;
PONENTpulse--单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDPONENTpulse;
PONENTtemp--温度模块
PORT(a,b,c,clk:
INSTD_LOGIC;--a控制开关,b提高1度,c降低1度
temp1,temp2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDPONENTtemp;
PONENTtimer--定时模块
PORT(a,b,c,up,down,clk1,clk2:
INSTD_LOGIC;
sw1:
OUTSTD_LOGIC;--总开关关闭信号
oh1,oh2,ot1,ot2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输送给数码管显示剩余时间
ENDPONENTtimer;
PONENTmode
PORT(b,c,clk:
INSTD_LOGIC;
cool,heat,dry:
OUTSTD_LOGIC;
cool1,heat1,dry1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDPONENTmode;
SIGNALswa,swb,swc:
STD_LOGIC;
SIGNALsigBCD7_1,sigBCD7_2,sigBCD7_3,sigBCD7_4,sigBCD7_5,
sigBCD7_6,sigBCD7_7,sigBCD7_8,sigBCD7_9,sigBCD7_10,
sigBCD7_11,sigBCD7_12,sigBCD7_13,sigBCD7_14:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
U1:
switchPORTMAP(a=>switchin,b=>swb,c=>swa,clk=>clk1,d=>sigBCD7_1);
U2:
controlPORTMAP(a=>switchin,b=>swc,clk=>clk1,c=>swb);
U3:
fanPORTMAP(a=>swa,b=>fanup,c=>fandown,clk=>clk1,di=>dis,zhong=>zhongs,gao=>gaos,ssleep=>sigBCD7_2,sdi=>sigBCD7_3,szhong=>sigBCD7_4,sgao=>sigBCD7_5);
U4:
tempPORTMAP(a=>swa,b=>tempup,c=>tempdown,clk=>clk1,temp1=>sigBCD7_6,temp2=>sigBCD7_7);
U5:
timerPORTMAP(a=>swa,clk1=>clk1,clk2=>clk2,b=>timerop,c=>timercancel,up=>timerup,down=>timerdown,sw1=>swc,oh1=>sigBCD7_8,oh2=>sigBCD7_9,ot1=>sigBCD7_10,ot2=>sigBCD7_11);
U6:
modePORTMAP(b=>swa,c=>modeset,clk=>clk1,cool=>cools,heat=>heats,dry=>drys,cool1=>sigBCD7_12,heat1=>sigBCD7_13,dry1=>sigBCD7_14);
U7:
BCD7PORTMAP(a=>swa,b=>sigBCD7_1,q=>switchstate);
U8:
BCD7PORTMAP(a=>swa,b=>sigBCD7_2,q=>sleepstate);
U9:
BCD7PORTMAP(a=>swa,b=>sigBCD7_3,q=>distate);
U10:
BCD7PORTMAP(a=>swa,b=>sigBCD7_4,q=>zhongstate);
U11:
BCD7PORTMAP(a=>swa,b=>sigBCD7_5,q=>gaostate);
U12:
BCD7PORTMAP(a=>swa,b=>sigBCD7_6,q=>tempd);
U13:
BCD7PORTMAP(a=>swa,b=>sigBCD7_7,q=>temps);
U14:
BCD7PORTMAP(a=>swa,b=>sigBCD7_8,q=>hdstate);
U15:
BCD7PORTMAP(a=>swa,b=>sigBCD7_9,q=>hsstate);
U16:
BCD7PORTMAP(a=>swa,b=>sigBCD7_10,q=>tdstate);
U17:
BCD7PORTMAP(a=>swa,b=>sigBCD7_11,q=>tsstate);
U18:
BCD7PORTMAP(a=>swa,b=>sigBCD7_12,q=>coolstate);
U19:
BCD7PORTMAP(a=>swa,b=>sigBCD7_13,q=>heatstate);
U20:
BCD7PORTMAP(a=>swa,b=>sigBCD7_14,q=>drystate);
PROCESS(clk1)
BEGIN
ENDPROCESS;
ENDARCHITECTUREbehave;
2〕单脉冲模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYpulseIS--单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDENTITYpulse;
ARCHITECTUREbehaveOFpulseIS
SIGNALd:
STD_LOGIC:
='0';
SIGNALf:
STD_LOGIC:
='0';
SIGNALg:
STD_LOGIC:
='0';--确保经过第一个clk上升沿时输出1
SIGNALh:
STD_LOGIC:
='0';--同上
BEGIN
PROCESS(a,clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(f='1')THEN
g<='1';
ELSEg<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(a,clk)
BEGIN
IF(clk'EVENTANDclk='0')THEN
IF(a='1')THEN
IF(f='1')THEN
IF(g='1')THEN
d<='1';
ELSEd<='0';
ENDIF;
ELSEd<='1';
ENDIF;
ELSEd<='0';--a为0时,重置此单脉冲发生器
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(d)
BEGIN
IF(a='1')THEN
IF(d='1')THEN
f<='0';
ELSEf<='1';
ENDIF;
ELSEf<='0';
ENDIF;
b<=f;
ENDPROCESS;
ENDARCHITECTUREbehave;
3〕开关模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYswitchIS--开关模块
PORT(a,b,clk:
INSTD_LOGIC;--b受定时模块的控制,时间减为0时,关闭开关
c:
OUTSTD_LOGIC;
d:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输送给数码管
ENDENTITYswitch;
ARCHITECTUREbehaveOFswitchIS
PONENTpulse--调用单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDPONENTpulse;
SIGNALp1:
STD_LOGIC:
='0';
SIGNALp2:
STD_LOGIC:
='0';
BEGIN
U1:
pulsePORTMAP(a=>a,b=>p1,clk=>clk);
U2:
pulsePORTMAP(a=>b,b=>p2,clk=>clk);
PROCESS(a,b,clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(p1='1')THEN--空调开关翻开
c<='1';d<="0001";
ENDIF;
IF(p2='1')THEN--时间减为0时,定时模块返回1,关闭开关
c<='0';d<="0000";
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREbehave;
4〕开关控制模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcontrolIS--开关控制模块
PORT(a,b,clk:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDENTITYcontrol;
ARCHITECTUREbehaveOFcontrolIS
PONENTpulse--调用单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDPONENTpulse;
SIGNALp1:
STD_LOGIC:
='0';
SIGNALp2:
STD_LOGIC:
='0';
BEGIN
U1:
pulsePORTMAP(a=>a,b=>p1,clk=>clk);
U2:
pulsePORTMAP(a=>b,b=>p2,clk=>clk);
PROCESS(a,b,clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(p1='1')THEN--空调开关翻开
c<='0';
ENDIF;
IF(p2='1')THEN--时间减为0时,定时模块返回1,关闭开关
c<='1';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREbehave;
5〕温度模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtempIS--温度模块,最高30度,最低16度,默认26度
PORT(a,b,c,clk:
INSTD_LOGIC;--a控制开关,b提高1度,c降低1度
temp1,temp2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDENTITYtemp;
ARCHITECTUREbehaveOFtempIS
PONENTpulse--调用单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDPONENTpulse;
SIGNALt1:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
SIGNALt2:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
SIGNALp1:
STD_LOGIC:
='0';
SIGNALp2:
STD_LOGIC:
='0';
SIGNALp3:
STD_LOGIC:
='0';
BEGIN
U1:
pulsePORTMAP(a=>b,b=>p1,clk=>clk);
U2:
pulsePORTMAP(a=>c,b=>p2,clk=>clk);
U3:
pulsePORTMAP(a=>a,b=>p3,clk=>clk);
PROCESS(a,clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(p3='1')THEN--开关翻开时,默认26度
t1<="0010";t2<="0110";
ELSIF(a='0')THEN
t1<="0000";t2<="0000";
ENDIF;
IF(a='1')THEN
IF(p1='1')THEN--判断"温度+"按键按下
IF(t1="0011")THEN
t1<="0011";t2<="0000";
ELSIF(t2="1001")THEN
t1<=t1+'1';
t2<="0000";
ELSEt2<=t2+'1';
ENDIF;
ENDIF;
IF(p2='1')THEN--判断"温度-"按键按下
IF(t1="0001")THEN
IF(t2="0110")THEN
t1<="0001";t2<="0110";
ELSEt2<=t2-'1';
ENDIF;
ELSIF(t2="0000")THEN
t1<=t1-'1';
t2<="1001";
ELSEt2<=t2-'1';
ENDIF;
ENDIF;
ELSEt1<="0000";t2<="0000";
ENDIF;
ENDIF;
temp1<=t1;temp2<=t2;
ENDPROCESS;
ENDARCHITECTUREbehave;
6〕风速模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfanIS--风速模块:
睡眠、低、中、高;默认中挡;睡眠模式在低挡和停顿之间循环
PORT(a,b,c,clk:
INSTD_LOGIC;
di,zhong,gao:
OUTSTD_LOGIC;--由于high和low是敏感词汇,所以此处用拼音,可以看到此处没有睡眠模式,是因为睡眠模式其实是抵挡-停顿模式
ssleep,sdi,szhong,sgao:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--不同于发给空调内部的信号,睡眠模式的状态应显示在外
ENDENTITYfan;
ARCHITECTUREbehaveOFfanIS
PONENTpulse--调用单脉冲模块
PORT(a,clk:
INSTD_LOGIC;
b:
OUTSTD_LOGIC);
ENDPONENTpulse;
PONENTcount6--调用计数器
PORT(a,clk,rst:
INSTD_LOGIC;
o:
OUTSTD_LOGIC);
ENDPONENTcount6;
SIGNALe:
STD_LOGIC_VECTOR(2DOWNTO0):
="000";--停顿000、睡眠001、抵挡010、中挡011、高挡100
SIGNALp1:
STD_LOGIC:
='0';
SIGNALp2:
STD_LOGIC:
='0';
SIGNALp3:
STD_LOGIC:
='0';
SIGNALop:
STD_LOGIC:
='0';
SIGNALop1:
STD_LOGIC:
='0';--其上升沿用于开启睡眠模式
SIGNALop2:
STD_LOGIC:
='0';
SIGNALrst1:
STD_LOGIC:
='0';
SIGNALrst2:
STD_LOGIC:
='0';
SIGNALchange:
STD_LOGIC:
='0';
SIGNALm:
STD_LOGIC:
='0';--睡眠模式中使用,由于睡眠模式是循环模式,所以不设置置0
BEGIN--模式在按键操作下可循环滚动
U1:
pulsePORTMAP(a=>b,b=>p1,clk=>clk);
U2:
pulsePORTMAP(a=>c,b=>p2,clk=>clk);
U3:
pulsePORTMAP(a=>a,b=>p3,clk=>clk);
U4:
pulsePORTMAP(a=>rst1,b=>rst2,clk=>clk);
U5:
count6PORTMAP(a=>op,rst=>rst2,clk=>clk,o=>change);
PROCESS(a,clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
op1<=op2;
IF(p3='1')THEN--开关翻开时,默认中挡
e<="011";
ELSIF(a='0')THEN
e<="000"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 空调 控制器 设计