基于VHDL语言的简易洗衣机控制器.docx

上传人:b****3 文档编号:3887772 上传时间:2022-11-26 格式:DOCX 页数:18 大小:1.10MB
下载 相关 举报
基于VHDL语言的简易洗衣机控制器.docx_第1页
第1页 / 共18页
基于VHDL语言的简易洗衣机控制器.docx_第2页
第2页 / 共18页
基于VHDL语言的简易洗衣机控制器.docx_第3页
第3页 / 共18页
基于VHDL语言的简易洗衣机控制器.docx_第4页
第4页 / 共18页
基于VHDL语言的简易洗衣机控制器.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于VHDL语言的简易洗衣机控制器.docx

《基于VHDL语言的简易洗衣机控制器.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的简易洗衣机控制器.docx(18页珍藏版)》请在冰豆网上搜索。

基于VHDL语言的简易洗衣机控制器.docx

基于VHDL语言的简易洗衣机控制器

电子课程设计

——简易洗衣机控制器设计

学院:

班级:

姓名:

学号:

指导老师:

 

2013年12月

第一部分:

设计任务与要求………………………………………1

第二部分:

总体框图………………………………………………1

第三部分:

选择器件………………………………………………2

第四部分:

功能模块………………………………………………3

4.1时间预置编码寄存模块(settime)………………………3

4.2减法计数器模块(counter)………………………………4

4.3数码管显示模块(showtime)……………………………7

4.4时序电路模块(analyse)…………………………………9

4.5译码器模块(move)………………………………………11

第五部分:

总体设计电路图………………………………………13

5.1总体(顶层)设计电路图………………………………13

5.2顶层文件仿真…………………………………………13

5.3管脚分配图……………………………………………14

5.4硬件实验效果图…………………………………………14

第六部分:

课程设计心得体会……………………………………15

 

简易洗衣机控制器设计

1、设计任务与要求

设计一个洗衣机洗涤程序控制器,控制洗衣机的电动机按下图所示的规律运转:

时间到

 

用两位数码管预置洗涤时间(分钟数),洗涤过程在送入预置时间后开始运转,洗涤中按倒计时方式对洗涤过程作计时显示,用LED表示电动机的正、反转,如果定时时间到,则停机并发出音响信号。

2、总体框图

3、

RUNREVPAUSE

译码驱动模块(move)

clkout_1out_2

start时序电路模块(analyse)

clktime_over

start十进制减法计数器模块(counter)

洗涤预置时间编码寄存电路模块(settime)

报警信号

时间显示模块(showtime)

 

time_over

clk

K5start

K6load

K1K2K3K4

各个部分的具体功能描述如下:

(1)预设时间和编码电路(settime):

接受用户通过按钮预置的时间信息,编码成八位之后转给减法计数器。

(2)减法计数器电路(counter):

接收编码之后的预置时间信息,向电机运转控制电路传递运行信号,并将预置时间信息和剩余时间信息发给数码管显示电路进行实时显示。

(3)数码管显示电路(showtime):

接收减法计数器电路传来的时间信息,进行实时译码显示。

(4)电机运转时序控制电路(analyse):

接收运行起止信号,安排电机运行状态并编码输出。

(5)译码器(move):

接收电机运行状态信号,译码后实时控制电机的正传、反转和暂停。

3、选择器件

1、pc机一台。

2、CPLD/FPGA适配器板:

标准配置EPF10K10LC84-4接口板,下载接口是数字芯片的下载接口(DIGITALJTAG),主要用于CPLD/FPGA芯片的数据下载。

3、实验箱:

装有七段数码管及蜂鸣器等,七段数码管字形及真值表如下

七段数码管字形如下:

七段数码管真值表如下:

4、功能模块

4.1时间预置编码寄存模块(settime)

1、时间预置编码寄存模块settime如图1所示,time_input为通过开发板上拨码开关K1、K2、K3、K4输入的信号,load为输入确认信号。

本模块将输入的四位时间信号编码成八位二进制数输出到减法计数器电路。

图1时间预置编码寄存模块settime

2、仿真图

图2时间预置编码寄存模块仿真图

用K1、K2、K3、K4给time_input输入一个二进制数0111,让load有效,输出time_set为00000111。

3、时间预置编码寄存模块源代码

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysettimeis

port

load:

instd_logic;

time_input:

instd_logic_vector(3downto0);

time_set:

outstd_logic_vector(7downto0)

);

endsettime;

architecturesettimeofsettimeis

signalp1:

std_logic_vector(7downto0);

begin

process(load)

begin

if(load'eventandload='1')

then

casetime_inputis

when"0000"=>p1<="00000000";

when"0001"=>p1<="00000001";

when"0010"=>p1<="00000010";

when"0011"=>p1<="00000011";

when"0100"=>p1<="00000100";

when"0101"=>p1<="00000101";

when"0110"=>p1<="00000110";

when"0111"=>p1<="00000111";

when"1000"=>p1<="00001000";

when"1001"=>p1<="00001001";

whenothers=>p1<="00000000";

endcase;

endif;

endprocess;

time_set<=p1;

endsettime;

4.2减法计数器模块(counter)

1、减法计数模块counter如图3所示,本模块中clk为系统时序脉冲信号,start为系统开始运行的信号,time_set接收编码之后的预置时间信息,向电机运转控制电路传递运行信号,并将预置时间信息和剩余时间信息发给数码管显示电路进行实时显示。

time_remain为输出到数码管显示电路的时间信号,time_over为系统运行结束信号,可以用来控制蜂鸣器的通断。

图3减法计数模块

2、仿真图

图4减法计数模块仿真图

3、减法计数模块源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycounteris

port

clk,start:

instd_logic;

time_set:

instd_logic_vector(7downto0);

time_remain:

bufferstd_logic_vector(7downto0);

time_over:

bufferstd_logic

);

endcounter;

architecturecounterofcounteris

begin

process(clk)

variabletime_second:

integerrange0to59:

=59;

begin

if(clk'eventandclk='1')

then

if(start='0')

then

if(time_remain(7downto0)=0)

then

time_remain<=time_set;

else

time_remain(7downto4)<=time_remain(3downto0);

time_remain(3downto0)<=time_set(3downto0);

endif;

time_second:

=59;

time_over<='1';

else

if(time_over='1')

then

if(time_second=0andtime_remain(7downto0)=0)

then

time_over<='0';

else

if(time_second=0)

then

if(time_remain(3downto0)=0)

then

time_remain(7downto4)<=time_remain(7downto4)-1;

time_remain(3downto0)<="1001";

time_second:

=59;

else

time_remain(7downto4)<=time_remain(7downto4);

time_remain(3downto0)<=time_remain(3downto0)-1;

time_second:

=59;

endif;

else

time_second:

=time_second-1;

endif;

endif;

endif;

endif;

endif;

endprocess;

endcounter;

4.3数码管显示模块(showtime)

1、数码管显示模块showtime如图5所示,本模块clk为系统时序脉冲信号,time_remain接收减法计数器电路传来的时间信息,进行实时译码显示,a,b,c,d,e,f,g分别对应数码管的七段,minute和second分别位选两个数码管,显示十位和个位。

图5数码管显示模块

2、仿真图

图6数码管显示模块仿真图

3、数码管显示模块源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityshowtimeis

port

time_remain:

instd_logic_vector(7downto0);

clk:

instd_logic;

minute,second:

outstd_logic;

a,b,c,d,e,f,g:

outstd_logic

);

endshowtime;

architectureshowtimeofshowtimeis

signaltemp:

std_logic_vector(6downto0);

signalbcd:

std_logic_vector(3downto0);

signalchoose:

std_logic;

begin

process(clk)

begin

if(clk'eventandclk='1')

then

choose<=notchoose;

if(choose='1')

then

minute<='0';second<='1';

bcd<=time_remain(7downto4);

else

minute<='1';second<='0';

bcd<=time_remain(3downto0);

endif;

endif;

endprocess;

process(bcd)

begin

casebcdis

when"0000"=>temp<="1111110";

when"0001"=>temp<="0110000";

when"0010"=>temp<="1101101";

when"0011"=>temp<="1111001";

when"0100"=>temp<="0110011";

when"0101"=>temp<="1011011";

when"0110"=>temp<="1011111";

when"0111"=>temp<="1110000";

when"1000"=>temp<="1111111";

when"1001"=>temp<="1111011";

whenothers=>temp<="1111011";

endcase;

a<=temp(6);b<=temp(5);c<=temp(4);d<=temp(3);e<=temp

(2);f<=temp

(1);g<=temp(0);

endprocess;

endshowtime;

4.4时序电路模块(analyse)

1、时序电路模块analyse如图7所示,本模块由start控制使能控制,通过时钟的输入进行计算当前系统所处的状态,并进行编码输出电机的运转状态,out_1为高位时表示电机正转,out_2为高位时表示电机反转。

由于在显示以及输入的时候只有分钟,故在模块内部设计了一个秒的计时变量。

图7时序电路模块

2、仿真图

3、时序电路模块analyse源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityanalyseis

port

clk,start,time_over:

instd_logic;

out_1,out_2:

outstd_logic

);

endanalyse;

architectureanalyseofanalyseis

begin

process(clk)

variablestate:

std_logic;

variablewash_time:

integer:

=0;

variablewait_time:

integer:

=0;

begin

if(clk'eventandclk='1')

then

if(start='0')

then

wash_time:

=0;

wait_time:

=0;

state:

='0';

out_1<='0';out_2<='0';

else

if(time_over='1')

then

if(wash_time=20)

then

if(wait_time=10)

then

wash_time:

=0;

state:

=notstate;

else

wait_time:

=wait_time+1;

endif;

else

wash_time:

=wash_time+1;

wait_time:

=0;

endif;

endif;

if(wash_time=20)

then

out_1<='0';out_2<='0';

else

if(state='0')

then

out_1<='1';out_2<='0';

else

out_1<='0';out_2<='1';

endif;

endif;

endif;

endif;

endprocess;

endanalyse;

4.5译码器模块(move)

1、译码器模块move如图9所示,out_1和out_2接收时序电路模块的信号对信号进行译码,安排电机运行状态即正转(RUN)、反转(REV)、暂停(PAUSE),并进行输出。

此模块较为简单,设计基本没什么难度。

图9译码器模块

 

2、仿真图

图10译码器模块仿真图

3、译码器模块move源程序

libraryieee;

useieee.std_logic_1164.all;

entitymoveis

port

out_1,out_2:

instd_logic;

REV,RUN,PAUSE:

bufferstd_logic

);

endmove;

architecturemoveofmoveis

signalchoose:

std_logic_vector(1downto0);

begin

choose

(1)<=out_1;choose(0)<=out_2;

process(choose)

begin

casechooseis

when"00"=>REV<='0';RUN<='0';PAUSE<='1';

when"10"=>REV<='0';RUN<='1';PAUSE<='0';

when"01"=>REV<='1';RUN<='0';PAUSE<='0';

whenothers=>REV<='0';RUN<='0';PAUSE<='0';

endcase;

REV<=out_2;RUN<=out_1;PAUSE<=not(out_1orout_2);

endprocess;

endmove;

 

5、总体设计电路图

5.1总体(顶层)设计电路图

图11各模块连结后的电路图

系统运行过程如下:

在系统进行运行之前,使用K按钮预置洗衣机运转时间,此时用户设定的时间通过数码管时时显示出来,计时设备选取的精度是分钟级,也就是说用户可以设定洗衣时间是多少分钟,范围为00-99。

然后用户可以给出开始信号,系统开始运转并开始从预设时间倒计时,重复“正传->暂停->反转->暂停”的循环过程直至剩余时间变为零,剩余时间为零时,time_over指示报警信号。

数码管在系统的整个运行过程中时时显示剩余运转时间。

本设计在电路中加入了扫描信号,输入到减法模块,时序电路模块,实时显示模块。

由于扫描信号非常高,在我们看来,输出在数码管上的数字都是连续的两位数字,由预置时间开始以一分钟减一的速度递减。

当数码管显示为零时,洗衣停止。

5.2顶层文件仿真

由上图可以看出:

当预置号时间,启动start,数码管显示预置时间,电机开始以正转=>暂停=>反转=>暂停为周期进行循环,一个周期正好费时一分钟,一个周期结束,数码管显示减一,依次循环,直至数码管显示时间为零,洗衣结束。

5.3管脚分配图

5.4硬件实验效果图

六、课程设计心得体会

二周的课程设计终于做完了,在这二周的课设中我感觉我学到了蛮多东西。

首先,我学会了如何对一个大的课题进行分析——将大的整体划分为许多小的部分,直到各个部分容易设计出来。

关于这个洗衣机控制器,就是用模块化层次化的设计方法进行系统层的设计,这样分解下来,设计会更容易点,思路也比较简单。

洗衣机控制器主要就只有三个状态,要实现几种状态的多次循环的改变,其他的还有计时和数码显示的功能,通过每个模块的设计最后组装即可完成系统级的设计。

在设计的时候,如果特别要注意各个模块之间接口的设计,要是接口不对,模块之间就没法实现组装。

其次,这次课程设计让我感受到了我对所学习的内容是多么的不熟练,在编程的时候还要老是去翻书。

我记忆在深刻的是在编写程序时,看了一遍又一遍书但在编写的过程中还是出错了,最后只好对着书编写。

但我觉的出现问题并不是很要紧,这些问题能提醒我那些地方没有学好,只要我重视这些地方将其巩固我想我将能学到许多的知识。

通过这次设计,对于VHDL的设计方法大致有了一些技巧性的了解,位以后的硬件设计打下了基础,对FPGA的编程、定时器和计数器的设计都熟悉起来,加深了对时序组合电路的印象。

最后,我感觉我对QuartusII软件的使用熟练了许多。

我虽然以前在试验的时候使用过QuartusII这个软件,但用的时间毕竟不长,对其不太熟练,经过这次做课设我对这个软件运用熟练很多,这对以后的学习一定有很大的帮助。

我想在面对一个问题时不能存在侥幸心理,只要我们认真对待它,我们就能学到东西。

通过在网上进行各种资料的查询,也发现了其实FPGA的设计具有较好的前景,其功能的强大和设计方法的简单可靠。

具有较强的适应能力和可移植性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1