版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字系统设计与硬件描述语言期末考试作业题目:空调控制器的设计学院:电子信息工程学院专业:物联网工程学号:姓名: 选题设计描述功能介绍设计内容为空调控制器,可实现空调的开关、模式切换、温度控制、风速控制、定时设置。模式默认为制冷,可切换为制热、除湿。温度默认为26度,可按“温度+”、“温度-”调节,每次调节1度,最高30度,最低16度。风速默认为中挡,可按“风速+”、“风速-”切换为低挡、高挡、睡眠模式。睡眠模式中,在低挡与停止间循环。定时设置默认关闭,开启时默认30分钟,可按“定时+”、“定时-”调节,每次调节30分钟,最高24小时,最低30分钟。定时倒计时结束时,关闭空调。定时开启时,可按“取消定时”关闭定时。空调控制器模拟界面如下:算法简介1)空调控制器其输入与输出在主程序kt中已标明,在此不做介绍。2)单脉冲模块这是非常重要以及核心的模块。当a产生一个上升沿时,输出一个单脉冲,脉冲将持续到经过一个clk上升沿后的clk下降沿。3)开关模块 a连接空调的开关,b连接开关控制模块的输出,c为空调各工作模块的开关信号,d连接数码管显示开关状况。当定时时间结束,b输入一个单脉冲,空调关闭。4)开关控制模块此模块的作用是保证开关模块能够正常工作。开关打开时,a输入一个单脉冲,重置c。b连接定时模块,当定时结束,b输入一个单脉冲,使c输出1,使开关模块输出05)温度模块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;ENTITYktISPORT(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;ARCHITECTUREbehaveOFktISCOMPONENTswitch--开关模块PORT(a,b,clk:INSTD_LOGIC;--b受定时模块的控制,时间减为0时,关闭开关c:OUTSTD_LOGIC; d:OUTSTD_LOGIC_VECTOR(3DOWNTO0)); --输送给数码管ENDCOMPONENTswitch;COMPONENTcontrol--开关控制模块PORT(a,b,clk:INSTD_LOGIC;c:OUTSTD_LOGIC); ENDCOMPONENTcontrol;COMPONENTfan--风速模块PORT(a,b,c,clk:INSTD_LOGIC;di,zhong,gao:OUTSTD_LOGIC;--由于high和low是敏感词汇,所以此处用拼音,可以看到此处没有睡眠模式,是因为睡眠模式其实是抵挡-停止模式 ssleep,sdi,szhong,sgao:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--不同于发给空调内部的信号,睡眠模式的状态应显示在外ENDCOMPONENTfan;COMPONENTBCD7--数码管模块PORT(a:INSTD_LOGIC; b:INSTD_LOGIC_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(0TO6));ENDCOMPONENTBCD7;COMPONENTpulse--单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;COMPONENTtemp--温度模块PORT(a,b,c,clk:INSTD_LOGIC;--a控制开关,b提高1度,c降低1度temp1,temp2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTtemp;COMPONENTtimer--定时模块PORT(a,b,c,up,down,clk1,clk2:INSTD_LOGIC; sw1:OUTSTD_LOGIC;--总开关关闭信号oh1,oh2,ot1,ot2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输送给数码管显示剩余时间ENDCOMPONENTtimer;COMPONENTmodePORT(b,c,clk:INSTD_LOGIC;cool,heat,dry:OUTSTD_LOGIC; cool1,heat1,dry1:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTmode;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);BEGINU1: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)BEGINENDPROCESS;ENDARCHITECTUREbehave;2)单脉冲模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpulseIS--单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDENTITYpulse;ARCHITECTUREbehaveOFpulseISSIGNALd:STD_LOGIC:='0';SIGNALf:STD_LOGIC:='0';SIGNALg:STD_LOGIC:='0';--确保经过第一个clk上升沿时输出1SIGNALh:STD_LOGIC:='0';--同上BEGINPROCESS(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')THENd<='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;ARCHITECTUREbehaveOFswitchISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;SIGNALp1:STD_LOGIC:='0';SIGNALp2:STD_LOGIC:='0';BEGINU1: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;ARCHITECTUREbehaveOFcontrolISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;SIGNALp1:STD_LOGIC:='0';SIGNALp2:STD_LOGIC:='0';BEGINU1: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;ARCHITECTUREbehaveOFtempISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;SIGNALt1:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALt2:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALp1:STD_LOGIC:='0';SIGNALp2:STD_LOGIC:='0';SIGNALp3:STD_LOGIC:='0';BEGINU1: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) BEGINIF(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")THENt1<="0011";t2<="0000";ELSIF(t2="1001")THEN t1<=t1+'1';t2<="0000";ELSEt2<=t2+'1';ENDIF;ENDIF;IF(p2='1')THEN--判断"温度-"按键按下IF(t1="0001")THENIF(t2="0110")THENt1<="0001";t2<="0110"; ELSEt2<=t2-'1';ENDIF;ELSIF(t2="0000")THENt1<=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;ARCHITECTUREbehaveOFfanISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;COMPONENTcount6--调用计数器PORT(a,clk,rst:INSTD_LOGIC; o:OUTSTD_LOGIC);ENDCOMPONENTcount6;SIGNALe:STD_LOGIC_VECTOR(2DOWNTO0):="000";--停止000、睡眠001、抵挡010、中挡011、高挡100SIGNALp1: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';--睡眠模式中使用,由于睡眠模式是循环模式,所以不设置置0BEGIN--模式在按键操作下可循环滚动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"; ENDIF;IF(a='1')THEN IF(p1='1')THEN--判断"风速+"按键按下 IF(e="100")THEN--高挡时按下,则切换为睡眠e<="001";op1<='1';ELSEe<=e+'1';op1<='0';ENDIF;ENDIF;IF(p2='1')THEN--判断"风速"-"按键按下IF(e="001")THEN--睡眠时按下,则切换为高挡e<="100";op1<='0'; ELSIF(e="010")THEN e<=e-'1';op1<='1'; ELSEe<=e-'1';op1<='0';ENDIF;ENDIF; ELSEe<="000"; ENDIF; ENDIF; ENDPROCESS;PROCESS(change) BEGIN IF(change'EVENTANDchange='1')THEN IF(m='1')THEN m<='0'; ELSEm<='1'; ENDIF; ENDIF;ENDPROCESS;PROCESS(e) BEGIN op2<=op1; IF(e="001")THEN--睡眠时的低挡-停止循环 IF(op2'EVENTANDop2='1')THEN op<='1';rst1<='1'; ENDIF; op<='1'; CASEmISWHEN'1'=>di<='1';zhong<='0';gao<='0';ssleep<="0001";sdi<="0000";szhong<="0000";sgao<="0000";WHEN'0'=>di<='0';zhong<='0';gao<='0';ssleep<="0001";sdi<="0000";szhong<="0000";sgao<="0000";ENDCASE; ELSE op<='0';--关闭睡眠模式IF(e="010")THENdi<='1';zhong<='0';gao<='0';ssleep<="0000";sdi<="0001";szhong<="0000";sgao<="0000";ELSIF(e="011")THENdi<='0';zhong<='1';gao<='0';ssleep<="0000";sdi<="0000";szhong<="0001";sgao<="0000";ELSIF(e="100")THENdi<='0';zhong<='0';gao<='1';ssleep<="0000";sdi<="0000";szhong<="0000";sgao<="0001";ELSIF(e="000")THENdi<='0';zhong<='0';gao<='0';ssleep<="0000";sdi<="0000";szhong<="0000";sgao<="0000";ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREbehave;7)模式模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmodeIS--模式模块:制冷、制热、除湿PORT(b,c,clk:INSTD_LOGIC;cool,heat,dry:OUTSTD_LOGIC; cool1,heat1,dry1:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYmode;ARCHITECTUREbehaveOFmodeISCOMPONENTpulse--单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;SIGNALe:STD_LOGIC_VECTOR(1DOWNTO0):="00";SIGNALp1:STD_LOGIC:='0';SIGNALp2:STD_LOGIC:='0';BEGINU1:pulsePORTMAP(a=>b,b=>p1,clk=>clk);U2:pulsePORTMAP(a=>c,b=>p2,clk=>clk);PROCESS(b,c,p1,p2,clk)--按键选择模式 BEGIN IF(clk'EVENTANDclk='1')THEN IF(b='1')THEN IF(p1='1')THEN--默认制冷模式 e<="01"; ENDIF; IF(p2='1')THEN IF(e="11")THEN e<="01"; ELSEe<=e+'1'; ENDIF; ENDIF; ELSEe<="00"; ENDIF; ENDIF; ENDPROCESS;PROCESS(e) BEGIN--由于第一个PROCESS中,a为0时e为"00",所以此处不再考虑aCASEeISWHEN"01"=>cool<='1';heat<='0';dry<='0';cool1<="0001";heat1<="0000";dry1<="0000";WHEN"10"=>cool<='0';heat<='1';dry<='0';cool1<="0000";heat1<="0001";dry1<="0000"; WHEN"11"=>cool<='0';heat<='0';dry<='1';cool1<="0000";heat1<="0000";dry1<="0001"; WHENOTHERS=>cool<='0';heat<='0';dry<='0';cool1<="0000";heat1<="0000";dry1<="0000"; ENDCASE;ENDPROCESS;ENDARCHITECTUREbehave;8)定时模块ENTITYtimerIS--定时模块:最低30分钟,最高24小时,每次按键调整30分钟,可取消定时PORT(a,b,c,up,down,clk1,clk2:INSTD_LOGIC; sw1:OUTSTD_LOGIC;--总开关关闭信号oh1,oh2,ot1,ot2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输送给数码管显示剩余时间ENDENTITYtimer;ARCHITECTUREbehaveOFtimerISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;COMPONENTcd--调用倒计时模块PORT(a,clk:INSTD_LOGIC; time1,time2,time3,time4:INSTD_LOGIC_VECTOR(3DOWNTO0); finish:OUTSTD_LOGIC; outtime1,outtime2,outtime3,outtime4:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTcd;SIGNALcl:STD_LOGIC:='0';SIGNALop:STD_LOGIC:='0';SIGNALp1:STD_LOGIC:='0';SIGNALp2:STD_LOGIC:='0';SIGNALp3:STD_LOGIC:='0';SIGNALsw:STD_LOGIC:='0';--倒计时模块开关信号SIGNALh11:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALh22:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALt11:STD_LOGIC_VECTOR(3DOWNTO0):="0011";SIGNALt22:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALh1:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALh2:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALt1:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALt2:STD_LOGIC_VECTOR(3DOWNTO0);BEGINU1:pulsePORTMAP(a=>b,b=>op,clk=>clk1);U2:pulsePORTMAP(a=>c,b=>cl,clk=>clk1);U3:pulsePORTMAP(a=>up,b=>p1,clk=>clk1);U4:pulsePORTMAP(a=>down,b=>p2,clk=>clk1);U5:pulsePORTMAP(a=>sw,b=>p3,clk=>clk1);U6:cdPORTMAP(a=>sw,clk=>clk2,time1=>h1,time2=>h2,time3=>t1,time4=>t2,finish=>sw1,outtime1=>oh1,outtime2=>oh2,outtime3=>ot1,outtime4=>ot2);PROCESS(a,op,cl)BEGINIF(a='1')THENIF(op='1')THENsw<='1'; ENDIF;IF(cl='1')THENsw<='0'; ENDIF;ELSEsw<='0';ENDIF;ENDPROCESS;PROCESS(sw,clk1)BEGINIF(clk1'EVENTANDclk1='1')THEN IF(p3='1')THEN--定时开启时,默认30分钟h11<="0000";h22<="0000";t11<="0011";t22<="0000"; ELSIF(sw='0')THENh11<="0000";h22<="0000";t11<="0000";t22<="0000"; ENDIF;IF(sw='1')THEN IF(p1='1')THEN--判断"时间+"按键按下 IF(h11="0010")THEN IF(h22="0100")THEN h11<="0010";h22<="0100";t11<="0000";t22<="0000"; ELSIF(t11="0000")THEN t11<="0011"; ELSEh22<=h22+'1';t11<="0000"; ENDIF; ELSIF(h22="1001")THEN IF(t11="0000")THEN t11<="0011"; ELSEh11<=h11+'1';h22<="0000";t11<="0000"; ENDIF; ELSIF(t11="0011")THEN h22<=h22+'1';t11<="0000"; ELSEt11<="0011"; ENDIF; ENDIF; IF(p2='1')THEN--判断"时间-"按键按下IF(h11="0000")THEN IF(h22="0000")THEN h11<="0000";h22<="0000";t11<="0011";t22<="0000"; ELSIF(t11="0011")THEN t11<="0000"; ELSEh22<=h22-'1';t11<="0011"; ENDIF; ELSIF(h22="0000")THEN IF(t11="0011")THEN t11<="0000"; ELSEh11<=h11-'1';h22<="1001";t11<="0011"; ENDIF; ELSIF(t11="0011")THEN t11<="0000"; ELSEh22<=h22-'1';t11<="0011"; ENDIF; ENDIF; ENDIF; ENDIF; h1<=h11;h2<=h22;t1<=t11;t2<=t22;ENDPROCESS;ENDARCHITECTUREbehave;9)倒计时模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcdIS--倒计时模块,仅在定时开启时有效PORT(a,clk:INSTD_LOGIC; time1,time2,time3,time4:INSTD_LOGIC_VECTOR(3DOWNTO0); finish:OUTSTD_LOGIC; outtime1,outtime2,outtime3,outtime4:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYcd;ARCHITECTUREbehaveOFcdISCOMPONENTpulse--调用单脉冲模块PORT(a,clk:INSTD_LOGIC; b:OUTSTD_LOGIC);ENDCOMPONENTpulse;SIGNALs:STD_LOGIC:='0';SIGNALintime11:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALintime22:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALintime33:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALintime44:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALstime1:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALstime2:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALstime3:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALstime4:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALintime5:STD_LOGIC_VECTOR (1DOWNTO0):="00";SIGNALintime6:STD_LOGIC_VECTOR(1DOWNTO0):="01";SIGNALintime7:STD_LOGIC_VECTOR(1DOWNTO0):="01";BEGINU1:pulsePORTMAP(a=>a,b=>s,clk=>clk);PROCESS(time1,time2,time3,time4,clk)--为当定时时间更改时,令变量重新赋值BEGIN IF(clk'EVENTANDclk='1')THEN IF(s='1')THEN intime5<="11";ELSIF(a='1')THEN IF(stime1/=time1ORstime2/=time2ORstime3/=time3ORstime4/=time4)THEN stime1<=time1; stime2<=time2; stime3<=time3; stime4<=time4; IF(intime5="01")THEN intime5<="10"; ELSEintime5<="01";ENDIF; ENDIF; ELSEintime5<="00"; ENDIF; ENDIF;intime11<=time1; intime22<=time2; intime33<=time3; intime44<=time4;ENDPROCESS;PROCESS(clk,intime5,intime6) VARIABLEintime1,intime2,intime3,intime4:STD_LOGIC_VECTOR(3DOWNTO0);BEGIN IF(clk'EVENTANDclk='1')THEN IF(a='1')THEN IF(intime5/=intime6)THEN--第一个PROCESS运行时,变量被重新赋值 intime6<=intime5; intime1:=intime11; intime2:=intime22; intime3:=intime33; intime4:=intime44; ENDIF; IF(intime4/="0000")THEN intime4:=intime4-'1'; finish<='0'; ELSIF(intime3/="0000")THEN intime4:="1001"; intime3:=intime3-'1'; finish<='0'; ELSIF(intime2/="0000")THEN intime3:="0101"; intime4:="1001"; intime2:=intime2-'1'; finish<='0'; ELSIF(intime1/="0000")THEN intime2:="1001"; intime3:="0101"; intime4:="1001"; intime1:=intime1-'1'; finish<='0'; ELSE intime2:="0000"; intime3:="0000"; intime4:="0000"; intime1:="0000"; finish<='1'; ENDIF; ELSE intime2:="0000"; intime3:="0000"; intime4:="0000"; intime1:="0000"; finish<='0'; ENDIF; outtime1<=intime1; outtime2<=intime2; outtime3<=intime3; outtime4<=intime4; ENDIF;ENDPROCESS;ENDARCHITECTUREbehave;10)数码管模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBCD7IS--数码管模块PORT(a:INSTD_LOGIC;b:INSTD_LOGIC_VECTOR(3DOWNTO0);--数据输入q:OUTSTD_LOGIC_VECTOR(0TO6));--7段输出ENDBCD7;ARCHITECTUREbehavOFBCD7ISBEGINPROCESS(b)BEGIN IF(a='1')THEN CASEb(3DOWNTO0)IS--BCD7段译码表WHEN"0000"=>q<="1111110";WHEN"0001"=>q<="0110000";WHEN"0010"=>q<="1101101";WHEN"0011"=>q<="1111001";WHEN"0100"=>q<="0110011";WHEN"0101"=>q<="1011011";WHEN"0110"=>q<="1011111";WHEN"0111"=>q<="1110000";WHEN"1000"=>q<="1111111";WHEN"1001"=>q<="1111011";WHENOTHERS=>q<="0000000";ENDCASE; ELSEq<="1111110"; ENDIF;ENDPROCESS;ENDbehav;11)计数器模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount6IS--计数器模块PORT(a,clk,rst:INSTD_LOGIC; o:OUTSTD_LOGIC);END;ARCHITECTUREbehavOFcount6ISSIGNALq:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(clk,rst)BEGINIF(rst='1')THEN q<="0000";ELSIFrising_edge(clk)THEN IF(a='1')THENq<=q+1;IFq>="0101"THEN q<="0000";ENDIF; ELSEq<="0000";ENDIF; ENDIF; ENDPROCESS; PROCESS(q) BEGIN IF(a='1')THEN IF(q="0000")THEN o<='1'; ELSEo<='0'; ENDIF; ELSEo<='0';--关闭时输出0 ENDIF;ENDPROCESS;END;仿真结果及分析仿真的部分解析与算法描述中相同,故省略。1)单脉冲模块2)开关模块注意:a并非空调的开机状态,而是类似于“按下开机键的时间”。故a由1变为0时无变化发生。3)开关控制模块定时结束时,b接收到一个脉冲c输出1,而当空调重新打开时,c重置为0。4)温度模块可能看不清,拆为两部分截图:默认为26度,最高为30度,最低为16度。5)风速模块可能看不清,拆为两部分截图:b为1的较长一段为睡眠模式。可以看到,默认为中挡。睡眠模式时,在低挡和停止间循环。6)模式模块7)定时模块可能看不清,拆为若干部分截图:由于仿真需要,所以在某些地方调整了时钟频率。b上升沿触发定时开启,默认30分钟。最高24小时,之后再按时间+键依然重置为24小时(即仿真图中的23:59)。倒计时为0时,sw1输出1。取消定时时(c),关闭定时。取消定时后再按定时(b),可重新开启定时。8)倒计时模块可能看不清,拆为两部分截图:输入时间改变时,重新计时。倒计时为0时,finish输出1。9)数码管模块10)计数器模块11)空调控制器由于仿真图太长太宽,屏幕截图不到clk,所以先截图输入,为配合仿真截图,将主要测试变化集中于左右两部分:左半部分主要对定时模式的作用、其他模式互不干扰工作、睡眠模式进行测试。右半部分主要对取消定时模式进行仿真。最后横向分段截取全图:受仿真长度限制,总程序的仿真无法在保证结果可读性强的情况下仿真各种状态发生,但分模块的仿真做到了这一点。对仿真的疑问之处,请参考模块仿真。心得体会一开始构思的开关的两个输入分别是开关信号和时间信号,其中一个信号为0时,输出为0。首先我想到用开关模块的输入开启时间模块,但这有一个逻辑问题:时间模块没有收到开始信号,就没法给开关模块传输信息,所以最终我决定让开关输入信号同时给时间模块一个脉冲。睡眠模式需要调用计数器,为使仿真结果可读性强,使用6位加法计数器。因为时间模块与睡眠模式都需要用到单脉冲信号,所以我决定编写一个单脉冲发生器,即输入为1时,输出一个脉冲。这小小的器件编写起来却非常艰难,因为我发现它涉及到很多语法问题和逻辑问题,我尝试了很多种方法,而让我没有想到的是,最终成功的程序是一个简洁明了的小程序。后来我很惊喜地发现,这个小模块可以灵活应用在很多地方,比如模拟一次按键。但是有一个问题是,单脉冲持续到下一个clk的上升沿,如何保证其他程序的clk上升沿时,单脉冲输出仍保持1?所以我再次编写了这个程序,更改之后程序逻辑比较复杂,使单脉冲持续到经过一个上升沿后的下降沿,这样也避免了输出紊乱,完美解决了我的问题。在温度模块,单脉冲发生器发挥了很大作用,它使模块可以在process只能有一个沿判定的情况下,成功进行了对“+”、“-”的判定。风速模块的编写是一项困难的工作。有了模式模块的编写经验,使得它的总体架构很容易就编写了出来。但难点在于睡眠模式,这一模式在低挡和停止间循环,需要调用单脉冲发生器和计数器。编写时发生了很多语法错误。最终的一个错误是:计数器的返回信号无法触发睡眠模式中的改变信号(m)。我尝试了许多方法都没能成功改正,最终编写了一个新的process,使问题得到了解决。原计划最后一个模块是定时模块。考虑到这个模块的复杂性,我决定将它拆分为定时模块与倒计时模块。我首先编写的是倒计时模块。如果仅仅做一个小时和分钟的倒计时的话很简单,但如何让倒计时能够在需要的时候重置为需要的数值?我尝试了很多方法。老实说,我已经不记得当时的编程历程,只是在各种错误中反复尝试,最终取得了理想的结果。关于定时模块,我先编写的是开启和关闭倒计时模块的信号,我在两个长久以来的问题上反复折腾了几个小时:同一个process不能有多个event;同一个信号不能在多个process中赋值。最终我决定换一种方法:调用了单脉冲模块,结果出奇的顺利,只用了几行代码就解决了困扰我许久的问题。定时模块的编写建立在前面模块的经验基础上,所以并不难。当编写完各个模块后,我在主程序中将它们整合并略加修改了各个模块。但这时出现了一个问题,这个问题不太好描述,大体上就是说开关无法正常工作。所以我又编写了一个开关控制模块以保证开关模块的正常运转。当这一切结束,编译成功,并且多次不同仿真都成功时,我非常激动。数天来的艰苦奋战没有白费,在这过程中,我对VHDL的诸多基础问题有了一定的认知,同时我的编程思路也逐渐向硬件编程靠近,比如我意识到“signal”其实是导线。通过这次实践,我掌握了很多看书时忽视的东西。过程艰辛,而结果让我比较满意。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统HYPERLINK"/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 助听器验配师持续改进能力考核试卷含答案
- 园林植保工安全宣传模拟考核试卷含答案
- 捻线工复试竞赛考核试卷含答案
- 船舶机工操作能力模拟考核试卷含答案
- 液化天然气储运工发展趋势知识考核试卷含答案
- 2025年建筑行业绿色建材与智能建筑系统创新报告
- 城市地下空间开发利用项目2025年技术创新与地下空间文化艺术应用可行性研究报告
- 健康饮食结构优化指导书
- 智慧教育平台课程质量监测评估手册
- 高效时间管理与自我管理技巧
- 2026年安全生产月:重大危险源管控与隐患排查治理课件
- 2026广西百色市那坡县劳动人事争议仲裁院招聘编外工作人员5人笔试备考试题及答案解析
- 5.1《阿Q正传(节选)》课件+2025-2026学年统编版高二语文选择性必修下册
- GINA哮喘指南核心更新解读2026
- 2025年甘孜州船头学校选调事业单位工作人员真题
- 2026年汽车维修前台测试题及答案
- 2026福建厦门公交集团有限公司公交招聘考试备考试题及答案解析
- 2026年职业能力倾向验-通关题库及1套参考答案详解
- 百慕大三角分析课件
- 人教版新目标英语七年级下册unit 4 写作市公开课一等奖省课获奖课件
- 八年级家长会-语文老师课件
评论
0/150
提交评论