基于FPGA的洗衣机控制器的设计(共21页).doc
精选优质文档-倾情为你奉上湖南文理学院课程设计报告课程名称: 自动化专业课程设计 专业班级: 自动化 2班 学生姓名: 石 扬 指导教师: 彭 琛 完成时间: 报告成绩: 评阅意见: 评阅教师 日期 专心-专注-专业 基 于 F P G A 的 洗 衣 机 控 制 器 的 设 计 摘 要基于FPGA的洗衣机控制器设计,主要通过使用VerilogHDL语言,在Quartus2上完成电路设计以及程序开发模拟。实现以洗衣机控制器为核心,加上必要的外围电路,能够对洗衣机工作状态自由控制。全部程序由控制器模块,分频模块,按键去抖模块,显示译码模块组成,顶层模块使用原理图实现,底层由Verilog HDL语句实现。核心控制器FPGA根据控制端口的信号输入,向洗衣机发出正传,反转,待机信号,并通过数码管和LED灯显示当前的工作状态以及工作时间。该洗衣机控制电路可以方便快捷的实现对洗衣机的控制和状态的显示功能,同时具有紧急暂停待机功能,保证控制的可靠性,以及洗涤循环次数报警功能,提高任务精度。 目录 一、系统设计1、设计要求1洗衣机的状态为待机5s正转60s待机5s反转60s,并用3个LED灯和7段显示器分别表示其工作状态和显示相应工作状态下的时间。2可自行设定洗衣机的循环次数,这里设置最大的循环次数为15次。3具有紧急情况的处理功能。当发生紧急情况时,立即转入待机状态,紧急情况解除后,继续执行后续步骤;4洗衣机设定循环次数递减到零时立即报警,以表示洗衣机设定的循环次数已经结束。2、总体设计方案1、设计思路题目要求设计一个洗衣机控制电路,实现对洗衣机工作状态的控制。1. 中心控制模块基本实现要求功能,包括计时、LED输出、电机正反转信号输出、洗涤循环置数设置。2. 分频模块实现从高频向低频转换,供中心控制模块使用3按键去抖模块,实现对按键的去抖功能。4. 数码显示电路,将10进制时间通过数码管显示出来。2、系统组成洗衣机控制电路主要由中心控制模块、按键模块,显示模块,时钟分频模块,四部分组成组成。FPGA键盘模块(按键,拨码开关等)显示模块(数码管,LED灯等)晶体振荡模块(产生100Hz信号)报警功能系统结构框图 二、单元硬件电路设计1、按键模块设有1个按键:add;1个拨码开关start。add用于初始状态下设置循环次数,没按一次循环次数加一,start用于启动和停止洗衣机。2、显示模块 设有3个LED灯,两个数码管,一个蜂鸣器。LED灯用来表示当前状态,数码管用来表示当前状态所剩余时间。蜂鸣器用来表示洗衣是否完成,洗衣完成时蜂鸣器发出声音。3、中心控制模块中心控制模块是以一片altera公司的Cyclone2系列FPGA为主体,配合一些外围电路实现的。Cyclone2 系列FPGA采用全铜层、低K值、1.2伏SRAM工艺设计,裸片尺寸被尽可能最小的优化。采用300毫米晶圆,以TSMC成功的90nm工艺技术为基础,Cyclone II 器件提供了4,608到68,416个逻辑单元(LE),并具有一整套最佳的功能,包括嵌入式18比特x18比特乘法器、专用外部存储器接口电路、4kbit嵌入式存储器块、锁相环(PLL)和高速差分I/O能力。 三、软 件 设 计采用Quartus2作为开发工具对可编程逻辑器件FPGA的编程,底层由Verilog HDL语句实现,顶层使用原理图实现。软件设计由控制模块,分频模块,按键去抖模块,显示译码模块四部分组成,由于输入时钟为100 HZ,因此使用分频模块输出1HZ的方波,给控制模块提供每1s自加1的信号,控制模块输出的计数时间输入给数码管显示译码模块,通过译码模块定时器的值可以在数码管上显示,控制模块由此1hz的方波信号可以控制洗衣机的正转、反转、待机和报警工作方式。按键消抖模块的作用是为了消除按键抖动而设立的。1、控制模块程序设计控制模块采用有限状态机实现对洗衣机工作状态的控制。状态转换示意图s0: 待机状态 s1:正转状态 s2:待机状态 s3:反转状态软件流程图循环设置循环开始待机5秒正转60秒待机5秒反转60秒达到循环次数最大值循环结束循环次数未到报警开始2、显示译码程序设计数码管显示译码模块主要功能是把定时器送来的值译码并通过数码管显示出来。fpga的Verilog HDL硬件语言是并行的这有别于软件的描述语言扫描方式。3、按键去抖程序设计在进行独立按键或者矩阵式按键的设计的时候,我们在按下键盘的时候其实并不只是按下去而是有一个抖动的过程,就连松手的过程也有抖动,然而这个抖动通常被人们所忽略,从而导致输入数据的错误和乱码,因此我们必须对按键进行按键的消抖处理。fpga的Verilog HDL语言是硬件描述语言,主要运用了状态机和延时的消抖方式。4、分频模块程序设计该模块通过输入的clock信号(100HZ)分频后得到1HZ,供给中心控制模块,其余模块使用未分频的100HZ信号。 四、系统仿真测试1、控制模块仿真 顶层原理图设计 设置循环次数为3,按start后洗衣机开始工作。循环次数由3次减为2次,从电机反转到待机状态待机5秒后,电机正转,开始第二次循环当按下emergency紧急状况按钮计数器count保持不变,电机停止转动当emergency结束后电机恢复转动,洗衣机正常工作循环次数结束,count和times同时清零,洗衣机停止工作2、显示译码模块仿真3、分频模块仿真4.按键去抖模块仿真 五、心得体会经过2周的设计,通过不断地努力与完善,终于完成了这次的专业综合课程设计。从一开始的确定课题,到后来的资料查找、理论学习,这一切都使我的理论知识和动手能力进一步得到提高。在选择课题、原理分析、调试过程中不可避免地遇到各种问题,这要求保持沉着冷静,联系书本理论知识积极地思考,遇到解决不了的可以请教同学或指导老师,虽然在设计过程中不可避免地遇到很多问题,但是最后还是在老师以及同学的帮助下圆满解决了这些问题,实现了整个系统设计与最后调试,相关指标达到期望的要求,很好地完成了。经过这次课程设计培养了我的设计能力以及全面的考虑问题能力。虽然设计的过程是痛苦的但是收获成功的喜悦却是如此的让人激动。相信这次课程设计对我以后的学习及工作都会产生积极深远的影响。 另外。通过使用VerilogHDL语言编程实现了一个洗衣机控制器,实现了各项控制要求,该控制器操作简单,可用于实际的洗衣机控制器设计中。在Quartus2上完成电路设计以及程序开发模拟。实现以洗衣机控制器为核心,加上必要的外围电路,能够对洗衣机工作状态自由控制。全部程序由控制器模块,分频模块,按键去抖模块,显示译码模块组成,顶层模块使用原理图实现,底层由Verilog HDL语句实现。核心控制器FPGA根据控制端口的信号输入,向洗衣机发出正传,反转,待机信号,通过数码管和LED灯显示当前的工作状态以及工作时间。该洗衣机控制电路可以方便快捷的实现对洗衣机的控制和状态的显示功能,同时具有紧急暂停待机功能,保证控制的可靠性,以及洗涤循环次数报警功能,提高任务精度。 六、参考文献1、黑金开发板配套教程VerilogHDL那些事儿2、康华光主编电子技术基础数字部分(第五版)3、陈明义主编电子技术课程设计实用教程S 2002年05月第1版4、EDA先锋工作室设计与验证Verilog HDL 5、马建国.孟宪元编著FPGA现代数字系统设计 七、附录附录一:电路使用说明1.电路通电后,在start开关未闭合前可以通过add按键开关设置洗衣机洗涤循环次数(待机-正转-待机-反转,为一次循环)。2.设定循环次数以后,闭合start开关,洗衣机控制器开始工作。3.可以观察到指示待机LEDSTOP灯亮5s,正转LEDZHENG灯亮60S,待机LEDSTOP亮5s,反转LEDFAN灯亮60s,如此循环直至工作允许时间为0,报警器发出警报。4.当按下emergency紧急情况键时,电机停止工作,开始进入待机状态,同时LEDSTOP亮。附录二:电路原理图附录三:程序代码1.控制器模块程序module xiyiji(add,ledzheng,ledfan,ledstop,clk,zheng,fan,start,alram,emergency,count);input add,clk,start,emergency; /add循环次数,start洗衣机工作emergency紧急工作output ledzheng,ledfan,ledstop,zheng,fan,alram,count; /ledzheng正转ledfan反转,ledstop暂停alram警报,count计数reg ledzheng,ledfan,ledstop;reg zheng,fan;reg alram;reg 3:0tim,times;reg 9:0 counter;reg 7:0 count;reg 3:0 state;parameter s0=4'b0001;parameter s1=4'b0010;parameter s2=4'b0100;parameter s3=4'b1000; /4种工作状态always (posedge add) begin if(tim<15) /最大循环次数15次 tim<=tim+1'b1; else tim<=0; end always (posedge clk)begin if(start=0) /strart=0时,赋初值 begin zheng<=0; fan<=0; count<=8'b; times<=tim; alram<=1'b0; end else begin if(emergency=1) /紧急情况时,暂停 begin zheng<=1'b0; fan<=1'b0; ledstop<=1'b1; ledzheng<=1'b0; ledfan<=1'b0; end else case(state) s0:begin /状态s0开始 if(times=0) begin alram<=1'b1; count<=8'b; end else begin zheng<=0;fan<=0; ledzheng<=1'b0; ledfan<=1'b0; ledstop<=1'b1; if(count=8'b) /待机时间够5秒 begin state<=s1; /状态转换到s1 zheng<=1;fan<=0; ledzheng<=1'b1; ledfan<=1'b0; ledstop<=1'b0; count<=8'b; end else count<=count+1'b1; end end s1:begin /状态s1开始 zheng<=1;fan<=0; ledzheng<=1'b1; ledfan<=1'b0; ledstop<=1'b0; if(count=8'b) /正转够60秒 begin state<=s2; /切换到s2 zheng<=0;fan<=0; ledzheng<=1'b0; ledfan<=1'b0; ledstop<=1'b1; count<=8'b; end else count<=count+1'b1; end s2:begin /s2开始 zheng<=0;fan<=0; ledzheng<=1'b0; ledfan<=1'b0; ledstop<=1'b1; if(count=8'b) /待机时间够5秒 begin state<=s3; zheng<=0;fan<=1; ledzheng<=1'b0; ledfan<=1'b1; ledstop<=1'b0; count<=8'b; end else count<=count+1'b1; end s3:begin /s3开始 zheng<=0;fan<=1; ledzheng<=1'b0; ledfan<=1'b1; ledstop<=1'b0; if(count=8'b) /反转够60秒 begin times<=times-1'b1; count<=8'b; state<=s0; zheng<=0;fan<=0; ledzheng<=1'b0; ledfan<=1'b0; ledstop<=1'b1; end else count<=count+1'b1; if(times=1&&count=8'b) /如果循环次数结束,并且反转够60秒,则停止工作,报警 begin alram<=1'b1; count<=8'b; end end default: begin state<=s0; end endcase end endendmodule2.显示译码模块程序module shumaguan(qclock,code1,code2,discode,enable); input qclock; input 3:0code1,code2; output 6:0discode; output 1:0enable; reg 6:0discode; reg 1:0enable; reg 2:0count; reg 3:0code; always(posedge qclock) begin if(count=1) count<=0; else count<=count+1; case(count)3'b000: begin code<=code2;enable<=8'b10; end3'b001: begin code<=code1;enable<=8'b01; end endcase case(code)4'b0000:discode<=7'b;4'b0001:discode<=7'b;4'b0010:discode<=7'b;4'b0011:discode<=7'b;4'b0100:discode<=7'b;4'b0101:discode<=7'b;4'b0110:discode<=7'b;4'b0111:discode<=7'b;4'b1000:discode<=7'b;4'b1001:discode<=7'b;default:discode<=7'b; endcase endendmodule 3.按键去抖模块程序module qudou(keyin,keyout,clock); input clock,keyin; output keyout; reg keyout; reg 3:0count;always (posedge clock) begin if(keyin=1) begin count<=count+1'b1;if(count>=8) begin keyout<=1; count<=9; endelse keyout<=0; end else begin keyout<=0;count<=0; end endendmodule4.分频模块程序module fdiv100(clockin,clockout);input clockin;output clockout;reg clockout;reg7:0 count;always (posedge clockin) begin if(count=49) begin clockout=clockout; count<=0; end else count<=count+1'b1; endendmodule