210132潘文斌数字电路与逻辑设计实验电子版报告.docx
《210132潘文斌数字电路与逻辑设计实验电子版报告.docx》由会员分享,可在线阅读,更多相关《210132潘文斌数字电路与逻辑设计实验电子版报告.docx(36页珍藏版)》请在冰豆网上搜索。
210132潘文斌数字电路与逻辑设计实验电子版报告
数电综合实验报告
------简易电磁炉的设计与实现
班级:
2011211105
姓名:
潘文斌
学号:
2011210132
日期:
2013.11.06
一:
设计课题的任务要求2
基本要求:
2
提高要求:
3
二:
系统设计3
设计思路3
总体框图4
顶层框图5
逻辑流程图5
状态转移图6
分块设计6
1分频器模块6
2:
防抖模块7
3:
控制器模块(2个)7
4:
数码管显示模块9
5:
点阵显示模块9
6:
总框图10
三:
仿真波形及波形分析10
1:
控制器1仿真10
2控制器2仿真12
8:
总体仿真13
四:
源程序13
1:
分频器13
2:
防抖模块15
3:
控制器1(模式选择、定时设定、倒计时)16
4:
控制器2(火力设定)18
5:
数码管显示模块19
五:
功能说明29
六:
元件清单和利用情况29
七:
故障和问题分析29
八:
总结和结论30
一:
设计课题的任务要求
设计制作一个简易电磁炉控制器。
基本要求:
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、设置关闭键,任何时候按下关闭键即可将电磁炉关机。
提高要求:
自拟其他功能
二:
系统设计
设计思路
A)用户按下烹饪键开机,开机时系统处于“火锅模式-90s定时-1900W”火力状态,随后用户可通过烹饪键改变烹饪模式,通过定时键改变定时状态,通过两个火力按键调节当前火力值。
其中8*8点阵显示当前烹饪模式,两个数码管显示当前倒计时,四个数码管用来显示当前火力大小(单位W)。
B)当烹饪时间到后,电磁炉自动关机;或者用户使用完毕后,按下关机键关闭电磁炉。
C)根据正常逻辑,爆炒模式下只能为最大火力模式,并且不能修改火力大小;爆炒结束后,进入煎炒模式。
D)每次按下定时键,都有蜂鸣声响起。
E)LD7灯的亮灭表示电磁炉的开关状态
主要考虑问题:
1:
由于键盘输入不稳定,数字跳变太快,所以需要加键盘防抖模块。
2:
键盘防抖模块需要特殊的频率,倒计时需要1HZ频率,数码管和点阵显示频率要比较高,所以分频器模块不止一个。
3:
爆炒模式是一个特殊模式,所以,还需在程序中设计一个变量进行判断。
综上,主要涉及以下几个模块。
分频器,键盘防抖模块,控制器,数据装载,数字译码,数码管显示模块,火力选择和显示模块,倒计时模块,点阵显示模块。
通过实际编程,最终的模块分类与交给老师的前期设计图有所不同,把控制器、数据装载、数字译码及倒计时合成为一个控制器1,将火力选择、数据装载合成为控制器2,最后程序中有分频器、键盘防抖模块、控制器1、控制器2、数码管显示模块和点阵显示模块。
总体框图
顶层框图
逻辑流程图
状态转移图
分块设计
1分频器模块
1hz用于倒计时,100HZ是时间输入防抖所用频率,SCAN是点阵和数码管扫描显示所用,CTR是扫描按键所用(但是效果不好)
2:
防抖模块
KEY(3)=BTN7,KEY
(2)=BTN6,KEY
(1)=BTN5,KEY(0)=BTN4
虽然使用了防抖模块,但是由于烧入板子的程序中我把模式选择定时设定和倒计时模块合成为一个部件…quartus规定一个进程里只能有一个时钟所以按键输入的判断使用的是CLK_1HZ的上升沿不是之前预期设想的CLK_CTR(10HZ),这使得BTN7,BTN4实际操作起来效果不好,等待的时钟上升沿时间太久。
改进:
在之后的代码中,我将附带回来修改后的程序,将模式选择定时设定和倒计时再次分开(TT,之前的活白干了还效果不好////)
3:
控制器模块(2个)
1.控制器1的主要功能是模式选择、定时设定、和倒计时
为了让模式改变和定时设定改变时不用设置那么多中间变量来改变显示的时间,所以把原本三个功能模块合成为一个,预期的效果达到了,代码编写和组装比之前编写的版本容易,但是在验收的时候也发现了其不好的地方,就是按键输入的判断变得非常慢。
CLK使用的是CLK_1HZ,这里主要是局限于quartus一个进程只能有一个时钟的规定。
所以倒计时和按键输入的判断均用此时钟来进行。
OFF是电磁炉的总开关,当OFF为1时,STATE输出为0,停止工作并灭灯。
TIMER_10,TIMER_1分别是时间的十位和个位,这里采用4位BCD码的存储思想,方便display模块的编译显示
STATE输出电磁炉的工作状态,当STATE为1时显示和倒计时部件正常工作,当STATE为0时,显示和倒计时停止工作,并灭灯复位。
MODE输出电磁炉的烹饪模式,因为有5中模式,所以采用3位二进制表示。
2.控制器2的主要功能是进行火力调节并输出BCD码形式的火力变量
CLK是CLK_CTR(10HZ),相较于控制器1,在这个时钟频率下进行的按键输入判断效果好了很多。
MODE的输入是作为进行火力调节时的考虑因素之一,用来实现在爆炒模式下火力只能为1900。
Fire_show1~4分别对应火力的千位、百位、十位、个位,采用的是4位BCD码显示。
4:
数码管显示模块
当STATE=0,停止工作;当STATE=1时,根据show1~6的输入,,对照数码管的段位进行译码,按CLK_SCAN的频率进行数码管扫描显示。
CLK2输入的是CLK_SCAN(10KHZ)
Light(7~0)对应数码管的a~h段
CAT是一维六位数组使能输出,决定数码管扫描显示的位。
5:
点阵显示模块
STATE=0停止工作,STATE=1时,根据MODE输入的模式类型,显示不同的点阵图形
CLK2用的是CLK_SCAN(10KHZ)
6:
总框图
三:
仿真波形及波形分析
1:
控制器1仿真
图中,CLK是输入脉冲,1HZ,OFF是总开关,BTN7选择模式,BTN4设置时间,STATE正在烹饪。
先仿真模式选择
000是H,001是J,010是B,011是T,100是Z。
从仿真可以看出,模块对应的初始时间与实验要求相符,在B模式下,倒计时停止后可以自动转到J模式下。
对定时设定进行仿真,定时时长转化符合实验要求,按键输入的下一秒有蜂鸣器(SPD)的输出
倒计时功能的仿真中可以看出,倒计时功能正常,在计算到00时,STATE为0,停止工作。
并复位到MODE=100(便于下次开机时模式选择第一项为000)。
模式选择定时设定和倒计时一块混合仿真,当触发模式选择或定时设定时时间都会以对应的时长进行重置,倒计时功能正常,STATE,SPD的波形正常,在触发OFF的时候,系统马上停止工作,符合实验要求。
2控制器2仿真
BTN6火力增加,BTN5火力减少
在验收后老师提出了,当火力达到最大时再按BTN6不变,火力最小时再按BTN5不变的建议,回来后修改了下代码,在这次的仿真就实现了该建议。
当检测到BTN7输入产生了模式改变时,自动重置火力为1900,并且在模式为010爆炒的时候,无法改变火力。
符合实验要求。
8:
总体仿真
四:
源程序
1:
分频器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdividerIS
PORT(CP:
INSTD_LOGIC;
CLK_1HZ:
OUTSTD_LOGIC;
CLK_SCAN:
OUTSTD_LOGIC;
CLK_CTR:
OUTSTD_LOGIC;
CLK_100HZ:
OUTSTD_LOGIC);
ENDENTITYdivider;
ARCHITECTUREdiv_aOFdividerIS
SIGNALcounter_t:
INTEGERRANGE0TO49999999;--分频得1hz时钟扫描
SIGNALcounter_scan:
INTEGERRANGE0TO4999;
SIGNALcounter_ctr:
INTEGERRANGE0TO4999999;
SIGNALcounter_100hz:
INTEGERRANGE0TO499999;
BEGIN
div_t1:
PROCESS(CP)
BEGIN
IFCP'EVENTANDCP='1'THEN
IFcounter_t=49999999THEN
counter_t<=0;
ELSE
counter_t<=counter_t+1;
ENDIF;
ENDIF;
ENDPROCESSdiv_t1;
div_t2:
PROCESS(counter_t)
BEGIN
IFcounter_t<24999999THEN--占空比为50%
CLK_1HZ<='1';
ELSECLK_1HZ<='0';
ENDIF;
ENDPROCESSdiv_t2;
div_scan1:
PROCESS(CP)
BEGIN
IFCP'EVENTANDCP='1'THEN
IFcounter_scan=4999THEN
counter_scan<=0;
ELSE
counter_scan<=counter_scan+1;
ENDIF;
ENDIF;
ENDPROCESSdiv_scan1;
div_scan2:
PROCESS(counter_scan)
BEGIN
IFcounter_scan<2499THEN--占空比为50%
CLK_SCAN<='1';
ELSECLK_SCAN<='0';
ENDIF;
ENDPROCESSdiv_scan2;
div_ctr1:
PROCESS(CP)
BEGIN
IFCP'EVENTANDCP='1'THEN
IFcounter_ctr=4999999THEN
counter_ctr<=0;
ELSE
counter_ctr<=counter_ctr+1;
ENDIF;
ENDIF;
ENDPROCESSdiv_ctr1;
div_ctr2:
PROCESS(counter_ctr)
BEGIN
IFcounter_ctr<2499999THEN--占空比为50%
CLK_CTR<='1';
ELSECLK_CTR<='0';
ENDIF;
ENDPROCESSdiv_ctr2;
div_100hz1:
PROCESS(CP)
BEGIN
IFCP'EVENTANDCP='1'THEN
IFcounter_100hz=499999THEN
counter_100hz<=0;
ELSE
counter_100hz<=counter_100hz+1;
ENDIF;
ENDIF;
ENDPROCESSdiv_100hz1;
div_100hz2:
PROCESS(counter_100hz)
BEGIN
IFcounter_100hz<249999THEN--占空比为50%
CLK_100HZ<='1';
ELSECLK_100HZ<='0';
ENDIF;
ENDPROCESSdiv_100hz2;
ENDdiv_a;
2:
防抖模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYpre_shakeIS
PORT(CLK_100HZ:
INSTD_LOGIC;
KEY:
INSTD_LOGIC_VECTOR(3DOWNTO0);
KEYOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--按键输出
ENDENTITYpre_shake;
ARCHITECTUREartOFpre_shakeIS
SIGNALtmp1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtmp2:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK_100HZ,KEY)
BEGIN
IF(CLK_100HZ'EVENTANDCLK_100HZ='0')THEN--消抖部分
tmp2(0)<=tmp1(0);
tmp1(0)<=KEY(0);
tmp2
(1)<=tmp1
(1);
tmp1
(1)<=KEY
(1);
tmp2
(2)<=tmp1
(2);
tmp1
(2)<=KEY
(2);
tmp2(3)<=tmp1(3);
tmp1(3)<=KEY(3);
ENDIF;
KEYOUT(0)<=CLK_100HZANDtmp1(0)AND(NOTtmp2(0));
KEYOUT
(1)<=CLK_100HZANDtmp1
(1)AND(NOTtmp2
(1));
KEYOUT
(2)<=CLK_100HZANDtmp1
(2)AND(NOTtmp2
(2));
KEYOUT(3)<=CLK_100HZANDtmp1(3)AND(NOTtmp2(3));
ENDPROCESS;
ENDARCHITECTUREart;
3:
控制器1(模式选择、定时设定、倒计时)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmode_time_timerIS
PORT(BTN7,BTN4,CLK,OFF:
INSTD_LOGIC;
TIMER_10,TIMER_1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--倒计时十位、个位
STATE:
OUTSTD_LOGIC;--电磁炉工作状态LCD4
SPD:
OUTSTD_LOGIC;--蜂鸣器
MODE:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));--烹饪模式
ENDENTITYmode_time_timer;
ARCHITECTUREbehaveOFmode_time_timerIS
SIGNALMODE1:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALSETTER:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALTEMP10,TEMP1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALTEMP:
STD_LOGIC;
BEGIN
P1:
PROCESS(CLK)--1HZ时钟
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFTEMP='1'THEN--判断电磁炉工作状态(1为运行)
IFTEMP1="0000"THEN--对时间个位为0的情况进行分类讨论
IFTEMP10="0000"THEN--如果十位也为0,此时时间为00
IFMODE1="010"THEN--判断是否在爆炒模式下工作
MODE1<="001";TEMP10<="1001";TEMP1<="0000";
ELSE
TEMP<='0';MODE1<="100";
ENDIF;
ELSE--时间为X0时,进行借位
TEMP1<="1001";
TEMP10<=TEMP10-'1';
ENDIF;
ELSE--个位非特殊情况,每1HZ时钟上升沿减1
TEMP1<=TEMP1-'1';
ENDIF;
IFBTN4='1'THEN--定时设置(时钟上升沿且处于工作状态时BTN4是否为1)
CASESETTERIS
WHEN"00"=>SETTER<="01";TEMP10<="0000";TEMP1<="0101";
WHEN"01"=>SETTER<="10";TEMP10<="0001";TEMP1<="0000";
WHEN"10"=>SETTER<="11";TEMP10<="0011";TEMP1<="0000";
WHEN"11"=>SETTER<="00";TEMP10<="0110";TEMP1<="0000";
WHENOTHERS=>SETTER<="00";TEMP10<="0000";TEMP1<="0000";
ENDCASE;
ENDIF;
ENDIF;
IFBTN7='1'THEN--模式选择(时钟上升沿且处于工作状态时BTN7是否为1)
TEMP<='1';--工作
SETTER<="00";--定时设置中的计数变量复位
CASEMODE1IS--选择模式的同时也重置定时时间
WHEN"000"=>MODE1<="001";TEMP10<="1001";TEMP1<="0000";--h-->j
WHEN"001"=>MODE1<="010";TEMP10<="0000";TEMP1<="0011";--j-->b
WHEN"010"=>MODE1<="011";TEMP10<="1001";TEMP1<="0000";--b-->t
WHEN"011"=>MODE1<="100";TEMP10<="0010";TEMP1<="0000";--t-->z
WHEN"100"=>MODE1<="000";TEMP10<="1001";TEMP1<="0000";--z-->h
WHENOTHERS=>MODE1<="000";TEMP10<="1001";TEMP1<="0000";
ENDCASE;
ENDIF;
IFBTN4='1'THEN--当定时设置成功时,蜂鸣器工作
SPD<='1';
ELSE
SPD<='0';
ENDIF;
ENDIF;
IFOFF='1'THEN--总开关为1时停止工作
TEMP<='0';
MODE1<="100";
ENDIF;
ENDPROCESS;
MODE<=MODE1;
STATE<=TEMP;
TIMER_10<=TEMP10;
TIMER_1<=TEMP1;
ENDbehave;
4:
控制器2(火力设定)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYset_fireIS
PORT(CLK,BTN7,BTN6,BTN5:
INSTD_LOGIC;
MODE:
INSTD_LOGIC_VECTOR(2DOWNTO0);
fire_show1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
fire_show2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
fire_show3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
fire_show4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDENTITYset_fire;
ARCHITECTUREbehaveOFset_fireIS
SIGNALTEMP:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALD1,D2,D3,D4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
p1:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBTN7='1'THEN--模式转换后重置火力1900
TEMP<="100";
ENDIF;
IFBTN6='1'THEN
IFTEMP="100"THEN
TEMP<="100";--烧录验收后通过老师反馈现已改为TEMP<=”100”;
ELSE
TEMP<=TEMP+'1';
ENDIF;
ENDIF;
IFBTN5='1'THEN
IFTEMP="000"THEN
TEMP<="000";--烧录验收后通过老师反馈现已改为TEMP<=”000”;
ELSE
TEMP<=TEMP-'1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
p2:
PROCESS(TEMP,MODE)
BEGIN
IFMODE="010"THEN
D1<="0001";D2<=