摘 要: 基于可编程逻辑器件EPM240T100C5,使用硬件描述语言VHDL,采用“自顶向下”的设计方法,编写一个微波炉控制器的芯片。介绍了微波炉控制器的设计思路与模块划分,应用Quartus II软件对每个模块和主程序分别进行了调试,并硬件下载到开发板上进行了模拟调试。
关键词: 复杂可编程逻辑器件; 现场可编程门阵列; 高速集成电路描述语言; Quartus II软件
随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中,EDA技术的含量正以惊人的速度上升;电子类的高新技术项目的开发也日益依赖于EDA技术的应用。设计者的工作仅限于利用软件的方式来完成对系统硬件功能的描述,在EDA工具的帮助下并应用相应的FPGA/CPLD器件,就可以得到最后的设计结果。尽管目标系统是硬件,但整个设计和修改过程如同完成软件设计一样方便和高效,从而使产品的开发周期大为缩短、性能价格比大幅提高。不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。
1 系统硬件设计框图
本系统设计采用Altera MAXⅡ系列性价比较高的EPM240T100C5可编程逻辑器件作为信号处理及系统控制核心,完成包括分频、计数、显示等一系列工作,结合所需的外围模块,组成一个最小系统,完成按键控制、LED显示、音频提示。总体设计如图1所示。
利用CPLD/FPGA可编程的特点,使电路大为简化,利用软件Quartus II和硬件描述语言VHDL对数字系统进行编程、调试和仿真,使得设计、调试方便便捷,充分地发挥了CPLD/FPGA的优势及特点。
2 微波炉控制器的整体设计方案
根据该微波炉的功能设计要求,软件设计可由:分频器、状态控制器、 数据装载器大、计时器、显示器、微波加热信号锁存器6个模块组成。各模块之间的关系如图2所示。
2.1 分频器fredivn的设计
在接口电路中,时钟信号的作用至关重要,一般CPLD的外部时钟信号可达到几十MHz,但是由于一些接口电路的特性所致,这样高频率的时钟不适合电路工作,所以应该引入时钟分频电路产生适合接口的工作频率。分频模块的设计用于产生合适的扫描时钟、计数时钟和闪烁时钟,其外部接口如图3所示。时钟发生器的输入是全局时钟clk,是从50 MHz的石英晶振得到的信号。输出信号是扫描时钟clk 1 kHz、clk 5 Hz和clk 1 Hz。
部分关键程序如下:
------1 kHz分频---------------
process(clk)
variable count0:integer range 0 to 24999;
begin
if clk'event and clk='1' then
if count0=24999 then
clk0<=not clk0;
count0:=0;
else count0:=count0+1;
end if;
end if;
clk1kHz<=clk0;
end process;
------5 Hz分频---------------
process(clk0)
variable count1:integer range 0 to 99;
begin
if clk0'event and clk0='1' then
if count1=99 then clk1<=not clk1;count1:=0;
else count1:=count1+1;
end if;
end if;
clk5 Hz<=clk1;
end process;
-----1 Hz分频-----------------
process(clk0)
variable count2:integer range 0 to 499;
begin
if clk0′event and clk0=′1′ then
if count2=499 then clk2<=not clk2;count2:=0;
else count2:=count2+1;
end if;
end if;
clk1Hz<=clk2;
end process;
end;
2.2 状态控制器state的设计
通常状态机是控制单元的主体,它接收外部信号及数据单元产生的状态信息,产生控制信号。微波炉状态控制器state的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息,因此可用一个状态机实现。通过对微波炉工作过程中的转换条件及输出信号进行分析,可得到其状态转换图如图4所示。
该状态机有8个状态。当状态机的reset信号为0时,状态机复位到idle状态,当reset信号为1时,状态机处于工作状态或待机状态。状态机的转换关系是:当前状态是idle状态,在时钟上升沿到来时,如果输入信号test=0或stall_1=0或stall_2=0或stall_3=0,则转入下一状态tap1或tap2或tap3或tap4, 否则仍停留在idle状态,实现了微波炉上电复位时处于待机状态。当test=0时,状态机转入测试状态tap1。当stall_1=0或stall_2=0或stall_3=0时,状态机转入档位状态tap2或tap3或tap4其中一个状态后,而这三个状态之间也可以相互转换。在每一个档位状态内,同时也嵌入了计数状态tap5,只要设置好输入时间,如果start=0则可以进入计时状态,否则仍停留在其中状态之一内。当处于计时状态时,如果stop=0,则转入停止状态tap6,使微波炉处于停止工作状态,而停止状态tap6与计时状态tap5之间也是可以相互转换的,当start=0,则转回计时工作状态,否则仍停留在停止状态tap6。当计时完毕,则由计数器输出done=1信号,从计时工作状态tap5转换到结束状态tap7。不管处于哪个状态,只要reset为0,则状态机会立刻转换为初始状态idle。
状态机state的外部接口如图5所示。
2.3 数据装载器data的设计
数据装载模块的控制信号基本是从状态机输出的信号中得到的。其功能主要是实现时间数据的输入、微波炉控制器当前状态数据的输出。当处于复位状态时数据“0000 0”将会送到寄存器内,寄存器再把数据送到数据输出端口;在测试状态时数据“8888 8”会被送到寄存器内,寄存器再把数据送到数据输出端口;在结束状态时数据为“donE 0”会被送到寄存器内,寄存器再把数据送到数据输出端口。在启动档位时,档位数据也会被输入到寄存器中,这时就可以输入时间数据,时间数据的输入有4位——分高位min_h、分低位min_l、秒高位sec_h、秒低位sec_l,每一个时间数据的输入也会送到寄存器内,再送到数据的输出端口。其中bn和sn是闪烁使能信号的输出。数据装载器的输入与输出端口如图6所示。
2.4 计数器counter的设计
根据设计要求,counter为减数计数器,其最大计时99:59。因此可以用3个十进制计数器和1个六进制计数器级联构成。计数器的工作与状态机的状态有关,当状态机处在复位状态、测试状态、停止状态、结束状态、档位状态都属于不工作状态,只有在计数状态时,才会工作。计数器如果进入了停止状态,会保留当前计数值,当再次按下开始键时,计数器由当前值开始计数。
4个计数器的计数使能端相连、置数使能端相连,实现同时计数和同时置数。第一个计数器的计数脉冲是从1 kHz输入的,第二个计数器的计数脉冲clk与第一个计数器的进位cn相连,第三个计数器的计数脉冲clk与第二个计数器的进位相连cn,第四个计数器的计数脉冲clk与第三个计数器的进位cn相连,设计中使用了库中的一个4输入与门,所有进位输出都连接到4输入与门,当倒计时结束,done输出“1”信号。
2.5 微波加热信号锁存器latch_cook的设计
对于latch_cook的设计,主要用来锁存微波信号,数据的输入由状态控制得到,当启动档位1时,st1_en输出信号为1、st1_en输出信号为0、st1_en输出信号为0,1_en与d1相连、 st2_en与d2相连、 st3_en与d3相连,也就是d1d2d3输入端口的数据是启动档位1的输出数据“001”。同理,当启动档2时,d1d2d3输入端口的数据为“010”,启动档位3时,d1d2d3输入端口的数据为“011”,其他状态时latch_cook模块设计中使用了两个进程。第一个进程是把输入微波信号赋给寄存器q,当g使能信号为1时,判断是哪个档位微波加热信号后,再对寄存器q进行赋值。使能端g是从load_en取得信号值的。输出load_en为1信号只有复位、测试、结束、档位这几个工作状态。其中只有在档位状态时才能触发进程,其他都不能。第二个进程是对微波信号的锁存控制,eo与计数使能端相连,只有在计数时才能触发进程,使cook输出信号值,否则cook输出高阻抗信号。latch_cook的输入、输出端口如图7所示。
部分关键程序如下:
architecture one of latch_cook is
signal q:std_logic_vector(2 downto 0);
signal s:std_logic_vector(2 downto 0);
begin
s<=d1&d2&d3;
process(s)
begin
if g='1'then
case s is
when"001"=>q<="001";--档位3
when"010"=>q<="010";--档位2
when"100"=>q<="100";--档位1
when others=>null;
end case;
end if;
end process;
process(oe)
begin
if oe='1'then--输出信号
cook<=q;
else
cook<="ZZZ";--呈现高阻抗
end if;
end process;
end;
2.6 显示译码器LED的设计
对于显示电路,硬件上使用了串行连接的设计,即每个数码管对应的引脚都接在一起,通过控制公共端控制相应数码管的亮灭(共阴极数码管的公共端为高电平时,LED不亮;共阳极的公共端为低电平时,LED不亮)。
因此,在显示模块里有4个进程实现设计——数码管动态扫描计数进程、数码管位动态扫描进程、数码管闪烁显示进程、译码信号进程。显示模块工作首先是动态扫描计数,以1 kHz的扫描频率进行扫描计数。扫描所得到的计数值传递到数码管位动态扫描进程中,控制数码管的位选信号,即显示完第一位后,接着显示第二位,依此类推,一直显示到第5位,显示模块接着继续从第一位显示,从而实现循环显示。因为1 kHz的扫描频率使6个数码管看上去是同时显示的,实现了计数结果和状态信息的显示;译码信号进程则根据动态扫描所得到的信号值,选择相应的显示数据,只要计数器数据输出或状态发生变化,则数码管的显示也发生相应的变化。对于数码管闪烁显示进程,当ficker_seg=1时,则段信号与1 Hz频率相与后再送到输出端去以1 s的频率闪烁、一亮一暗、全段灭、全段亮,否则正常输出段信号。显示模块的输入、输出端口如图8所示。
3 系统调试
为了能够准确地对所编写的软件进行调试,采用EMP240系列开发板上进行系统调试。图9是一个模拟操作系统界面。
系统调试的主要步骤如下:
(1) 在上电复位时,系统操作界面显示:00000。微波加热信号为0。正处于待机状态。
(2)按下TEST测试键,5个数码管所有段位点亮同时一亮一暗地交替闪烁着。按下复位键,系统返回复位待机状态。
(3) 右边有三个档位控制键,在待机状态时,只要按下其中一个键,就能对时间进行设定。而三个档位之间可以相互转换。按下复位键,系统返回复位待机状态。
(4) 设定好时间后就可以按下开始键,启动相应微波加热信号,同时进行倒计时计数,如果要停止加热,则按下停止键,系统进入停止状态,微波加热信号输出为0,想要再次加热,则按回开始键。按下复位键,系统返回复位待机状态。
(5) 当计时结束后,输出done显示提示,微波加热信号输出为0。按下复位键,系统返回复位待机状态。
本系统以EMP240T100C5为主要控制芯片,综合运用了Quartus II开发工具,使用VHDL硬件描述语言,使得系统设计的硬件功能基本都可以通过软件编程实现,程序经过实验仿真与调试,各项功能达到了预定的设计指标。这种设计方案不仅使电子系统的设计以及产品性能的改进和扩展变得十分简单,同时它还代替了原有的许多单元电路或单片机的控制芯片和大量外围电路,使电子电路设计更加灵活方便。为实现微波炉以及更多家用电器的信息化和智能化进行了较深入的探索和实践。
参考文献
[1] 周润景,图雅,张丽敏. 基于QuartusII的FPGA/CPLD数字系统设计实例[M]. 北京:电子工业出版社,2007.
[2] 延明,张亦华. 数字电路EDA技术入门[M].北京:北京邮电大学出版社,2006.
[3] 韩团军. 基于FPGA微波炉控制器设计[J].研究与开发, 2010,29(8):64-67.
[4] 刘昌华. 数字逻辑EDA设计与实践—MAX+plusII与QuartusII双剑合璧[M].北京:国防工业出版社,2006.