基于MAXII系列CPLD的微波炉控制器芯片设计.docx
《基于MAXII系列CPLD的微波炉控制器芯片设计.docx》由会员分享,可在线阅读,更多相关《基于MAXII系列CPLD的微波炉控制器芯片设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于MAXII系列CPLD的微波炉控制器芯片设计
浙江科技学院
嵌入式系统(EDA技术)
课程设计报告书
课题名称:
基于MAXII系列CPLD的微波炉控制器芯片设计
院、系:
自动化与电气工程学院
专业班级:
建筑电气智能化
第1章绪论
随着人们生活水平的提高和信息化的发展,家用电器层出不穷,各种功能也越来越完善,其中微波炉是现代家庭的必备产品已经成为人们日用生活中的必不可少的厨房电器,大大降低了家庭妇女的工作量和工作强度,它的质量和性能的高低,将会极大的影响人们的生活水平和质量。
为此,设计一个高质量的微波炉控制系统是非常有必要的。
微波炉开始进入越来越多的家庭,他给人们的生活带来了极大的方便。
微波炉由2450MHz的超高频来加热食物。
他省时、省电、方便和卫生,作为现代的烹饪工具,微波炉的控制器体现着他的重要性能指标。
目前大部分微波炉控制器采用单片机进行设计,带南路比较复杂性能不够灵活。
本文采用先进的EDA技术,利用QuartusII工作平台和VHDL设计语言,设计了一种新型的微波炉控制器芯片,该芯片具有系统复位、时间设定和烹饪计时的功能,用一片FPGA芯片实现,所以能设计出一款方便安全操作的微波炉是非常有必要的。
第2章设计目的
该设计用VHDL语言在MAX+PLUSⅡ软件平台上通过编译、模拟、仿真,完成了微波炉控制功能,实现了微波炉的测试、时间设置、烹调计时、完成提示等设计,并对时钟分频作了一定的探讨。
此设计采用了现场可编程逻辑器件FPGA的ASIC设计,由控制模块、装载模块、计时模块和显示模块四大模块组成,而且它可以将所有器件集成在一块芯片上,体积大大减小,且外围电路很简单,易于实现。
第3章设计要求
3.1微波炉的功能要求
要求设计一个基于MAXII系列的可调式数字闹钟,器件型号为EPM240T100C5,功能要求如下:
1、上电后,系统自动复位:
数码管显示全零,功率选择小火档,显示“1”,三挡加热输出均为低电平;
2、可以进行烹调时间的分、秒设置,并使用数码管显示时间信息,设要求最长的烹调时间为59分59秒;
3、可以选择加热功率,分三档:
高火、中火、小火,分别显示“3”,“2”,“1”;
4、按“开始”按键进入烹调状态,根据功率选择输出加热控制信号,时间显示数码管按每秒减1的倒计时方式显示剩余烹调时间;
5、烹调定时结束后,输出通知信号,系统回到复位状态。
3.2设计步骤
采用VHDL的系统设计,一般有以下6个步骤:
(1)要求的功能模块划分;
(2)VHDL的设计描述(设计输入);
(3)代码仿真模拟(前仿真);
(4)计综合、优化和布局布线;
(5)布局布线后的仿真模拟(后仿真);
(6)设计的实现(下载到目标器件)。
第4章设计思想
4.1微波炉定时器的工作过程
上电后,系统处于复位状态。
工作时首先进行烹调时间设置,并使用数码管显示时间信息,设要求最长的烹调时间为59分59秒,时间设置完毕后系统自动回到初始状态;按开始烹调按键进入烹调状态,时间显示数码管按每秒减1的倒计时方式显示剩余烹调时间;烹调结束后,系统回到复位状态。
4.2根据系统的基本要求
(1)计时电路的设计:
芯片内部产生和外部提供。
本例中由外部时钟电路以BCD码的形式提供。
(2)时间设置出错及工作过程的取消等情况的处理:
设置一个复位按键。
(3)数码管状态的检测:
设置数码管检测按键,按动该按键后,数码管能够显示“8888”的信息。
(4)时间显示电路:
采用4位7段显示数码管显示,并由芯片直接驱动。
(5)微波管的驱动:
设置一个输出驱动控制烹调状态的继电器即可。
第5章设计内容
微波炉控制器的功能设计要求,本系统可由一下4个模块组成:
①状态控制器KZQ;②数据装载器ZZQ;③烹调计时器JSQ;④显示译码器YMQ47;状态控制电路,其功能是控制微波炉工作过程中的状态转换,并发出相关控制信号;数据装载电路,其功能是根据控制信号选择定时时间,测试数据或计时完成信息的载入;计时器电路,其功能是对时钟进行减法计数,提供烹调完成时的状态信号。
译码器,就是负责将各种显示信息的BCD转换成七段数码管显示的驱动信息编码。
微波炉控制器的系统框图如图1所示。
其中,CLK为时钟输入信号,时钟上升沿敏感;RESET为复位信号,高电平有效时系统复位清零;TEST为数码显示管测试信号,高电平有效系统显示8888;SET_T高电平有效时允许设置烹饪时间;KEY为定时时间输入信号,用于设置烹饪时间的长短,其高到低分别表示时间分、秒的十位、个位;START为烹调开始信号,高电平有效时开始烹调;输出信号COOK指示微波炉状态,高电平时表示烹调进行时;SEC0、SEC1、MIN0、MIN1分别表示秒个位、秒十位、分个位、分十位。
图1微波炉控制器的系统框图
首先,对系统进行复位清零,使其各电路模块均处于初始状态;当烹饪时间设置信号SET_T有效时,读入时间信号KEY[3..0]的取值,此时系统显示设置的时间信息,再按下SET_T确定设置时间完成。
按下开始键START,系统进入烹调状态,COOK信号变为高电平,时钟计数器开始减法计数,MIN1、MIN0、SEC1、SEC0显示剩余烹调时间。
烹调结束,系统恢复初始状态。
当系统处于复位清零状态时,按下显像管测试按钮TEST,将对显像管是否正常工作进行测试,正常工作时,显像管输出全8。
5.1状态控制电路模块
状态控制器的功能根据输入信号和自身当时所处的状态完成状态的转换和输出相应的控制信号,其模块框图如图3所示。
其中,输出信号LD_DONE指示数据装载电路载入的烹调结束的状态信息的显示的驱动信息数据;LD_CLK显示数据装载电路的设置的时间数据;LD_TEST指示数据装载电路载入的用于测试的数据,以显示驱动信息数据;COOK指示烹饪的状态,并提示计时器进行减法计算;KEY为定时时间输入信号,用于设置烹饪时间的长短,其高到低分别表示时间分、秒的十位、个位。
当LD_DONE有效时,输出烹调结束数据。
当LD_CLK有效时,输出烹调的设置时间数据。
当LD_TEST有效时,输出数码管测试数据--包括6个输入信号和4个输出信号。
图3状态控制电路模块框图
根据微波炉工作流程的描述,分析状态转换条件及输出信号,可以得到如图4所示的微波炉控制器的状态转换图。
图中,当RESET信号有效时,系统复位清零;输入/输出对应烹调时间设置、显示译码测试、完成信号显示和减法计数定时四种状态进行相应的转换。
5.2数据装载电路模块
数据装载电路的本质是一个三选一多路选择器,其模块框图如图5所示。
图5数据装载电路模块框图
当LD_DONE有效时,输出烹调结束的信息数据数据。
当L_CLK有效时,输出烹调的设置时间数据。
当L_TEST有效时,输出数码管测试数据。
LOAD信号为LD_DONE时DATEOUT输出KEY有效指示。
5.3计时器模块
电路计时模块可以由十进制减法计数器和六进制减法计数器级联组成,其中,两个十进制的减法计数器用于分、秒的个位减法计数,两个六进制的减法计数器用于分、秒的十位减法计数。
由六进制计数器和十进制计数器级联构成的计时模块原理图如图6所示。
图6计时器模块原理图
计时器模块的框图如图7所示。
图7计时器模块框图
LOAD有效时完成装入功能,COOK(EN)有效时执行减计数;CLR由RESET发出信号,清除装载已存的数据;DONE返回给控制器,MIN和SEC显示所剩时间和测试状态信息、烹调结束状态信息等。
显示译码控制部分的设计
显示的数字或字母
BCD编码
七段显示驱动编码(g~a)
0
0000
0111111
1
0001
0000110
2
0010
1011011
3
0011
1001111
4
0100
1100110
5
0101
1101101
6
0110
1111101
7
0111
0000111
8
1000
1111111
9
1001
1101111
d
1010
1011110
o
1011
1011100
n
1100
1010100
E
1101
1111001
设计内容
状态控制符号图
5.4状态控制源程序
--状态控制电路的VHDL实现如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYcontrollorIS
PORT(
RESET:
INSTD_LOGIC;--复位信号
KEY:
INSTD_LOGIC_VECTOR(3DOWNTO0);--输入时间
SET_T:
INSTD_LOGIC;--时间设置信号
START:
INSTD_LOGIC;--开始烹调信号
TEST:
INSTD_LOGIC;--显示电路测试信号
CLK:
INSTD_LOGIC;--时钟脉冲
DONE:
INSTD_LOGIC;--完成信号
COOK:
OUTSTD_LOGIC;--指示烹调状态,提示计时器开始计数
LD_TEST:
OUTSTD_LOGIC;--指示数据装载电路载入的用于测试的数据
LD_CLK:
OUTSTD_LOGIC;--指示数据装载电路载入设置时间数据
DATA:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);--16位数据
LED_SET_T:
OUTSTD_LOGIC;--LED显示状态
LD_DONE:
OUTSTD_LOGIC--LED显示完成
);
ENDcontrollor;
ARCHITECTURErtlOFcontrollorIS
TYPESTATESIS(IDLE,LAMP_TEST,SET_CLOCK,TIMER,DONE_MSG);
SIGNALNXT,CUR:
STATES;--2个信号:
下一状态、当前状态
SIGNALDATATMP:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALSET_T0:
STD_LOGIC;--设置时间信号
BEGIN
PROCESS(CLK,RESET)--时钟和复位的进程
BEGIN
IFRESET='1'THEN--复位时将IDLE(显示0000)赋予当前状态
CUR<=IDLE;
ELSIFCLK'EVENTANDCLK='1'THEN
CUR<=NXT;--如果不是,遇到上边沿则自动跳转下一状态
ENDIF;
ENDPROCESS;
PROCESS(RESET,KEY)--复位和输入的进程
BEGIN--可以让输入4位数字显示时间
IFRESET='1'THEN--复位时不论任何状态数码管都将显示0000
DATATMP<=(others=>'0');
ELSE
IFKEY(3)'EVENTANDKEY(3)='1'THEN--设置分的十位
IFDATATMP(15DOWNTO12)="0101"THEN--5自动跳转到0
DATATMP(15DOWNTO12)<="0000";
ELSE
DATATMP(15DOWNTO12)<=DATATMP(15DOWNTO12)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY
(2)'EVENTANDKEY
(2)='1'THEN--设置分的个位
IFDATATMP(11DOWNTO8)="1001"THEN--9自动跳转到0
DATATMP(11DOWNTO8)<="0000";
ELSE
DATATMP(11DOWNTO8)<=DATATMP(11DOWNTO8)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY
(1)'EVENTANDKEY
(1)='1'THEN--设置秒的十位
IFDATATMP(7DOWNTO4)="0101"THEN--5自动跳转到0
DATATMP(7DOWNTO4)<="0000";
ELSE
DATATMP(7DOWNTO4)<=DATATMP(7DOWNTO4)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY(0)'EVENTANDKEY(0)='1'THEN--设置秒的个位
IFDATATMP(3DOWNTO0)="1001"THEN--9自动跳转到0
DATATMP(3DOWNTO0)<="0000";
ELSE
DATATMP(3DOWNTO0)<=DATATMP(3DOWNTO0)+1;
ENDIF;
ENDIF;--否则自动加1
ENDIF;
DATA<=DATATMP;
ENDPROCESS;
PROCESS(SET_T,RESET)--设置时间和复位进程
BEGIN
IFRESET='1'THEN--复位时设置时间变为低电平
SET_T0<='0';
ELSIFSET_T'EVENTANDSET_T='1'THEN--按下SET_T键时
SET_T0<=NOTSET_T0;--SET_T非它前之状态
ENDIF;
IFSET_T0='1'THEN
LED_SET_T<='1';--赋予SET_T持续电平
ELSE
LED_SET_T<='0';--赋予SET_T持续电平
ENDIF;
ENDPROCESS;
PROCESS(CLK,CUR,SET_T,START,TEST,DONE)IS
BEGIN
NXT<=IDLE;--将IDLE载入NXT
LD_TEST<='0';--复位
LD_DONE<='0';
LD_CLK<='0';
COOK<='0';
CASECURIS
WHENLAMP_TEST=>--译码器显示测试状态
LD_TEST<='1';
COOK<='0';
WHENSET_CLOCK=>--烹调时间测试状态
LD_CLK<='1';
COOK<='0';
WHENDONE_MSG=>--完成信息显示状态
LD_DONE<='0';
COOK<='0';
WHENIDLE=>--初始状态定义
IFTEST='1'THEN
NXT<=LAMP_TEST;--设置TEST
LD_TEST<='1';
ELSIFSET_T0='1'THEN--设置SET_T
NXT<=SET_CLOCK;
LD_CLK<='1';
ELSIFSTART='1'ANDDONE='0'THEN--设置计时模式
NXT<=TIMER;
COOK<='1';
ENDIF;
WHENTIMER=>
IFDONE='1'THEN--设置计时完成
NXT<=DONE_MSG;
LD_DONE<='0';
ELSE
NXT<=TIMER;
COOK<='1';
ENDIF;
--WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDrtl;
数据装载的符号图
数据装载的源程序
--数据装载电路的VHDL实现如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYloaderIS
PORT(
DATAIN:
INSTD_LOGIC_VECTOR(15DOWNTO0);--输入16位数据
LD_TEST:
INSTD_LOGIC;
LD_CLK:
INSTD_LOGIC;
LD_DONE:
INSTD_LOGIC;
DATAOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);--输出16位数据
LOAD:
OUTSTD_LOGIC--选择状态
);
ENDloader;
ARCHITECTURErtlOFloaderIS
BEGIN
PROCESS(DATAIN,LD_TEST,LD_CLK,LD_DONE)
CONSTANTALLS:
STD_LOGIC_VECTOR(15DOWNTO0)--测试信息
:
="1000100010001000";--显示8888
CONSTANTDONE:
STD_LOGIC_VECTOR(15DOWNTO0)--烹调完成信息
:
="1010101111001101";
VARIABLETEMP:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
LOAD<=LD_TESTORLD_DONEORLD_CLK;--三选一状态
TEMP:
=LD_TEST&LD_DONE&LD_CLK;--中间变量定义
CASETEMPIS
WHEN"100"=>--测试
DATAOUT<=ALLS;
WHEN"010"=>--烹调完成
DATAOUT<=DONE;
WHEN"001"=>
DATAOUT<=DATAIN;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDrtl;
计时器电路的符号图
计时器电路的源程序
--十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;--CLR:
清除数据
EN:
INSTD_LOGIC;--信号使能
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);--输入的4位数据
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出的4位数据
CARRY_OUT:
OUTSTD_LOGIC--数据装载
);
ENDcnt10;
ARCHITECTURErtlOFcnt10IS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);--链接输入输出
BEGIN--数据的信号
PROCESS(CLK,LOAD,CLR,EN)
BEGIN
IFCLR='1'THEN--当CLR高电平,数据变为0000
TMP<="0000";
ELSIFLOAD='1'THEN--否则装载输入的数据
TMP<=DATAIN;
ELSIFCLK'EVENTANDCLK='0'THEN--上升沿时,执行10进制减法
IFEN='1'THEN
IFTMP="0000"THEN--0跳转到9
TMP<="1001";
ELSE--自动减1
TMP<=TMP-'1';
ENDIF;
ENDIF;
ENDIF;
IFTMP="0000"THEN
CARRY_OUT<='1';--COOK<=CARRY_OUT
ELSE
CARRY_OUT<='0';
ENDIF;
ENDPROCESS;
Q<=TMP;
ENDrtl;
--六进制减法计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt6IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC
);
ENDcnt6;
ARCHITECTURErtlOFcnt6IS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK,LOAD,CLR,EN)
BEGIN
IFCLR='1'THEN
TMP<="0000";
ELSIFLOAD='1'THEN
TMP<=DATAIN;
ELSIFCLK'EVENTANDCLK='0'THEN--上升沿时进行6进制减法
IFEN='1'THEN
IFTMP="0000"THEN--0自动跳转到5
TMP<="0101";
ELSE
TMP<=TMP-'1';--否则自动减1
ENDIF;
ENDIF;
ENDIF;
IFTMP="0000"THEN
CARRY_OUT<='1';--赋值给COOK
ELSE
CARRY_OUT<='0';
ENDIF;
ENDPROCESS;
Q<=TMP;
ENDrtl;
--计时电路的VHDL实现如下:
--计数器电路模块设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcounterIS
PORT(
COOK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
DATA:
INSTD_LOGIC_VECTOR(15DOWNTO0);
SEC0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--秒个位
SEC1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--秒十位
MIN0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--分个位
MIN1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--分十位
DONE:
OUTSTD_LOGIC--完成
);
ENDcounter;
ARCHITECTURErtlOFcounterIS
--定义十进制和六进制计数器电路模块
COMPONENTcnt10IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;
EN:
INSTD_LO