按照状态转移图可编写状态机的VHDL源程序。采用双进程描述法设计的离心机控制器源程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity controller is
port (c0,reset: in std_logic;
clk1,k1,k2,r1,r2,r3: in std_logic;
clr1,clr2,clr3,j,enal,ena2: out std_logic;
ld1,ld2,ld3,g1,a,b,c: out std_logic;
fo: out std_logic_vector(6 downto 0));
end controller;
architecture state_machine of controller is
type statetype is (system_reset,load,one_dry,water_ld, water,
two_dry_ld,two_dry,unload_reset,unload,return_trip,decision,
wash,cycle_ld);
signal present_state,next_state : statetype;
begin
state_comb:process (present_state,c0,reset,k1,k2,r1,r2,r3)
begin
if reset='1' then
clr1<='1';clr2<='1';clr3<='1';j<='0';ena1<='0';
ena2<='0';
g1<='0';c<='0';b<='0';a<='0';
fo<=″0000000″;ld1<='0';ld2<='0';ld3<='0';
next_state <= system_reset;
else
case present_state is
when system_reset =>
clr1<='1';clr2<='1';clr3<='0';j<='0';
ena1<='0';ena2<='0';
g1<='1';c<='1';b<='0';a<='1';
fo<=″0000000″;ld1<='0';ld2<='0';ld3<='1';
if (c0='1') then
next_state<=load;
else
next_state<=system_reset;
end if;
when load =>
clr1<='0';clr2<='0';clr3<='0';j<='0';
ena1<='1';ena2<='0';
g1<='0';c<='0';b<='0';a<='0';
fo<=″0000001″;ld1<='0';ld2<='0';ld3<='0';
if (k1='1') then
next_state<=one_dry;
else
next_state<=load;
end if;
……
end case;
end if;
end process state_comb;
state_clocked:process(clk1,reset)
begin
if reset='1' then
present_state<=system_reset;
elsif rising_edge(clk1) then
present_state<=next_state;
end if;
end process state_clocked;
end state_machine;
利用EDA软件MAX+plus Ⅱ对该程序进行编译、仿真,其仿真波形见图4。