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