北京邮电大学-数字电路与逻辑设计-洗衣机控制器实验报告模板_第1页
北京邮电大学-数字电路与逻辑设计-洗衣机控制器实验报告模板_第2页
北京邮电大学-数字电路与逻辑设计-洗衣机控制器实验报告模板_第3页
北京邮电大学-数字电路与逻辑设计-洗衣机控制器实验报告模板_第4页
北京邮电大学-数字电路与逻辑设计-洗衣机控制器实验报告模板_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学数字电路与逻辑设计实验题目:洗衣机控制器学院:信息与通信工程学院班级:学号:姓名:班内序号日期: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|101011010|100101101|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)、分频模块entitydivisport(clk:instd_logic;--1kHzclkout:outstd_logic--1Hz);enddiv;architecturediv_archofdivissignalt:std_logic;signalcount:integerrange0to499;beginprocess(clk)beginif(clk'eventandclk='1')thenif(count=499)--1000thencount<=0;t<=nott;elsecount<=count+1;endif;endif;endprocess;clkout<=t;end;

--

计数

500个周期分频(2)、按键模块entitybuttonisport(stateclk,pauseclk,startclk:instd_logic;--stateout:outstd_logic_vector(2downto0);pauseout,startout:outstd_logic--

--5

按键输入种模式输出暂停、开始输出);endbutton;architecturearchiofbuttonisbeginp1:process(stateclk)--5

种模式variablecout1:integerrange0to5;beginif(stateclk'eventandstateclk='1')thencout1:=cout1+1;if(cout1>5)thencout1:=cout1mod5;endif;endif;casecout1iswhen1=>stateout<="001";when2=>stateout<="010";when3=>stateout<="011";when4=>stateout<="100";when5=>stateout<="101";when0=>stateout<="000";endcase;endprocessp1;p2:process(pauseclk)--当有按键按下,暂停工作,再次按下连续工作variablecout2:integerrange0to1;beginif(pauseclk'eventandpauseclk='1')thencout2:=cout2+1;endif;if(cout2=1)thenpauseout<='1';elsepauseout<='0';endif;endprocessp2;p3:process(startclk)--按键按下开始工作variablecout3:integerrange0to1;beginif(startclk'eventandstartclk='1')thencout3:=cout3+1;endif;if(cout3=1)thenstartout<='1';elsestartout<='0';endif;endprocessp3;endarchi;(3)、防抖模块entitydoudongisport(clk,reset:instd_logic;resetn:outstd_logic

--clk--

为1kHz,reset防抖后的按键信号

为按键信号);enddoudong;architectureaofdoudongissignaltmp1,tmp2:std_logic;beginprocess(clk)beginif(clk'eventandclk='0')thentmp2<=tmp1;tmp1<=reset;endif;endprocess;resetn<=clkandtmp1and(nottmp2);enda;(4)、点阵显示entitydianzhenisport(clk_scan:instd_logic;--1kHzcondition:instd_logic_vector(2downto0);row:outstd_logic_vector(7downto0);col_R:outstd_logic_vector(7downto0);col_G:outstd_logic_vector(7downto0)

--5------

的时钟扫描频率个小状态输入行扫描列扫描(红色亮)列扫描(绿色亮));enddianzhen;architecturearc_dianzhenofdianzhenissignalscan_row:std_logic_vector(2downto0);

--

行扫描beginp1:process(clk_scan,condition)beginifclk_scan'eventandclk_scan='1'thencaseconditioniswhen"000"=>

--进水casescan_rowiswhen"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"thenscan_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"thenscan_row<="000";elsescan_row<=scan_row+1;endif;when"010"=>--漂洗casescan_rowiswhen"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"thenscan_row<="000";elsescan_row<=scan_row+1;endif;when"011"=>—-排水casescan_rowiswhen"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"thenscan_row<="000";elsescan_row<=scan_row+1;endif;when"100"=>--甩干casescan_rowiswhen"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"thenscan_row<="000";elsescan_row<=scan_row+1;endif;whenothers=>

-

-没有状态,不显示casescan_rowiswhen"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"thenscan_row<="000";elsescan_row<=scan_row+1;endif;endcase;endif;endprocessp1;endarc_dianzhen;5)、报警模块entityalarmisport(clk,alarmin:instd_logic;--clk为1kHz时钟频率,alarmin为报警输入alarmout:outstd_logic--报警输出,连续时间为5秒);endalarm;architectureaofalarmissignalcnt:integerrange0to4999;beginprocess(clk)beginifclk'eventandclk='1'thenifalarmin='1'thenif(cnt/=4999)then--5秒报警cnt<=cnt+1;alarmout<='1';elsealarmout<='0';endif;elsecnt<=0;alarmout<='0';endif;endif;endprocess;enda;(6)、数码管译码输出显示entityledshowisport(clk:instd_logic;shiwei,gewei:in

--1kHzstd_logic_vector(3downto0);--

扫描频率十位、个位二进制输入showout:outstd_logic_vector(6downto0);--数码管译码输出cat:outstd_logic_vector(5downto0)--控制数码管依次点亮);endledshow;architectureaofledshowissignalcnt:integerrange0to1;--控制个位、十位交替点亮beginprocess(clk,shiwei,gewei)beginif(clk'eventandclk='1')thencasecntiswhen0=>cat<="111101";cnt<=1;--第5个数码管显示十位caseshiweiiswhen"0000"=>showout<="1111110";--0when"0001"=>showout<="0110000";--1when"0010"=>showout<="1101101";--2when"0011"=>showout<="1111001";--3when"0100"=>showout<="0110011";--4when"0101"=>showout<="1011011";--5when"0110"=>showout<="1011111";--6when"0111"=>showout<="1110000";--7when"1000"=>showout<="1111111";--8when"1001"=>showout<="1111011";--9whenothers=>showout<="0000000";endcase;when1=>cat<="111110";cnt<=0;--第6个数码管显示个位casegeweiiswhen"0000"=>showout<="1111110";--0when"0001"=>showout<="0110000";--1when"0010"=>showout<="1101101";--2when"0011"=>showout<="1111001";--3when"0100"=>showout<="0110011";--4when"0101"=>showout<="1011011";--5when"0110"=>showout<="1011111";--6when"0111"=>showout<="1110000";--7when"1000"=>showout<="1111111";--8when"1001"=>showout<="1111011";--9whenothers=>showout<="0000000";endcase;endcase;endif;endprocess;enda;(7)、控制器entitycontrolisport(clk,pause,start:instd_logic;--1Hz时钟频率,开始、暂停输入state:instd_logic_vector(2downto0);--5种模式输入mode:outstd_logic_vector(2downto0);--3种大状态输出mode_mini:outstd_logic_vector(2downto0);--5种小状态输出time_gewei,time_shiwei:outstd_logic_vector(3downto0);--时间二进制输出alarm:outstd_logic--报警信号);endcontrol;architectureaofcontrolissignaltmp1:std_logic_vector(2downto0);--5种小状态signaltmp2:integerrange0to30;--倒计时signaltmp3:std_logic_vector(2downto0);--3种大状态signalpre_state:integerrange0to4;--转移状态signaltmp5:std_logic;--报警signalcnt:integerrange0to8;--报警输入beginp1:process(clk)beginif(clk'eventandclk='1')thenif(start='1')then--有开始信号,开始工作if(pause='0')then--无暂停if(tmp2=0)then--倒计时为0,判断新状态casepre_stateis--当前状态when0=>--当前处于开始状态ifstate="001"orstate="101"thenpre_state<=1;tmp2<=30;elsifstate<="011"thenpre_state<=3;tmp2<=15;elsifstate<="010"orstate<="100"thenpre_state<=2;tmp2<=25;endif;when1=>--当前处于洗衣状态ifstate="101"thenpre_state<=2;tmp2<=25;elsifstate<="001"thenpre_state<=4;tmp2<=0;tmp5<='1';alarm<=tmp5;endif;when2=>--当前处于漂洗状态ifstate="101"orstate="100"thenpre_state<=3;tmp2<=15;elsifstate<="010"thenpre_state<=4;tmp2<=0;tmp5<='1';alarm<=tmp5;endif;when3=>--当前处于脱水状态ifstate="011"orstate="100"orstate="101"thenpre_state<=4;tmp2<=0;tmp5<='1';alarm<=tmp5;endif;when4=>--当前处于结束状态tmp2<=0;tmp5<='1';alarm<=tmp5;if(tmp5='1')thenif(cnt<8)thencnt<=cnt+1;elsetmp5<='0';alarm<=tmp5;cnt<=0;endif;elseifstate="001"orstate="010"orstate="011"orstate="100"orstate="101"thenpre_state<=0;--结束洗衣后,判断可否有新状态endif;endif;endcase;endif;endif;if(tmp2/=0)then--tmp2<=tmp2-1;endif;

倒计时if(pause='1')then--

暂停pre_state<=pre_state;tmp2<=tmp2;endif;endif;endif;endprocess;p2:process(pre_state)begincasepre_stateis--将当前状态对应到相应when1=>tmp3<="001";--洗衣when2=>tmp3<="010";--漂洗when3=>tmp3<="100";--脱水whenothers=>tmp3<="000";endcase;mode<=tmp3;time_shiwei<=conv_std_logic_vector(tmp2/10,4);time_gewei<=conv_std_logic_vector(tmp2mod10,4);endprocess;

3个大状态--将十进制转为二进制p3:process(pre_state,tmp2)begincasepre_stateis--将每个状态对应到小状态when1=>if(tmp2>25)thentmp1<="000";--进水elsif(tmp2>10andtmp2<=25)thentmp1<="001";elsif(tmp2>5andtmp2<=10)thentmp1<="011";--冲洗elsif(tmp2>0andtmp2<=5)thentmp1<="100";--排水elsetmp1<="111";--甩干endif;when2=>if(tmp2>20)thentmp1<="000";--进水elsif(tmp2>10andtmp2<=20)thentmp1<="010";--漂洗elsif(tmp2>5andtmp2<=10)thentmp1<="011";--排水elsif(tmp2>0andtmp2<=5)thentmp1<="100";--甩干elsetmp1<="111";endif;when3=>if(tmp2>10)thentmp1<="011";--排水elsif(tmp2>0andtmp2<=10)thentmp1<="100";--甩干elsetmp1<="111";endif;whenothers=>tmp1<="111";endcase;mode_mini<=tmp1;endprocess;enda;顶层文件libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitylaundryisport(clk_main,state,pause,start:instd_logic;--mode_out:outstd_logic_vector(2downto0);--3

主时钟,模式、暂停、开始按键种状态输出,用发光二极管显示ledshow_out:outstd_logic_vector(6downto0);--cat_out:outstd_logic_vector(5downto0);--

数码管倒计时输出十位、个位交替点亮alarm_out:outstd_logic;--报警输出(连续row_out:outstd_logic_vector(7downto0);--col_R_out:outstd_logic_vector(7downto0);--col_G_out:outstd_logic_vector(7downto0));endlaundry;

5秒)行扫描列扫描(红色)—列扫描(绿色)architecturearch_laundryoflaundryiscomponentalarm--报警模块port(clk,alarmin:instd_logic;alarmout:outstd_logic);endcomponent;componentledshow--port(clk:instd_logic;

数码管译码输出模块shiwei,gewei:instd_logic_vector(3downto0);showout:outstd_logic_vector(6downto0);cat:outstd_logic_vector(5downto0));endcomponent;componentdoudong

--

防抖模块port(clk,reset:instd_logic;resetn:outstd_logic);endcomponent;componentdiv--port(clk:instd_logic;clkout:outstd_logic);endcomponent;

分频模块componentdianzhen

--

点阵模块port(clk_scan:instd_logic;condition:instd_logic_vector(2downto0);row:outstd_logic_vector(7downto0);col_R:outstd_logic_vector(7downto0);col_G:outstd_logic_vector(7downto0));endcomponent;componentcontrol--port(clk,pause,start:instd_logic;

控制器state:instd_logic_vector(2downto0);--5zhongmoshimode:outstd_logic_vector(2downto0);--3zhongzhuangtaimode_mini:outstd_logic_vector(2downto0);--5zhongxiaozhuangtaitime_gewei,time_shiwei:outstd_logic_vector(3downto0);alarm:outstd_logic);endcomponent;componentbutton--按键模块port(stateclk,pauseclk,startclk:instd_logic;stateout:outstd_logic_vector(2downto0);pauseout,startout:outstd_logic);endcomponent;signalclk11,cn1,cn2,cn3,cn4,cn5,cn6:std_logic;--连接线signalstate1,state2:std_logic_vector(2downto0);signalts,tg:std_logic_vector(3downto0);begin--各个模块连接u1:alarmportmap(clk=>clk_main,alarmin=>cn6,alarmout=>alarm_out);u2:ledshowportmap(clk=>clk_main,shiwei=>ts,gewei=>tg,showout=>ledshow_out,cat=>cat_out);u3:doudongportmap(clk=>clk_main,reset=>start,resetn=>cn3);u4:doudongportmap(clk=>clk_main,reset=>pause,resetn=>cn2);u5:doudongportmap(clk=>clk_main,reset=>state,resetn=>cn1);u6:divportmap(clk=>clk_main,clkout=>clk11);u7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论