EDA课程设计微波炉定时控制器.docx
《EDA课程设计微波炉定时控制器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计微波炉定时控制器.docx(25页珍藏版)》请在冰豆网上搜索。
EDA课程设计微波炉定时控制器
一、设计题目和要求-----------------------------------------------------------------2
二、设计思路--------------------------------------------------------------------------2
三、单元模块设计--------------------------------------------------------------------3
--------------------------------------------------------------------------------------------8
3.1、FENPIN模块设计-----------------------------------------------------(3,4)
3.2、FIRST模块设计------------------------------------------------------(4,5)
3.3、JIANJISHU模块设计------------------------------------------------(5,6)
3.4、CHOICE和VIEW模块设计------------------------------------------(7,8)
四、硬件实验---------------------------------------------------------------------------8
五、心得体会---------------------------------------------------------------------------9
附页:
程序代码------------------------------------------------------------------------10
---------------------------------------------------------------------------------------------17
一、设计题目和要求
设计题目为:
微波炉定时控制器
要求:
1、复位开关:
2、启动开关:
3、烹调时间设置:
4、烹调时间显示:
5、七段码测试:
6、启动输出:
7、按TEST键可以测试七段码管,显示为“8888”;
8、设定时间后,按启动键开始烹调,同时七段码显示剩余时间,时间为0时,显示烹调完成信息“CDEF”
二、设计思路
A.先有一个大概的模块话设计,就如下图:
预设初值倒计时减计数输出数据
B:
再在上面大模块的基础上进行改进
增加复位端和测试端
复位输出数据
预设倒计时实现闪烁
初值减计数
测试
C:
具体的设计过程:
1、刚开始设计是先完成了FENPIN模块的设计,因为这个模块比较简单。
2、然后是对设初值大模块的设计,在这一部分的设计遇到两方案:
(1)设计四个按钮的初始话模块,四个按钮分别控制秒,十秒,分,十分4个数值的初始化加;
(2)设计两个按钮的初始化模块,两个按钮分别提供一个移位信号和一个加信号;
两个方案都用了一下,发现还好是2号方案比较好,不仅程序上比较简单而且省了很多按钮的使用,比较符合实际应用的要求;
3、在完成了初始话模块的设计之后,接下来就是减计数模块的设计,只要把由初始化模块所提供的数据进行减计数即可;
4、在完成以上三个模块时,程序的已经初见雏形了,然后把这三个模块连接起来,添加上复位和测试按钮就可以了;
5、用动态扫描的方法队数据进行输出,其中在输入数据是使相应的数据进行闪烁。
三.单元模块设计
单元模块设计部分主要有4部分组成:
(一)、FENPIN模块,用于给后面的JIANJISHU模块和VIEW模块提供合适的频率。
(二)、FIRST模块,用于设定微波炉的初试时间而用。
(三)、JIANJISHU模块,配合FENPIN模块提供的时钟频率实现每秒减一的计数。
(四)、CHOICE模块和VIEW模块,利用动态扫描的方法显出对应数字。
3.1FENPIN模块的设计
FENPIN模块主要利用1Khz的时钟信号进行分频。
得到1s的outlck时钟信号(用于后期JIANJISHU模块的使用)和0.5s的screen的时钟信号(用于VIEW的显示闪烁使用)。
输出1s的时钟信号
说明:
试验箱上有1Khz,2Khz等多个时钟信号。
而在这里采用1Khz的信号使用。
1Khz/1000=1s,所以采用1Khz进行千分频得到1s的信号。
实验波形图:
每秒产生一个时钟脉冲
(程序代码见附录。
)
Move此时数码管有输出
Move选中时数码管无输出
3.2FIRST模块设计
FIRST模块主要用于对时间设定初始值而用,其中设有ABLE和CLK两时钟信号,分别用于外接按钮信号而用,其中CLK用于进行加计数,ABLE用于移位而用。
输出o1,o2,o3和o4分别是输出秒,十秒,分,十分。
而输出o5是为VIEW实现闪烁而用的。
其中的RES和TEST要配合JIANJISHU模块中的RES和TEST同时控制才能有效(具体会在JIANJISHU模块中详细介绍)。
说明:
开始设计时,由于没有考虑全面设计了一个有4个按键分别控制秒,十秒,分,十分的方案,因为课设要接近与实际设计,而实际不可能给予如此多的按键,这样不仅占用大量空间而且产品也是非常的不美观,所以之后就改成现在的由ABLE控制移位,再由CLK给予时钟脉冲的方式进行设计,最后发现这样的设计不仅没有上述的缺点更加使我的程序变的更加的简单。
波形图仿真:
每个上升沿都会进行加计数
当res和test为零时输出分别是“0000”和“8888”
Able在每个脉冲到来是都会进行移位,而o5正好显示出正在加的位数
注意:
编写此段代码是要注意秒位和分位都是记从1记到9然后进位自己变成0的,
而十秒位和十分位是记到5然后变成0的。
(程序代码见附页)
3.3JIANJISHU模块的设计
JIANJISHU模块的主要用于对FIRST的数据进行选择性的处理和输出:
(一)、当JIANJISHU模块中的res=0时,由于res作为输入同样也连接这FRIST模块中
的res,他们是由一个输入共同控制的,所以此时输出的就是“0000”;
(二)、当JIANJISHU模块中的test=0时,同res一样的道理,此时输出为“8888”;
(三)、当q4=15(输出为F)或start=0时,LED就不会亮了,表示工作完成或处
于等待状态,此时不对FIRST模块中的数据进行任何处理就直接输出;
(四)、在以上条件都不满足的情况下,若此时start=1,那么JIANJISHU模块才
开始了真正的工作状态,即配合FENPIN模块中时钟outclk开始每秒减一的记时计数;
本程序中复位键res和test的详细说明:
这里的res和test和模块FRIST中的res和test是用同一个控制端,而且JIANJISHU的res和test是必不可少的。
因为每次进行计数完后由于是利用信号进行减计数,在记完一次数之后q1,q2,q3和q4都会保持最后一次的状态,如果不及时清零的话,那么下一次的res,test以及加计数就是只能对前一级的输入进行复位和测试,输出的将是前一级的各个位数减去q1,q2,q3和q4的值,所以在JIANJISHU模块中进行清零是十分重要的。
波形图仿真:
输入初值为“0015”
当start=1时开始配合clks的始终上升沿开始减计数
在各位都记到0时,就数码管就会显示“FEDC”同时LED熄灭
这就是上次提到的复位是清零了所有的中间信号,这样输出为FIRST中提供原始数据
(程序代码见附页)
3.4CHOICE模块和VIEW模块
CHOICE模块和VIEW模块必须放在一起进行使用,CHOICE模块是进行数据选则而使用的,VIEW模块是用于在相应的为进行输出对应的数,两者和起来就是一个动态扫描的过程。
A:
CHOICE模块;
说明:
这里的clk时钟信号是使用和FENPIN模块中一样的时钟信号(1Khz),因为人
的眼睛对时间的分辨为20个微秒,用1Khz的信号完全能满足这样的要求;要注意CHOICE有两个输出,o2显然输出的是对应的数据信号,而o1要输出的是一个位选信号,是为下一个模块VIEW显示而用。
B:
VIEW模块;
说明:
f1是接受位信号用的,f2是接受数据而用的。
详细说明一下screen和able的作用:
Screen是有FENPIN模块通过对时钟信号分频得到的,当在模块FRIST选中某一
进行加数初始化是,VIEW就可以在时钟screen在为1是正常输出able所指的那位,
当screen为0时,able所指的那位不能对应输出,这样就能达到让相应的数码管闪烁
的效果。
波形图:
(程序代码见附页)
四.硬件实验
管脚设置
To
Location
I/OBank
I/OStandard
1
Clk1
PIN_152
3
LVTTL
2
Clk2
PIN_135
3
LVTTL
3
Move
PIN_136
3
LVTTL
4
Rest
PIN_137
3
LVTTL
5
Testt
PIN_138
3
LVTTL
6
Startt
PIN_156
3
LVTTL
7
Lighto
PIN_165
3
LVTTL
8
Sel[2]
PIN_5
1
LVTTL
9
Sel[1]
PIN_4
1
LVTTL
10
Sel[0]
PIN_3
1
LVTTL
11
Seg[7]
PIN_2
1
LVTTL
12
Seg[6]
PIN_1
1
LVTTL
13
Seg[5]
PIN_180
3
LVTTL
14
Seg[4]
PIN_179
3
LVTTL
15
Seg[3]
PIN_178
3
LVTTL
16
Seg[2]
PIN_177
3
LVTTL
17
Seg[1]
PIN_176
3
LVTTL
18
Seg[0]
PIN_175
3
LVTTL
注释:
Clk1:
选用的是1Khz的信号;
Clk2,Move,Rest,Testt:
选用的是按钮信号;
Startt:
使用的是开关信号;
Lighto:
LED输出;
五、心得体会
这次我独立完成了一次完整的程序设计,在整个的设计过程中我感觉我的动手能力得到了比较高的提高吧,学了的东西如果连这么一个比较简单的课设都不能完成的话我感觉是比较羞愧的一件事情。
在整个的设计过程中现在回头好好回想一下我觉得还是有很多不足的,做任何事情起步的时候就应该有一个全局观,但是刚开始由于我没有考虑完全,在FIRST模块种设计了有四个按键控制的初始化程序,之后发现这样不仅程序非常的繁琐,而且这种课设应该和实际好好联系一下,有谁家的微波炉就光是刚开始设定初值都有这么多按钮,那么不仅难看而且比较耗资源,使用也不是最方便的,所以之后经过分析后选择了现在使用的由两个按钮就能事先数据初始化的功能。
因此在以后的设计工作中也要学会有大局观。
同是在编写复位和测试两个按键的功能是遇到了比较大的麻烦,总是输出一些莫名其妙的数据,之后发现是由于在JIANJISHU模块的中的中间信号没有清零而导致的,这样的一个遇到困难然后去解决这个问题的过程让我对中间信号有了比较深刻的理解。
在完成大半个程序之后,我发现在初始化数据的时候没有任何的提示是在对哪以为进行加,所以就去请教了老师,以老师的方案就是用一个时间较长的时钟信号对输出数码管的管脚进行或操作(数码管是共阴),当时我嫌这么方法写的代码比较长,所以我就尝试了一下在输出数码管的位选上做文章,用这个较长的时钟信号和位信号进行位操作,这样可以实现闪烁,但是在时钟信号为’1’时输入的位信号是“111”,由于实验箱上的数码管都进行了引脚的锁定,所以会让第8个数码管点亮,所以这个方案宣告失败,最后就采用了现程序使用的方法,和老师的差不多,写起来也比较方便。
总的来说这样的课程设计比上课有意思多了,在实际中还是有很多不是在课本上能学的到的东西,这个需要自己去理解,去总结的。
附页:
————————————微波炉定时控制器程序代码————————————
第一部分:
TOP(顶层文件)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytopis
port(rest,clk1,clk2,move,startt,testt:
instd_logic;
lighto:
outstd_logic;
sel:
outstd_logic_vector(2downto0);
seg:
outstd_logic_vector(7downto0));
end;
architecturethreeoftopis
componentfenpinis
port(clk:
instd_logic;分频
outclk,screen:
outstd_logic);
endcomponent;
componentfirstis
port(clk,able,res,test:
instd_logic;初始化数据
o1,o2,o3,o4,o5:
outstd_logic_vector(3downto0));
endcomponent;
componentjianjishuis
port(clks,start,res,test:
instd_logic;
in1,in2,in3,in4:
instd_logic_vector(3downto0);减计数
light:
outstd_logic;
out1,out2,out3,out4:
outstd_logic_vector(3downto0));
endcomponent;
componentchoiceis
port(clk:
std_logic;
f1,f2,f3,f4:
instd_logic_vector(3downto0);
o1:
outstd_logic_vector(1downto0);位选
o2:
outstd_logic_vector(3downto0));
endcomponent;
componentviewis
port(screen:
instd_logic;
f1:
instd_logic_vector(1downto0);
f2,able:
instd_logic_vector(3downto0);显示输出
segout:
outstd_logic_vector(7downto0);
selout:
outstd_logic_vector(2downto0));
endcomponent;
signalb,c,d,e,f,g,h,i,j:
std_logic_vector(3downto0);
signala,k:
std_logic;
signalq:
std_logic_vector(1downto0);
signalp:
std_logic_vector(3downto0);
begin
u1:
fenpinportmap(clk=>clk1,outclk=>a,screen=>k);
u2:
firstportmap(clk=>clk2,res=>rest,test=>testt,able=>move,
o1=>b,o2=>c,o3=>d,o4=>e,o5=>j);
u3:
jianjishuportmap(clks=>a,start=>startt,res=>rest,test=>testt,in1=>b,in2=>c,
in3=>d,in4=>e,light=>lighto,out1=>f,out2=>g,out3=>h,out4=>i);
u4:
choiceportmap(clk=>clk1,f1=>f,f2=>g,f3=>h,f4=>i,o1=>q,o2=>p);
u5:
viewportmap(able=>j,screen=>k,f1=>q,f2=>p,segout=>seg,selout=>sel);
end;
————————————————————————————————————
第二部分:
FENPIN(时钟分频)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;
outclk,screen:
outstd_logic);
end;
architecturefirstoffenpinis
signalQ1,Q2:
std_logic;
begin
one:
process(clk)
variablecount1:
integerrange0to1002;
begin
Q1<='0';
ifcount1>1000thenQ1<='1';count1:
=0;
elsifclk'eventandclk='1'thencount1:
=count1+1;分出1秒信号
endif;
endprocess;
two:
process(clk)
variablecount2:
integerrange0to500;
begin
ifclk'eventandclk='1'then
ifcount2<250thenQ2<='1';count2:
=count2+1;
elseQ2<='0';count2:
=count2+1;闪烁信号
endif;
endif;
ifcount2>499thencount2:
=0;
endif;
endprocess;
outclk<=Q1;
screen<=Q2;
end;
第三部分:
FIRST(数据初始化)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfirstis
port(clk,able,res,test:
instd_logic;
o1,o2,o3,o4,o5:
outstd_logic_vector(3downto0));
end;
architecturetwooffirstis
signalq1,q2,q3,q4,q5:
std_logic_vector(3downto0);
begin
process(able)
begin
ifable'eventandable='1'then
ifq5<4thenq5<=q5+1;位选信号,选择相应的位进行初始
elseq5<="0000";化,其中“0000”为空位。
endif;
endif;
endprocess;
process(clk,res,test,q4)
begin
ifres='0'thenq1<="0000";q2<="0000";q3<="0000";q4<="0000";--复位键
elsiftest='0'thenq1<="1000";q2<="1000";q3<="1000";q4<="1000";--测试键
elsifclk'eventandclk='1'then
caseq5is
when"0001"=>ifq1<9thenq1<=q1+1;
elseq1<="0000";秒位加数
endif;
when"0010"=>ifq2<5thenq2<=q2+1;
elseq2<="0000";十秒位加数
endif;
when"0011"=>ifq3<9thenq3<=q3+1;
elseq3<="0000";分位加数
endif;
when"0100"=>ifq4<5thenq4<=q4+1;
elseq4<="0000";十分位加数
endif;
whenothers=>null;
endcase;
endif;
endprocess;
o1<=q1;
o2<=q2;
o3<=q3;
o4<=q4;
o5<=q5;--在VIEW模块中选择闪烁位
end;
————————————————————————————————————
第四部分:
JIANJISHU(数据按秒倒计时)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjianjishuis
port(clks,start,res,test:
instd_logic;
in1,in2,in3,in4:
instd_logic_vector(3downto0);
light:
outstd_logic;
out1,out2,out3,out4:
outstd_logic_vector(3downto0));
end;
architectureoneofjianjishuis
signalq1,q2,q3,q4:
std_logic_vector(3downto0);
begin
process(start,clks,res,test,q4)
variablea:
std_logic_vector(1downto0);
begin
ifres='0'ortest='0'thenq1<="0000";q2<="0000";q3<="0000";q4<="0000";
--对信号都清零设置