打撃結果がアウトの場合、
アウトカウントはひとつづつ増え、
スリーアウトでチェンジします。
-- OUT Counter
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity OUT_COUNTER is
port(
CLK : in std_logic;
RESET : in std_logic;
BATTING : in std_logic_vector(2 downto 0);
OUT_LED : out std_logic_vector(1 downto 0);
CHANGE : out std_logic
);
end OUT_COUNTER;
architecture RTL of OUT_COUNTER is
signal OUT_COUNT_TMP : std_logic_vector(1 downto 0);
signal OUT_LED_TMP : std_logic_vector(1 downto 0);
begin
process (CLK,RESET)
begin
if (RESET = '0') then
OUT_COUNT_TMP <= "00";
elsif (CLK'event and CLK = '0') then
if (BATTING = "000") then
OUT_COUNT_TMP <= OUT_COUNT_TMP + 1;
end if;
end if;
end process;
process(OUT_COUNT_TMP)
begin
case (OUT_COUNT_TMP) is
when "00" =>
OUT_LED_TMP <= "00";
CHANGE <= '1';
when "01" =>
OUT_LED_TMP <= "01";
CHANGE <= '1';
when "10" =>
OUT_LED_TMP <= "11";
CHANGE <= '1';
when "11" =>
OUT_LED_TMP <= "00";
CHANGE <= '0';
when others =>
OUT_LED_TMP <= null;
CHANGE <= null;
end case;
end process;
OUT_LED <= OUT_LED_TMP;
end RTL;
ここで、
when "11" =>
OUT_LED_TMP <= "00";
CHANGE <= '0';
アウトカウントが3の時のCHANGE信号は負論理にしています。
通常、信号を送出する場合、1を出力しますが、CHANGEはリセットと同じような効果を与えるので、RESETと論理を同じにして、0を出力しています。
また、
when "11" =>
OUT_LED_TMP <= "00";
CHANGE <= '0';
の OUT_LED_TMP <= "00"; を忘れていました。*1
3アウトチェンジでアウトカウントはリセットされるので、動作上は影響ないのですが、全ての場合を網羅しないと、ラッチ回路が作成されてしまいます。*2