FPGA系统设计组成员及负责模块:冀鹏超状态控制器KZQ设计陆威数据装载器ZZQ设计韩华凯烹饪计时器JSQ设计凌智烹饪计时器JSQ设计白浚材显示译码器YMQ47设计孙兵剑微波炉控制器WBLKZQ设计微波炉控制器的设计与分析一.系统设计要求现在设计一个微波炉控制器WBLKZQ,其外部接口如图1所示。
通过该控制器再配以4个七段数码二极管完成微波炉的定时及信息显示。
图1 微波炉控制器外部接口符号图图1中的各信号的功能及要求如下:CLK是秒表时钟脉冲输入,它接收每秒一个时钟脉冲的节拍信号。
RESET为复位信号,高电平有效,用于芯片的复位功能。
TEST为测试信号,高电平有效。
用于测试4哥七段数码二极管工作是否正常。
SET_TS是烹调时间设置控制信号,高电平有效。
DATA0的一个人16位的总线输入信号,输入所设置的时间长短,它由高到低分为4组,每一组是BCD码输入,分别表示分、秒上十位个位的数字,如12分59秒。
START是烹调开始的控制信号,高电平有效。
COOK是烹调进行信号,它外接用于控制烹调的继电器开关,高电平时表明烹调已经开始或正在进行,低电平表示烹调结束或没有进行。
MIN_H(十分位)、MIN_L(分位)、SEC_H(十秒位)和SEC_L(秒位)是4组七位总线信号,它们分别接4个七段数码管,动态地显示完成烹调所剩的时间以及测试状态信息“8888”、烹调完毕的状态信息“donE”。
该微波炉控制器WBLKZQ的具体功能要求如下:上电后系统首先处于一种复位状态。
在工作时首先按SEC_L键设置烹调时间,此时系统读入DATA0的数据作为烹调所需时间,然后系统自动回到复位状态,同时4个七段数码管显示时间信息(假设系统最长的烹调时间为59分59秒)。
再按START键后系统进入烹调状态,COOK信号开始为高电平,此时4个七段数码管每隔一秒钟变化一次,用以刷新还剩多少时间结束烹调。
烹调结束后,COOK信号变为低电平,同时4个七段数码管组合在一起显示“donE”的信息,然后系统回到复位状态。
系统可以通过按RESET键随时回到复位状态。
在复位状态下,按TEST键在4个数码管上会显示“8888”的信息,它可以测试4个七段数码管工作是否正常。
二.系统设计要1.微波炉控制器的总体设计方案根据该微波炉控制器的功能设计要求,本系统可由以下4个模块组成:①状态控制器KZQ;②数据装载器ZZQ;③烹调计时器JSQ;④显示译码器YMQ47。
其内部组成原理如图2所示。
图2 微波炉控制器WBLKZQ的内部组成原理图(1)状态控制器KZQ的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息:输入信号为CLK、TEST、START、SET_T、RESET和DONE,输出信号为LD_DONE、LD_CLK、LD_8888和COOK信号。
KZQ根据输入信号和自身当时所处的状态完成状态的转换和输出相应的控制信号:LD_DONE指示ZZQ装入烹调完毕的状态信息“donE”的显示驱动信息数据;LD_CLK 指示ZZQ装入设置的烹饪时间数据;LD_8888指示ZZQ装入用于测试的数据“8888”以显示驱动信息数据;COOK指示烹饪正在进行之中,并提示计时器进行减计数。
(2)数据装载器ZZQ的功能是根据KZQ发出的控制信号选择定时时间、测试数据或烹调完成信息的装入。
当LD_DONE为高电平时,输出烹调完毕的状态信息数据;LD_CLK为高电平时,输出设置的烹饪时间数据;LD_8888为高电平时,输出测试数据。
输出信号LOAD用于提示JSQ将处于数据装入状态。
(3)计时器JSQ的功能是负责烹调过程中的时间递减计数,并提供烹调完成时的状态信号提供KZQ产生烹调完成信号。
LOAD为高电平时完成装入功能,COOK为高电平时执行逆计数功能。
输入DONE指示烹调完成。
MIN_H、MIN_L、SEC_H、和SEC_L为完成烹调所剩的时间以及测试状态信息“8888”、烹调完毕的状态信息“donE”的BCD码信息。
(4)显示译码器YMQ47的功能就是负责将各种显示信息的BCD转换成七段数码管显示的驱动信息编码。
需要译码的信息有:数字0~9,字母d、o、n、E。
2.状态控制器KZQ的设计状态控制器KZQ的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息,因此我们可用一个状态机来实现它。
经过对微波炉工作过程中的状态转换条件及输出信号进行分析,我们可得到其状态转换图如图3所示,其输入、输出端口如图4所示。
图3 KZQ的输入输出端口图图4 KZQ的输入输出端口图3.数据装载器ZZQ的设计ZZQ的输入、输出端口如5所示,根据其应完成的逻辑功能,它本质上就是一个三选一数据选择器。
本设计采用一个进程来完成,但由于三个被选择的数据只有一个来自输入端口,因此另两个被选择的数据则通过在进程的说明部分定义两个常数来产生。
由于用于显示“8888”的常数ALL-8需分解成4个8,分别经过四个4—7译码器译码后才是真正的显示驱动信息编码,因此该常数应是4个分段的是4位BCD码,故应设为“11000”。
同理,显示“donE”的常数DONE可设为“11101”,其中d、o、n、E的BCD 码分别为:“1010”、“1011”、“1100”、“1101”。
该模块的主要程序如下:图5 ZZQ的输入输出端口PROCESS(DATA1,LD_8888.LD_CLK.LD_DONE)ISCONSTANT ALL_8:STD_LOGIC_VECTOR(15 DOWNTO 0):="11000";CONSTANT DONE:STD_LOGIC_VECTOR(15 DOWNTO 0):="11101";V ARIABLE TEMP:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINLOAD<=LD_8888 OR LD_DONE OR LD_CLK;TEMP:=LD_8888 & LD_DONE & LD_CLK;CASE TEMP ISWHEN "100"=>DATA2<=ALL_8; --LOAD_8888=1WHEN "010"=>DATA2<=DONE; --LOAD_DONE=1WHEN "001"=>DATA2<=DATA1; --LOAD_CLK=1WHEN OTHERS=>NULL;END CASE;END PROCESS;4.烹调计时器JSQ的设计烹调计时器JSQ为减数计时器,其最大计时时间为59:59。
因此我们可用两个减计数十进制计数器DCNT10和两个减计数六进制计数器DCNT6级联构成。
JSQ的内部组成原理如图6所示。
图6 JSQ的内部组成原理图5.显示译码器YMQ47的设计本显示译码器YMQ47不但要对数字0~9进行显示译码,还要对字母d、o、n、E进行显示译码,其译码对照表如表1所示。
表1 YMQ47的译码对照表显示的数字或字母BCD编码七段显示驱动编码(g~a)0 00001 00012 00103 00114 01005 01016 01107 01118 10009 1001三.主要VHDL源程序1.状态控制器KZQ的VHDL源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY KZQ ISPORT(RESET,SET_T,START,TEST,CLK,DONE:IN STD_LOGIC;COOK,LD_8888,LD_CLK,LD_DONE:OUT STD_LOGIC);END ENTITY KZQ;ARCHITECTURE ART OF KZQ ISTYPE STATE_TYPE IS(IDLE,LAMP_TEST,SET_CLOCK,TIMER,DONE_MSG); SIGNAL NXT_STATE,CURR_STATE:STATE_TYPE;BEGINPROCESS(CLK,RESET)ISBEGINIF RESET='1' THENCURR_STATE<=IDLE;ELSIF CLK'EVENT AND CLK='1' THENCURR_STATE<=NXT_STA TE;END IF;END PROCESS;PROCESS(CLK,CURR_STATE,SET_T,START,TEST,DONE)ISBEGINNXT_STATE<=IDLE; --DEFAULT NEX STATE IS IDLELD_8888<='0';LD_DONE<='0';LD_CLK<='0';COOK<='0';CASE CURR_STA TE ISWHEN LAMP_TEST=>LD_8888<='1';COOK<='0';WHEN SET_CLOCK=>LD_CLK<='1';COOK<='0';WHEN DONE_MSG=>LD_DONE<='0';COOK<='0';WHEN IDLE=>IF(TEST='1')THENNXT_STATE<=LAMP_TEST;LD_8888<='1';ELSIF SET_T='1'THENNXT_STATE<=SET_CLOCK;LD_CLK<='1';ELSIF ((START='1')AND(DONE='0'))THENNXT_STATE<=TIMER;COOK<='1';END IF;WHEN TIMER=>IF DONE='1'THENNXT_STATE<=DONE_MSG;LD_DONE<='1';ELSENXT_STATE<=TIMER;COOK<='1';END IF;END CASE;END PROCESS;END ARCHITECTURE ART;2.数据装载器ZZQ的VHDL源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY ZZQ ISPORT(DATA1:IN STD_LOGIC_VECTOR(15 DOWNTO 0);LD_8888:IN STD_LOGIC;LD_CLK:IN STD_LOGIC;LD_DONE:IN STD_LOGIC;DATA2:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LOAD:OUT STD_LOGIC);END ENTITY ZZQ;ARCHITECTURE ART OF ZZQ ISBEGINPROCESS(DATA1,LD_8888,LD_CLK,LD_DONE)ISCONSTANT ALL_8:STD_LOGIC_VECTOR(15 DOWNTO 0):="11000";CONSTANT DONE:STD_LOGIC_VECTOR(15 DOWNTO 0):="11101";V ARIABLE TEMP:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINLOAD<=LD_8888 OR LD_DONE OR LD_CLK;TEMP:=LD_8888 & LD_DONE&LD_CLK;CASE TEMP ISWHEN"100"=>DATA2<=ALL_8;WHEN"010"=>DATA2<=DONE;WHEN"001"=>DATA2<=DATA1;WHEN OTHERS=>NULL;END CASE;END PROCESS;3.烹调计时器JSQ的VHDL源程序--DCNT10.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DCNT10 ISPORT(CLK:IN STD_LOGIC;LOAD:IN STD_LOGIC;ENA:IN STD_LOGIC;DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END ENTITY DCNT10ARCHITECTURE ART OF DCNT10 ISSIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK,LOAD,ENA)ISBEGINIF LOAD='1' THENCQI<=DATAIN;ELSIF CLK'EVENT AND CLK='1' THENIF ENA='1' THENIF CQI="000" THEN CQI<="1001";ELSE CQI<=CQI-'1';END IF;END IF;END IF;END PROCESS;PROCESS(CLK,CQI)ISBEGINIF CLK'EVENT AND CLK='1' THENIF CQI="0000" THEN CARRY_OUT<='1';ELSE CARRY_OUT<='0';END IF;END IF;END PROCESS;CQ<=CQI;END ARCHITECTURE ART;--DCNT6.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DCNT6 ISPORT(CLK:IN STD_LOGIC;LOAD:IN STD_LOGIC;ENA:IN STD_LOGIC;DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END ENTITY DCNT6;ARCHITECTURE ART OF DCNT6 ISSIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK,LOAD,ENA)ISBEGINIF LOAD='1' THENCQI<=DATAIN;ELSIF CLK'EVENT AND CLK='1' THENIF ENA='1' THENIF CQI="0000" THEN CQI<="0101";ELSE CQI<=CQI-'1';END IF;END IF;END IF;END PROCESS;PROCESS(CLK,CQI)ISBEGINIF CLK'EVENT AND CLK='1' THENIF CQI="0000" THEN CARRY_OUT<='1';ELSE CARRY_OUT<='0';END IF;END IF;END PROCESS;CQ<=CQI;END ARCHITECTURE ART;--JSQ.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY JSQ ISPORT(COOK:IN STD_LOGIC;DATA3:IN STD_LOGIC_VECTOR(15 DOWNTO 0);LOAD:IN STD_LOGIC;CLK:IN STD_LOGIC;SEC_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);SEC_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DONE:OUT STD_LOGIC);END ENTITY JSQ;ARCHITECTURE ART OF JSQ ISCOMPONENT DCNT10 ISPORT(CLK,LOAD,ENA:IN STD_LOGIC;DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END COMPONENT DCNT10;COMPONENT DCNT6 ISPORT(CLK,LOAD,ENA:IN STD_LOGIC;DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC);END COMPONENT DCNT6;SIGNAL NEWCLK:STD_LOGIC;SIGNAL S1:STD_LOGIC;SIGNAL S2:STD_LOGIC;SIGNAL S3:STD_LOGIC;SIGNAL S4:STD_LOGIC;BEGINU1:DCNT10 PORT MAP(CLK, LOAD, COOK, DA TA3(3 DOWNTO 0), SEC_L, S1); U2:DCNT6 PORT MAP(S1, LOAD, COOK, DATA3(7 DOWNTO 4), SEC_H, S2);U3:DCNT10 PORT MAP(S2, LOAD, COOK, DATA3(11 DOWNTO 8), MIN_L, S3); U4:DCNT6 PORT MAP(S3, LOAD, COOK, DATA3(15 DOWNTO 12), MIN_H, S4); DONE<=S1 AND S2 AND S3 AND S4;END ARCHITECTURE ART;4.显示译码器YMQ47的源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY YMQ47 ISPORT(AIN4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);DOUT7:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY YMQ47;ARCHITECTURE ART OF YMQ47 ISBEGINPROCESS(AIN4)BEGINCASE AIN4 ISWHEN"0000"=>DOUT7<="0111111";WHEN"0001"=>DOUT7<="0000100";WHEN"0010"=>DOUT7<="1011011";WHEN"0011"=>DOUT7<="1001111";WHEN"0100"=>DOUT7<="1100110";WHEN"0101"=>DOUT7<="1101101";WHEN"0110"=>DOUT7<="1111101";WHEN"0111"=>DOUT7<="0000111";WHEN"1000"=>DOUT7<="1111111";WHEN"1001"=>DOUT7<="1101111";WHEN"1010"=>DOUT7<="1011110";WHEN"1011"=>DOUT7<="1011100";WHEN"1100"=>DOUT7<="1010100";WHEN"1101"=>DOUT7<="1111001";WHEN OTHERS=>DOUT7<="0000000";END CASE;END PROCESS;END ARCHITECTURE ART;5.微波炉控制器WBLKZQ的VHDL源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY WBLKZQ ISPORT(RESET,SET_T,START,TEST,CLK:IN STD_LOGIC;COOK:OUT STD_LOGIC;SEC_L,SEC_H,MIN_L,MIN_H:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ENTITY WBLKZQ;ARCHITECTURE ART OF WBLKZQ ISCOMPONENT KZQ ISPORT(RESET,SET_T,START,TEST,CLK,DONE:IN STD_LOGIC;COOK,LD_8888,LD_CLK,LD_DONE:OUT STD_LOGIC);END COMPONENT KZQ;COMPONENT ZZQ ISPORT(DATA1:IN STD_LOGIC_VECTOR(15 DOWNTO 0);LD_8888:IN STD_LOGIC;LD_CLK:IN STD_LOGIC;LD_DONE:IN STD_LOGIC;DATA2:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LOAD:OUT STD_LOGIC);END COMPONENT ZZQ;COMPONENT JSQ ISPORT(COOK:IN STD_LOGIC;DATA3:IN STD_LOGIC_VECTOR(15 DOWNTO 0);LOAD:IN STD_LOGIC;CLK:IN STD_LOGIC;SEC_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);SEC_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN_H:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DONE:OUT STD_LOGIC);END COMPONENT JSQ;COMPONENT YMQ47PORT(AIN4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT YMQ47 ;SIGNAL S1:STD_LOGIC;SIGNAL S2:STD_LOGIC;SIGNAL S3:STD_LOGIC;SIGNAL S4:STD_LOGIC;SIGNAL S5:STD_LOGIC;SIGNAL S6:STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL S7:STD_LOGIC;SIGNAL S8:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL S9:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL S10:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL S11:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINU1:KZQ PORT MAP(RESET,SET_T,START,TEST,CLK,S1,S2,S3,S4,S5);U2:ZZQ PORT MAP(DA TA0(15 DOWNTO 0),S3,S4,S5,S6(15 DOWNTO 0),S7);U3:JSQ PORT MAP(S2,S6(15 DOWNTO 0),S7,CLK,S8(3 DOWNTO 0),S9(3 DOWNTO 0),S10(3 DOWNTO 0),S11(3 DOWNTO 0),S1);U4:YMQ47 PORT MAP(S8(3 DOWNTO 0),SEC_L(6 DOWNTO 0));U5:YMQ47 PORT MAP(S9(3 DOWNTO 0),SEC_H(6 DOWNTO 0));U6:YMQ47 PORT MAP(S10(3 DOWNTO 0),MIN_L(6 DOWNTO 0));U7:YMQ47 PORT MAP(S11(3 DOWNTO 0),MIN_H(6 DOWNTO 0));COOK<=S2;END ARCHITECTURE ART;四.系统仿真状态控制器KZQ、数据装载器ZZQ、烹调计时器JSQ和显示译码YMQ47的仿真分别如图7、图8、图9、图10所示:图7状态控制器KZQ的仿真图图8数据装载器ZZQ的仿真图图9烹调计时器JSQ的仿真图图10显示译码器YMQ47仿真图四.设计心得FPGA系统设计是一门比较难的课程,在这次设计中,我们全组花了不少的时间,其中有苦也有乐,苦的是我们付出了不少的汗水,乐的是在付出的过程中我们学到了许多。