基于FPGA的洗衣机控制器 verilog hdl 语言描述的设计与开发.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号: 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芯片的编程采用模块化的Verilog HDL (硬件描述语言)进行设计,设计由分频模块,按键消抖模块,定时时间自减模块,时序中心控制模块,数码管显示模块组成,顶层实现整个芯片的功能。顶层使用原理图实现,底层由Verilog HDL语句实现。
FPGA的输入时钟为20M hz,因此使用了分频模块输出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.1 FPGA系统板部分原理图 (13)
7.2 FPGA系统板PCB图 (15)
三、正文
3.1 洗衣机控制器的整体框图及原理:
基于fpga的洗衣机控制器电路主要由五大模块组成,分别为按键消抖模块,时钟分频模块,定时器设定和自减模块,时序中心控制模块,数码管显示译码模块。具体电路如图1所示:
图1
由于输入时钟为20M hz,因此使用了分频模块输出1hz的方波(中间上方模块)给定时器设定和自减模块(中间下方模块)提供每1s自减1的信号,定时器模块输出的自减值输入给数码管显示译码模块(右下方模块)和时序控制模块(右上模块),通过译码模块定时器的值可以在数码管上显示,同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、停机和报警工作方式。
按键消抖模块(左下方模块)的作用是为了消除按键抖动而设立的。
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