数字电路综合实验报告学院:信息与通信工程专业:信息工程班级:2013211125基于CPDL的简易洗衣机控制器的设计与实现一:设计课题的任务要求基本要求:1、洗衣机的工作步骤为洗涤、漂洗和脱水三个过程,工作时间分别为:洗涤30秒(进水5秒,洗衣15秒,排水5秒,甩干5秒),漂洗25秒(进水5秒,漂洗10秒,排水5秒,甩干5秒),脱水15秒(排水5秒,甩干10秒);2、用一个按键实现洗衣程序的手动选择:A、单洗涤;B、单漂洗;C、单脱D、漂洗和脱水;E、洗涤、漂洗和脱水全过程;3、用发光二极管显示洗衣机的工作状态(洗衣、漂洗和脱水),并倒计时显示每个状态的工作时间,全部过程结束后,应有声音提示使用者,并保持在停止状态,直至再次开始;4、用点阵动画显示洗衣机工作过程中进水、波轮或滚筒转动、排水和甩干等的工作情况,四种工作情况的动画显示要有区别且尽可能的形象。5、用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前保留的状态;提高要求:1、三个过程的时间有多个选项供使用者选择。2、可以预约洗衣时间。3、自拟其它功能。二:系统设计(一)设计思路本题目较复杂的地方是状态太多,而且状态中还嵌套着状态,于是我选择了分模块写代码然后顶层用原件图连接起来的设计方法。根据实验要求,首先要通过一个经过防抖按键来实现模式的选择,这里我通过记录输入时钟上升沿的个数来选择好不同的模式,同时设置好不同模式对应的总时间,状态转移时间,LED初始值等。然后在检测到确定按键产生的信号后,将这些选择好的信息传入到中心控制器中。在中心控制器中由开始/暂停键来控制程序的进行,在开始状态下,时间会递减,并可以判断是否进行状态转换而转换到下一个状态(洗涤,漂洗,脱水),同时将变化的时间传入到时间处理模块和动画转换模块,前者将输入的时间提取成个位和十位,然后输出到数码管控制模块进行显示。后者通过与选择模式的结合,可以决定当前模式与时间对应的动画,将决定动画的代码传入到动画模块,即可以通过点阵显示不同的动画。当时间减少到0时,中心控制器还会输出一个蜂鸣器报警的信号来控制报警。所有进程执行完毕后,各项数据会进行清零返回,等待下一次的使用。由上面的设计思路可以总结出一共有以下的模块:分频模块、防抖模块、按键(模式选择,确定,开始/暂停)模块、中心控制模块、时间处理模块、数码管显示模块、数码管选通模块、动画控制模块、动画显示模块、报警模块。在下文中有对每个模块的功能介绍,代码分析以及仿真波形的分析。(二)总体框图上文所述的各种模块之间的连接如图所示:说明:其中动画模块,数码管模块等还可以细分,在下文中也有着详细的介绍以及相关代码和仿真分析。(三)状态转移图由于洗衣的五种模式之间存在着相互的联系,我们可以用状态转移图来表示这五种状态在选择时的转换关系:说明:001:单洗涤010:单漂洗100:单脱水110:漂洗+脱水111:洗涤+漂洗+脱水000:结束001010000111110100(四)控制流程图否是否是否否是是否是三:分块设计代码及仿真分析(一)分频模块1:模块功能此模块对外部输入的25MHZ时钟进行三级分频。第一级分为600HZ,用于点阵和数码管的扫描,第二级为100HZ,用于防抖模块的输入信号,第三级为1HZ,用于时间控制和动画控制。模式选择开始确定?开始?倒计时为0?结束并报警数码管,led,点阵动画显示暂停?暂停开始?2:代码分析(以三级分频为例子)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydivisport(clk:instd_logic;--输100HZ时钟clkout:outstd_logic--分频后的1HZ时钟);enddiv;architectureaofdivissignaltemp_clk:std_logic;signaltmp:integerrange0to49;beginprocess(clk)beginif(clk'eventandclk='1')theniftmp=49thentmp=0;temp_clk=nottemp_clk;elsetmp=tmp+1;endif;endif;endprocess;clkout=temp_clk;enda;3:仿真波形与分析由波形图可见,输入100个时钟,输出一个时钟,实现了对输入时钟的100分频。(二)防抖模块1:模块功能由于按键在有反应时间,有抖动,可能会造成你按一次产生多个脉冲的情况从而影响程序进程。防抖可以消除抖动,使得你按一次键只产生一个时钟信号。2:代码分析libraryieee;useieee.std_logic_1164.all;entityfangdouisport(clk:instd_logic;--100HZ时钟信号key:instd_logic;--按键输入key_out:outstd_logic);--输出endfangdou;architectureaoffangdouissignalresetmp1,resetmp2:std_logic;beginprocess(clk)beginif(clk'eventandclk='0')thenresetmp2=resetmp1;resetmp1=key;endif;endprocess;key_out=clkandresetmp1and(notresetmp2);--消除抖动enda;3:仿真波形与分析由图可知,防抖程序消除了一些毛刺,使输出信号变得稳定。(三)按键模块1:模块功能此模块有三个部分,一个是模式选择按钮,产生相应的模式信号。一个是确定按钮,通过按键来改变输出的高低电平,还有一个是开始/暂停按钮,产生控制时间变化的信号,这两者都采用循环计数的方式来控制信号。2:代码分析libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned;entitymodeselectisport(mode_in:instd_logic;--模式选择信号start:instd_logic;--开始/暂停信号datain:instd_logic;--确定信号mode_out:outstd_logic_vector(2downto0);--模式输出led_out:outstd_logic_vector(2downto0);--LED信号timecount:outintegerrange0to70;--总时间temp:outintegerrange0to40;--转移时间st_out:outstd_logic;--开始/确定输出data_out:outstd_logic--确定信号输出);endmodeselect;architectureaofmodeselectissignalmodetmp:std_logic_vector(2downto0);signalstate:std_logic_vector(2downto0);beginp1:process(mode_in)--模式转换beginif(mode_in'eventandmode_in='1')thencasemodetmpiswhen000=modetmp=001;when001=modetmp=010;when010=modetmp=100;when100=modetmp=110;when110=modetmp=111;whenothers=modetmp=000;endcase;mode_out=modetmp;endif;mode_out=modetmp;state=modetmp;casestateis--设置时间等信号when000=timecount=0;temp=0;led_out=000;when001=timecount=30;temp=0;led_out=001;when010=timecount=25;temp=0;led_out=010;when100=timecount=15;temp=0;led_out=100;when110=timecount=40;temp=15;led_out=010;when111=timecount=70;temp=40;led_out=001;whenothers=timecount=0;temp=0;led_out=000;endcase;endprocess;p2:process(start)--开始/暂停信号variablesout:integerrange0to1;beginif(start'eventandstart='1')thenif(sout=0)thensout:=sout+1;elsesout:=0;endif;if(sout=0)thenst_out='0';elsest_out='1';endif;endif;endprocess;p3:process(datain)--确定信号variabledout:integerrange0to1;beginif(datain'eventanddatain='1')thenif(dout=0)thendout:=dout+1;elsedout:=0;endif;if(dout=0)thendata_out='0';elsedata_out='1';endif;endif;endprocess;end;3:仿真波形与分析由图可知,在选择模式2(按两次键,单漂洗)的情况下,会对应输出LED信号为010,模式输出信号为010,总时间为25,时间转移信号为0(即不转移)。确定键按一下后能够输出一个高电平,而暂停/开始键按一下输出高电平,再按一下输出变成低电平。(四)中心控制模块1:模块功能此模块为此工程最为关键的部分,它通过控制时间的倒数间接的控制了数码管显示,点阵显示,LED显示,以及蜂鸣器报警。此部分通过确定键和开始/暂停键来实现对时间的控制。2:代码分析libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned;entitycontrolcenterisport(clk:instd_logic;--1HZ扫描频率switch:instd_logic;start:instd_logic;mode_in:instd_logic_vector(2downto0);led_in:instd_logic_vector(2downto0);timecount:inintegerrange0to70;temp:inintegerrange0to40;led_out:outstd_logic_vector(2downto0);--输出LED信号alarm:outstd_logic;--输出蜂鸣器信号timeout:outintegerrange0to70--输出时间);endcontrolcenter;architectureaofcontrolcenterissignalmode2:std_logic_vector(2downto0);signaltime2:integerrange0to70;signaltemp2:integerrange0to40;signalled2:std_logic_vector(2downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(switch='1')then--确定信号为1,预制信号进入系统mode2=mode_in;time2=timecount;temp2=temp;led2=led_in;endif;if(start='1')then--开始if(time2/=0)then--时间不为