北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx
《北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx》由会员分享,可在线阅读,更多相关《北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx(31页珍藏版)》请在冰豆网上搜索。
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC
北京邮电大学
数字电路与逻辑设计实验
题目:
洗衣机控制器
学院:
信息与通信工程学院
班级:
学号:
姓名:
班内序号日期:
2015年11月5日
一、设计课题的任务要求:
(1)实验目的:
1、熟练掌握VHDL语言和QuartusII软件的使用;
2、理解状态机的工作原理和设计方法;
3、掌握利用EDA工具进行自顶向下的电子系统设计方法;
(2)实验内容:
基本要求:
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、自拟其它功能。
二、系统设计:
(1)设计思路和分块设计:
实验的目的是模仿洗衣机的功能,设计出洗衣机控制器。
包括开关控制,工作暂停,工作模式的选择,工作状态的显示,倒计时工作时间并显示和工作结束报警等功能。
将整个控制器分为7个小模块,分别是分频模块、按键模块、控制器、防抖模块、报警模块、点阵显示和数码管译码输出显示,再将各个模块连接起来,实现洗衣机控制器功能。
分频模块:
选取主时钟频率为1kHz,为了使倒计时输出为1s的时间周期,需要将主频率进行1kHz分频,使得到的频率为1Hz,输入给控制器的时钟。
按键模块:
有模式选择、暂停和开始3个按键,模式选择可以选择5种洗衣模式,当开始按键按下并且有模式输入时,洗衣机开始工作。
当暂停按键按下时,洗衣机暂停工作并保持当前工作状态。
防抖模块:
按键经过防抖后,可以输出时钟,去除了毛刺即抖动时钟。
报警模块:
时钟输入为1kHz,当洗衣结束后,报警模块接收到控制器给它的输入信号,会以1000Hz的频率报警,(由于人耳能听到的频率为20-20000Hz)持续5秒后停止。
点阵显示:
以1kHz的频率进行扫描,点阵上可以显示稳定的图案,在洗衣过程中分别显示进水、洗衣、漂洗、脱水和甩干5个小状态。
数码管译码输出显示:
控制器将倒计时十位和个位输出到译码器,译码电路分别显示十位和个位,扫描频率为1kHz,数码管可以稳定显示。
控制器:
控制器是整个电路的核心模块,控制各个模块的连接。
时钟频率为1Hz,输出为3个大状态(洗衣、漂洗、脱水),用发光二极管显示,5个小状态,十位个位输出和报警输出。
用状态转移控制各个过程的转换,控制各个小状态的转换,完成各个功能显示的连接。
(2)总体框图:
系统框图
分频模块
clk
数码管译码输出显示
点阵显示
控制器
防抖模块
报警模块
按键模块
状态转移图
开始
001|101011
漂洗
010|100
101101|101
洗衣
脱水
001010011|101|100
结束
ASM图
开始
输入状态
否
状态是否为0
开始按键输入
是
否
是否开始
倒计时时间显示
否是
点阵显示(5种小状态)
是否暂停
倒计时
二极管显示(3种大状态)
暂停
时间是否为0
是是否
是否继续
是
报警
是否有新状态
否
结束
是
结束
否
三、仿真波形及波形分析
分频模块:
clk为1000Hz的时钟,输出clkout为分频后的时钟,频率为1Hz。
防抖模块:
输入reset信号有抖动,输出resetn为无抖动的时钟。
按键模块:
输入pauseclk、startclk、stateclk分别为暂停、开始、模式输入按键,当按下暂停按键时,暂停输出pauseout变为高电平,洗衣机工作状态保持不变;
当按下开始按键时,输出startout变为高电平,洗衣机开始工作;当按下模式按键时,可以选择5种工作模式,输出对应5种模式。
报警模块:
时钟clk为1000Hz,为蜂鸣器工作频率,当输入信号alarmin为高电平时,输出alarmout变为高电平,维持5秒后变为低电平,结束报警。
数码管译码输出显示:
clk为1kHz的扫描频率,gewei、shiwei分别为个位、十位输入,showout为数码管译码输出,十位个位交替显示,cat控制数码管的点亮,分别显示十位和个位输出。
控制器:
时钟clk为1Hz,输入按键信号pause(暂停)、start(开始),洗衣工作模式state,输出mode为洗衣、漂洗、脱水三个大状态,输出mode_mini为进水、洗衣、漂洗、排水、甩干五个小状态,输出time_gewei、time_shiwei为个位、十位转换为二经制的输出,alarm为报警输出,当洗衣结束输出高电平。
四、源程序
(1)、分频模块
entitydivis
port(
clk:
instd_logic;--1kHz
clkout:
outstd_logic--1Hz
);
enddiv;
architecturediv_archofdivis
signalt:
std_logic;
signalcount:
integerrange0to499;--计数500个周期
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(count=499)--1000分频
thencount<=0;
t<=nott;
else
count<=count+1;
endif;
endif;
endprocess;
clkout<=t;
end;
(2)、按键模块
entitybuttonis
port
(
stateclk,pauseclk,startclk:
instd_logic;--按键输入
stateout:
outstd_logic_vector(2downto0);--5种模式输出
pauseout,startout:
outstd_logic--暂停、开始输出
);
endbutton;
architecturearchiofbuttonis
begin
p1:
process(stateclk)--5种模式
variablecout1:
integerrange0to5;
begin
if(stateclk'eventandstateclk='1')then
cout1:
=cout1+1;
if(cout1>5)then
cout1:
=cout1mod5;
endif;
endif;
casecout1is
when1=>stateout<="001";
when2=>stateout<="010";
when3=>stateout<="011";
when4=>stateout<="100";
when5=>stateout<="101";
when0=>stateout<="000";
endcase;
endprocessp1;
p2:
process(pauseclk)--当有按键按下,暂停工作,再次按下继续工作
variablecout2:
integerrange0to1;
begin
if(pauseclk'eventandpauseclk='1')then
cout2:
=cout2+1;
endif;
if(cout2=1)then
pauseout<='1';
else
pauseout<='0';
endif;
endprocessp2;
p3:
process(startclk)--按键按下开始工作
variablecout3:
integerrange0to1;
begin
if(startclk'eventandstartclk='1')then
cout3:
=cout3+1;
endif;
if(cout3=1)then
startout<='1';
else
startout<='0';
endif;
endprocessp3;
endarchi;
(3)、防抖模块
entitydoudongis
port
(
clk,reset:
instd_logic;--clk为1kHz,reset为按键信号
resetn:
outstd_logic--防抖后的按键信号
);
enddoudong;
architectureaofdoudongis
signaltmp1,tmp2:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='0')then
tmp2<=tmp1;
tmp1<=reset;
endif;
endprocess;
resetn<=clkandtmp1and(nottmp2);
enda;
(4)、点阵显示
entitydianzhenis
port(
clk_scan:
instd_logic;--1kHz的时钟扫描频率
condition:
instd_logic_vector(2downto0);--5个小状态输入
row:
outstd_logic_vector(7downto0);--行扫描
col_R:
outstd_logic_vector(7downto0);--列扫描(红色亮)
col_G:
outstd_logic_vector(7downto0)--列扫描(绿色亮)
);
enddianzhen;
architecturearc_dianzhenofdianzhenis
signalscan_row:
std_logic_vector(2downto0);--行扫描
begin
p1:
process(clk_scan,condition)
begin
ifclk_scan'eventandclk_scan='1'then
caseconditionis
when"000"=>--进水
casescan_rowis
when"000"=>
row<="10111111";col_R<="01111110";col_G<="01111110";
when"001"=>
row<="11011111";col_R<="01000010";col_G<="01000010";
when"010"=>
row<="11101111";col_R<="01000010";col_G<="11100010";
when"011"=>
row<="11110111";col_R<="01000010";col_G<="11010010";
when"100"=>
row<="11111011";col_R<="01000010";col_G<="01001010";
when"101"=>
row<="11111101";col_R<="01111110";col_G<="01111110";
whenothers=>
row<="11111111";col_R<="00000000";col_G<="00000000";
endcase;
ifscan_row="110"orscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
when"001"=>
casescan_rowis--洗衣
when"000"=>
row<="10111111";col_R<="01111110";col_G<="01111110";
when"001"=>
row<="11011111";col_R<="01011010";col_G<="01000010";
when"010"=>
row<="11101111";col_R<="01100110";col_G<="01000010";
when"011"=>
row<="11110111";col_R<="01100110";col_G<="01000010";
when"100"=>
row<="11111011";col_R<="01011010";col_G<="01000010";
when"101"=>
row<="11111101";col_R<="01111110";col_G<="01111110";
whenothers=>
row<="11111111";col_R<="00000000";col_G<="00000000";
endcase;
ifscan_row="110"orscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
when"010"=>--漂洗
casescan_rowis
when"000"=>
row<="10111111";col_R<="01111110";col_G<="01111110";
when"001"=>
row<="11011111";col_R<="01000010";col_G<="01011010";
when"010"=>
row<="11101111";col_R<="01000010";col_G<="01100110";
when"011"=>
row<="11110111";col_R<="01000010";col_G<="01000010";
when"100"=>
row<="11111011";col_R<="01000010";col_G<="01011010";
when"101"=>
row<="11111101";col_R<="01111110";col_G<="01111110";
whenothers=>
row<="11111111";col_R<="00000000";col_G<="00000000";
endcase;
ifscan_row="110"orscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
when"011"=>—-排水
casescan_rowis
when"000"=>
row<="10111111";col_R<="01111110";col_G<="11111110";
when"001"=>
row<="11011111";col_R<="01000010";col_G<="11000010";
when"010"=>
row<="11101111";col_R<="01000010";col_G<="11000010";
when"011"=>
row<="11110111";col_R<="01000010";col_G<="11000010";
when"100"=>
row<="11111011";col_R<="01000010";col_G<="11111010";
when"101"=>
row<="11111101";col_R<="01111110";col_G<="01111110";
whenothers=>
row<="11111111";col_R<="00000000";col_G<="00000000";
endcase;
ifscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
when"100"=>--甩干
casescan_rowis
when"000"=>
row<="10111111";col_R<="10010000";col_G<="00000000";
when"001"=>
row<="11011111";col_R<="01010000";col_G<="00000000";
when"010"=>
row<="11101111";col_R<="00110000";col_G<="00000110";
when"011"=>
row<="11110111";col_R<="00010000";col_G<="00001001";
when"100"=>
row<="11111011";col_R<="00110000";col_G<="00001001";
when"101"=>
row<="11111101";col_R<="01010000";col_G<="00000110";
when"110"=>
row<="11111110";col_R<="10010000";col_G<="00000000";
when"111"=>
row<="01111111";col_R<="00010000";col_G<="00000000";
endcase;
ifscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
whenothers=>--没有状态,不显示
casescan_rowis
when"000"=>
row<="10111111";col_R<="00000000";col_G<="00000000";
when"001"=>
row<="11011111";col_R<="00000000";col_G<="00000000";
when"010"=>
row<="11101111";col_R<="00000000";col_G<="00000000";
when"011"=>
row<="11110111";col_R<="00000000";col_G<="00000000";
when"100"=>
row<="11111011";col_R<="00000000";col_G<="00000000";
when"101"=>
row<="11111101";col_R<="00000000";col_G<="00000000";
when"110"=>
row<="11111110";col_R<="00000000";col_G<="00000000";
when"111"=>
row<="01111111";col_R<="00000000";col_G<="00000000";
endcase;
ifscan_row="111"then
scan_row<="000";
elsescan_row<=scan_row+1;
endif;
endcase;
endif;
endprocessp1;
endarc_dianzhen;
(5)、报警模块
entityalarmis
port
(
clk,alarmin:
instd_logic;--clk为1kHz时钟频率,alarmin为报警输入
alarmout:
outstd_logic--报警输出,持续时间为5秒
);
endalarm;
architectureaofalarmis
signalcnt:
integerrange0to4999;
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifalarmin='1'then
if(cnt/=4999)then--5秒报警
cnt<=cnt+1;alarmout<='1';
elsealarmout<='0';
endif;
elsecnt<=0;alarmout<='0';
endif;
endif;
endprocess;
enda;
(6)、数码管译码输出显示
entityledshowis
port
(
clk:
instd_logic;--1kHz扫描频率
shiwei,gewei:
instd_logic_vector(3downto0);--十位、个位二进制输入
showout:
outstd_logic_vector(6downto0);--数码管译码输出
cat:
outstd_logic_vector(5downto0)--控制数码管依次点亮
);
endledshow;
architectureaofledshowis
signalcnt:
integerrange0to1;--控制个位、十位交替点亮
begin
process(clk,shiwei,gewei)
begin
if(clk'eventandclk='1')then
casecntis
when0=