
基于FPGA的洗衣机控制器-verilog-hdl-语言描述.doc
17页编号: 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三 、正文 ··········································43.1洗衣机控制器的整体框图及原理 ············4 3.2洗衣机控制电路单元模块设计和仿真········5 3.2.1按键消抖模块的设计················5 3.2.2时钟分频模块的设计················6 3.2.3定时器设定和自减模块的设计·········7 3.2.4时序中心控制模块的设计·············83.2.5数码管显示译码模块的设计···········9 四、电路调试···································11五、结束语和心得体会····························12六、参考文献··································13七、附录······································137.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; endalways @(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; endendassign H_L_sig = H_L_f2 & (~H_L_f1); //延时的启动标志位always @(posedge Clk or negedge Reset )begin if(!Reset)begin Count<=0;end else if(Count == Delay10ms)begin Count<=0; end else if(H_L_sig) begin Count<=0; end else begin Count<=Count+1; endendalways @(posedge Clk or negedge Reset)begin if(!Reset) begin H_L_f3<=1; end else if(Count == Delay10ms) begin H_L_f3<=Key_in; endendalways @(posedge Clk or negedge Reset )begin if(!Reset) begin H_L_f4<=1; end else begin H_L_f4<=H_L_f3; end endassign Key_out = H_L_f4 & (~H_L_f3); endmodule3.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; endalways @(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 else begin Count<=Count+1'd1; endendassign ClkOut=OutData;endmodule3.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; endalways @(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 //时间减一endalways @(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//每秒减一endassign SetTim。
