基于FPGA的洗衣机控制器 verilog hdl 语言描述
更新时间:2023-10-01 12:43:01 阅读量: 综合文库 文档下载
编号: 1
电机控制综合课程设计
报告书
课 题: 基于FPGA的洗衣机控制器 院 (系): 机电工程学院 专 业: 电气工程及其自动化 学生姓名: 蒋岷君 学 号: 0800120313
题目类型:?理论研究 ?实验研究 ?工程设计 ?工程技术研究 ?软件开发
2011 年 7月 6 日
1
前言
一、洗衣机控制器主要内容
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芯片的编程采用模块化的Verilog HDL (硬件描述语言)进行设计,设计由分频模块,按键消抖模块,定时时间自减模块,时序中心控制模块,数码管显示模块组成,顶层实现整个芯片的功能。顶层使用原理图实现,底层由Verilog HDL语句实现。
FPGA的输入时钟为20M hz,因此使用了分频模块输出1hz的方波给定时器设定自减模块提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块和时序控制模块,通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。通过按键消抖模块可以准确无抖动的设定定时器的工作时间。
2
目录
一 、前言···········································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.1 FPGA系统板部分原理图···················13 7.2 FPGA系统板PCB图······················15
3
三、正文
3.1 洗衣机控制器的整体框图及原理:
基于fpga的洗衣机控制器电路主要由五大模块组成,分别为按键消抖模块,时钟分频模块,定时器设定和自减模块,时序中心控制模块,数码管显示译码模块。具体电路如图1所示:
图1
由于输入时钟为20M hz,因此使用了分频模块输出1hz的方波(中间上方模块)给定时器设定和自减模块(中间下方模块)提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块(右下方模块)和时序控制模块(右上模块),通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。
4
按键消抖模块(左下方模块)的作用是为了消除按键抖动而设立的。
3.2、洗衣机控制电路单元模块设计和仿真
3.2.1按键消抖模块的设计
在进行独立按键或者矩阵式按键的设计的时候,我们在按下键盘的时候其实并不只是按下去而是有一个抖动的过程,就连松手的过程也有抖动,然而这个抖动通常被人们所忽略,从而导致输入数据的错误和乱码,因此我们必须对按键进行按键的消抖处理。我们通常在单片机的消抖使用的是延时消抖,这种消抖也称为软件消抖,但是fpga的Verilog HDL语言是硬件描述语言,所以也称作硬件消抖,主要运用了状态机和延时的消抖方式。
按键消抖模块图如图2:
图2
其Verilog HDL 语言描述如下:
module Key_module (Key_in,Key_out,Clk,Rst); input Clk,Rst,Key_in; output Key_out;
reg Reset; reg H_L_f1;reg H_L_f2; reg H_L_f3; reg H_L_f4; reg [17:0] Count; wire H_L_sig; parameter Delay10ms = 'd200_000;
always @(posedge Clk ) //异步复位同步释放 begin Reset<=Rst; end
always @(posedge Clk or negedge Reset ) begin
if(!Reset) begin H_L_f1<=1; H_L_f2<=1; end
else begin H_L_f1<=Key_in; H_L_f2<=H_L_f1; end end
assign H_L_sig = H_L_f2 & (~H_L_f1); //延时的启动标志位 always @(posedge Clk or negedge Reset ) begin
if(!Reset)begin Count<=0;end
5
else if(Count == Delay10ms)begin Count<=0; end else if(H_L_sig) begin Count<=0; end else begin Count<=Count+1; end end
always @(posedge Clk or negedge Reset) begin
if(!Reset) begin H_L_f3<=1; end
else if(Count == Delay10ms) begin H_L_f3<=Key_in; end end
always @(posedge Clk or negedge Reset ) begin
if(!Reset) begin H_L_f4<=1; end
else begin H_L_f4<=H_L_f3; end end
assign Key_out = H_L_f4 & (~H_L_f3); endmodule
3.2.2时钟分频模块的设计
由于使用的FPGA的输入时钟是20M hz,定时模块的自减频率是1hz,因此
需要进行分频得到1hz的时钟频率输入给定时模块。
时钟分频模块图如图3: 时钟分频模块功能仿真图如图4:
图3 图4 其Verilog HDL 语言描述如下:
module FrequencyDivider(Clk,Rst,ClkOut); input Clk,Rst; output ClkOut;
reg [23:0] Count; reg OutData; reg Reset; always @(posedge Clk ) //异步复位同步释放 begin Reset<=Rst; end
always @(posedge Clk or negedge Reset) begin
if(!Reset) begin Count<=0; OutData<=0; end
else if(Count==24'd10_000_000) begin Count<=0; OutData<=~OutData; end
6
else begin Count<=Count+1'd1; end end
assign ClkOut=OutData;
endmodule
3.2.3定时器设定和自减模块的设计
定时器设定和自减模块可以设定定时器的工作时间,通过输入的1hz的信号使定时器的值每秒自减1,直至为0。其定时器的值输出给数码管译码模块和时序控制模块。
定时器设定和自减模块图如图 5;定时器设定和自减模块功能仿真图如图6:
图5
图6 其Verilog HDL 语言描述如下:
module KeySet(Clk,Clk_1hz,Rst,Start,UpKey,DownKey,SetTimer);
input Clk,Clk_1hz,Rst,Start,UpKey,DownKey; output [6:0] SetTimer; reg [6:0] Timer; reg [6:0] rTimer; reg Reset; always @(posedge Clk ) //异步复位同步释放 begin Reset<=Rst; end
always @(posedge Clk or negedge Reset) begin
if(!Reset) begin Timer<=7'd50; end //定时时间赋初值
else if(Start) begin if(UpKey) begin Timer<=Timer+1'b1; end else if(DownKey) begin Timer<=Timer-1'b1; end end //时间减一end
7
always @(posedge Clk_1hz) //1s信号输入 begin
rTimer<=Timer; if(!Start) begin
if(rTimer==7'd0) begin rTimer<=0; end //时间到0保持以免错误 else begin rTimer<=rTimer-1'b1; end end//每秒减一 end
assign SetTimer=rTimer; endmodule
3.2.4时序中心控制模块的设计
时序控制模块由定时器送来的值来控制洗衣机控制器的工作方式,正转、反转、停转和报警。
时序中心控制模块图如图7; 时序中心控制模块图功能仿真如图8:
图7
图8 其Verilog HDL 语言描述如下:
module Center(Clk,Start,Rst,Forward,Back,Stop,Sound,SetTimer); input Clk,Start,Rst; input [6:0]SetTimer; output Back,Stop,Sound,Forward;
reg rBack,rStop,rSound,rForward; reg [3:0] i; reg [1:0] j; reg [6:0] rSetTimer; reg [24:0] num; reg Reset; always @(posedge Clk ) //异步复位同步释放 begin Reset<=Rst; end
always @(posedge Clk or negedge Reset) begin
8
if(!Reset) begin rBack<=0; rStop<=0; rSound<=0; rForward<=0; rSetTimer<=0; i<=0; j<=0; num<=0; end
else if(!Start && SetTimer) begin //播下开始键并且倒计时不为0 case(i) //0~1正转10s
4'd0: begin rSetTimer<=SetTimer; rForward<=1'b1; rBack<=1'b0; rStop<=1'b0; rSound<=1'b0; i<=i+1'b1; end
4'd1: begin if(SetTimer==rSetTimer-4'd10) begin i<=i+1'b1; end end
4'd2: begin rSetTimer<=SetTimer; i<=i+1'b1;rForward<=1'b0; rBack<=1'b0; rStop<=1'b1; rSound<=1'b0; end //2~3停机5s
4'd3: begin if(SetTimer==rSetTimer-3'd5) begin i<=i+1'b1; end end
4'd4: begin rSetTimer<=SetTimer; i<=i+1'b1; rForward<=1'b0; rBack<=1'b1; rStop<=1'b0; rSound<=1'b0; end //4~5反转10s
4'd5: begin if(SetTimer==rSetTimer-4'd10) begin i<=i+1'b1; end end 4'd6: begin rSetTimer<=SetTimer; i<=i+1'b1; rForward<=1'b0; rBack<=1'b0; rStop<=1'b1; rSound<=1'b0; end //6~7停机5s
4'd7: begin if(SetTimer==rSetTimer-3'd5) begin i<=i+1'b1; end end 4'd8: begin i<=4'd0; end//倒计时不为0,则循环,回到case 0 endcase end
else if(!SetTimer) begin case( j )
2'd0: begin //倒计时为0时停机并报警1s
if(num==25'd20_000_000) begin j<=j+1'b1; end else begin num<=num+1'b1; rForward<=1'b0;
rBack<=1'b0; rStop<=1'b1; rSound<=1'b1;end end 2'd1: begin rSound<=1'b0; end endcase end end
assign Forward=rForward; assign Back=rBack; assign Stop=rStop; assign Sound=rSound; endmodule
3.2.5数码管显示译码模块的设计
数码管显示译码模块主要功能是把定时器送来的值译码并通过数码管显示出来。fpga的Verilog HDL硬件语言是并行的这有别于软件的描述语言扫描方式。 数码管显示译码模块图如图9:
9
图9
数码管显示译码模块功能仿真图如图10:、
图10 其Verilog HDL 语言描述如下:
module digital (Clk,Rst,Date_in,Dig_sel,Dig_out); input Rst,Clk; input [6:0] Date_in; //MAX 99 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; reg Reset; reg [20:0] Count; reg [9:0] rDate;
parameter Time='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 @(posedge Clk ) begin Reset<=Rst; end
always @ (posedge Clk or negedge Reset) begin if(!Reset) Count<=0;
else if(Count == Time) Count<=0; else Count<=Count+1; end
always @ ( posedge Clk or negedge Reset)//并行概念很重要 begin //数码管显示
rDate<=Date_in;//从wire上读值过来赋给reg型变量提高数据的稳定性 if(!Reset) begin rDate<=0; end
else if(Count>'d0 && Count<='d50_000) begin Led_sel<='b111_110; Led_out<=Display[rDate]; end //段选
10
else begin Led_sel<='b111_101; Led_out<=Display[rDate/10]; end end
assign Dig_sel = Led_sel; assign Dig_out = Led_out; endmodule
四、电路调试
1.定时器自减值与洗衣机控制器的正转、反转,停机,报警在RTL仿真的时候是同步的,但是下载到硬件上运行的时候出错,不能同步。
解决方法:反复的研究Verilog HDL程序后发现,开始是使用分频器输出的1hz的时钟输入给时序中心控制器模块,而定时器模块的时钟是20M hz的,两个模块的时钟不能同步,因此就存在一定的延时不同步导致错误。然后我把时序中心控制模块的时钟也改为20M hz,让两个模块的时钟同步,定时器自减输出的值输入到时序中心控制模块作为时序控制的信号,问题顺利解决。
2.程序在运行的时有时候数码管会显示定时器的起始值,洗衣机控制器又重新从头开始运行。
解决方法:研究硬件电路的设计发现,启动工作控制开关,默认设置为了低电平是不启动的,高电平启动并保持才能使洗衣机控制器正常工作,而在启动后工作中,电平出现不稳的状态,电平并不能很好的起到拉高的作用,因此怀疑是上拉能力不足和电源纹波的干扰,导致电平的不稳定性使洗衣机控制器有时复位。随后我便在电源的输出端并接一个220uf的电解电容和一个0.1uf的瓷片电容,再用示波器测试发现纹波减少很多;同时为了防止上拉能力不足导致错误,我便把启动控制开关默认设置为高电平,低电平为启动和保持。然后再测试,问题解决。 3.使用按键修改定时器模块的设定值时,按一下按键,数据变化好几次,不是每按一次改变一个值。
11
解决方法:根据以往的经验可以知道是因为按键没有消抖所致,在设计电路的时候忘记了使用按键消抖模块,随后编写了按键消抖模块,再接入控制系统测试,数据正确,问题解决。
五、结束语和心得体会
在经过了几天的学习设计仿真,我学到了很多东西,主要是对数字电路的基础理论知识的复习巩固和对FPGA方面知识的掌握,更加清楚了解到了Verilog HDL语言的魅力,对以前学的理论知识通过实践来检验,更深入的理解了理论联系实际的重要性。
通过这次的FPGA设计,我可以说是受益良多。看到洗衣机控制器的题目,我首先想到的是状态机的设计,因为课本上说状态机其实就是控制器,后来经过看书觉得应该是摩尔型状态机,可是分析后发现设计题目比较复杂,如果用状态机的思路来设计,比较困难。结合以前做课程设计的经验,如果用模块化层次化的设计思路更清晰,设计起来也更容易,特别是更符合FPGA设计的的流程,故自己开始设计各功能模块。洗衣机控制器主要实几种状态的循环改变,还有计时和数码显示的功能,所以我觉得电路主要有五大部分组成,包括:按键消抖模块,时钟分频模块,定时器设定和自减模块,时序中心控制模块,数码管显示译码模块。在设计的过程中,我也遇到了不少困难,在经过耐心的调试后还是顺利解决了所有问题。通过这次设计,让我更深入的掌握了Verilog HDL的设计方法与一些技巧,让我对FPGA的编程、定时器和计数器的设计更加熟悉,让我更加明白时序组合门电路设计思路和方法。在设计中学到不少课本上没有的东西,并且充分认识到家电控制电路设计在一片FPGA芯片内,具有体积小、可靠性高、降低成本、设计周期短,功能灵活的特点,本人受益匪浅。
12
我相信通过此次课程设计,一定会对以后的设计工作提供很大帮助。
六、参考文献
1、黑金开发板配套教程 VerilogHDL那些事儿
2、康华光主编 电子技术基础 数字部分(第五版)
3、陈明义主编、电子技术课程设计实用教程[S] 2002年05月第1版 4、EDA先锋工作室 设计与验证Verilog HDL 5、马建国 孟宪元 编著 FPGA现代数字系统设计
七、附录
7.1 FPGA系统板部分原理图
13
14
7.2 FPGA系统板PCB图
15
正在阅读:
基于FPGA的洗衣机控制器 verilog hdl 语言描述10-01
湖北黄冈中学高二上学期期末考试英语试题 word版含解析05-10
Xx镇计生办2012年上半年工作总结和下半年工作计划06-07
大英三作文03-19
个人工作失职检讨书05-14
特殊的生日礼物作文800字06-27
公路工程预算编制说明03-08
电化学03-08
科协新年度工作计划范文01-13
- 计算机试题
- 【2012天津卷高考满分作文】鱼心人不知
- 教育心理学历年真题及答案--浙江教师资格考试
- 20180327-第六届“中金所杯”全国大学生金融知识大赛参考题库
- 洪林兴达煤矿2018年度水情水害预测预报
- 基本要道讲义
- 机电设备安装试运行异常现象分析与对策
- 《有机化学》复习资料-李月明
- 非常可乐非常MC2--非常可乐广告策划提案 - 图文
- 2011中考数学真题解析4 - 科学记数法(含答案)
- 企业人力资源管理师三级07- 09年真题及答案
- 基于单片机的光控自动窗帘控制系统设计说明书1 - 图文
- 20160802神华九江输煤皮带机安装方案001
- (共53套)新人教版一生物必修2(全册)教案汇总 word打印版
- 2014行政管理学总复习
- 中国银监会关于加强地方政府融资平台贷款风险监管的指导意见
- 民宿酒店核心竞争与研究
- 游园活动谜语大全2012
- 河南省天一大联考2016届高三英语5月阶段性测试试题(六)(A卷)
- 小型超市管理系统毕业论文详细设计4
- 控制器
- 洗衣机
- 基于
- 描述
- verilog
- 语言
- FPGA
- hdl
- ERP U8.72实验报告
- 2010届中考数学动点问题专项训练1 - 图文
- 上教版化学补充习题答案(九上)2018修正版
- 党支部会议事制度
- 中国法制史期末复习重点详解(最终版)
- 表格数据的图形化导学案
- 高铁基本知识
- 西南大学17秋0847《《中级听力》》在线作业(参考资料)
- 2012春《区域经济学》作业三 - 0001
- 银行董事会办公室工作职责
- 《珠海市干线路网规划》项目简介
- 团课教案
- 新课标下小学语文阅读教学的重点调整
- 关于开展解决拖欠农民工工资突出问题专项整治的实施方案
- 常微分方程第四章考试卷1
- 2017城乡规划专业人才需求调查问卷
- 英语自然拼音法xyt
- 日光灯发光原理
- 2019年幼儿园保健个人工作计划与2019年幼儿园保健工作计划合集
- 信用证翻译