KITE-1マイクロプロセッサのシーケンサ


KITE-1マイクロプロセッサのシーケンサを例として順序回路の記述法を見 て行きましょう.KITE-1マイクロプロセッサは,以下の図に示すようにリセッ ト解除後はベクトルスタートから実行を開始します.そして,命令フェッチ, 各命令の実行と処理が進みます.

先の例に習って,``V0''から``DECO''ステートまでのシーケンサ(一部ですが) を記述してみましょう.


まずエンティティ部分で,このシーケンサに必要な入出力を記述します.本来 ならば,命令レジスタとフラグレジスタが入力として必要ですが,これはデコー ドステート以降で必要な信号ですからここでは省略します.
library IEEE;
use IEEE.std_logic_1164.all;

entity IDC_SEQ is
  port(
    CLK   : in  std_logic; -- sequencer clock
    RESET : in  std_logic; -- reset
    START : in  std_logic; -- sequencer start
    ACK   : in  std_logic; -- memory acknowledge
    MREQ  : out std_logic; -- memory request
    PC_W  : out std_logic; -- program counter write
    PC_R  : out std_logic; -- program counter read
    PC_INC: out std_logic; -- program counter increment
    AR_W  : out std_logic; -- address register write
    IR_W  : out std_logic; -- instruction register write
    DBI   : out std_logic  -- data bus buffer enable ( input )
  );
end IDC_SEQ;

アーキテクチャでは,まずタイプ宣言でステートの定義を行います.そして, ステートマシンの状態変化を記述するプロセス文と,制御信号を生成するため のプロセス文とをそれぞれ記述します.
architecture IDC_SEQ_BODY of IDC_SEQ is
	type   STATE_TYPE    is ( V0, V1, V2, F0, F1, DECO );
	signal PRESENT_STATE : STATE_TYPE;
begin
  SEQ_PROC : process( RESET, CLK )
  begin
    if RESET = '1' then		-- 非同期リセット
      PRESENT_STATE <= V0;	-- リセット時のステートはV0
    elsif CLK'event and CLK = '1' then
      case PRESENT_STATE is
        when V0 =>
          if START = '1' then	-- スタートがかかったらV1へ
            PRESENT_STATE <= V1;
          end if;
        when V1 =>		-- ACKが来たらV2へ
          if ACK = '1' then
            PRESENT_STATE <= V2;
          end if;
        when V2 => PRESENT_STATE <= F0;
        when F0 => PRESENT_STATE <= F1;
        when F1 =>		-- ACKが来たらDECOへ
          if ACK = '1' then
            PRESENT_STATE <= DECO;
          end if;
        when DECO => .........; -- 命令個別の処理へ
        ....
        when others => V0;	-- その他の条件
      end case;
    end if;
  end process;

  SEQ_CNTL : process( PRESENT_STATE )
  begin
    MREQ <= '0';		-- はじめに全てを初期化しておいて
    PC_W <= '0';   PC_R <= '0';   PC_INC <= '0';
    AR_W <= '0'; 
    IR_W <= '0';
    DBI  <= '0';
    case ( PRESENT_STATE ) is	-- 必要な制御信号のみ'1'へ設定
      when V0   => null;
      when V1   => MREQ <= '1';
      when V2   => MREQ <= '1';   PC_W <= '1';   DBI    <= '1';
      when F0   => PC_R <= '1';   AR_W <= '1';   PC_INC <= '1';
      when F1   => MREQ <= '1';
      when DECO => MREQ <= '1';   IR_W <= '1';   DBI    <= '1';
    end case;
end IDC_SEQ_BODY;

いかがでしょう.プロセッサのシーケンサ部分の一部を示しましたが、後は命 令毎に命令の実行フェーズ にしたがった制御を行うように記述していけばよいのです.
では,最後にトライステートバッファの記述方法について学びます.

次へ進む ( トライステートバッファ )



ホーム もどる 辞書

This is my e-mail address:
arch_www < www@cs.kumamoto-u.ac.jp >
Copyright (C) KITE Microprocessor Project, 1996