微波炉控制器 2.docx
- 文档编号:6057972
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:14
- 大小:120.27KB
微波炉控制器 2.docx
《微波炉控制器 2.docx》由会员分享,可在线阅读,更多相关《微波炉控制器 2.docx(14页珍藏版)》请在冰豆网上搜索。
微波炉控制器2
1课程设计目的
以VHDL语言为开发工具,QuartusII作为程序运行平台。
通过设计和实验,对开发的程序进行调试运行和波形仿真测试验证,运用硬件描述语言VHDL,大大降低了硬件数字系统设计。
该控制器具有系统复位、时间设定、烹饪计时、显示译码等功能,基于FPGA芯片实现。
2课程设计要求和任务
2.1设计任务
利用所学的EDA设计方法实现微波炉定时控制,熟练使用使用QUARTUS
应用软件,进一步学习使用VHDL语言、原理图等EDA设计方法进行综合题目的方法。
2.2功能要求
1.复位开关:
2.启动开关:
3.烹调时间设置:
4.烹调时间显示:
5.七段码测试:
6.启动输出:
7.按TEST键可以测试七段码管,显示为“8888”;
8.设定时间后,按启动键开始烹调,同时七段码显示剩余时间,时间为0时,显示烹调完成信息“CDEF”
3总体设计思路及原理描述
根据题目要求,通过该控制器再配以4个七段数码二极管完成微波炉的定时及信息显示。
该系统控制部分以FPGA芯片为核心,根据该微波炉控制器的功能设计要求,本系统可由以下4个模块组成:
①时钟分频模块;②时间初始化模块;③烹调倒计时模块;④显示译码模块。
clk是秒时钟脉冲输入,它接收每秒一个时钟脉冲的节拍信号。
reset为复位信号,高电平有效,用于芯片的复位功能。
test为测试信号,高电平有效,用于测试4个七段数码二极管工作是否正常。
start为开始加热信号。
sec1、sec10、min1、min10为设定时间的秒位、十秒位、一分位、十分位。
selectLed为数码管位选信号共3位。
Led为数码管段码信号共7位。
clk是秒时钟脉冲输入,它接收每秒一个时钟脉冲的节拍信号。
reset为复位信号,高电平有效,用于芯片的复位功能。
test为测试信号,高电平有效,用于测试4个七段数码二极管工作是否正常。
start为开始加热信号。
sec1、sec10、min1、min10为设定时间的秒位、十秒位、一分位、十分位。
selectLed为数码管位选信号共3位。
Led为数码管段码信号共7位。
4分层次方案设计及代码描述
4.1分频模块设计
分频模块主要利用2Khz的时钟信号进行分频。
得到1s的clock时钟信号,用于计数模块的时钟信号。
分频程序端口图如下:
4.2时间设置模块设计
时间设定模块主要用于对时间设定初始值而用,其中设有clk和clock两时钟信号,分别用于外接按钮信号和减计数。
设定时间采用四个按钮控制,sec1、sec10、min1、min10分别为一秒,十秒,一分,十分的控制信号。
而信号tSec1、tSec10、tMin1、tMin10为传递信号,传递给显示模块。
时间设置模块端口图:
clk信号用于检测按钮的状态,当有按钮按下时,则相应的时间信号加一。
但sec1、min1、min10最大为9,累加至9后,再次按下按钮累加则置0。
sec10为十秒位所以最大为5,再次按下累加则置零。
4.3减计数模块设计
当检测到start按钮按下时则启动减计数程序开始减计数。
减计数模块端口图:
(1)开始减计数后,判断,秒位是否为"0000",不为零则依据clock时钟开始递减。
为零则置位借位判断位borrow,向十秒为借位。
(2)当十秒为不为零时,如果borrow位为1则减一后清零借位信号borrow,置位一秒位为"1001"即为9。
如果十秒位为零borrow为1,则向一分位借位。
(3)当一分不为零,如果borrow信号为1则减一清零借位信号borrow,置位十秒为"0101"即为5,置位一秒位为"1001"即为9。
如果一分位为零borrow为1,则向十分位借位。
(4)当十分位不为零,如果borrow位为1则减一后清零借位信号borrow,置位一分位和一秒位为"1001"即为9,置位十秒位为"0101"。
为零则减计数完毕。
置位tSec1、tSec10、tMin1、tMin10为"1111"。
结束减计数程序。
4.4显示译码模块
显示译码模块采用动态扫描位选输出数据,不需对四个数码管都进行绑定。
同时负责test信号的处理。
当test按钮按下时,不再接收进程间传递信号tSec1、tSec10、tMin1、tMin10的数据,直接给数码管送段码显示"1111111"。
显示译码模块端口图:
显示译码负责对0-9的数字进行编码编码表如下:
还需对完成信号"CDEF"进行编码:
C为"0111001";
D为"0111111";
E为"1111001";
F为"1110001";
显示译码模块的设计,由于加热完毕需要显示为"CDEF"。
所以采用了对每一位数码管单独设计译码模块。
检测到"1111"时,各位显示对应的字符。
还需要注意对其他状态的处理,每个数码管只需要显示0-9和一个"1111"状态,还需对其他状态置零处理。
5各模块的时序仿真图
5.1分频时序仿真:
软件仿真采用的时钟周期为1us,所以分频后得到的时间为2ms。
5.2时间初始化时序图仿真
其中t0,t1,t2,t3为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号
5.3减计数时序仿真:
其中t0,t1,t2,t3为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号
5.4动态扫描仿真:
5.5软件仿真
其中t0,t1,t2,t3为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号
5.6程序和代码
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitymicrowaveis
port(
clk,start,reset,test:
instd_logic;
min10,min1,sec10,sec1:
instd_logic;
--为设定时间的10分钟位1分钟位10秒钟位
light:
outstd_logic;--启动输出显示灯
selectLed:
outstd_logic_vector(2downto0);
--数码管位选控制信号
led:
outstd_logic_vector(6downto0)--数码管段码
);
endmicrowave;
architecturecontrollerofmicrowaveis
signaltMin10,tMin1,tSec10,tSec1:
std_logic_vector(3downto0);
--最大设定时间为99分59秒
signalclock:
std_logic;
begin
setClock:
process(clk,reset)
---------------分频模块-----------------
variablesetFreq:
integerrange2002downto0;--设置选定频begin
ifreset='1'then
clock<='0';
setFreq:
=0;
elsifclk'eventandclk='1'then
setFreq:
=setFreq+1;
ifsetFreq=2000then
setFreq:
=0;
clock<=notclock;
endif;
endif;
endprocess;
-----------显示时间处理模块-------------
setTime:
process(min10,min1,sec10,sec1,reset,test,start,clock)
variabletime0,time1,time2,time3:
std_logic_vector(3downto0);
--最大设定时间为99分59秒(5999s)
variabletimeTotal:
std_logic_vector(15downto0);
variableturnOn:
std_logic;
begin
ifstart='1'then
turnOn:
='1';
light<='1';
elsifreset='1'then
turnOn:
='0';
light<='0';
endif;
ifturnOn='0'then
ifreset='1'then
time3:
="0000";--复位处理
elsifmin10'eventandmin10='1'then--设置十分位时间
iftime3<9then
time3:
=time3+1;
else
time3:
="0000";--十分位最大为9,超过置0
endif;
endif;
ifreset='1'then
time2:
="0000";
elsifmin1'eventandmin1='1'then--设置一分位时间
iftime2<9then
time2:
=time2+1;
else
time2:
="0000";--一分位最大为9,超过置0
endif;
endif;
ifreset='1'then
time1:
="0000";
elsifsec10'eventandsec10='1'then--设置十秒位时间
iftime1<5then--十秒位最大为5
time1:
=time1+1;
else
time1:
="0000";--十秒位最大为5,超过置0
endif;
endif;
ifreset='1'then
time0:
="0000";
elsifsec1'eventandsec1='1'then--设置一秒位时间
iftime0<9then
time0:
=time0+1;
else
time0:
="0000";--一秒位最大为9,超过置0
endif;
endif;
elsifclock'eventandclock='1'then
ifturnOn='1'then
timeTotal:
=time3&time2&time1&time0;--并置各个时间位
iftimeTotal<="1001100101011001"then--在5999秒内
iftime0="0000"then
iftime1/="0000"then--向十秒位借位
time1:
=time1-1;
time0:
="1001";--借位后一秒位为"1001"
elsiftime2/="0000"then--向一分位借位
time2:
=time2-1;
time1:
="0101";--借位后十秒位为"0101"
time0:
="1001";--借位后一秒位为"1001"
elsiftime3/="0000"then--向十分位借位
time3:
=time3-1;
time2:
="1001";
--借位后一分位和一秒位为"1001"
time1:
="0101";--借位后十秒位为"0101"
time0:
="1001";
elsiftime3="0000"then
time3:
="1111";
time2:
="1111";
time1:
="1111";
time0:
="1111";
endif;
elsiftimeTotal>0then
time0:
=time0-1;
--不需要借位则直接用一秒位减一
endif;
endif;
endif;
endif;
tSec1<=time0;
tSec10<=time1;
tMin1<=time2;
tMin10<=time3;
endprocess;
-----------显示译码模块-------------
ledDisply:
process(tSec1,tSec10,tMin1,tMin10,clk,test,reset)
variableled0,led1,led2,led3:
std_logic_vector(6downto0);
variablecount:
std_logic_vector(2downto0);
variabletestOn:
std_logic;
begin
iftest='1'then
testOn:
='1';
elsifreset='1'then
testOn:
='0';
endif;
casetMin10is
when"0000"=>led3:
="0111111";
when"0001"=>led3:
="0000110";
when"0010"=>led3:
="1011011";
when"0011"=>led3:
="1001111";
when"0100"=>led3:
="1100110";
when"0101"=>led3:
="1101101";
when"0110"=>led3:
="1111101";
when"0111"=>led3:
="0000111";
when"1000"=>led3:
="1111111";
when"1001"=>led3:
="1101111";
when"1111"=>led3:
="0111001";--加热完毕输出'C'
whenothers=>led3:
="0111111";--异常情况都输出'0'
endcase;
casetMin1is--显示译码模块
when"0000"=>led2:
="0111111";
when"0001"=>led2:
="0000110";
when"0010"=>led2:
="1011011";
when"0011"=>led2:
="1001111";
when"0100"=>led2:
="1100110";
when"0101"=>led2:
="1101101";
when"0110"=>led2:
="1111101";
when"0111"=>led2:
="0000111";
when"1000"=>led2:
="1111111";
when"1001"=>led2:
="1101111";
when"1111"=>led2:
="0111111";--加热完毕输出'D'
whenothers=>led2:
="0111111";--异常情况都输出'0'
endcase;
casetSec10is--显示译码模块
when"0000"=>led1:
="0111111";
when"0001"=>led1:
="0000110";
when"0010"=>led1:
="1011011";
when"0011"=>led1:
="1001111";
when"0100"=>led1:
="1100110";
when"0101"=>led1:
="1101101";--10秒位最大为5
when"1000"=>led1:
="1111111";
when"1111"=>led1:
="1111001";--加热完毕输出'E'
whenothers=>led1:
="0111111";--异常情况都输出'0'
endcase;
casetSec1is--显示译码模块
when"0000"=>led0:
="0111111";
when"0001"=>led0:
="0000110";
when"0010"=>led0:
="1011011";
when"0011"=>led0:
="1001111";
when"0100"=>led0:
="1100110";
when"0101"=>led0:
="1101101";
when"0110"=>led0:
="1111101";
when"0111"=>led0:
="0000111";
when"1000"=>led0:
="1111111";
when"1001"=>led0:
="1101111";
when"1111"=>led0:
="1110001";--加热完毕输出'F'
whenothers=>led0:
="0111111";--异常情况都输出'0'
endcase;
ifclk'eventandclk='1'then--扫描显示
ifcount="011"then--只需四个数码管,count:
="000";
else
count:
=count+1;
endif;
selectLed<=count;
iftestOn='1'then
led<="1111111";
else
casecountis--依据位码选择对应数码管显示
when"000"=>led<=led0;
when"001"=>led<=led1;
when"010"=>led<=led2;
when"011"=>led<=led3;
whenothers=>null;
endcase;
endif;
endif;
endprocess;
endcontroller;
6总结
这门语言更难以控制,即使实现很简单的功能,都很可能出现错误。
在处理一个个错误的过程中,也开始逐渐熟悉这门语言。
明白VHDL的相对硬件实现的便利和强大。
整个设计中,只是用了三个进程。
一个用于分频,产生1s的clock信号。
一个用于设定时间和减计数。
还有一个用于译码显示。
三个进程中通过clock信号传递时钟信号,通过tSec1、tSec10tMin1、tMin10传递数码管各位的数值。
随这科学技术的不断发展,EDA已经成为硬件设计的重要部分。
实习中也逐渐认可这一点。
学好这一门课必将为以后的发展打下很好的基础。
两周实习,的确比在上课所学到的多得多。
7参考文献
1.潘松,黄继业.EDA技术与VHDL.北京:
清华大学出版社,2005
2.赵全利,秦春.EDA技术及应用教程.机械工业出版社,2012
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微波炉控制器 微波炉 控制器
![提示](https://static.bdocx.com/images/bang_tan.gif)