北邮简易电磁炉控制器的设计与实现.doc
数字电路与逻辑设计综合实验实验报告 实验名称: 班级: 班内序号: 姓名: 学号: 目录 一、设计课题的任务要求二、系统设计基本思想三、仿真波形及波形分析:四、实验结果及分析:五、元器件清单及资源利用情况六、故障及问题分析七、实验总结和心得体会八、源程序 数电设计综合实验微波炉控制器一、设计课题的任务要求设计制作一个简易微波炉控制器。【基本要求】 1、烹饪模式选择:电磁炉的烹饪模式有火锅、煎炒、爆炒、煲汤和蒸炖五档可选。用 一个按键(BTN7 )实现烹饪档位的选择(按下此键依上述顺序依次变化),用点阵 显示当前的烹调档位(火锅显示 H 、煎炒显示 J 、爆炒显示 B 、煲汤显示 T 和蒸炖 显示 Z ),烹调档位的选择按键同时也是加热的开始按键,即烹调档位选定的同时电磁炉就以最大功率开始加热,没有选择时电磁炉处于停止状态,点阵不显示。 2、火力调节:电磁炉的火力分5档可调:1900W-1500W-1100W-600W-100W,用数码管 DISP3-DISP0 显示当前的火力,用两个按键(BTN6 和 BTN5 )实现火力的增加或减少,烹调过程中,除爆炒模式外,其它模式均可以随时可以调节火力,爆炒模式只能以最高功率加热。 3、定时功能:用一个按键(BTN4 )实现定时设置,按下定时键,蜂鸣器响一声,每按一次定时键,定时时间以 5-10-30-60 秒钟的顺序依次递增,定时设定完毕后,电磁炉开始倒计时。用数码管 DISP5 和 DISP4 显示定时档位和倒计时的过程,倒计时时间到后,电磁炉自动停止加热并关机。 4 、不进行定时操作时,电磁炉以默认加热时间进行加热。蒸炖模式的默认时间为20秒钟;爆炒模式的默认时间是 3 秒钟,爆炒 3 秒钟后自动返回煎炒模式;其他模式的默认时间为 90 秒。 5、用点亮的发光二极管 LD4 表示开机加热,熄灭表示关机。 6、 设置关闭键,任何时候按下关闭键即可将电磁炉关机。 提高要求:用8个LED灯作为加热进度显示条,随着加热时间的增加匀速增加点亮LED灯的个数,无论加热时间是多长,最后都必须将8个LED灯全部点亮。增加烧烤功能,用一个键选择微波或烧烤功能,用一个数码管指示当前处于微波还是烧烤功能。烧烤火力和加热时间要求与微波功能相同。二、系统设计基本思想1、【设计过程】 1)审题,初步确定思路。2)画出流程图,状态转移图。3)用VHDL语言进行编程。适时对程序进行修改。4)编译成功后,进行仿真,观察波形图。5)将程序下载到实验板上,调试各功能。6)通过计算机仿真和下载调试,发现问题,返回原程序进行修改。7)进行总体的调试,并验收。 2、【设计思路】 电路由烹饪模式选择模块、火力调节模块、定时模块、倒计时模块、分频器模块,关机模块,译码和数码显示电路,点阵显示电路等模块组成。1、 烹饪模式选择模块电磁炉的烹饪模式有火锅、煎炒、爆炒、煲汤和蒸炖五档可选。通过按键的次数来控制。将模式信息传递到点阵显示模块。2、火力调节模块电磁炉的火力分 5 档可调:1900W-1500W-1100W-600W-100W,将火力信息传递到数码显示模块。3、定时模块定时时间以 5-10-30-60 秒钟的顺序依次递增。将倒计时信息传递到数码显示模块。4、倒计时模块微波炉以数码管显示的方式提示用户当前剩余的加热时间。从默认时间或者已调定时时间开始,依次减少1秒钟。5、分频器模块将系统时钟分频,设计一个大小合适的分频器使得系统能够正确的实现一秒的计时以及数码管和点阵显示扫描的扫描时钟。6、关机模块当倒计时结束时,会自动关机。当然,按下关机键的时候,也可以随时关机7、译码和数码显示电路译码和数码显示电路是将计时状态直观清晰地反映出来,被人们的视觉器官所接受。显示器件选用LED 七段数码管。在译码显示电路输出的驱动下,依次显示,只是扫描频率很高,所以在人的视觉里可以看到稳定显示的数字符号。8、点阵显示电路点阵的row为低电平, col为高电平的时候,相应的点才可以亮。在这里逐行进行扫描,扫描频率很高,所以在我们看来就是静止显示所有的亮点。 3、【微波炉逻辑划分方块图】 4、【状态转移图】1) 烹饪模式状态转移图2)火力调节状态转移图3)倒计时状态转移图5、【流程图】 三、仿真波形及波形分析:通过仿真软件QUATUSII进行仿真。1) 烹饪模式选择模块 当modelSel第一次出现上升沿的时候,开机,同时点阵显示H当modelSel第二次出现上升沿的时候,点阵显示J之后如果继续设置modelSel的上升沿的话,就可以实现,五中模式的循环转换。 )火力调节如果fireDown出现上升沿的时候,火力下调如果fireUp出现上升沿的时候,火力上调 3)倒计时调节每当timeset出现上升沿的时候,将会改变数码管的较高两位,5-10-30-60,然后继续回到5循环。 4)power为1 的时候表示按下关机键,所有的数码管,点阵,led都灭掉了 四、实验结果及分析:1)开机 2)选择烹饪模式 3)火力调节 5)调节倒计时 6)爆炒模式转换为煎炒模式 7)关机(BTN7) 五、元器件清单及资源利用情况(1)实验器材1 计算机;2 EDA 开发板及相应元器件。(2)资源利用情况 逻辑原件:15%,引脚使用:32%。总体来说还是可以的。六、故障及问题分析1. 【问题】刚开始点阵显示不了。【解决方案】后来发现,只有row=0,col=1的时候,相应的点才会亮。2. 【问题】实验中遇到的最大的问题,就是产生不了倒计时。一直都显示00。思路都检查了好多遍。【解决方案】在分频上出错了。分频当时是进行2499999次循环。后来改成24999之后发现倒计时可以用了。一直以为是倒计时部分写错了,花费了好多时间。3.【问题】在设置关机键的时候,每次关机,再开机,不能恢复到初始状态,而是停留在关机前的状态。【解决方案】解决方案通过Power和ModelSel键控制,如果有按键,就恢复状态。4.【问题】蜂鸣器刚开始是响的,但是加上消抖后,就不响了。【解决方案】也有改过代码,但是一直没有成功。七、实验总结和心得体会在本次的数字电路综合实验中,我选择的题目是设计实现微波炉控制器。觉得电磁炉挺有意思的,心想,一定要好好去做这个实验。但是,看到那么多功能还是有点懵的。第一次实验,老师让我们画流程图,一点一点的去理思路。后来终于觉得自己可以开动了。第一次实验结束后,我便开始写一些小段程序,比如说,数码管显示,点阵显示等等小程序。第二次实验结束的时候,我的小程序大部分可以运行了。第三次实验的时候,发现我的数码管显示电路加上就开始出错。解决了一整天都没有成功。后来只能放弃,开始了一个新的思路,就是按部就班的,按照最简单的思路去写代码。第四次实验就要验收了,可是我的倒计时出了问题,一直显示不了,上面的故障分析中也有提到。后来又一点点的改代码,一点点的去验证。最后终于发现是我的分频有问题。书上写的是循环2499999次,所以从来没觉得是分频有问题,一直找别的原因,浪费了很多时间。可能实际与理论还是有一定差距的。之后又花了点时间,处理了一些小细节。最终验收成功。这次的经验教训还是挺多的。一、如果我能把我的代码分块写的话,出现问题的时候也不会牵一发动全身。没有分块,每一个问题,解决的时候都很困难。二、分频问题。要根据实际的板子时钟频率去写代码。而不是把书上的理解了,就照搬过来。很多时候都是要联系实际的。三、代码优化问题。这次代码写的挺冗长的,因为问题多,解决完的时候都需要马上验收了,所以很多代码,完全可以写得更简单的。这次代码有386行。总得来说,实验还是成功的,遇到了好多问题,也有让我焦头烂额的时候。但是我还是坚持了下来。我想,在实验成功的那一刹那,那些努力都得到了见证。 八、参考文献数字电路与逻辑设计实验教程北京邮电大学电路实验中心<VHDL硬件描述语言与数字逻辑电路设计 侯伯亨 西安电子科技大学出版社数字逻辑设计实验技术与EDA工具 北京邮电大学九、源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dcl ISPORT( clk: IN STD_LOGIC; -时钟输入modelSel: IN STD_LOGIC; -烹饪模式选择fireUp: IN STD_LOGIC; -增加火力fireDown: IN STD_LOGIC; -减小火力timeset: IN STD_LOGIC; -定时设置power: IN STD_LOGIC; -开关row,col: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -点阵显示的行列控制time1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -时间显示scan: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -数码管显示控制 powerled: OUT STD_LOGIC; -电源指示灯控制beef: OUT STD_LOGIC); -蜂鸣器控制END dcl;ARCHITECTURE a OF dcl IS TYPE state_type1 IS (s0,s1,s2,s3,s4); SIGNAL state: state_type1;TYPE state_type2 IS (f0,f1,f2,f3,f4); SIGNAL fire: state_type2;TYPE state_type3 IS (t0,t1,t2,t3); SIGNAL pre_time: state_type3;SIGNAL timemodel: STD_LOGIC_VECTOR(1 DOWNTO 0); -时间选择信号SIGNAL led: STD_LOGIC;SIGNAL clock1: STD_LOGIC; -1Hz时钟信号SIGNAL clock2: STD_LOGIC; -200Hz时钟信号SIGNAL COUNT2: INTEGER RANGE 0 TO 249999; -产生clock1过程中用到的信号SIGNAL jump: INTEGER range 0 to 1; -表示跳转-SIGNAL jump: STD_LOGIC; -表示跳转SIGNAL finish: STD_LOGIC; -倒计时结束SIGNAL setge: INTEGER RANGE 0 TO 9; -设定时间的个位SIGNAL setshi: INTEGER RANGE 0 TO 9; -设定时间的十位SIGNALbeef1: STD_LOGIC; signal temp1 : std_logic;signal temp2 : std_logic;signal temp3 : std_logic;signal temp4 : std_logic;SIGNAL fun1_tmp3:INTEGER RANGE 0 TO 7;SIGNAL fun: STD_LOGIC; SIGNAL sig: STD_LOGIC; SIGNAL fun1: STD_LOGIC; signal ge:INTEGER RANGE 0 TO 9;signal shi:INTEGER RANGE 0 TO 9;BEGIN p1:PROCESS(ge,shi,state,modelSel,jump) begin IF (ge = 0 AND shi = 0) THENCASE state IS WHEN s2 =>jump<=1;WHEN OTHERS =>jump<=0;END CASE; end if; end process p1;p2:process(clk,COUNT2,setge,setshi,led,modelsel,timeset,state,beef1)begin if(clk'event and clk = '1') thenIF (timeset='1' OR sig ='1') THENge<=setge;shi<=setshi; finish<='0'end if;if COUNT2 = 49999 then COUNT2 <= 0;else COUNT2 <= COUNT2 + 1;end if;if(COUNT2 = 49999) then clock2 <= '1'else clock2 <= '0'end if;IF(clock2= '1') THEN beef<=beef1;IF (led='1') THENIF(ge = 0 AND shi /= 0) THEN ge<=9;shi<=shi-1;ELSIF (ge = 0 AND shi = 0) THEN finish<='1'ELSE ge<=ge-1;END IF; END IF;end if;end if;END PROCESS p2;p3:PROCESS(clk,power,led) -电源控制BEGINIF(clk'EVENT AND clk='1') THEN IF modelSel='1' THEN led<='1'ELSIF (power='1' or finish='1') THEN led<='0'END IF; powerled<=led;END IF;END PROCESS p3;p4:PROCESS(clk,modelSel,led,jump) -烹饪模式选择BEGINIF(clk'EVENT AND clk='1') THEN temp2 <=modelSel;IF(power='1' or finish='1') THEN state<=s0;END IF; IF(led='1') THEN IF(jump=1) THEN state<=s1; ELSE CASE state IS WHEN s0 => IF(modelSel='1' and temp2='0') THEN state<=s1;ELSE state<=s0;END IF; WHEN s1 => IF(modelSel='1' and temp2='0') THEN state<=s2;ELSE state<=s1;END IF; WHEN s2 => IF(modelSel='1'and temp2='0') THEN state<=s3;ELSE state<=s2;END IF;WHEN s3 => IF(modelSel='1' and temp2='0') THEN state<=s4;ELSE state<=s3;END IF;WHEN s4 => IF(modelSel='1' and temp2='0') THEN state<=s0;ELSE state<=s4;END IF;END CASE;END IF;END IF;END IF;END PROCESS p4;p5:PROCESS(clk,state,led) -点阵显示BEGINIF(clk'EVENT AND clk='1') THEN IF(led='0') THEN row<="11111111" col<="00000000" -如果开关指示灯未亮,点阵不显示 ELSE CASE state IS WHEN s0 => CASE fun1_tmp3 IS WHEN 0=>fun1_tmp3<=1; -H col<="00000000" row<="01111111" WHEN 1=>fun1_tmp3<=2; col<="00000000" row<="10111111" WHEN 2=>fun1_tmp3<=3; col<="00100100" row<="11011111" WHEN 3=>fun1_tmp3<=4; col<="00100100" row<="11101111" WHEN 4=>fun1_tmp3<=5; col<="00111100" row<="11110111" WHEN 5=>fun1_tmp3<=6; col<="00100100" row<="11111011" WHEN 6=>fun1_tmp3<=7; col<="00100100" row<="11111101" WHEN others=>fun1_tmp3<=0; col<="00000000" row<="11111110" END CASE; WHEN s1=> -J CASE fun1_tmp3 IS WHEN 0=>fun1_tmp3<=1; col<="00000000" row<="01111111" WHEN 1=>fun1_tmp3<=2; col<="00111100" row<="10111111" WHEN 2=>fun1_tmp3<=3; col<="00010000" row<="11011111" WHEN 3=>fun1_tmp3<=4; col<="00010000" row<="11101111" WHEN 4=>fun1_tmp3<=5; col<="00010000" row<="11110111" WHEN 5=>fun1_tmp3<=6; col<="00010100" row<="11111011" WHEN 6=>fun1_tmp3<=7; col<="00011000" row<="11111101" WHEN others=>fun1_tmp3<=0; col<="00000000" row<="11111110" END CASE;WHEN s2=> -B CASE fun1_tmp3 IS WHEN 0=>fun1_tmp3<=1; col<="00000000"row<="01111111" WHEN 1=>fun1_tmp3<=2; col<="00011110" row<="10111111" WHEN 2=>fun1_tmp3<=3; col<="00100010" row<="11011111" WHEN 3=>fun1_tmp3<=4; col<="00100010" row<="11101111" WHEN 4=>fun1_tmp3<=5; col<="00011110" row<="11110111" WHEN 5=>fun1_tmp3<=6; col<="00100010" row<="11111011" WHEN 6=>fun1_tmp3<=7; col<="00100010" row<="11111101" WHEN others=>fun1_tmp3<=0; col<="00011110" row<="11111110" END CASE;WHEN s3=> -T CASE fun1_tmp3 IS WHEN 0=>fun1_tmp3<=1; col<="00000000" row<="01111111" WHEN 1=>fun1_tmp3<=2; col<="01111100" row<="10111111" WHEN 2=>fun1_tmp3<=3; col<="00010000" row<="11011111" WHEN 3=>fun1_tmp3<=4; col<="00010000" row<="11101111" WHEN 4=>fun1_tmp3<=5; col<="00010000" row<="11110111" WHEN 5=>fun1_tmp3<=6; col<="00010000" row<="11111011" WHEN 6=>fun1_tmp3<=7; col<="00000000" row<="11111101" WHEN others=>fun1_tmp3<=0; col<="00000000" row<="11111110" END CASE;-Z WHEN OTHERS=> CASE fun1_tmp3 IS WHEN 0=>fun1_tmp3<=1; col<="00000000" row<="01111111" WHEN 1=>fun1_tmp3<=2; col<="00111110" row<="10111111" WHEN 2=>fun1_tmp3<=3; col<="00010000" row<="11011111" WHEN 3=>fun1_tmp3<=4; col<="00001000" row<="11101111" WHEN 4=>fun1_tmp3<=5; col<="00000100" row<="11110111" WHEN 5=>fun1_tmp3<=6; col<="00111110" row<="11111011" WHEN 6=>fun1_tmp3<=7; col<="00000000" row<="11111101" WHEN others=>fun1_tmp3<=0; col<="00000000" row<="11111110" END CASE; END CASE; END IF;END IF;END PROCESS p5;p6:PROCESS(clk,led,state,fireUp,fireDown) -火力选择BEGINIF (clk'EVENT AND clk = '1') THENtemp3<=fireUp;temp4<=fireDown;IF(power='1'or finish='1')THEN fire<=f0;END IF;IF(led='1') THEN IF(state=s2) THEN fire<=f0; -如果为爆炒,火力最大为f0; ELSE CASE fire IS WHEN f0=> IF (fireUp='1' and temp3='0') THEN fire <=f0; ELSIF(fireDown='1' AND temp4='0' ) THEN fire <=f1; ELSE fire <=f0;END IF;WHEN f1=> IF (fireUp='1' AND temp3='0') THEN fire <=f0; 待添加的隐藏文字内容3ELSIF(temp4='0' AND fireDown='1') THEN fire <=f2;ELSE fire <=f1;END IF; WHEN f2=> IF (fireUp='1' AND temp3='0') THEN fire <=f1; ELSIF(temp4='0' AND fireDown='1') THEN fire <=f3; ELSE fire <=f2;END IF; WHEN f3=> IF (fireUp='1' AND temp3='0') THEN fire <=f2; ELSIF(temp4='0' AND fireDown='1') THEN fire <=f4; ELSE fire <=f3;END IF; WHEN f4=> IF (fireUp='1' AND temp3='0') THEN fire <=f3; ELSIF(temp4='0' AND fireDown='1') THEN fire <=f4; ELSE fire <=f4;END IF;END CASE; END IF;END IF;END IF;END PROCESS p6;p8:PROCESS(clk,timeset,led) -时间设置BEGINIF (clk'EVENT AND clk = '1') THENtemp1<=timeset;IF (led='1') THEN CASE pre_time IS WHEN t0 => IF(timeset='1' and temp1<='0') THEN pre_time<=t1;beef1<='1'else pre_time<=t0;beef1<='0'END IF;WHEN t1 => IF(timeset='1' and temp1<='0') THEN pre_time<=t2;beef1<='1'else pre_time<=t1;beef1<='0'END IF; WHEN t2 => IF(timeset='1' and temp1<='0') THEN pre_time<=t3;beef1<='1'else pre_time<=t2;beef1<='0'END IF; WHEN t3 => IF(timeset='1' and temp1<='0') THEN pre_time<=t0;beef1<='1'else pre_time<=t3;beef1<='0'END IF;END CASE;IF(modelSel='1')THEN pre_time<=t3;end if;END IF;END IF;END PROCESS p8; p9:PROCESS(clk,led,pre_time,state,jump,timeset)-默认时间modelSel state fun1<='1' BEGINIF (clk'EVENT AND clk = '1') THENIF(modelSel='1'or jump=1)THEN fun<='0'sig<='1'else sig<='0'end if; IF (led='1') THENIF(jump=1)THEN setge<=0;setshi<=9;ELSEIF (timeset='1') THEN fun<='1' CASE pre_time IS WHEN t0=>setge<=5;setshi<=0;WHEN t1=>setge<=0;setshi<=1;WHEN t2=>setge<=0;setshi<=3;WHEN t3=>setge<=0;setshi<=6; END CASE;ELSIF fun='0' THEN CASE state IS WHEN s0=>setge<=0;setshi<=9; WHEN s1=>setge<=0;setshi<=9; WHEN s2=>setge<=3;setshi<=0; WHEN s3=>setge<=0;setshi<=9; WHEN s4=>setge<=0;setshi<=2;END CASE;END IF;END IF;END IF;END IF;END PROCESS p9;p10:PROCESS(clk,ge,shi,led) -数码管扫描time_ge<=ge;time_shi<=shiVARIABLE i: INTEGER RANGE 0 TO 5;VARIABLE o: INTEGER RANGE 0 TO 1;BEGINIF(clk'EVENT AND clk ='1') THENIF (led='0') THEN scan<="111111"elseCASE i IS WHEN 0 =>scan<="011111" CASE shi IS -十位显示WHEN 0 => time1<="0111111"WHEN 1 => time1<="0000110"WHEN 2 => time1<="1011011"WHEN 3 => time1<="1001111"WHEN 4 => time1<="1100110"WHEN 5 => time1<="1101101"WHEN 6 => time1<="1111101"WHEN 7 => time1<="0000111"WHEN 8 => time1<="1111111"WHEN 9 => time1<="1101111" END CASE; i:=1; WHEN 1 =>scan<="101111" CASE ge IS -个位显示WHEN 0 => time1<="0111111"WHEN 1 => time1<="0000110"WHEN 2 => time1<="1011011"WHEN 3 => time1<="1001111"WHEN 4 => time1<="1100110"WHEN 5 => time1<="1101101"WHEN 6 => time1<="1111101"