欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    北邮数电实验 洗衣机控制器.docx

    • 资源ID:3339390       资源大小:48.79KB        全文页数:29页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    北邮数电实验 洗衣机控制器.docx

    北邮数电实验 洗衣机控制器数字电路与逻辑设计实验 基于CPLD 的简易洗衣机控制器的设计与实现 姓名 学院信息与通信工程学院 专业信息工程 班级 学号 班内序号 1 1. 实验任务要求 1.1. 基本要求: 洗衣机的工作步骤为洗涤、漂洗和脱水三个过程,工作时间分别为:洗涤30 秒,漂洗25 秒,脱水15 秒;掌握QuartusII图形模块单元的生成与调用。 用一个按键实现洗衣程序的手动选择:A、单洗涤;B、单漂洗;C、单脱水;D、漂洗和脱水;E、洗涤、漂洗和脱水全过程。 用发光二极管显示洗衣机的工作状态,并倒计时显示每个状态的工作时间,全部过程结束后,应有声音提示使用者,并保持在停止状态,直至再次开始。 用点阵动画显示洗衣机工作过程中进水、波轮或滚筒转动、排水和甩干等的工作情况,四种工作情况的动画显示要有区别且尽可能的形象。 用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前保留的状态。 1.2. 提高要求: 三个过程的时间有多个选项供使用者选择。 可以预约洗衣时间。 自拟其它功能。 2. 系统设计 2.1. 设计思路 按照实验要求,整个系统可按功能分为时钟分频、逻辑控制、按键功能、蜂鸣器报警、数码管显示、LED显示、点阵显示。设计思路是先完成分频和逻辑控制的基本功能,在此基础上加入按键控制、报警和几个显示功能。 2.1.1 输入部分: 设置了外部时钟,开始信号,暂停/继续信号,状态选择信号。 2.1.2 控制部分: 分频进程,将外部输入的50MHz时钟信号分频为1Hz和500Hz时钟信号,应用于倒计时计数和扫频; 逻辑控制进程,在符合前提条件的情况下,根据预置的状态对输入数据进行分析判断,对应相应过程的洗衣,并完成不同状态的转变,将改变的输出信号送至输出部分显示; 按键防抖动进程,避免在切换瞬间,因按键的来回弹跳对信号造成误操作; 按键状态控制进程,判断按键前一状态来确定下一状态。 2.1.3 输出部分: LED显示进程,显示当前选择的洗衣状态。 2 数码管计数扫频及显示进程,将各个洗衣状态对应的时间及倒计时情况进行显示; 点阵动画行扫描、计时及显示进程,根据不同的洗衣状态设计不同动画,并进行显示; 报警进程,通过判断本次洗衣过程是否结束来发出报警信号。 2.2. 总体框图 2.2.1 总体框图 2.2.2 MOS图 2.2.3流程图 3 开始接通电源选择模式否开始?是运行过程否继续?过程暂停是暂停?否是过程结束 否报警结束?是结束2.3.分块设计 2.3.1 分频进程 进程说明 分频程序由2个程序来实现,利用分频的思想,从50MHz经过分频模块,得到1Hz和500Hz的时钟信号,其中1Hz的时钟信号用于其他进程的计时,500Hz时钟信号用于数码管扫频、点阵行扫频、按键防抖等进程。 信号说明 clock:输入的时钟信号; clk:第一个进程分频后1Hz的时钟信号,每触发一次高电平时间为1秒; clk1:第二个进程分频后500Hz的时钟信号。 2.3.2逻辑控制进程 4 进程说明 为整个程序的主体,在输入拨码的高电平上升沿触发时,进行不同洗衣模式的切换;根据选择的洗衣模式,确定洗衣的时间。与led及点阵相关的代码是之后写进去的,为了逻辑思考的方便和减少代码量没有重新写进程。 长状态中三个分状态的切换,通过一个计时器、一个计数器和一个变量来完成。在倒计时开始后,变量记录下一个分状态的时间长,在状态切换时赋值给倒计时变量;同时,在倒计时开始后,点阵时间计数器开始计时,在小过程动画切换时间点,计数器计数,用于控制点阵显示进程。 LED显示的实现为直接把选择状态的二进制码进行赋值。 信号说明 clk: 1Hz时钟信号; start、pause: 作为前提判断条件; state:洗衣状态对应的二进制码; time:倒计时时间变量; temp:记录下一状态时间的变量; add:点阵计时变量; point:计数器,记录当前时间对应的动画状态。 2.3.3按键防抖进程 进程说明 按键防抖动模块负责暂停/继续按键的防抖动功能。按键是机械式开关结构,在开关切换的瞬间会在接触点出现来回弹跳的现象,这种弹跳现象可能造成误动作而影响到正确性,当按下按键一次然后松开后,实际产生的按键信号跳动了多次,经过取样信号的检查后将会造成误判。因此必须加上弹跳消除电路,避免误操作信号的发生。 以500Hz信号为时钟输入,变量m作为状态计数,当按键输入信号为高电平时,在时钟上升沿m加1,当m大于20时,即按键时间超过40ms时记为按键有效,把处理后信号赋值为高电平;否则按键无效,把处理后信号赋值为低电平。 信号说明 clk2:分频后500Hz时钟信号; pause_in:原始输入的按键信号; pause:输出的防抖动的按键信号; 2.3.4按键状态控制进程 进程说明 按键状态控制进程负责暂停/继续按键处理后的的电平状态切换。按键和拨码不同处在于松手后按键恢复低电平,因此要持续时间保持或改变电平状态,需要另写一进程进行控制。 使用变量pa作为0/1计数,开始洗衣后,在防抖处理后的信号的上升沿时进行判断,若pa为1则维持暂停,输出低电平信号,同时pa赋值0;若pa为0.说明此时状态为暂停,按键后应该继续洗衣,所以输出高电平信号,同时pa赋值0。输出的信号就是其他进程中使用的暂停/继续信号。 信号说明 start:开始信号; pause1:输入的防抖动按键信号; pause:输出的保持状态按键信号。 5 2.3.5数码管显示进程 进程说明 数码管显示选定洗衣状态的总时间以及倒计时的情况。六个七段数码管中选择了两个来显示秒数的十位和个位,实际上轮流点亮而非一起点亮,通过使用扫频时钟信号和计数器来完成扫描,因为扫描频率足够大,利用人眼效应会使人感觉两个数码管同时亮。 信号说明 clk2:分频后500Hz时钟信号; cnt:扫频计数器,直接控制cat5.0和t的切换; time:倒计时过程中的当前时间; cat5.0:数码管显示位,”111011”和”110111”随扫频信号反复切换; t:十位、个位要显示的数字,随扫频信号反复切换; distime4.0:表示6个数码管将要显示的数字。 2.3.6报警器进程 进程说明 使用1Hz信号时钟,在时钟上升沿判断当前状态,如果一个状态已结束,即state为”000”,则报警信号赋值为高电平,利用循环来限定蜂鸣器出响时间,出响时间即为计数器初值。 信号说明 clk: 1Hz时钟信号; state:选定的洗衣状态; alarm:报警输出信号,高电平为出响; alarmtime:计数器,控制报警出响时间; 2.3.7点阵进程 进程说明 负责显示不同洗衣过程对应的图案。 可选择的每个洗衣状态中包含进水、洗衣、漂洗、排水、甩干多个小过程,需要一个计数器控制每个小过程的时间,分析实验要求发现每个小过程的时间都是5秒的倍数,所以把每个小动画设计成5秒一个周期的循环动画。 与数码管显示同理,点阵的变化显示也需要通过扫频处理,需要设置专门的计数器负责扫行计数。通过计数器产生点阵扫描,对行信号轮流进行扫描,为高电平的列信号表示被扫描行中对应列二极管发光。当扫描频率足够大时,可以让人以为不同行的二极管同时点亮。 点阵的动画设计部分,设定了五种动画对应五个不同的小状态,设置变量记录当前时间对应的触发状态,进而控制点阵显示。 信号说明 clk: 1Hz时钟信号; start、pause、state:作为前提判断条件; periodtime:5s计时器,每个小过程的动画周期; runnum:扫行计数器; point:计数器,记录当前时间对应的动画状态; row7.0:点阵列变量; colorg7.0、colorr7.0:点阵列变量。 3. 仿真波形及波形分析 6 注:为方便仿真,我修改了频率,并把每个进程提取出来分别进行了仿真。 3.1 分频部分 3.1.1 仿真波形图 3.1.2 仿真使用代码 3.1.3仿真波形分析 进程p1分频系数为10,进程q2分频系数为20。关于count的IF语句描述了一个计数模值为10的计数器,该计数器每一个计数周期结束,信号clk翻转一次,这样信号clk的周期为时钟信号clock周期的10倍,实现了对clock的10分频。20分频同理。实际实验中使用的是50MHz和7 500Hz的分频。 3.2 状态转换部分 3.2.1 仿真波形图 3.2.2 仿真使用代码 3.2.3仿真波形分析 初始状态为“000”,当模式选择开关高电平的上升沿到来时,状态改变一次。输出的LED状态显示依次为 001、010、100、100、110、111、000。 3.3 按键部分 3.3.1 仿真波形图 8 3.3.2 仿真使用代码 3.3.3仿真波形分析 执行语句的条件为开始开关处于高电平,pause_in是输入的按键信号,当输入按键信号高电平持续时间大于3个时钟信号,输出pause1信号的为高电平,pause1信号才有效;否则,当输入按键信号高电平持续时间小于3个时钟信号,如第640ns之后的按键高电平信号,没有触发有效的pause1信号,即实现了防抖的功能。 第一个pause_in高电平信号之后,即pause1信号第一次置为高电平时,输出高电平的pause信号,进入暂停状态,此信号就是在其他进程中使用的最终信号;pause1信号第二次置为高电平时,输出低电平的pause信号,继续开始。 3.4数码管部分 3.4.1 仿真波形图 9 3.4.2 仿真使用代码 10 11 3.4.3仿真波形分析 以40秒模式为例。执行语句的条件为开始开关处于高电平,观察仿真波形可以看到扫频时钟信号每触发一次高电平,扫行信号cat在110111和111011之前切换一次。 clk为计时信号,clk2为扫频信号,频率做了修改以便于仿真。 为了方便观察,我把原代码中的distime变量的改为了distime_ge和distime_shi两个变量。distime_ge为数码管显示的个位,可以看到,以cat信号两次高电平为周期,distime_ge的值变化一次,为"1111011"、"1111111"、"1110000"、"1011111"、"1011011"、"0110011"、"1111001"、"1101101"、"0110000"、"1111110",即从9到0递减;distime_shi为数码管显示的十位,可以看到distime_shi先是显示"0110011",即最初的数字4,开始倒计时后显示"1111001",即数字3,在十个clk时钟信号后变成"1101101",即数字2。 3.5报警器部分 3.5.1 仿真波形图 3.5.2 仿真使用代码 12 3.5.3仿真波形分析 在state为“000”,即结束状态时,alarm为高电平,时间为4个时钟信号的长度,即蜂鸣器发出了4秒声响。state为其他值是alarm均为低电平。 在时钟上升沿判断,当state为“000”时,进入计数循环,变量值从0累加到4时以后赋给alarm高电平。 3.6点阵时间分配部分 3.6.1 仿真波形图 3.6.2 仿真使用代码 3.6.3仿真波形分析 执行语句的条件为开始开关处于高电平,在每个时钟信号上升沿计数,add累加1,在动13 画切换时间点,比如add=5时,把动画对应的触发状态赋给变量point,在点阵动画设计进程中把point作为判断条件,使用case语句判断要调用的动画语句。 仿真波形以state为“100”为例,为了便于仿真把point用二进制信号表示。 3.7点阵动画设计部分 3.7.1 仿真波形图 3.7.2 仿真使用代码 3.7.3仿真波形分析 开始开关处于高电平时,当时钟信号clk处于上升沿时,periodtime累加1,即为周期为5的计数器。行变量row中“1”表示点阵的对应行点亮, “0”表示对应行不亮。color两个变量表示点阵的列,“1”表示对应列点亮, “0”表示对应列不亮。 以进水动画为例,计数器每加1,行变量row、两个不同颜色的列变量colorg和colorr改变一次状态,改变的显示即为程序中的设定值。 4. 源代码 14 library ieee; use ieee.std_logic_1164.all; entity washerzy is port( clock: in std_logic; -时钟 start: in std_logic; -开始 pause_in: in std_logic; -暂停和继续 change: in std_logic; -选择状态 alarm: out std_logic; -报警 dismode: out std_logic_vector(2 downto 0); -led显示状态 distime: out std_logic_vector(6 downto 0); -数码管显示数 cat: out std_logic_vector(5 downto 0); -数码管显示位 row: out std_logic_vector(7 downto 0); -点阵行 colorg: out std_logic_vector(7 downto 0); -颜色一 colorr: out std_logic_vector(7 downto 0) -颜色二 ); end washerzy ; architecture total of washerzy is signal count: integer range 0 to 24999999; -分频计数 signal clk: std_logic; signal clk_count: integer range 0 to 49999; signal clk2: std_logic; signal mode: std_logic_vector(2 downto 0); -选择模式 signal state: std_logic_vector(2 downto 0); -当前状态 signal temp: integer range 0 to 40; -状态转换替换时间 signal time: integer range 0 to 70; -倒计时 signal add: integer range 0 to 70:=0; -点阵计时 signal point: integer range 0 to 5:=0; -点阵动画状态 signal unit: integer range 0 to 9; -数码管显示数字 signal cnt: integer range 0 to 1; -数码管扫频显示两数字计数 signal timecount:integer range 4 downto 0; -报警器出响时间 signal rownum:integer range 0 to 7; -点阵扫频频率变化 signal periodtime:integer range 0 to 4; -点阵 1hz变化 signal pause: std_logic; -按键状态处理后 signal pause1: std_logic; -防抖处理后 begin fenpin1:process (clock) -1s begin if (clock'event and clock = '1') then if (count=24999999) then count<=0; 15 clk<=not clk; else count<=count+1; end if; end if; end process fenpin1; fenpin2:process(clock) -扫频用 begin if (clock'event and clock = '1') then if (clk_count=49999) then clk_count<=0; clk2<=not clk2; else clk_count<=clk_count+1; end if; end if; end process fenpin2; controlst:process (start,clk,pause,change,state) begin if (start='0') then add<=0; 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; case state is when "001"=>temp<=0; -洗衣(进水5,洗衣15,排水5,甩干5) time<=30; when "010"=>temp<=0; -漂洗(进水5,漂洗10,排水5,甩干5) time<=25; when "100"=>temp<=0; -脱水(排水5,甩干10) time<=15; when "110"=>temp<=15; -漂洗和脱水 time<=40; when "111"=>temp<=40; -洗衣,漂洗和脱水全过程 time<=70; when "000"=>temp<=0; 16 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; add<=add+1; if (time=1)then -完成本过程后当前状态归零 state<="000" add<=0; point<=0; elsif (time=temp) then case state is when "111"=>state<="110" -洗涤结束,开始漂洗 temp<=15; when "100"=>state<="100" -微调.漂洗结束,开始脱水 temp<=0; when others=>temp<=0; state<="000" end case; elsif(time=temp+1)then case state is when "111"=>add<=0; when "110"=>add<=0; state<="100" when others=> add<=add; end case; end if; case state is when "100" => case add is - point对应动画:1进水,2漂洗,3洗衣,4排水,5甩干 when 0 => point<=4; when 1 => point<=4; when 5 => point<=5; when 15 => point<=0; when others => point<=point; end case; when "010" => case add is when 0 => point<=1; when 5 => point<=3; when 15 => point<=4; when 20 => point<=5; 17 when 25 => point<=0; when others => point<=point; end case; when "110" => case add is when 0 => point<=1; when 1 => point<=1; when 5 => point<=3; when 15 => point<=4; when 20 => point<=5; when others => point<=point; end case; when "001" => case add is when 0 => point<=1; when 5 => point<=2; when 20 => point<=4; when 25 => point<=5; when 30 => point<=0; when others => point<=point; end case; when "111" => case add is when 0 => point<=1; when 5 => point<=2; when 20 => point<=4; when 25 => point<=5; when others => point<=point; end case; when others => point<=0; end case; end if; end if; end if; dismode <=state; end process controlst; shuma:process (clk2,cnt,time,unit) begin if (clk2'event and clk2='1')then if cnt=1 then -数码管扫频计数 cnt<=0; else cnt<=cnt+1; end if; end if; case cnt is 18 when 0=>cat<="111011"unit<=time mod 10; -个位 when 1=>cat<="110111"unit<=time/10; -十位 when others=>cat<="111111" end case; case unit is -数码管示数 when 1=>distime<="0110000" when 2=>distime<="1101101" when 3=>distime<="1111001" when 4=>distime<="0110011" when 5=>distime<="1011011" when 6=>distime<="1011111" when 7=>distime<="1110000" when 8=>distime<="1111111" when 9=>distime<="1111011" when others=>distime<="1111110" end case; end process shuma; alarmclock:process(state,clk) begin if (clk'event and clk='1') then -报警器 case state is when "000" =>alarm<='1' if (timecount = 0)then alarm <='0' else timecount<=timecount-1; end if; when others => alarm <='0' timecount<=4; -出响时间 end case; end if; end process alarmclock; pddianzhen:process (clk,pause,start,state) begin if(start='1') then if(pause='0') then if(state/="000") then if(clk' event and clk='1') then if periodtime=4 then -点阵动画每个画面计时(1s) periodtime<=0; else periodtime<=periodtime+1; 19 end if; end if; end if; end if; else periodtime<=0; end if; end process pddianzhen; saohang:process(pause,clk2,start,state) -扫行 begin if(start='1') then if(pause='0') then if(state/="000")then if(clk2' event and clk2='1') then if rownum=7 then rownum<=0; else rownum<=rownum+1; end if; end if; end if; end if; else rownum<=0; end if; end process saohang; dianzhen:process(point,pause,periodtime,rownum) -点阵动画的设计 begin if(start='1') then if(pause='0') then case point is when 1 =>case periodtime is -进水 when 0 =>row<="00000000" colorg<="01010101"colorr<="10101010" when 1 =>row<="11111110" colorg<="01010101"colorr<="10101010" when 2 =>row<="11111100" colorg<="01010101"colorr<="10101010" when 3 =>row<="11110000" colorg<="01010101"colorr<="10101010" when 4 =>row<="11000000" colorg<="01010101"colorr<="10101010" when others =>row<="00000000" colorg<="00000000"colorr<="11111111" end case; when 2 =>case periodtime is -漂洗 when 1 =>case rownum is when 0=>row<="11111110" colorg<="11111111"colorr<="00000000" when 1=>row<="11111101" colorg<="10001001"colorr<="00000000" when 2=>row<="11111011" colorg<="10001001"colorr<="00000000" 20 when 3=>row<="11110111" colorg<="10001001"colorr<="01110000" when 4=>row<="11101111" colorg<="10010001"colorr<="00001110" when 5=>row<="11011111" colorg<="10010001"colorr<="00000000" when 6=>row<="10111111" colorg<="10010001"colorr<="00000000" when 7=>row<="01111111" colorg<="11111111"colorr<="00000000" end case; when 2 =>case rownum is when 0=>row<="11111110" colorg<="11111111"colorr<="00000000" when 1=>row<="11111101" colorg<="10000011"colorr<="01000000" when 2=>row<="11111011" colorg<="10000101"colorr<="00100000" when 3=>row<="11110111" colorg<="10001001"colorr<="00010000" when 4=>row<="11101111" colorg<="10010001"colorr<="00001000" when 5=>row<="11011111" colorg<="10100001"colorr<="00000100" when 6=>row<="10111111" colorg<="11000001"colorr<="00000010" when 7=>row<="01111111" colorg<="11111111"colorr<="00000000" end case; when 3 =>case rownum is when 0=>row<="11111110" colorg<="11111111"colorr<="00000000" when 1=>row<="11111101" colorg<="10000001"colorr<="00001000" when 2=>row<="11111011" colorg<="10000001"colorr<="00001000" when 3=>row<="11110111" colorg<="11110001"colorr<="00001000" when 4=>row<="11101111" colorg<="10001111"colorr<="00010000" when 5=>row<="11011111" colorg<="10000001"colorr<="00010000" when 6=>row<="10111111" colorg<="10000001"colorr<="00010000" when 7=>row<="01111111" colorg<="11111111"colorr<="00000000" end case; when 4 =>case rownum is when 0=>row<="11111110" colorg<="11111111"colorr<="00000000" when 1=>row<="11111101" colorg<="11000001"colorr<="00000010" when 2=>row<="11111011" colorg<="10100001"colorr<="00000100" when 3=>row<="11110111" colorg<="10010001"colorr<="00001000" when 4=>row<="11101111" colorg<="10001001"colorr<="00010000" when 5=>row<="11011111" colorg<="10000101"colorr<="00100000" when 6=>row<="10111111" colorg<="10000011"colorr<="01000000" when 7=>row<="01111111" colorg<="11111111"colorr<="00000000" end case; when others =>row<="11111111" colorg<="00000000"colorr<="00000000" end case; when 3 =>case periodtime is -洗衣 when 1 =>case rownum is when 0=>row<="11111110" colorg<="00001000"colorr<="00000000" when 1=>row<="11111101" colorg<="00001000"colorr<="00000000" when 2=>row<="11111011" colorg<="00001000"colorr<="00000000"

    注意事项

    本文(北邮数电实验 洗衣机控制器.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开