微波炉控制器 2Word文档下载推荐.docx
《微波炉控制器 2Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微波炉控制器 2Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
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"
如果一分位为零borrow为1,则向十分位借位。
(4)当十分位不为零,如果borrow位为1则减一后清零借位信号borrow,置位一分位和一秒位为"
即为9,置位十秒位为"
。
为零则减计数完毕。
置位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"
显示译码模块的设计,由于加热完毕需要显示为"
所以采用了对每一位数码管单独设计译码模块。
检测到"
时,各位显示对应的字符。
还需要注意对其他状态的处理,每个数码管只需要显示0-9和一个"
状态,还需对其他状态置零处理。
5各模块的时序仿真图
5.1分频时序仿真:
软件仿真采用的时钟周期为1us,所以分频后得到的时间为2ms。
5.2时间初始化时序图仿真
其中t0,t1,t2,t3为输出显示信号,为方便观察tSec1,tSec10,tMin1,tMin10的数据,加入的测试信号
5.3减计数时序仿真:
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:
--为设定时间的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='
=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:
--最大设定时间为99分59秒(5999s)
variabletimeTotal:
std_logic_vector(15downto0);
variableturnOn:
ifstart='
turnOn:
;
light<
elsifreset='
ifturnOn='
ifreset='
time3:
="
--复位处理
elsifmin10'
eventandmin10='
then--设置十分位时间
iftime3<
9then
time3:
=time3+1;
else
--十分位最大为9,超过置0
endif;
time2:
elsifmin1'
eventandmin1='
then--设置一分位时间
iftime2<
time2:
=time2+1;
--一分位最大为9,超过置0
time1:
elsifsec10'
eventandsec10='
then--设置十秒位时间
iftime1<
5then--十秒位最大为5
time1:
=time1+1;
else
--十秒位最大为5,超过置0
time0:
elsifsec1'
eventandsec1='
then--设置一秒位时间
iftime0<
time0:
=time0+1;
--一秒位最大为9,超过置0
elsifclock'
eventandclock='
ifturnOn='
then
timeTotal:
=time3&
time2&
time1&
time0;
--并置各个时间位
iftimeTotal<
1001100101011001"
then--在5999秒内
iftime0="
iftime1/="
then--向十秒位借位
time1:
=time1-1;
time0:
--借位后一秒位为"
elsiftime2/="
then--向一分位借位
time2:
=time2-1;
--借位后十秒位为"
elsiftime3/="
then--向十分位借位
time3:
=time3-1;
--借位后一分位和一秒位为"
elsiftime3="
endif;
elsiftimeTotal>
0then
time0:
=time0-1;
--不需要借位则直接用一秒位减一
endif;
tSec1<
=time0;
tSec10<
=time1;
tMin1<
=time2;
tMin10<
=time3;
-----------显示译码模块-------------
ledDisply:
process(tSec1,tSec10,tMin1,tMin10,clk,test,reset)
variableled0,led1,led2,led3:
std_logic_vector(6downto0);
variablecount:
std_logic_vector(2downto0);
variabletestOn:
begin
iftest='
testOn:
casetMin10is
when"
=>
led3:
0001"
0000110"
0010"
1011011"
0011"
1001111"
0100"
1100110"
1101101"
0110"
1111101"
0111"
0000111"
1000"
1101111"
--加热完毕输出'
C'
whenothers=>
--异常情况都输出'
endcase;
casetMin1is--显示译码模块
led2:
D'
casetSec10is--显示译码模块
led1:
--10秒位最大为5
E'
casetSec1is--显示译码模块
led0:
F'
whenothers=>
ifclk'
then--扫描显示
ifcount="
011"
then--只需四个数码管,count:
000"
else
count:
=count+1;
selectLed<
=count;
iftestOn='
led<
casecountis--依据位码选择对应数码管显示
when"
led<
=led0;
001"
=led1;
010"
=led2;
=led3;
whenothers=>
null;
endcase;
endcontroller;
6总结
这门语言更难以控制,即使实现很简单的功能,都很可能出现错误。
在处理一个个错误的过程中,也开始逐渐熟悉这门语言。
明白VHDL的相对硬件实现的便利和强大。
整个设计中,只是用了三个进程。
一个用于分频,产生1s的clock信号。
一个用于设定时间和减计数。
还有一个用于译码显示。
三个进程中通过clock信号传递时钟信号,通过tSec1、tSec10tMin1、tMin10传递数码管各位的数值。
随这科学技术的不断发展,EDA已经成为硬件设计的重要部分。
实习中也逐渐认可这一点。
学好这一门课必将为以后的发展打下很好的基础。
两周实习,的确比在上课所学到的多得多。
7参考文献
1.潘松,黄继业.EDA技术与VHDL.北京:
清华大学出版社,2005
2.赵全利,秦春.EDA技术及应用教程.机械工业出版社,2012