VHDLで4相クロックを作る

これまでMAX V (5M240ZT100C5N)を使ってきたが、今回からMAX 10 (10M08SAE144C8G)を使う。

pp.193-195
いわゆるone-hot state counterである。下のコードはテキストのままである。

-- clk_gen.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity clk_gen is
    port(
        CLK    : in   std_logic;
        
        CLK_FT : out std_logic; -- フェッチ
        CLK_DC : out std_logic; -- デコード
        CLK_EX : out std_logic; -- 実行
        CLK_WB : out std_logic  -- ライトバック
    );
end clk_gen;

architecture RTL of clk_gen is

-- := "00"で初期値を設定。シミュレーションをするのでなければ不要。
signal COUNT : std_logic_vector(1 downto 0) := "00";

begin
    process(CLK)
    begin
        if(CLK'event and CLK = '1') then
            case COUNT is
                when "00"   => CLK_FT <= '1'; CLK_DC <= '0'; CLK_EX <= '0'; CLK_WB <= '0';
                when "01"   => CLK_FT <= '0'; CLK_DC <= '1'; CLK_EX <= '0'; CLK_WB <= '0';
                when "10"   => CLK_FT <= '0'; CLK_DC <= '0'; CLK_EX <= '1'; CLK_WB <= '0';
                when "11"   => CLK_FT <= '0'; CLK_DC <= '0'; CLK_EX <= '0'; CLK_WB <= '1';
                when others => null; -- std_logicはH、L以外にもHi-Zなど全部で9値を取り得る。
            end case;
            COUNT <= COUNT + 1;
        end if;
    end process;
end RTL;

実行結果:
CLKへはFGから4 Hzを与えた。
f:id:ti-nspire:20210113132746p:plain:h281