ステートマシンの記述


状態遷移図および命令実行フェーズ表にしたがって、状態遷移を記述します。
実行フェーズ表は以下を参照して下さい。
3バス構成の実行フェーズ表

  reg [7:0] STATE;	// Current State

//------------------------------------------------------------------//
// State Transition
//------------------------------------------------------------------//
  always @( posedge RST or posedge CLK )
  begin
    if ( RST==1 ) STATE<=`V0;
    else
      case ( STATE )
      `HALTING : if( RST==1 ) STATE<=`V0;
      `V0  :     if( RST==0 ) STATE<= ...... ;
      `V1  :     if( ACK==1 ) STATE<= ...... ;
      `V2  :                  STATE<= ...... ;
      `F1  :                  STATE<= ...... ;
      `F2  :     if( ACK==1 ) STATE<= ...... ;
      `F3  :                  STATE<= ...... ;
      `DEC :
        begin
        case ( `OP_4 )			// 4 bit オペコードの命令デコード
        `IR_LDD  : STATE<=`LDD_1;
        `IR_STD  : STATE<=`STD_1;
        `IR_CALL : STATE<=`CALL_1;
        `IR_JP, ... , ... , ... , ... 
	        : ... ;
        default :
          case ( `OP_6 )			// 6 bit オペコードの命令デコード
	  `IR_ADD, `IR_SUB, `IR_OR, `IR_EOR, `IR_AND
                   : if( `OP_M==`IMM ) STATE<=`BIOP_IMM_1; else
                     if( `OP_M==`IDX ) STATE<=`BIOP_IDX_1; else
                                       STATE<=`F1;			// 未定義命令
	  `IR_INC, `IR_DEC, `IR_MV
                   : ...... ;
	  `IR_NOT, `IR_LSL, `IR_ASL, `IR_LSR,
	  `IR_ASR, `IR_ROL, `IR_ROR, `IR_SWP
                   : ...... ;
	  `IR_LD   : if( ... ) ...... ; else 
                     if( ... ) ...... ; else
                               ...... ;
	  `IR_ST   : if( ... ) ...... ; else
                               ...... ;
	  `IR_IN   : ...... ;
	  `IR_OUT  : ...... ;
	  `IR_POP  : ...... ;
	  `IR_PUSH : ...... ;
	  `IR_RET  : ...... ;
	  `IR_HALT : ...... ;
	  `IR_NOP  : ...... ;
          default  : STATE<=`F1;		//  未定義命令
          endcase
        endcase
      end

    //
    // LD Imm
    //
    `LDI_1 :  STATE<=`F1;

    //
    // LD Index
    //
    `LDX_1 :              STATE<=`LDX_2;
    `LDX_2 : if( ACK==1 ) STATE<=`LDX_3; 
    `LDX_3 :              STATE<=`F1;

    //
    // LD Direct
    //
    `LDD_1 :              STATE<=`LDD_2;
    `LDD_2 : if( ACK==1 ) STATE<=`LDD_3; 
    `LDD_3 :              STATE<=`F1;
    //
    // ST Index
    //
    `STX_1 :              ...... ;
    `STX_2 :              ...... ;
    `STX_3 : if( ACK==1 ) ...... ;
    `STX_4:               ...... ;

    //
    // ST Direct
    //
    `STD_1 :              ...... ;
    `STD_2 :              ...... ;
    `STD_3 : if( ACK==1 ) ...... ;
    `STD_4 :              ...... ;

    //
    // CALL
    //
    `CALL_1:              ...... ;
    `CALL_2:              ...... ;
    `CALL_3: if( ACK==1 ) ...... ;
    `CALL_4:              ...... ;
    `CALL_5:              ...... ;

    //
    // Branch Instructions
    //
    `JP_1 :  ...... ;

     //
     // Binary Instructions
     //  ADD, SUB, OR, EOR, AND
    `BIOP_IMM_1 : ...... ;

    //
    // BIOP Index
    //  ADD, SUB, OR, EOR, AND
    `BIOP_IDX_1 :              ...... ;
    `BIOP_IDX_2 : if( ACK==1 ) ...... ;
    `BIOP_IDX_3 :              ...... ;

    //
    // INC & DEC & MV
    //
    `INC_DEC_MV : ...... ;

    // Mono operand instructions
    //  NOT and  all shift instructions
    `MONO_1 : ...... ;

    //
    // INPUT instruction
    //
    `IN_1 :              ...... ;
    `IN_2 : if( ACK==1 ) ...... ;
    `IN_3 :              ...... ;

    //
    // OUTPUT instruction
    //
    `OUT_1 :              ...... ;
    `OUT_2 :              ...... ;
    `OUT_3 : if( ACK==1 ) ...... ;
    `OUT_4 :              ...... ;

    //
    // POP
    //
    `POP_1 :              ...... ;
    `POP_2 : if( ACK==1 ) ...... ;
    `POP_3 :              ...... ;

    //
    // PUSH
    //
    `PUSH_1 :              ...... ;
    `PUSH_2 :              ...... ;
    `PUSH_3 : if( ACK==1 ) ...... ;
    `PUSH_4 :              ...... ;

    //
    //
    //
    `RET_1 :              ...... ;
    `RET_2 : if( ACK==1 ) ...... ;
    `RET_3 :              ...... ;

    //
    // HALT
    //
    `HALT_1 : STATE <= `HALTING;

    //
    // NOP
    //
    `NOP_1  : STATE <= `F1;

    default : STATE <= `F1;
    endcase
  end



次は、 デコーダの記述 についてみていきます。


| CAD Home |