先の例に習って,``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;