📄 autoseller.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY autoseller IS
PORT (line,row: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
SOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
clock,reset,halfcoin,onecoin,fivecoins,tencoins: IN STD_ULOGIC;
ready,dispense,ret,coin: OUT STD_ULOGIC);
END ENTITY autoseller;
ARCHITECTURE structure OF autoseller IS
TYPE state_type IS (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U);
SIGNAL present_state, next_state: state_type;
BEGIN
PROCESS (line, row)
VARIABLE lr:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
lr:=(line & row);
CASE lr IS
WHEN B"00010001" => SOUT<=B"10100001"; --A1
WHEN B"00010010" => SOUT<=B"10100010"; --A2
WHEN B"00010011" => SOUT<=B"10100011"; --A3
WHEN B"00100001" => SOUT<=B"10110001"; --B1
WHEN B"00100010" => SOUT<=B"10110010"; --B2
WHEN B"00100011" => SOUT<=B"10110011"; --B3
WHEN B"00110001" => SOUT<=B"11000001"; --C1
WHEN B"00110010" => SOUT<=B"11000010"; --C2
WHEN B"00110011" => SOUT<=B"11000011"; --C3
WHEN OTHERS => SOUT<=B"00000000"; --00
END CASE;
END PROCESS;
sta: PROCESS(clock, reset)
BEGIN
IF(reset = '1') THEN
present_state <= A;
ELSIF (rising_edge(clock)) THEN --clock'EVENT AND clock='1'
present_state <= next_state;
END IF;
END PROCESS sta;
addcoin:PROCESS(halfcoin,onecoin,fivecoins,tencoins, present_state, line)
BEGIN
ready <= '0';
dispense <= '0';
ret <= '0';
coin <= '0';
IF (line = B"0001") THEN
CASE present_state IS
WHEN A =>
ready <= '1';
IF (halfcoin = '1') THEN
next_state <= C;
ELSIF(onecoin = '1') THEN
next_state <= D;
ELSIF(fivecoins = '1') THEN
next_state <= J;
ELSIF (tencoins = '1') THEN
next_state <= P;
ELSE
next_state <= A;
END IF;
WHEN B => --出饮料
dispense <= '1';
next_state <= A;
WHEN C =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= D;
ELSIF(onecoin = '1') THEN
next_state <= E;
ELSIF(fivecoins = '1') THEN
next_state <= K;
ELSIF (tencoins = '1') THEN
next_state <= Q;
ELSE
next_state <= C;
END IF;
WHEN D =>
coin <= '0';
ret <= '0';
next_state <= B;
WHEN E =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN F =>
next_state <= A;
WHEN G =>
next_state <= A;
WHEN H =>
next_state <= A;
WHEN I =>
next_state <= A;
WHEN J =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN K =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN L =>
next_state <= A;
WHEN M =>
next_state <= A;
WHEN N =>
next_state <= A;
WHEN O =>
next_state <= A;
WHEN P =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN Q =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN R =>
next_state <= A;
WHEN S =>
next_state <= A;
WHEN T =>
next_state <= A;
WHEN U =>
next_state <= A;
END CASE;
ELSIF (line = B"0010") THEN
CASE present_state IS
WHEN A =>
ready <= '1';
IF (halfcoin = '1') THEN
next_state <= C;
ELSIF(onecoin = '1') THEN
next_state <= D;
ELSIF(fivecoins = '1') THEN
next_state <= J;
ELSIF (tencoins = '1') THEN
next_state <= P;
ELSE
next_state <= A;
END IF;
WHEN B => --出饮料
dispense <= '1';
next_state <= A;
WHEN C =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= D;
ELSIF(onecoin = '1') THEN
next_state <= E;
ELSIF(fivecoins = '1') THEN
next_state <= K;
ELSIF (tencoins = '1') THEN
next_state <= Q;
ELSE
next_state <= C;
END IF;
WHEN D =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= E;
ELSIF(onecoin = '1') THEN
next_state <= F;
ELSIF(fivecoins = '1') THEN
next_state <= L;
ELSIF (tencoins = '1') THEN
next_state <= R;
ELSE
next_state <= D;
END IF;
WHEN E =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= F;
ELSIF(onecoin = '1') THEN
next_state <= G;
ELSIF(fivecoins = '1') THEN
next_state <= M;
ELSIF (tencoins = '1') THEN
next_state <= S;
ELSE
next_state <= E;
END IF;
WHEN F =>
coin <= '0';
ret <= '0';
next_state <= B;
WHEN G =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN H =>
next_state <= A;
WHEN I =>
next_state <= A;
WHEN J =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN K =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN L =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN M =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN N =>
next_state <= A;
WHEN O =>
next_state <= A;
WHEN P =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN Q =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN R =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN S =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN T =>
next_state <= A;
WHEN U =>
next_state <= A;
END CASE;
ELSIF (line = B"0011") THEN
CASE present_state IS
WHEN A =>
ready <= '1';
IF (halfcoin = '1') THEN
next_state <= C;
ELSIF(onecoin = '1') THEN
next_state <= D;
ELSIF(fivecoins = '1') THEN
next_state <= J;
ELSIF (tencoins = '1') THEN
next_state <= P;
ELSE
next_state <= A;
END IF;
WHEN B => --出饮料
dispense <= '1';
next_state <= A;
WHEN C =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= D;
ELSIF(onecoin = '1') THEN
next_state <= E;
ELSIF(fivecoins = '1') THEN
next_state <= K;
ELSIF (tencoins = '1') THEN
next_state <= Q;
ELSE
next_state <= C;
END IF;
WHEN D =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= E;
ELSIF(onecoin = '1') THEN
next_state <= F;
ELSIF(fivecoins = '1') THEN
next_state <= L;
ELSIF (tencoins = '1') THEN
next_state <= R;
ELSE
next_state <= D;
END IF;
WHEN E =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= F;
ELSIF(onecoin = '1') THEN
next_state <= G;
ELSIF(fivecoins = '1') THEN
next_state <= M;
ELSIF (tencoins = '1') THEN
next_state <= S;
ELSE
next_state <= E;
END IF;
WHEN F =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= G;
ELSIF(onecoin = '1') THEN
next_state <= H;
ELSIF(fivecoins = '1') THEN
next_state <= N;
ELSIF (tencoins = '1') THEN
next_state <= T;
ELSE
next_state <= F;
END IF;
WHEN G =>
coin <= '1';
IF (halfcoin = '1') THEN
next_state <= H;
ELSIF(onecoin = '1') THEN
next_state <= I;
ELSIF(fivecoins = '1') THEN
next_state <= O;
ELSIF (tencoins = '1') THEN
next_state <= U;
ELSE
next_state <= G;
END IF;
WHEN H =>
coin <= '0';
ret <= '0';
next_state <= B;
WHEN I =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN J =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN K =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN L =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN M =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN N =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN O =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN P =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN Q =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN R =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN S =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN T =>
coin <= '0';
ret <= '1';
next_state <= B;
WHEN U =>
coin <= '0';
ret <= '1';
next_state <= B;
END CASE;
ELSE NULL;
END IF;
END PROCESS addcoin;
END ARCHITECTURE structure;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -