記事一覧

野球ゲームをつくる ~ 6.アウトカウントとチェンジ

2015年06月02日(火)22時48分

打撃結果がアウトの場合、
アウトカウントはひとつづつ増え、
スリーアウトでチェンジします。

out_counter.vhd

-- 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

*1:2015.06.10 修正
*2:実は、Warningで気づきました。