数字电路实验报告 洗衣机控制器附代码及仿真波形.docx
《数字电路实验报告 洗衣机控制器附代码及仿真波形.docx》由会员分享,可在线阅读,更多相关《数字电路实验报告 洗衣机控制器附代码及仿真波形.docx(13页珍藏版)》请在冰豆网上搜索。
数字电路实验报告洗衣机控制器附代码及仿真波形
【实验任务】
●基本任务:
1.洗衣机的工作步骤为洗衣、漂洗和脱水三个过程,工作时间分别为:
洗衣20秒,漂洗25秒,脱水15秒;
2.用一个按键实现洗衣程序的手动选择:
A、单洗涤;B、单漂洗;C、单脱水;D、漂洗和脱水;E、洗涤、漂洗和脱水全过程;
3.用显示器件显示洗衣机的工作状态(洗衣、漂洗和脱水),并倒计时显示每个状态的工作时间,全部过程结束后,应提示使用者;
4.用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前保留的状态;
●提高要求:
1.三个过程的时间有多个选项供使用者选择。
2.可以预约洗衣时间。
3.自拟其它功能:
【分块设计】
【流程图】
【状态转移图】
【设计模块】
数码管代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYseg7IS
PORT(
start,en_app:
INSTD_LOGIC;
clk1000:
INSTD_LOGIC;
time_cnt:
ININTEGERRANGE0TO30;
app_time:
ININTEGERRANGE0TO5;
clr:
INSTD_LOGIC;
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
seg:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)
);
ENDseg7;
ARCHITECTUREbodyofseg7OFseg7IS
SIGNALtem:
INTEGERRANGE0TO1;
SIGNALnum:
INTEGERRANGE0TO9;
SIGNALcat0:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
PROCESS(clk1000)
BEGIN
IF(clk1000'EVENTANDclk1000='1')THEN
IFstart='1'THEN
CASEtemIS
WHEN0=>cat0<="111101";num<=INTEGER((time_cnt)MOD(10));tem<=tem+1;
WHEN1=>cat0<="111110";num<=INTEGER(time_cnt/10);tem<=0;
WHENOTHERS=>cat0<="111111";tem<=0;
ENDCASE;
cat<=cat0;
ELSE
IFen_app='1'THEN
CASEtemIS
WHEN0=>cat0<="111101";num<=INTEGER((app_time)MOD(10));tem<=tem+1;
WHEN1=>cat0<="111110";num<=INTEGER(app_time/10);tem<=0;
WHENOTHERS=>cat0<="111111";tem<=0;
ENDCASE;
cat<=cat0;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(num,clr)
BEGIN
IFclr='1'THEN
seg<="1111110";
ELSE
CASEnumIS
WHEN0=>seg<="1111110";
WHEN1=>seg<="0110000";
WHEN2=>seg<="1101101";
WHEN3=>seg<="1111001";
WHEN4=>seg<="0110011";
WHEN5=>seg<="1011011";
WHEN6=>seg<="1011111";
WHEN7=>seg<="1110000";
WHEN8=>seg<="1111111";
WHEN9=>seg<="1111011";
WHENothers=>seg<="0000000";
ENDCASE;
ENDIF;
ENDPROCESS;
ENDbodyofseg7;
数码管波形:
数码管的选通信号cat【0】cat【1】交替,使两位数码管交替点亮,因为人眼的延迟效果,造成同时点亮的感觉。
可以看到随着start的每一次高电平,工作状态指示灯led就会变一次数值,代表工作状态的改变,说明模式转换功能正常
选择模式代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYchoiceIS
PORT(nextt:
INSTD_LOGIC;
start:
INSTD_LOGIC;
s1,s2,s3:
OUTINTEGERRANGE0TO3;
led:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDchoice;
ARCHITECTUREbodyofchoiceOFchoiceIS
TYPEchoice_stateIS(A,B,C,D,E);
SIGNALcs:
choice_state;
BEGIN
P1:
PROCESS(nextt)
BEGIN
IF(nextt'EVENTANDnextt='1')THEN
IFstart='0'THEN
CASEcsIS
whenA=>s1<=1;s2<=0;s3<=0;led<="100";cs<=B;
whenB=>s1<=2;s2<=0;s3<=0;led<="010";cs<=C;
whenC=>s1<=3;s2<=0;s3<=0;led<="001";cs<=D;
whenD=>s1<=2;s2<=3;s3<=0;led<="011";cs<=E;
whenE=>s1<=1;s2<=2;s3<=3;led<="111";cs<=A;
whenothers=>null;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESSP1;
ENDbodyofchoice;
选择模式波形图
控制器代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcontrollerIS
PORT(
clk1s,pause:
INSTD_LOGIC;
start:
INSTD_LOGIC;
s1,s2,s3:
ININTEGERRANGE0TO3;
cl_beeper:
INSTD_LOGIC;
tim_out:
OUTINTEGERRANGE0TO30;
pause_show:
OUTSTD_LOGIC;
state_now:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
startbeeper:
OUTSTD_LOGIC
);
ENDcontroller;
ARCHITECTUREaOFcontrollerIS
SIGNALtim_tmp:
INTEGERRANGE0TO30;
SIGNALstate_over:
INTEGERRANGE0TO1;
SIGNALs_now,s_next,s_last:
INTEGERRANGE0TO3;
BEGIN
p1:
PROCESS(clk1s,start,cl_beeper,state_over,pause,s_now)
BEGIN
IF(clk1s'EVENTANDclk1s='1')THEN
CASEstartIS
WHEN'0'=>
state_over<=1;
s_now<=s1;
s_next<=s2;
s_last<=s3;
WHEN'1'=>
IFstate_over=1THEN
state_over<=0;
CASEs_nowIS
WHEN0=>
CASEcl_beeperIS
WHEN'1'=>startbeeper<='0';
WHENOTHERS=>startbeeper<='1';
ENDCASE;
tim_tmp<=0;state_now<="000";
WHEN1=>tim_tmp<=20;state_now<="100";
WHEN2=>tim_tmp<=25;state_now<="010";
WHEN3=>tim_tmp<=15;state_now<="001";
WHENOTHERS=>NULL;
ENDCASE;
ELSE
CASEpauseIS
WHEN'0'=>
pause_show<='0';
IFtim_tmp>0THEN
tim_out<=tim_tmp;
tim_tmp<=tim_tmp-1;
ELSE
tim_out<=0;
s_now<=s_next;
s_next<=s_last;
s_last<=0;
state_over<=1;
ENDIF;
WHEN'1'=>pause_show<='1';
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
END;
控制器波形图:
分频器代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclk1000IS
PORT(
clkcl:
INSTD_LOGIC;
clk1000:
OUTSTD_LOGIC);
ENDclk1000;
ARCHITECTUREbodyofclk1000OFclk1000IS
SIGNALcount1:
INTEGERRANGE0TO499;
SIGNALbuf:
STD_LOGIC;
BEGIN
P1:
PROCESS(clkcl)
BEGIN
IF(clkcl'EVENTANDclkcl='1')THEN
IFcount1=499THEN
buf<=NOTbuf;clk1000<=buf;
ELSE
clk1000<=buf;
ENDIF;
count1<=count1+1;
ENDIF;
ENDPROCESSP1;
ENDbodyofclk1000;
分频模块波形:
【功能说明】
实现洗衣机洗涤,漂洗和脱水,持续时间分别为20秒,25秒和15秒。
用一个功能键完成不同模式的切换:
A.单洗涤;B.单漂洗;C.单脱水;D.漂洗和脱水;E.洗涤,漂洗和脱水全过程。
在所选择的程序完成之后,控制器处于停止状态。
一个拨码开关实现开始功能,另一个拨码开关实现暂停和继续洗衣的功能控制,暂停后继续洗衣能够回到暂停之前保留的状态。
用数码管以倒计时的方式显示当前状态的剩余时间。
而且每一种模式在选择的时候,其对应功能的数码灯就会点亮,而在工作的时候,其对应的数码灯就会进行有规则的闪烁,以表明正在进行的工作状态。
倒计时为0时蜂鸣器响起给予警报。
【故障分析】
1.通过按键开关选择工作模式,由于开始设计程序的时候没有过多的考虑到按键的毛刺和噪声问题,初次测试系统时,发现按键效果非常差,后来在网上查了些资料,加进了按键防抖防抖程序,按键效果好用多了,而且充分运用了拨码开关效果显著。
2.下载到电路板以后,发现状态指示灯显示异常。
当某工作状态结束以后,该状态指示灯没有熄灭,反而还在闪烁。
检查指示灯的信号并无错误。
后发现是与该信号想关联的时钟分频时没有分平均,有1的误差,结果导致此问题。
改正后问题解决。
3.下载后运行,时间倒计时为0后,蜂鸣器并没有给出报警,经多次调试仍无法解决,判定为电路板本身问题,换过电路板后运行成功且蜂鸣器给出报警。
【实验总结】
本次数电综合实验是以数电理论知识以及vhdl代码运用为基础,因为上学期做过相关的实验,本以为不会有太大的问题,结果由于相比去年的数电实验,实验难度跨度相对较大,而且vhdl以及数电理论知识已经抛到了脑后,由于实验安排比较晚已经接近期末,时间不够充裕,遇到了各种各样的问题,具体体现在了代码编写以及各模块接口的使用上。
硬件编程与之前我们学过的C语言不同。
最大的不同就是硬件语言中各段代码是并行执行的,因此之前软件编程的各种经验就不一定有用,甚至有时候还会起反作用。
还有就是调试时遇到的一些不是逻辑错误的问题,都是因为硬件语言的不同所造成的。
遇到这样的问题的时候我只能求助于同学和老师,并且去网上参考一些资料。
通过自己的学习,重新拾起了vhdl的用法和一些基本的数电理论知识。
对vhdl也有了更进一步的了解,一步步的实现编译成功,仿真成功到运行成功,这期间将数码管,led灯管脚几乎背在了脑子里面,从一个个问题的发现到一个个问题的解决,这期间是一次次的查阅资料,一次次的求助同学和老师,每一个问题的解决都是我不懈努力的结果,看着最后自己的劳动成果心中真是欣喜万分。
通过这次实验让我进一步理解了数电的基本理论知识,以及掌握vhdl的编程方法,将理论知识化为实践,亲手操作,独立思考解决问题,唯有亲身经历才能体会到其中的欣喜,只要开始就要咬着牙坚持下去,自己选择的路,跪着也要走完,当你回过头来的时候,你会发现曾经的付出和代价换回了如今的勇敢和自信,用知识武装自己,用勇气激励自己,只要肯相信自己,一切都会成功。
【参考文献】
《数字电路与逻辑设计实验教程》———北京邮电大学电路实验中心
《数字逻辑设计实验技术与EDA工具》———北京邮电大学
《数字电路EDA入门——VHDL程序实例集》———张亦华延明