ステートマシンの記述
状態遷移図および命令実行フェーズ表にしたがって、状態遷移を記述します。
実行フェーズ表は以下を参照して下さい。
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 |