基于VHDL语言的简易洗衣机控制器.docx
《基于VHDL语言的简易洗衣机控制器.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的简易洗衣机控制器.docx(17页珍藏版)》请在冰豆网上搜索。
基于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
简易洗衣机控制器设计
一、设计任务与要求
设计一个洗衣机洗涤程序控制器,控制洗衣机的电动机按下图所示的规律运
转:
时间到
用两位数码管预置洗涤时间(分钟数,洗涤过程在送入预置时间后开始运转,洗涤中按倒计时方式对洗涤过程作计时显示,用LED表示电动机的正、反转,如果定时时间到,则停机并发出音响信号。
二、总体框图
RUNREVPAUSE
time_overclkK5start
K6load
K1K2K3K4
各个部分的具体功能描述如下:
(一预设时间和编码电路(settime:
接受用户通过按钮预置的时间信息,编码
译码驱动模块(move
clkout_1out_2
start时序电路模块(analyse
clktime_over
start十进制减法计数器模块(counter
洗涤预置时间编码寄存电路模块(settime
报警信号
时间显示模块(showtime
定时启动停止
正转暂停反转暂停
成八位之后转给减法计数器。
(二减法计数器电路(counter:
接收编码之后的预置时间信息,向电机运转
控制电路传递运行信号,并将预置时间信息和剩余时间信息发给数码管显示电路进行实时显示。
(三数码管显示电路(showtime:
接收减法计数器电路传来的时间信息,进行
实时译码显示。
(四电机运转时序控制电路(analyse:
接收运行起止信号,安排电机运行状态
并编码输出。
(五译码器(move:
接收电机运行状态信号,译码后实时控制电机的正传、反转
和暂停。
三、选择器件
1、pc机一台。
2、CPLD/FPGA适配器板:
标准配置EPF10K10LC84-4接口板,下载接口是数字芯片的下载接口(DIGITALJTAG,主要用于CPLD/FPGA芯片的数据下载。
3、实验箱:
装有七段数码管及蜂鸣器等,七段数码管字形及真值表如下
七段数码管字形如下:
七段数码管真值表如下:
四、功能模块
4.1时间预置编码寄存模块(settime
1、时间预置编码寄存模块settime如图1所示,time_input为通过开发板上拨码开关K1、K
2、K
3、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=0then
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.1总体(顶层)设计电路图图11各模块连结后的电路图系统运行过程如下:
在系统进行运行之前,使用K按钮预置洗衣机运转时间,此时用户设定的时间通过数码管时时显示出来,计时设备选取的精度是分钟级,也就是说用户可以设定洗衣时间是多少分钟,范围为00-99。
然后用户可以给出开始信号,系统开始运转并开始从预设时间倒计时,重复“正传->暂停->反转->暂停”的循环过程直至剩余时间变为零,剩余时间为零时,time_over指示报警信号。
数码管在系统的整个运行过程中时时显示剩余运转时间。
本设计在电路中加入了扫描信号,输入到减法模块,时序电路模块,实时显示模块。
由于扫描信号非常高,在我们看来,输出在数码管上的数字都是连续的两位数字,由预置时间开始以一分钟减一的速度递减。
当数码管显示为零时,洗衣停止。
5.2顶层文件仿真13
由上图可以看出:
当预置号时间,启动start,数码管显示预置时间,电机开始以正转=>暂停=>反转=>暂停为周期进行循环,一个周期正好费时一分钟,一个周期结束,数码管显示减一,依次循环,直至数码管显示时间为零,洗衣结束。
5.3管脚分配图5.4硬件实验效果图14
六、课程设计心得体会二周的课程设计终于做完了,在这二周的课设中我感觉我学到了蛮多东西。
首先,我学会了如何对一个大的课题进行分析——将大的整体划分为许多小的部分,直到各个部分容易设计出来。
关于这个洗衣机控制器,就是用模块化层次化的设计方法进行系统层的设计,这样分解下来,设计会更容易点,思路也比较简单。
洗衣机控制器主要就只有三个状态,要实现几种状态的多次循环的改变,其他的还有计时和数码显示的功能,通过每个模块的设计最后组装即可完成系统级的设计。
在设计的时候,如果特别要注意各个模块之间接口的设计,要是接口不对,模块之间就没法实现组装。
其次,这次课程设计让我感受到了我对所学习的内容是多么的不熟练,在编程的时候还要老是去翻书。
我记忆在深刻的是在编写程序时,看了一遍又一遍书但在编写的过程中还是出错了,最后只好对着书编写。
但我觉的出现问题并不是很要紧,这些问题能提醒我那些地方没有学好,只要我重视这些地方将其巩固我想我将能学到许多的知识。
通过这次设计,对于VHDL的设计方法大致有了一些技巧性的了解,位以后的硬件设计打下了基础,对FPGA的编程、定时器和计数器的设计都熟悉起来,加深了对时序组合电路的印象。
最后,我感觉我对QuartusII软件的使用熟练了许多。
我虽然以前在试验的时候使用过QuartusII这个软件,但用的时间毕竟不长,对其不太熟练,经过这次做课设我对这个软件运用熟练很多,这对以后的学习一定有很大的帮助。
我想在面对一个问题时不能存在侥幸心理,只要我们认真对待它,我们就能学到东西。
通过在网上进行各种资料的查询,也发现了其实FPGA的设计具有较好的前景,其功能的强大和设计方法的简单可靠。
具有较强的适应能力和可移植性。
15