基于FPGA技术的微波炉控制器.docx
《基于FPGA技术的微波炉控制器.docx》由会员分享,可在线阅读,更多相关《基于FPGA技术的微波炉控制器.docx(22页珍藏版)》请在冰豆网上搜索。
![基于FPGA技术的微波炉控制器.docx](https://file1.bdocx.com/fileroot1/2023-2/24/a0564ba2-e505-41e4-abb2-bb47b41dbd50/a0564ba2-e505-41e4-abb2-bb47b41dbd501.gif)
基于FPGA技术的微波炉控制器
**大学**学院
现代电子系统设计
**系(院)**专业
题目:
基于FPGA技术的微波炉控制器
学生姓名:
班级:
学号:
指导教师:
完成日期:
年月
摘要
本文介绍了应用FPGA芯片和硬件描述语言(VHDL)设计微波炉控制器系统的方法。
系统使用VHDL编程实现各底层模块的功能,顶层的设计采用图形输入完成。
本文主要阐述模块化设计的思想和状态图的描述方法,以及它们在硬件描述语言中的应用,并展示了其在QuartusⅡ开发系统下的仿真结果和烧写到EPM570T100C5后的现象。
主要有以下几个模块:
状态控制器KZQ、数据装载器ZZQ、烹调计时器JSQ、显示译码器YMQ47以及分频器和动态显示电路。
该控制器具有系统复位、状态控制、时间设定、烹饪计时、动态显示译码等功能。
关键字:
FPGA;VHDL;微波炉;控制器;状态图;定时器
1.绪论
随着人民生活水平的提高,微波炉开始进入越来越多的家庭,它给人们的生活带来了极大的方便。
它省事、省电、方便和卫生。
作为现代的烹饪工具,微波炉控制器体现着它的重要性能指标。
目前大部分微波炉控制器采用单片机进行设计,电路比较复杂,性能不够灵活。
本文采用先进的EDA技术,利用QuartusⅡ工作平台和VHDL设计语言,设计了一种新型的微波炉控制器系统。
该控制器具有系统复位、状态控制、时间设定、烹饪计时、动态显示译码等功能。
1.1任务的提出
设计一个微波炉控制器
1.2设计的基本要求
(1)七段数码管及发光二极管完成微波炉的定时及状态显示;
(2)控制器的输入信号包括定时控制信号、定时数据的输入、复位信号、开始煮饭的控制信号等;
(3)其他(我们自己添加了测试数码管是否能够正常显示的TEST信号)。
1.3设计的目的和意义
目前大部分微波炉控制器采用单片机进行设计,电路比较复杂,性能不够灵活。
本文采用先进的EDA技术,利用QuartusⅡ工作平台和VHDL设计语言,设计了一种新型的微波炉控制器系统。
该控制器具有系统复位、状态控制、时间设定、烹饪计时、动态显示译码等功能。
2.系统总体设计
2.1系统总体方案设计
根据该微波炉控制器的功能设计要求,本系统可由以下6个模块组成:
1.分频器;2.状态控制器KZQ;3.数据装载器ZZQ;4.烹调计时器JSQ;5.显示译码器YMQ47;6.动态显示电路。
其内部组成原理图如图1所示。
图1
2.2系统功能模块描述(具体的电路图和VHDL设计文件将在附件中给出)
各个模块的功能介绍
(1)分频器fenpinqi模块的功能是实现对实验箱上的50Mhz的分频,是整个系统能够正常显示的基础。
(2)状态控制器KZQ的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息;输入信号为CLK、TEST、START、SET_T、RESET和DONE,输出信号为LD_DONE、LD_CLK、LD_8888和COOK信号。
(3)数据装载器ZZQ的功能是根据KZQ发出的控制信号选择定时时间、测试数据或烹调完成信息的装入。
(4)计时器JSQ的功能是负责烹调过程中的时间递减计数,并提供烹调完成时的状态信号供KZQ产生烹调完成信号。
(5)显示译码器YMQ47的功能就是负责将各种显示信息的BCD转换成七段数码管显示的驱动信息编码。
需要译码的信息有:
数字0~9,字母d、o、n、E。
(6)动态显示电路的功能是将显示译码器YMQ47驱动信息编码在数码管有限的条件下显示出来。
3.系统详细设计
3.1状态控制器KZQ的设计
状态控制器KZQ的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息,因此我们可用一个状态机来实现它。
经过对微波炉工作过程中的状态转换条件及输出信号进行分析,我们可得到其状态转换图如图2所示,其输入、输出端口如图3所示。
图2KZQ的状态转换图
图3KZQ的输入、输出端口图
3.2数据装载器ZZQ的设计
ZZQ的输入、输出端口如图4所示,根据其应完成的逻辑功能,它本质上就是一个三选一数据选择器。
本设计采用一个进程来完成,但由于三个被选择的数据只有一个来自输入端口,因此另两个被选择的数据则通过在进程的说明部分定义两个常数来产生。
图4ZZQ的输入、输出端口图
3.3烹调计时器JSQ的设计
烹调计时器JSQ为减数计数器,其最大计时时间为59:
59。
因此我们可用两个减计数十进制计数器DCNT10和两个减计数六进制计数器DCNT6级联构成。
3.4显示译码器YMQ47的设计
本显示译码器YMQ47不但要对数字0~9进行显示译码,还要对字母d、o、n、E进行显示译码,其译码对照表如表1所示。
表1YMQ47的译码对照表
4系统仿真
4.1状态转换控制器KZQ仿真图
4.2数据装载器ZZQ仿真图
4.3计时器JSQ仿真
因为计时器是由两个减计数十进制计数器DCNT10和两个减计数六进制计数器DCNT6级联构成,所以,先完成两个减计数十进制和六进制计数器的仿真。
以下分别是两减计数器的功能仿真图。
十进制计数器DCNT10仿真图
六进制计数器DCNT6仿真图
在前面仿真正确的基础上,生成相应的元件,对两计数器进行级联,进行编译、仿真得到仿真结果图。
下图是对59分59秒的仿真结果。
由以上仿真结果可以看出,该JSQ模块实现了烹调计时的定时作用。
4.4显示译码器YMQ47仿真图
5.设计总结
本设计使用QuartusⅡ软件进行编写,并在实验箱上实现。
本设计有六个小模块模块,也可以分成两个大模块,一个模块是由KZQ、ZZQ、JSQ组成的,这个模块是本设计的基本,另一个模块是有分频器、译码器、动态显示电路组成的,这个模块是为了配合实验箱。
第一次实验的时候,发现管脚不够分配,知道这是因为实验箱上只有一个静态显示数码管,有8个动态显示数码管。
于是,进行改进,在原来的基础上增加了动态显示模块。
第二次实验的时候,发现数码管跳的过快,基本分辨不出来数字的变化,于是,想到是分频分的不够,于是,又改了一下分频器的分频系数。
最后一次实验时,能够正确的进行显示,并能够完成系统复位、状态控制、时间设定、烹饪计时、动态显示译码等功能。
唯一的缺陷是,当计时到00:
00时,显示灯是灭了一下,然后继续亮。
这是需要改进的地方。
对于时间的设定,我们虽然没有实现键盘控制,但是我们可以通过软件进行设置,并不是通过接地或者接高电平写死了,而是可以改变的。
我们自己添加了测试数码管是否能够正常显示的TEST信号。
6.参考文献
[1]谭会生,张昌凡。
EDA技术及其应用[M].:
西安电子科技大学出版社
[2]江思敏.VHDL数字电路及系统设计.:
机械工业出版社
[3]**院《现代电子设计》课本和实验指导书
7.附件
7.1整体的原理图
7.2各个基本模块的VHDL语言
7.2.1分频器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinqiis
port
(nreset:
instd_logic;
clk:
instd_logic;
co:
outstd_logic;
qcnt:
bufferstd_logic_vector(19downto0)
);
endfenpinqi;
architecturebehaveoffenpinqiis
begin
process(clk,nreset)
begin
if(nreset='0')then
qcnt<="000";
elsif(clk'eventandclk='1')then
qcnt<=qcnt+1;
endif;
endprocess;
co<=qcnt(19);
endbehave;
7.2.2控制器KZQ
--KZQ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYKZQIS
PORT(RESET,SET_T,START,TEST,CLK,DONE:
INSTD_LOGIC;
COOK,LD_8888,LD_CLK,LD_DONE:
OUTSTD_LOGIC);
ENDENTITYKZQ;
ARCHITECTUREBEHAVEOFKZQIS
TYPESTATE_TYPEIS(IDLE,LAMP_TEST,SET_CLOCK,TIMER,DONE_MSG);
SIGNALNXT_STATE,CURR_STATE:
STATE_TYPE;
BEGIN
PROCESS(CLK,RESET)IS
BEGIN
IFRESET='1'THEN
CURR_STATE<=IDLE;
ELSIFCLK'EVENTANDCLK='1'THEN
CURR_STATE<=NXT_STATE;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CURR_STATE,SET_T,START,TEST,DONE)IS
BEGIN
NXT_STATE<=IDLE;--DEFAULTNEXTSTATEISIDLE;
LD_8888<='0';
LD_DONE<='0';
LD_CLK<='0';
COOK<='0';
CASECURR_STATEIS
WHENLAMP_TEST=>LD_8888<='1';COOK<='0';
WHENSET_CLOCK=>LD_CLK<='1';COOK<='0';
WHENDONE_MSG=>LD_DONE<='1';COOK<='0';
WHENIDLE=>
IF(TEST='1')THEN
NXT_STATE<=LAMP_TEST;
LD_8888<='1';
ELSIFSET_T='1'THEN
NXT_STATE<=SET_CLOCK;
LD_CLK<='1';
ELSIF((START='1')AND(DONE='0'))THEN
NXT_STATE<=TIMER;
COOK<='1';
ENDIF;
WHENTIMER=>
IFDONE='1'THEN
NXT_STATE<=DONE_MSG;
LD_DONE<='1';
ELSE
NXT_STATE<=TIMER;
COOK<='1';
ENDIF;
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREBEHAVE;
7.2.3装载器ZZQ
--ZZQ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYZZQIS
PORT(DATA1:
INSTD_LOGIC_VECTOR(15DOWNTO0);
LD_8888:
INSTD_LOGIC;
LD_CLK:
INSTD_LOGIC;
LD_DONE:
INSTD_LOGIC;
DATA2:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
LOAD:
OUTSTD_LOGIC);
ENDENTITYZZQ;
ARCHITECTUREBHVOFZZQIS
BEGIN
PROCESS(DATA1,LD_8888,LD_CLK,LD_DONE)IS
CONSTANTALL_8:
STD_LOGIC_VECTOR(15DOWNTO0):
="01000";
CONSTANTDONE:
STD_LOGIC_VECTOR(15DOWNTO0):
="01101";
VARIABLETEMP:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
LOAD<=LD_8888ORLD_DONEORLD_CLK;
TEMP:
=LD_8888&LD_DONE&LD_CLK;
CASETEMPIS
WHEN"100"=>DATA2<=ALL_8;--LOAD_8888=1
WHEN"010"=>DATA2<=DONE;--LOAD_DONE
WHEN"001"=>DATA2<=DATA1;--LOAD_CLK
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREBHV;
7.2.4计时器JSQ,和其中需用到的DCNT6和DCNT10
--JSQ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYJSQIS
PORT(COOK:
INSTD_LOGIC;
DATA3:
INSTD_LOGIC_VECTOR(15DOWNTO0);
LOAD:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
SEC_L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SEC_H:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
MIN_L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
MIN_H:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
DONE:
OUTSTD_LOGIC);
ENDENTITYJSQ;
ARCHITECTUREARTOFJSQIS
COMPONENTDCNT10IS
PORT(CLK,LOAD,ENA:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDCOMPONENTDCNT10;
COMPONENTDCNT6IS
PORT(CLK,LOAD,ENA:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDCOMPONENTDCNT6;
SIGNALNEWCLK:
STD_LOGIC;
SIGNALS1:
STD_LOGIC;
SIGNALS2:
STD_LOGIC;
SIGNALS3:
STD_LOGIC;
SIGNALS4:
STD_LOGIC;
BEGIN
U1:
DCNT10PORTMAP(CLK,LOAD,COOK,DATA3(3DOWNTO0),SEC_L,S1);
U2:
DCNT6PORTMAP(S1,LOAD,COOK,DATA3(7DOWNTO4),SEC_H,S2);
U3:
DCNT10PORTMAP(S2,LOAD,COOK,DATA3(11DOWNTO8),MIN_L,S3);
U4:
DCNT6PORTMAP(S3,LOAD,COOK,DATA3(15DOWNTO12),MIN_H,S4);
DONE<=S4ANDS3ANDS2ANDS1;
ENDARCHITECTUREART;
--DCNT6.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDCNT6IS
PORT(CLK:
INSTD_LOGIC;
LOAD:
INSTD_LOGIC;
ENA:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDENTITYDCNT6;
ARCHITECTUREARTOFDCNT6IS
SIGNALCQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK,LOAD,ENA)IS
BEGIN
IFLOAD='1'THEN
CQI<=DATAIN;
ELSIFCLK'EVENTANDCLK='1'THEN
IFENA='1'THEN
IFCQI="0000"THENCQI<="0101";
ELSECQI<=CQI-'1';ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CQI)IS
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI="0000"THENCARRY_OUT<='1';
ELSECARRY_OUT<='0';ENDIF;
ENDIF;
ENDPROCESS;
CQ<=CQI;
ENDARCHITECTUREART;
--DCNT10.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDCNT10IS
PORT(CLK:
INSTD_LOGIC;
LOAD:
INSTD_LOGIC;
ENA:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDENTITYDCNT10;
ARCHITECTUREARTOFDCNT10IS
SIGNALCQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK,LOAD,ENA)IS
BEGIN
IFLOAD='1'THEN
CQI<=DATAIN;
ELSIFCLK'EVENTANDCLK='1'THEN
IFENA='1'THEN
IFCQI="0000"THENCQI<="1001";
ELSECQI<=CQI-'1';ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CQI)IS
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI="0000"THENCARRY_OUT<='1';
ELSECARRY_OUT<='0';ENDIF;
ENDIF;
ENDPROCESS;
CQ<=CQI;
ENDARCHITECTUREART;
7.2.5译码器YMQ47
--YMQ47.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYYMQ47IS
PORT(AIN4:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT7:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYYMQ47;
ARCHITECTUREARTOFYMQ47IS
BEGIN
PROCESS(AIN4)
BEGIN
CASEAIN4IS
WHEN"0000"=>DOUT7<="0111111";--显示0的g~a
WHEN"0001"=>DOUT7<="0000110";--1
WHEN"0010"=>DOUT7<="1011011";--2
WHEN"0011"=>DOUT7<="1001111";--3
WHEN"0100"=>DOUT7<="1100110";--4
WHEN"0101"=>DOUT7<="1101101";--5
WHEN"0110"=>DOUT7<="1111101";--6
WHEN"0111"=>DOUT7<="0000111";--7
WHEN"1000"=>DOUT7<="1111111";--8
WHEN"1001"=>DOUT7<="1101111";--9
WHEN"1010"=>DOUT7<="1011110";--d
WHEN"1011"=>DOUT7<="1011100";--o
WHEN"1100"=>DOUT7<="1010100";--n
WHEN"1101"=>DOUT7<="1111001";--E
WHENOTHERS=>DOUT7<="0000000";
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREART;
7.2.6动态显示电路需要用到的DCNT4和decoder
--cntm4.vhd
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytm4is
port
(ci:
instd_logic;
nreset:
instd_logic;
clk:
instd_logic;
co:
outstd_logic;
qcnt:
bufferstd_logic_vector(3downto0)
);
endtm4;
architecturebehaveoftm4is
begin
co<='1'when(qcnt="0011"andci='1')else'0';
process(clk,nreset)
begin
if(nreset='0')then
qcnt<="0000";
elsif(clk'eventandclk='1')then
if(qcnt=3)then
qcnt<="0000";
else
qcnt<=qcnt+1;
endif;
endif;
endprocess;
endbehave;
--de