微波炉定时控制器设计
华东交通大学论文报告纸 第1页 共23页
微波炉定时控制器
摘要:本文针对日常生活用品微波炉进行设计,使用VHDL语言实现多种常用功能,然后进行组合拼装,形成一个具有一定功能的硬件。
关键词:EDA,VHDL硬件描述语言,微波炉定时控制器。
华东交通大学论文报告纸 第2页 共23页
目录
一、设计题目和要求-----------------------------------------------------------------3 二、方案分析与方案比较-----------------------------------------------------------4 三、单元模块设计--------------------------------------------------------------------6
、FENPIN模块设计-------------------------------------------------------6 3.1
3.2、FIRST模块设计--------------------------------------------------------7
3.3、JIANJISHU模块设计--------------------------------------------------8
3.4、CHOICE和VIEW模块设计--------------------------------------------10 四、硬件实验-------------------------------------------------------------------------12 五、收获与体会----------------------------------------------------------------------14 附页:程序代码--------------------------------------------------------------------- 15 参考文献-------------------------------------------------------------------------------23
华东交通大学论文报告纸 第3页 共23页
一、设计题目和要求
设计题目为:微波炉定时控制器
设计要求:
1、复位开关:
、启动开关: 2
3、烹调时间设置:
4、烹调时间显示:
5、七段码测试:
、启动输出: 6
7、按TEST键可以测试七段码管,显示为“8888”;
8、设定时间后,按启动键开始烹调,同时七段码显示剩余时间,时
间为0时,显示烹调完成信息“CDEF”
华东交通大学论文报告纸 第4页 共23页
二、方案分析与方案比较
方案一:刚开始准备用状态机做,鉴于题目的要求应该有五个状态,状态图为
SET_CLOCKSET_T&TEST/LD_CLKX/LD_8888LAMP_TEST
TEST/LD_8888X/LD_CLK
IDLERESET
START&DONE&TEST&SET_T/COOKX/LD_DONE
LD_DONE/COOKOTHERWISE/ALLOUTPUTS=0
DONE/LD_DONEDONE_MSGTIMER此方案的缺点是:在设定时间时需要四个按钮分别控制秒,十秒,分,十分4个数值的初始化加,另外有些状态转换不是很稳定,效果很难在实验板看出来,刚开始试了一下,没有成功;
方案二:用一般的VHDL语言写,没有牵涉到状态,反而比较简单,而且设定时间可以采用两个按钮分别提供一个移位信号和一个加信号(这与实际比较相符),管脚绑定简单(特别是数码管),这里采用的是动态扫描位选输出数据,不需对四个数码管都进行绑定;
综合比较发现还是方案二好,不仅程序简单,而且符合实际。
华东交通大学论文报告纸 第5页 共23页
A(先有一个大概的模块化设计,就如下图:
预设初值 倒计时减计数 输出数据
B:再在上面大模块的基础上进行改进
增加复位端和测试端
复位 输出数据
预设 倒计时 实现闪烁
初值 减计数
测试
C:具体的设计过程:
1、刚开始设计是先完成了FENPIN模块的设计,因为这个模块比较简单。
2、然后是对设初值大模块的设计,在这一部分的设计遇到两方案:
(1)设计四个按钮的初始话模块,四个按钮分别控制秒,十秒,分,十分4个数值的初始化加;
(2)设计两个按钮的初始化模块,两个按钮分别提供一个移位信号和一个加信号;
两个方案都用了一下,发现还好是2号方案比较好,不仅程序上比较简单而且省了很多按钮的使用,比较符合实际应用的要求;
3、在完成了初始化模块的设计之后,接下来就是减计数模块的设计,只要把由初始化模块所提供的数据进行减计数即可;
4、在完成以上三个模块时,程序的已经初见雏形了,然后把这三个模块连接起来,添加上复位和测试按钮就可以了;
5、用动态扫描的
队数据进行输出,其中在输入数据是使相应的数据进行闪烁。
华东交通大学论文报告纸 第6页 共23页
三.单元模块设计
单元模块设计部分主要有4部分组成:
(一)、FENPIN模块,用于给后面的JIANJISHU模块和VIEW模块提供合适的
频率。
(二)、FIRST模块,用于设定微波炉的初试时间而用。
(三)、JIANJISHU模块,配合FENPIN模块提供的时钟频率实现每秒减一的计
数。
(四)、CHOICE模块和VIEW模块,利用动态扫描的方法显出对应数字。 3.1 FENPIN模块的设计
FENPIN模块主要利用1Khz的时钟信号进行分频。得到1s的outclk时钟信号(用于后期JIANJISHU模块的使用)和0.5s的screen的时钟信号(用于VIEW的显示闪烁使用)。
输出1s的时钟信号
为数码管的闪烁
提供时钟信号
说明:试验箱上有1Khz,2Khz等多个时钟信号。而在这里采用1Khz的信号使用。
1Khz/1000=1s,所以采用1Khz进行千分频得到1s的信号。
华东交通大学论文报告纸 第7页 共23页
实验波形图:
每秒产生一个时钟脉冲
(程序代码见附录。)
Move此时数码管有输出
Move选中时数码管无输出
3.2 FIRST模块设计
FIRST模块主要用于对时间设定初始值而用,其中设有ABLE和CLK两时钟信号,分别用于外接按钮信号而用,其中CLK用于进行加计数,ABLE用于移位而用。输出o1,o2,o3和o4分别是输出秒,十秒,分,十分。而输出o5是为VIEW实现闪烁而用的。其中的RES和TEST要配合JIANJISHU模块中的RES和TEST同时控制才能有效(具体会在JIANJISHU模块中详细介绍)。
输出初始数据
说明:开始设计时,由于没有考虑全面设计了一个有4个按键分别控制秒,十秒,分,
华东交通大学论文报告纸 第8页 共23页
十分的方案,因为课设要接近与实际设计,而实际不可能给予如此多的按键,
这样不仅占用大量空间而且产品也是非常的不美观,所以之后就改成现在的由
ABLE控制移位,再由CLK给予时钟脉冲的方式进行设计,最后发现这样的设
计不仅没有上述的缺点更加使我的程序变的更加的简单。
波形图仿真:
每个上升沿都会进行加计数
当res和test为零时输出分别是“0000”和“8888”
Able在每个脉冲到来是都会进行移位,而o5正好显示出正在加的位数 注意:编写此段代码是要注意秒位和分位都是记从1记到9然后进位自己变成0的,
而十秒位和十分位是记到5然后变成0的。
(程序代码见附页)
3.3 JIANJISHU模块的设计
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开始每秒减一的记时计数;
华东交通大学论文报告纸 第9页 共23页
本程序中复位键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中提供原始数据 (程序代码见附页)
华东交通大学论文报告纸 第10页 共23页 3.4 CHOICE模块和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所指的那位不能对应输出,这样就能达到让相应的数码管闪烁 的效果。
华东交通大学论文报告纸 第11页 共23页
波形图:
( 程序代码见附页)
华东交通大学论文报告纸 第12页 共23页
四.硬件实验
管脚设置
注释:Clk1:选用的是1Khz的信号;
Clk2,Move,Rest,Testt:选用的是按钮信号;
Startt:使用的是开关信号;
Lighto:LED输出;
华东交通大学论文报告纸 第13页 共23页
整体仿真波形
实验结果:
本设计实现了要求的所有功能,有复位开关,启动开关。按TEST键可以测试七段数码管,显示为“8888”。可以对烹调时间进行设置,以及烹调时间可以在数码管上显示出来。当随意设置一个烹调时间时,按下启动键时,数码管上时间为烹调完成还需要的时间,当时间减少到0000时,即烹调完成时,数码管显示DONE,表明烹调已完成。
华东交通大学论文报告纸 第14页 共23页
五、收获与体会
这一个多星期以来我们都在进行这次的课程设计。通过这次课程设计我感觉自己学到了许多,也提高了我的动手能力。从一选到这个设计题目后我就开始紧张的工作,上网查资料,到图书馆查找有关的书籍,以及最后确定设计方法及设计思路。由于在宿舍有电脑,所以工作起来也方便了许多。刚开始主要在自己电脑上运行程序,查找错误,检验自己的设计思路及方法是否正确。最后几天主要到实验室用实验板进行操作,最后顺利实现了设计要求的功能。
在整个的设计过程中现在回头好好回想一下我觉得还是有很多不足的,做任何事情起步的时候就应该有一个全局观,但是刚开始由于我没有考虑完全,在FIRST模块种设计了有四个按键控制的初始化程序,之后发现这样不仅程序非常的繁琐,而且这种课设应该和实际好好联系一下,有谁家的微波炉就光是刚开始设定初值都有这么多按钮,那么不仅难看而且比较耗资源,使用也不是最方便的,所以之后经过分析后选择了现在使用的由两个按钮就能事先数据初始化的功能。因此在以后的设计工作中也要学会有大局观。
同是在编写复位和测试两个按键的功能是遇到了比较大的麻烦,总是输出一些莫名其妙的数据,之后发现是由于在JIANJISHU模块的中的中间信号没有清零而导致的,这样的一个遇到困难然后去解决这个问题的过程让我对中间信号有了比较深刻的理解。
当今电子设计技术获得了飞速的发展,而其核心已日趋转向基于计算机的电子设计自动化技术,即EDA技术,所以学好EDA对我们来说更加重要。这次课程设计给我们提供了一个学习和拓展的平台。
总的来说这样的课程设计比上课有意思多了,在实际中还是有很多不是在课本上能学的到的东西,这个需要自己去理解,去总结的。
华东交通大学论文报告纸 第15页 共23页 附页:
————————————微波炉定时控制器程序代码———————————— 第一部分:TOP(顶层文件)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity top is
port(rest,clk1,clk2,move,startt,testt:in std_logic;
lighto:out std_logic;
sel:out std_logic_vector(2 downto 0);
seg:out std_logic_vector(7 downto 0)); end;
architecture three of top is
component fenpin is
port(clk:in std_logic; 分频
outclk,screen:out std_logic);
end component;
component first is
port(clk,able,res,test:in std_logic; 初始化数据
o1,o2,o3,o4,o5:out std_logic_vector(3 downto 0));
end component;
component jianjishu is
port(clks,start,res,test:in std_logic;
in1,in2,in3,in4:in std_logic_vector(3 downto 0); 减计数
light:out std_logic;
out1,out2,out3,out4:out std_logic_vector(3 downto 0));
end component;
component choice is
port(clk:std_logic;
f1,f2,f3,f4:in std_logic_vector(3 downto 0);
o1:out std_logic_vector(1 downto 0); 位选
o2:out std_logic_vector(3 downto 0));
end component;
component view is
port(screen:in std_logic;
f1:in std_logic_vector(1 downto 0);
f2,able:in std_logic_vector(3 downto 0); 显示输出
segout:out std_logic_vector(7 downto 0);
华东交通大学论文报告纸 第16页 共23页
selout:out std_logic_vector(2 downto 0));
end component;
signal b,c,d,e,f,g,h,i,j:std_logic_vector(3 downto 0);
signal a,k:std_logic;
signal q:std_logic_vector(1 downto 0);
signal p:std_logic_vector(3 downto 0);
begin
u1: fenpin port map (clk=>clk1,outclk=>a,screen=>k); u2: first port map (clk=>clk2,res=>rest,test=>testt,able=>move,
o1=>b,o2=>c,o3=>d,o4=>e,o5=>j);
u3:jianjishu port map (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:choice port map (clk=>clk1,f1=>f,f2=>g,f3=>h,f4=>i,o1=>q,o2=>p);
u5:view port map (able=>j,screen=>k,f1=>q,f2=>p,segout=>seg,selout=>sel);
end;
————————————————————————————————————
第二部分:FENPIN(时钟分频)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port(clk:in std_logic;
outclk,screen:out std_logic);
end;
architecture first of fenpin is
signal Q1,Q2:std_logic;
begin
one:process(clk)
variable count1:integer range 0 to 1002;
begin
Q1<='0';
if count1>1000 then Q1<='1';count1:=0;
elsif clk'event and clk='1' then count1:=count1+1; 分出1秒信号
end if;
华东交通大学论文报告纸 第17页 共23页
end process;
two:process(clk)
variable count2:integer range 0 to 500;
begin
if clk'event and clk='1' then
if count2<250 then Q2<='1';count2:=count2+1;
else Q2<='0';count2:=count2+1; 闪烁信号
end if;
end if;
if count2>499 then count2:=0;
end if;
end process;
outclk<=Q1;
screen<=Q2;
end;
第三部分:FIRST(数据初始化)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity first is
port(clk,able,res,test:in std_logic;
o1,o2,o3,o4,o5:out std_logic_vector(3 downto 0));
end;
architecture two of first is
signal q1,q2,q3,q4,q5:std_logic_vector(3 downto 0);
begin
process(able)
begin
if able'event and able='1' then
if q5<4 then q5<=q5+1; 位选信号,选择相应的位进行初始
else q5<="0000"; 化,其中“0000”为空位。
end if;
end if;
end process;
华东交通大学论文报告纸 第18页 共23页
process(clk,res,test,q4)
begin
if res='0' then q1<="0000";q2<="0000";q3<="0000";q4<="0000"; --复位键
elsif test='0' then q1<="1000";q2<="1000";q3<="1000";q4<="1000"; --测试键
elsif clk'event and clk='1' then
case q5 is
when "0001"=> if q1<9 then q1<=q1+1;
else q1<="0000"; 秒位加数
end if;
when "0010"=> if q2<5 then q2<=q2+1;
else q2<="0000"; 十秒位加数
end if;
when "0011"=> if q3<9 then q3<=q3+1;
else q3<="0000"; 分位加数
end if;
when "0100"=> if q4<5 then q4<=q4+1;
else q4<="0000"; 十分位加数
end if;
when others=>null;
end case;
end if;
end process;
o1<=q1;
o2<=q2;
o3<=q3;
o4<=q4;
o5<=q5; --在VIEW模块中选择闪烁位 end;
————————————————————————————————————
第四部分:JIANJISHU(数据按秒倒计时)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity jianjishu is
port(clks,start,res,test:in std_logic;
华东交通大学论文报告纸 第19页 共23页
in1,in2,in3,in4:in std_logic_vector(3 downto 0);
light:out std_logic;
out1,out2,out3,out4:out std_logic_vector(3 downto 0)); end;
architecture one of jianjishu is
signal q1,q2,q3,q4:std_logic_vector(3 downto 0);
begin
process(start,clks,res,test,q4)
variable a:std_logic_vector(1 downto 0);
begin
if res='0' or test='0' then q1<="0000";q2<="0000";q3<="0000";q4<="0000";
--对信号都清零设置
elsif q4=(in4-15) or start='0' then a:="00";light<='0';
--当q4=15或start=0时不进行减计数,同时LED不亮
elsif start='1' then a:="11";light<='1';
--当start=1时LED点亮同时开始倒计时
case a is
when "11"=>if clks'event and clks='1' then
if (in1-q1)=0 then q1<=(in1-9);q2<=q2+1;
else q1<=q1+1;
end if;
--q1开始为0,当q1=in1时,对q1赋值为(in1-9),为负数,
同时对q2进行加1,那么(in2-q2)就可以视线减1,若不是那么q1<=q1+1,可以实现
(in1-q1)从9开始的倒计数
if (in2-q2)=0 and (in1-q1)=0 then
q3<=q3+1;q2<=(in2-5);q1<=(in1-9);
end if;
--当输出out1=0和out2=0时进位减1,同时out1=9,out2=5;
if (in3-q3)=0 and (in2-q2)=0 and (in1-q1)=0 then
q4<=q4+1;q3<=(in3-9);q2<=(in2-5);q1<=(in1-9);
end if;
if (in4-q4)=0 and (in3-q3)=0 and (in2-q2)=0 and (in1-q1)=0
then q4<=(in4-15);q3<=(in3-14);q2<=(in2-13);q1<=(in1-12);
end if;
--当所有计数完毕(都为0)时,实现输出FEDC;
end if;
when others=>null;
end case;
华东交通大学论文报告纸 第20页 共23页
end if;
end process;
out1<=(in1-q1);
out2<=(in2-q2);
out3<=(in3-q3);
out4<=(in4-q4);
end;
————————————————————————————————————
第五部分:CHOICE(数据选择模块)
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity choice is
port(clk:std_logic;
f1,f2,f3,f4:in std_logic_vector(3 downto 0);
o1:out std_logic_vector(1 downto 0);
o2:out std_logic_vector(3 downto 0)); end;
architecture one of choice is
signal q:std_logic_vector(1 downto 0);
begin
process(clk)
begin
if clk'event and clk='1' then q<=q+1;
end if;
case q is
when "00" => o2<=f1;
when "01" => o2<=f2;
when "10" => o2<=f3; 选择输出数据
when "11" => o2<=f4;
when others=> null;
end case;
end process;
o1<=q; --位选信号
end;
华东交通大学论文报告纸 第21页 共23页
————————————————————————————————————
第六部分:VIEW(显示模块)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity view is
port(screen:in std_logic;
f1:in std_logic_vector(1 downto 0);
f2,able:in std_logic_vector(3 downto 0);
segout:out std_logic_vector(7 downto 0);
selout:out std_logic_vector(2 downto 0)); end;
architecture one of view is
signal seg:std_logic_vector(6 downto 0);
signal sel:std_logic_vector(2 downto 0); begin
selout<=sel;
segout(6 downto 0)<=seg;
sel<="000" when f1=0 else
"001" when f1=1 else
"010" when f1=2 else 相应的数据选择对应的位进行输出
"011" when f1=3 else
"000";
segout(7)<='1' when f1=2 else '0'; --在第三个数码管输出小数点
process(f2,able,sel)
begin
if (able="0001" and sel="000") or (able="0010" and sel="001") or
(able="0011" and sel="010") or (able="0100" and sel="011") then
if screen='1' then seg<="0000000"; --无输出
else
case f2 is
when "0000" => seg<="0111111";
when "0001" => seg<="0000110";
when "0010" => seg<="1011011";
when "0011" => seg<="1001111";
when "0100" => seg<="1100110";
华东交通大学论文报告纸 第22页 共23页
when "0101" => seg<="1101101";
when "0110" => seg<="1111101";
when "0111" => seg<="0000111";
when "1000" => seg<="1111111";
when "1001" => seg<="1101111";
when "1010" => seg<="1110111";
when "1011" => seg<="1111100";
when "1100" => seg<="0111001";
when "1101" => seg<="1011110";
when "1110" => seg<="1111001";
when "1111" => seg<="1110001";
when others=>null;
end case; --有输出
end if; --实现闪烁
else
case f2 is
when "0000" => seg<="0111111";
when "0001" => seg<="0000110";
when "0010" => seg<="1011011";
when "0011" => seg<="1001111";
when "0100" => seg<="1100110";
when "0101" => seg<="1101101";
when "0110" => seg<="1111101";
when "0111" => seg<="0000111";
when "1000" => seg<="1111111";
when "1001" => seg<="1101111";
when "1010" => seg<="1110111";
when "1011" => seg<="1111100";
when "1100" => seg<="1111001";
when "1101" => seg<="0110111";
when "1110" => seg<="0111111";
when "1111" => seg<="1011110";
when others=>null;
end case; --在没选中的位正常输出
end if;
end process;
end;
华东交通大学论文报告纸 第23页 共23页 参考文献
1. 潘松,黄继业. EDA技术与VHDL. 北京:清华大学出版社,2005 2. 边计年. 用VHDL设计电子线路. 薛宏熙译. 北京:清华大学出版社,2000 3. 王锁萍. 电子设计自动化(EDA)教程. 成都:电子科技大学出版社,2000