根据图1所示的状态转换图,用VHDL中的CASE_WHEN结构和IF_THEN_ELSE语句实现控制功能,源程序如下:
LIBRARY IEEE; --库和程序包的使用说明
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY sellmachine IS --实体定义
PORT(clk,reset: IN std_logic;
state_inputs:IN std_logic_vector(0 TO 1);
comb_outputs:OUT std_logic_vector(0 TO 1));
END sellmachine;
ARCHITECTURE state OF sellmachine IS --结构体
TYPE fsm_st IS (S0,S1,S2,S3,S4); --状态枚举类型定义
SIGNAL current_state,next_state:fsm_st; --状态信号的定义
BEGIN
reg:PROCESS(reset,clk) --时序进程
BEGIN
IF reset=‘1’ THEN current_state《=S0; --异步复位
ELSIF rising_edge(clk) THEN
current_state《=next_state; --状态转换
END IF;
END PROCESS;
corn:PROCESS(current_state,state_inputs) --组合进程
BEGIN
CASE current_state IS
WHEN S0=》comb_outputs《=“00”; --现态S0
IF state_inputs《=“00” THEN next_state《=S0; --输入不同,次态不同
ELSIF state_inputs《=“01” THEN next_state《=S1;
ELSIF state_inputs《=“10” THEN next_state《=S2;
END IF;
WHEN S1=》comb_outputs《=“00”; --现态S1
IF state_inputs《=“00” THEN next_state《=S1; --输入不同,次态不同
ELSIF state_inputs《=“01” THEN next_state《=S2;
ELSIF state_inputs《=“10” THEN next_state《=S3;
END IF;
WHEN S2=》comb_outputs《=“00”; --现态S2
IF state_inputs《=“00” THEN next_state《=S2; --输入不同,次态不同
ELSIF state_inputs《=“01” THEN next_state《=S3;
ELSIF state_inputs《=“10” THEN next_state《=S4;
END IF;
WHEN S3=》comb_outputs《=“10”; --现态S3
IF state_inputs《=“00” THEN next_state《=S0; --输入不同,次态不同
ELSIF state_inputs《=“01” THEN next_state《=S1;
ELSIF state_inputs《=“10” THEN next_state《=S2;
END IF;
WHEN S4=》comb_outputs《=“11”; --现态S4
IF state_inputs《=“00” THEN next_state《=S0; --输入不同,次态不同
ELSIF state_inputs《=“01” THEN next_state《=S1;
ELSIF state_inputs《=“10” THEN next_state《=S2;
END IF;
END CASE;
END PROCESS;
END state; 编译、仿真及FPGA实现
在Altera公司的可编程逻辑器件集成开发平台Quartus II 8.0下完成程序的编辑、编译并进行时序仿真。
1)编译:编译是EDA设计中的核心环节。软件将对设计输入文件进行逻辑化简、综合和优化, 适当地用一片或多片器件进行适配,最后产生编程用的编程文件。主要包括设计编译和检查、逻辑优化和综合、适配和分割、布局和布线、生成编程数据文件等过程。自动售货机控制模块VHDL文件编译报告如图2所示。