数字电路实验洗衣机程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路与逻辑设计实验报告
题目:洗衣机控制器设计
一、洗衣机控制器要求
设计制作一个全自动洗衣机的控制器:
_ 洗衣机的工作步骤为洗衣、漂洗和脱水三个过程,工作时间分别为:洗衣20
秒,漂洗30 秒,脱水15 秒;
_ 用一个按键实现洗衣程序的手动选择:A、单洗涤;B、单漂洗;C、单脱水;
D、漂洗和脱水;
E、洗涤、漂洗和脱水全过程;
_ 用显示器件显示洗衣机的工作状态(洗衣、漂洗和脱水),并倒计时显示每个
状态的工作时间,全部过程结束后,应提示使用者;
_ 用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前
保留的状态;
_ 选做:三个过程的时间有多个选项供使用者选择。
_ 选做:可以预约洗衣时间。
_ 选做:自拟其它功能。
二、系统设计基本思想
电路由模式选择、计数器、报警模块以及译码驱动电路和数字显示电路等模块组成。
1、模式选择模块
五种洗衣模式可供用户选择,模式选择模块将用户的选择信息传递到控制模块。
2、减计数计数器模块计数器
洗衣以倒计时模块的方式提示用户当前剩余的洗衣时间,该计数器能读取不同的模值进行计数。
计时单位为一秒钟。
3、译码和数码显示电路
译码和数码显示电路是将计时状态直观清晰地反映出来,被人们的视觉器官所接受。
显示器件选用LED 七段数码管。
在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
4、报警模块
当系统运行到“报警”状态时,蜂鸣器将会报警,时间为5 秒。
4、分频器模块
设计一个大小合适的分频器使得系统能够正确的实现一秒的计时。
三、总体设计图以及转移图
流程图示:
总体逻辑设计图:
状态转移图示:
管脚设计图:
仿真情况:
简要说明:本次仿真执行的是第五个状态即洗涤、漂洗和脱水全过程。
通过此仿真可以
发现当输出选择模式信号change时,洗衣机模式开始发生变化。
输入第一个change信号的时候进入单洗涤状态,输入第二个change信号进入单漂洗状态,输入第三个change信号进入了单脱水的状态,输入第四个change信号进入了脱水和漂洗的状态,当输入最后一个change信号的时候进入洗涤、漂洗和脱水的全状态。
而在选择每个状态的同时时间信号(q[0]、q[1]、q[2]、q[3]、q[4]、q[5]、q[6])也发生变化,显示出每个状态时的时间。
而设定的led灯(cat0、cat1)则依次闪亮。
当start开始后change信号不再起作用,而系统进入了运行状态,时间开始逐秒变化。
当程序最终运行结束后,进入报警状态,sound开始显示为高电平,而时间均为0。
(特别说明:由于本实验分2次去做,管脚设定的时候进行了新建工程,代码粘贴过去的,实体名字取得和第二周验收时候不一致,不是其他原因。
)
四、代码示例
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY xiyiji IS
PORT
(
START: IN STD_LOGIC;
PAUSE: IN STD_LOGIC; --------暂停信号
CLOCK: IN STD_LOGIC;
Q: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); ----数码管显示信号
CAT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ----数码管选通信号
);
END xiyiji;
ARCHITECTURE washer OF xiyiji IS
SIGNAL STATE: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL MODE: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL TEMP: INTEGER RANGE 45 DOWNTO 0; -------时间中间变量
SIGNAL TIME: INTEGER RANGE 60 DOWNTO 0; -------倒计时时间
SIGNAL TMP: INTEGER RANGE 999 DOWNTO 0; -------分频变量
SIGNAL MA: INTEGER RANGE 9 DOWNTO 0; -------数码管译码变量
SIGNAL CLK: STD_LOGIC; ------分频时钟输出
BEGIN
PROCESS(CLOCK)
BEGIN
IF (CLOCK'EVENT AND CLOCK='1') THEN ----分频模块
TMP<=TMP + 1;
IF (TMP=999) THEN
TMP<=0;
CLK<= NOT CLK;
END IF;
END IF;
END PROCESS;
PROCESS (START,CLK,PAUSE,CHANGE) ----洗衣控制进程BEGIN
IF ( START = '0' ) THEN --------开始前模式选择模块
IF(CHANGE'EVENT AND CHANGE='1') THEN
CASE MODE IS
WHEN "000"=>MODE<="001";
WHEN "001"=>MODE<="010";
WHEN "010"=>MODE<="100";
WHEN "100"=>MODE<="110";
WHEN "110"=>MODE<="111";
WHEN OTHERS=>MODE<="000";
END CASE;
END IF;
STATE <= MODE; ------------选择洗衣模式
BUZZER <= '0';
CASE STATE IS ------设置模式时间以及中间变量的值
WHEN "001" =>TEMP <= 0 ;
TIME <= 20;
WHEN "010" =>TEMP <= 0 ;
TIME <= 25;
WHEN "100" =>TEMP <= 0 ;
TIME <= 15;
WHEN "110" =>TEMP <= 25 ;
TIME <= 40;
WHEN "111" =>TEMP <= 40 ;
TIME <= 60;
WHEN "000" =>TEMP <= 0 ;
TIME <= 0;
WHEN OTHERS =>TEMP<= 0 ;
TIME<= 0;
END CASE ;
ELSE
IF ( PAUSE = '0') THEN ----设置暂停信号
IF ( CLK'EVENT AND CLK = '1' AND TIME/=0) THEN
TIME <= TIME - 1 ; ------时间自减
IF ( TIME=1 ) THEN
STATE <="000";
BUZZER<= '1'; ------蜂鸣信号启动
ELSIF ( TIME = TEMP ) THEN ----洗衣中模式的切换
CASE STATE IS
WHEN "111" =>STATE <= "110";
TEMP <= 20;
WHEN "110" =>STATE <= "100";
TEMP <= 0;
WHEN OTHERS =>TEMP <= 0 ;
STATE <= "000";
END CASE;
END IF;
END IF;
END IF;
END IF;
MODEEND <= STATE; ------中间变量赋值给结果变量
END PROCESS;
PROCESS (CLOCK,TIME)
BEGIN
IF (CLOCK='1') THEN ------提取十位数
CAT<="111110"; ------数码管选通
END IF;
END PROCESS;
process (MA) ---------将数字译码为七段共阴数码管码
begin
case MA is
when 1 => q <= "0110000" ;
when 2 => q <= "1101101" ;
when 3 => q <= "1111001" ;
when 4 => q <= "0110011" ;
when 5 => q <= "1011011" ;
when 6 => q <= "1011111" ;
when 7 => q <= "1110000" ;
when 8 => q <= "1111111" ;
when 9 => q <= "1111011" ;
when others => q <= "1111110";
end case;
end process;
end washer; ----------洗衣机控制器结束
首先根据实验题目的要求可以将洗衣机控制器分解成为如下的几个模块:洗衣机模式选择、计数器、报警模块以及译码驱动电路和数字显示电路。
1、模式选择模块:
总共五种洗衣模式可供用户选择,模式选择模块将用户的选择信息传递到控制模块,这个模式选择模块将在洗衣机的开始按键start按下前进行模式选择。
基本思路是每有个脉冲模式改变一次,算上初始闲置模式共为六种其间进行循环改变,通过case语句在start为零时每接到change信号的一次改变,通过三位二进制数改变至下一状态。
如此即可实现循环形式的模式选择模块。
其简要代码如下:
If(change'event and change='1') then
case mode is
when "000"=>mode<="001";
when "001"=>mode<="010";
when "010"=>mode<="100";
when "100"=>mode<="110";
when "110"=>mode<="111";
when others=>mode<="000";
end case;
2、减计数计数器模块计数器
洗衣以倒计时模块的方式提示用户当前剩余的洗衣时间,该计数器能读-取不同的模值进行计数。
计时单位为一秒钟。
首先,由于需要数码管的显示,又要实现单位为一秒钟的倒计时所以必要对于系统时钟的分频器。
主要过程是设计一个总的时间变量称之为TIME,每个时钟上升沿一到就对此变量减一,如此首先在系统内部实现时间的自减。
自减是在没有暂停信号且开始信号为一的情况下进行的。
另外我设计了一个中间变量,在不同的状态对其进行不同的赋值,并使其与我设计的总时间变量进行比较,然后将比较结果送给模式的另一个中间变量即可实现洗衣过程中的状态变化显示。
减计数器及其和中间量的比较的简要代码如下:
if ( pause = '0') then
if ( clk'event and clk = '1' and time/=0) then
time <= time - 1 ;
if ( time=1 ) then
state <="000";buzzer<= '1';
elsif ( time = temp ) then
case state is
when "111" =>state <= "110";temp <= 20;
when "110" =>state <= "100";temp <= 0;
when others =>temp <= 0 ;state <= "000";
end case;
3、译码和数码显示电路:
译码和数码显示电路是将计时状态直观清晰地反映出来,被人们的视觉器官所接受。
显示器件选用LED 七段数码管。
在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
首先,由于需要数码管的显示,又要实现单位为一秒钟的倒计时所以必要对于系统时钟的分频器。
基于上个学期进行的基础数字电路vhdl学习,分频器是十分基础的模块易于设计。
又因为需要通过两位数码管显示当前倒计时的时间,同时当前倒计时的时间是两位数所以利用倒计时时间TIME除以10可以得到时间的十位,再用其MOD十即可得到时间的个位,然后将要显示的数与七段数码管的七个管角相匹配,最后将这两个数分别赋给两个数码管并使两个数码管交替显示就实现了对于倒计时的译码电路,以下是译码和数码显示电路的简要代码:if (clock='1') then
ma<=time/10; cat<="111101";
else
ma<=time mod 10; cat<="111110";
end if;
p rocess (ma)
begin
case ma is
when 1 => q <= "0110000" ;
when 2 => q <= "1101101" ;
when 3 => q <= "1111001" ;
when 4 => q <= "0110011" ;
when 5 => q <= "1011011" ;
when 6 => q <= "1011111" ;
when 7 => q <= "1110000" ;
when 8 => q <= "1111111" ;
when 9 => q <= "1111011" ;
when others => q <= "1111110";
end case;
end process;
4、报警模块:
报警模块是洗衣机系统的最后一个模块,即任何一个洗衣状态执行完成后倒计时为零时,系统运行到“报警”状态,蜂鸣器将会报警,时间为5 秒。
其设计相对比较简单,只是需要加入一个蜂鸣器信号BUZZER,并且使其再TIME倒计时总时间为零时,提供一个上升沿信号即可。
五、器件清单
硬件:1.计算机;2.直流稳压电源;3.EDA 开发板及相应元器件。
软件:QuartusⅡ的相应版本。
六、遇到的情况
本次数字电路的设计实验是一次综合性实验,是对上学期数字电路实验知识的全方位考察,所以在实验的过程中不免遇到一些问题及故障。
下面对实验中所遇到的问题进行分析。
首先对于本试验的状态转换模块的设计一开始没有想到采用三位二进制数的表示方法,所以对于五种状态只是采用了一个十进制的变量,但采用后发现这种表示方法对于实现洗衣过程中的状态显示将变得十分困难,后来经过思考发现利用三位二进制数表示模式不但同样易于转换模式同时可以方便的用三个发光二极管显示洗衣状态。
第二点就是在仿真的过程中,虽然需要观察的几个波形都十分符合预期,但是其中几个波形的仿真图会出现个别的冒险。
尽管并不影响下载到EDA实验板上的显示效果,但并不十分完善。
第三点就是下载到EDA实验板上的问题,为了将数字显示到七段数码管上,需要将数字的七位译码连接到数码管的七个管角,但连接后发现数字显示完全错误,经过分析所显示出的错误图形的七位译码发现本EDA实验板的共阴数码管的七个管角与所译的七位码正好反接了,后经过调整即可正常显示
所需数字。
而且显示平稳,没有突出问题。
七、结语
本试验是一个极具综合性实验,目的是制作一个洗衣机控制器;任务主要是通过对于数字电路逻辑编程的使用,实现洗衣机的控制。
但是由于安排的问题,对过去的知识忘记得比较多,只能大量阅读相关资料,查找需要的知识。
时间紧、任务重、错误百出,让人比较紧张,希望以后能够安排早一些。
最后,还要感谢老师给予的大力协助和指导。
八、参考文献
①数字电路与逻辑设计实验北京邮电大学电路中心
②EDA实验和VHDL语言实践。