基于FPGA的洗衣机控制器 verilog hdl 语言描述.docx
《基于FPGA的洗衣机控制器 verilog hdl 语言描述.docx》由会员分享,可在线阅读,更多相关《基于FPGA的洗衣机控制器 verilog hdl 语言描述.docx(17页珍藏版)》请在冰豆网上搜索。
基于FPGA的洗衣机控制器veriloghdl语言描述
编号:
1
电机控制综合课程设计
报告书
课题:
基于FPGA的洗衣机控制器
院(系):
机电工程学院
专业:
电气工程及其自动化
学生姓名:
蒋岷君
学号:
0800120313
题目类型:
理论研究实验研究工程设计工程技术研究软件开发
2011年7月6日
前言
一、洗衣机控制器主要内容
l.任务要求和内容
设计制作一个洗衣机的正反转定时控制线路。
1)控制洗衣机的电机作如下运转
定时开始――正转10S――暂停5S――反转10S――暂停5S――定时到停止
定时未到
2)用2位七段数码管显示定时时间(S)。
2.洗衣机控制器的使用步骤:
(1)电路上电后,在Start拨码开关未闭合前可以由UpKey和DownKey按键开关“+”“-”设置总的工作时间,确定洗衣机控制器工作允许时间。
(2)设定好允许工作时间后,闭合Start开关,洗衣机控制器开始工作。
(3)可以看见指示正转LED灯亮10s,停转LED灯亮5S,反转LED灯亮10s,停转LED亮5s,如此反复直至工作允许时间为0,蜂鸣器发出警报。
二、设计原理简介
洗衣机控制器的设计主要是时序控制和定时器的设计,由一片FPGA和外围电路构成电器控制部分。
FPGA接收键盘的控制命令,控制洗衣机的正转、反转、停机和定时时间为0报警的工作状态、控制并显示工作状态以及显示定时时间。
对FPGA芯片的编程采用模块化的VerilogHDL(硬件描述语言)进行设计,设计由分频模块,按键消抖模块,定时时间自减模块,时序中心控制模块,数码管显示模块组成,顶层实现整个芯片的功能。
顶层使用原理图实现,底层由VerilogHDL语句实现。
FPGA的输入时钟为20Mhz,因此使用了分频模块输出1hz的方波给定时器设定自减模块提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块和时序控制模块,通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。
通过按键消抖模块可以准确无抖动的设定定时器的工作时间。
一、前言···········································2
二、目录·········································3
三、正文··········································4
3.1洗衣机控制器的整体框图及原理············4
3.2洗衣机控制电路单元模块设计和仿真········5
3.2.1按键消抖模块的设计················5
3.2.2时钟分频模块的设计················6
3.2.3定时器设定和自减模块的设计·········7
3.2.4时序中心控制模块的设计·············8
3.2.5数码管显示译码模块的设计···········9
四、电路调试···································11
五、结束语和心得体会····························12
六、参考文献··································13
七、附录······································13
7.1FPGA系统板部分原理图···················13
7.2FPGA系统板PCB图······················15
三、正文
3.1洗衣机控制器的整体框图及原理:
基于fpga的洗衣机控制器电路主要由五大模块组成,分别为按键消抖模块,时钟分频模块,定时器设定和自减模块,时序中心控制模块,数码管显示译码模块。
具体电路如图1所示:
图1
由于输入时钟为20Mhz,因此使用了分频模块输出1hz的方波(中间上方模块)给定时器设定和自减模块(中间下方模块)提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块(右下方模块)和时序控制模块(右上模块),通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。
按键消抖模块(左下方模块)的作用是为了消除按键抖动而设立的。
3.2、洗衣机控制电路单元模块设计和仿真
3.2.1按键消抖模块的设计
在进行独立按键或者矩阵式按键的设计的时候,我们在按下键盘的时候其实并不只是按下去而是有一个抖动的过程,就连松手的过程也有抖动,然而这个抖动通常被人们所忽略,从而导致输入数据的错误和乱码,因此我们必须对按键进行按键的消抖处理。
我们通常在单片机的消抖使用的是延时消抖,这种消抖也称为软件消抖,但是fpga的VerilogHDL语言是硬件描述语言,所以也称作硬件消抖,主要运用了状态机和延时的消抖方式。
按键消抖模块图如图2:
图2
其VerilogHDL语言描述如下:
moduleKey_module(Key_in,Key_out,Clk,Rst);
inputClk,Rst,Key_in;
outputKey_out;
regReset;regH_L_f1;regH_L_f2;regH_L_f3;
regH_L_f4;reg[17:
0]Count;wireH_L_sig;
parameterDelay10ms='d200_000;
always@(posedgeClk)//异步复位同步释放
beginReset<=Rst;end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginH_L_f1<=1;H_L_f2<=1;end
elsebeginH_L_f1<=Key_in;H_L_f2<=H_L_f1;end
end
assignH_L_sig=H_L_f2&(~H_L_f1);//延时的启动标志位
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginCount<=0;end
elseif(Count==Delay10ms)beginCount<=0;end
elseif(H_L_sig)beginCount<=0;end
elsebeginCount<=Count+1;end
end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginH_L_f3<=1;end
elseif(Count==Delay10ms)beginH_L_f3<=Key_in;end
end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginH_L_f4<=1;end
elsebeginH_L_f4<=H_L_f3;end
end
assignKey_out=H_L_f4&(~H_L_f3);
endmodule
3.2.2时钟分频模块的设计
由于使用的FPGA的输入时钟是20Mhz,定时模块的自减频率是1hz,因此需要进行分频得到1hz的时钟频率输入给定时模块。
时钟分频模块图如图3:
时钟分频模块功能仿真图如图4:
图3图4
其VerilogHDL语言描述如下:
moduleFrequencyDivider(Clk,Rst,ClkOut);
inputClk,Rst;outputClkOut;
reg[23:
0]Count;regOutData;regReset;
always@(posedgeClk)//异步复位同步释放
beginReset<=Rst;end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginCount<=0;OutData<=0;end
elseif(Count==24'd10_000_000)beginCount<=0;
OutData<=~OutData;end
elsebeginCount<=Count+1'd1;end
end
assignClkOut=OutData;
endmodule
3.2.3定时器设定和自减模块的设计
定时器设定和自减模块可以设定定时器的工作时间,通过输入的1hz的信号使定时器的值每秒自减1,直至为0。
其定时器的值输出给数码管译码模块和时序控制模块。
定时器设定和自减模块图如图5;定时器设定和自减模块功能仿真图如图6:
图5
图6
其VerilogHDL语言描述如下:
moduleKeySet(Clk,Clk_1hz,Rst,Start,UpKey,DownKey,SetTimer);
inputClk,Clk_1hz,Rst,Start,UpKey,DownKey;output[6:
0]SetTimer;
reg[6:
0]Timer;reg[6:
0]rTimer;regReset;
always@(posedgeClk)//异步复位同步释放
beginReset<=Rst;end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginTimer<=7'd50;end//定时时间赋初值
elseif(Start)beginif(UpKey)beginTimer<=Timer+1'b1;end
elseif(DownKey)beginTimer<=Timer-1'b1;endend//时间减一end
always@(posedgeClk_1hz)//1s信号输入
begin
rTimer<=Timer;if(!
Start)begin
if(rTimer==7'd0)beginrTimer<=0;end//时间到0保持以免错误
elsebeginrTimer<=rTimer-1'b1;endend//每秒减一
end
assignSetTimer=rTimer;
endmodule
3.2.4时序中心控制模块的设计
时序控制模块由定时器送来的值来控制洗衣机控制器的工作方式,正转、反转、停转和报警。
时序中心控制模块图如图7;时序中心控制模块图功能仿真如图8:
图7
图8
其VerilogHDL语言描述如下:
moduleCenter(Clk,Start,Rst,Forward,Back,Stop,Sound,SetTimer);
inputClk,Start,Rst;input[6:
0]SetTimer;
outputBack,Stop,Sound,Forward;
regrBack,rStop,rSound,rForward;reg[3:
0]i;reg[1:
0]j;
reg[6:
0]rSetTimer;reg[24:
0]num;regReset;
always@(posedgeClk)//异步复位同步释放
beginReset<=Rst;end
always@(posedgeClkornegedgeReset)
begin
if(!
Reset)beginrBack<=0;rStop<=0;rSound<=0;
rForward<=0;rSetTimer<=0;i<=0;j<=0;num<=0;end
elseif(!
Start&&SetTimer)begin//播下开始键并且倒计时不为0
case(i)//0~1正转10s
4'd0:
beginrSetTimer<=SetTimer;rForward<=1'b1;
rBack<=1'b0;rStop<=1'b0;rSound<=1'b0;i<=i+1'b1;end
4'd1:
beginif(SetTimer==rSetTimer-4'd10)begini<=i+1'b1;endend
4'd2:
beginrSetTimer<=SetTimer;i<=i+1'b1;rForward<=1'b0;
rBack<=1'b0;rStop<=1'b1;rSound<=1'b0;end//2~3停机5s
4'd3:
beginif(SetTimer==rSetTimer-3'd5)begini<=i+1'b1;endend
4'd4:
beginrSetTimer<=SetTimer;i<=i+1'b1;rForward<=1'b0;
rBack<=1'b1;rStop<=1'b0;rSound<=1'b0;end//4~5反转10s
4'd5:
beginif(SetTimer==rSetTimer-4'd10)begini<=i+1'b1;endend
4'd6:
beginrSetTimer<=SetTimer;i<=i+1'b1;rForward<=1'b0;
rBack<=1'b0;rStop<=1'b1;rSound<=1'b0;end//6~7停机5s
4'd7:
beginif(SetTimer==rSetTimer-3'd5)begini<=i+1'b1;endend
4'd8:
begini<=4'd0;end//倒计时不为0,则循环,回到case0
endcaseend
elseif(!
SetTimer)begincase(j)
2'd0:
begin//倒计时为0时停机并报警1s
if(num==25'd20_000_000)beginj<=j+1'b1;end
elsebeginnum<=num+1'b1;rForward<=1'b0;
rBack<=1'b0;rStop<=1'b1;rSound<=1'b1;endend
2'd1:
beginrSound<=1'b0;endendcaseend
end
assignForward=rForward;assignBack=rBack;
assignStop=rStop;assignSound=rSound;
endmodule
3.2.5数码管显示译码模块的设计
数码管显示译码模块主要功能是把定时器送来的值译码并通过数码管显示出来。
fpga的VerilogHDL硬件语言是并行的这有别于软件的描述语言扫描方式。
数码管显示译码模块图如图9:
图9
数码管显示译码模块功能仿真图如图10:
、
图10
其VerilogHDL语言描述如下:
moduledigital(Clk,Rst,Date_in,Dig_sel,Dig_out);
inputRst,Clk;input[6:
0]Date_in;//MAX99
output[5:
0]Dig_sel;output[7:
0]Dig_out;
reg[7:
0]Display[0:
9];//定义为8位,10个地址
reg[5:
0]Led_sel;reg[7:
0]Led_out;regReset;
reg[20:
0]Count;reg[9:
0]rDate;
parameterTime='d100_000;//并行扫描时间
initial
begin
Count=0;rDate=0;Led_sel[5:
0]='b111_111;
Display[0]='b1100_0000;Display[1]='b1111_1001;
Display[2]='b1010_0100;Display[3]='b1011_0000;
Display[4]='b1001_1001;Display[5]='b1001_0010;
Display[6]='b1000_0010;Display[7]='b1111_1000;
Display[8]='b1000_0000;Display[9]='b1001_0000;
end
always@(posedgeClk)
beginReset<=Rst;end
always@(posedgeClkornegedgeReset)
beginif(!
Reset)Count<=0;
elseif(Count==Time)Count<=0;
elseCount<=Count+1;end
always@(posedgeClkornegedgeReset)//并行概念很重要
begin//数码管显示
rDate<=Date_in;//从wire上读值过来赋给reg型变量提高数据的稳定性
if(!
Reset)beginrDate<=0;end
elseif(Count>'d0&&Count<='d50_000)beginLed_sel<='b111_110;
Led_out<=Display[rDate%10];end//段选
elsebeginLed_sel<='b111_101;Led_out<=Display[rDate/10];end
end
assignDig_sel=Led_sel;
assignDig_out=Led_out;
endmodule
四、电路调试
1.定时器自减值与洗衣机控制器的正转、反转,停机,报警在RTL仿真的时候是同步的,但是下载到硬件上运行的时候出错,不能同步。
解决方法:
反复的研究VerilogHDL程序后发现,开始是使用分频器输出的1hz的时钟输入给时序中心控制器模块,而定时器模块的时钟是20Mhz的,两个模块的时钟不能同步,因此就存在一定的延时不同步导致错误。
然后我把时序中心控制模块的时钟也改为20Mhz,让两个模块的时钟同步,定时器自减输出的值输入到时序中心控制模块作为时序控制的信号,问题顺利解决。
2.程序在运行的时有时候数码管会显示定时器的起始值,洗衣机控制器又重新从头开始运行。
解决方法:
研究硬件电路的设计发现,启动工作控制开关,默认设置为了低电平是不启动的,高电平启动并保持才能使洗衣机控制器正常工作,而在启动后工作中,电平出现不稳的状态,电平并不能很好的起到拉高的作用,因此怀疑是上拉能力不足和电源纹波的干扰,导致电平的不稳定性使洗衣机控制器有时复位。
随后我便在电源的输出端并接一个220uf的电解电容和一个0.1uf的瓷片电容,再用示波器测试发现纹波减少很多;同时为了防止上拉能力不足导致错误,我便把启动控制开关默认设置为高电平,低电平为启动和保持。
然后再测试,问题解决。
3.使用按键修改定时器模块的设定值时,按一下按键,数据变化好几次,不是每按一次改变一个值。
解决方法:
根据以往的经验可以知道是因为按键没有消抖所致,在设计电路的时候忘记了使用按键消抖模块,随后编写了按键消抖模块,再接入控制系统测试,数据正确,问题解决。
五、结束语和心得体会
在经过了几天的学习设计仿真,我学到了很多东西,主要是对数字电路的基础理论知识的复习巩固和对FPGA方面知识的掌握,更加清楚了解到了VerilogHDL语言的魅力,对以前学的理论知识通过实践来检验,更深入的理解了理论联系实际的重要性。
通过这次的FPGA设计,我可以说是受益良多。
看到洗衣机控制器的题目,我首先想到的是状态机的设计,因为课本上说状态机其实就是控制器,后来经过看书觉得应该是摩尔型状态机,可是分析后发现设计题目比较复杂,如果用状态机的思路来设计,比较困难。
结合以前做课程设计的经验,如果用模块化层次化的设计思路更清晰,设计起来也更容易,特别是更符合FPGA设计的的流程,故自己开始设计各功能模块。
洗衣机控制器主要实几种状态的循环改变,还有计时和数码显示的功能,所以我觉得电路主要有五大部分组成,包括:
按键消抖模块,时钟分频模块,定时器设定和自减模块,时序中心控制模块,数码管显示译码模块。
在设计的过程中,我也遇到了不少困难,在经过耐心的调试后还是顺利解决了所有问题。
通过这次设计,让我更深入的掌握了VerilogHDL的设计方法与一些技巧,让我对FPGA的编程、定时器和计数器的设计更加熟悉,让我更加明白时序组合门电路设计思路和方法。
在设计中学到不少课本上没有的东西,并且充分认识到家电控制电路设计在一片FPGA芯片内,具有体积小、可靠性高、降低成本、设计周期短,功能灵活的特点,本人受益匪浅。
我相信通过此次课程设计,一定会对以后的设计工作提供很大帮助。
六、参考文献
1、黑金开发板配套教程VerilogHDL那些事儿
2、康华光主编电子技术基础数字部分(第五版)
3、陈明义主编、电子技术课程设计实用教程[S]2002年05月第1版
4、EDA先锋工作室设计与验证VerilogHDL
5、马建国孟宪元编著FPGA现代数字系统设计
七、附录
7.1FPGA系统板部分原理图
7.2FPGA系统板PCB图