北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx

上传人:b****7 文档编号:25932232 上传时间:2023-06-16 格式:DOCX 页数:31 大小:117.92KB
下载 相关 举报
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx_第1页
第1页 / 共31页
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx_第2页
第2页 / 共31页
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx_第3页
第3页 / 共31页
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx_第4页
第4页 / 共31页
北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx

《北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx》由会员分享,可在线阅读,更多相关《北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx(31页珍藏版)》请在冰豆网上搜索。

北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告DOC.docx

北京邮电大学数字电路与逻辑设计洗衣机控制器实验报告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=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1