ステートおよび命令コードの定義


KITE-1 マイクロプロセッサが取りうる状態を定義しましょう。KITE-1マイク ロプロセッサは以下のような状態遷移を取りながら命令を実行します。

ステート(E1)以降は、命令によって取りうる状態が異なります。以下のように 記述することで、文字列で状態を取り扱うことができます。


//
// State
//
`define HALTING    8'b00000000	// HALT
`define V0         8'b00000001	// RESET
`define V1         8'b00000011	// Vector Start
`define V2         8'b00000111
`define F1         8'b00001111	// Instruction Fetch
`define F2         8'b00001110
`define F3         8'b00001100
`define DEC        8'b00001000	// Decode

`define LDD_1      8'b00010000	// Load Direct
`define LDD_2      8'b00010001
`define LDD_3      8'b00010011

`define STD_1      8'b00010111	// Store Direct
`define STD_2      8'b00011111
`define STD_3      8'b00011110
`define STD_4      8'b00011100

`define CALL_1     8'b00100000	// Call
`define CALL_2     8'b00100001
`define CALL_3     8'b00100011
`define CALL_4     8'b00100111
`define CALL_5     8'b00101111

`define JP_1       8'b00110000	// Jump and Branch
`define HALT_1     8'b00110001
`define NOP_1      8'b00110111

`define BIOP_IMM_1 8'b00111111	// Binary Operations (Immediate)

`define BIOP_IDX_1 8'b01000000	// Binary Operations (Indexed)
`define BIOP_IDX_2 8'b01000001
`define BIOP_IDX_3 8'b01000011

`define INC_DEC_MV 8'b01010000	// INC, DEC, MV (Register Indirect)
`define MONO_1     8'b01010111	// Unary Operations (Inherent)

`define LDI_1      8'b01100000	// Load Immediate

`define LDX_1      8'b01100001	// Load Indexed
`define LDX_2      8'b01100011
`define LDX_3      8'b01100010

`define STX_1      8'b01110000	// Store Indexed
`define STX_2      8'b01110001
`define STX_3      8'b01110011
`define STX_4      8'b01110111

`define IN_1       8'b10000000	// In
`define IN_2       8'b10000001
`define IN_3       8'b10000011

`define OUT_1      8'b10000111	// Out
`define OUT_2      8'b10001111
`define OUT_3      8'b10001110
`define OUT_4      8'b10001100

`define POP_1      8'b10010000	// Pop
`define POP_2      8'b10010001
`define POP_3      8'b10010011

`define PUSH_1     8'b10100000	// Push
`define PUSH_2     8'b10100001
`define PUSH_3     8'b10100011
`define PUSH_4     8'b10100111

`define RET_1      8'b10110000	// Ret
`define RET_2      8'b10110001
`define RET_3      8'b10110011
`define RET_4      8'b10110111

このように、命令実行のために必要な状態を全て定義します。各状態値の値は この例では8ビットでグレイコードもどきにしてあります。状態値は必要に応 じてバイナリカウンタにしたり、One Hot タイプにしたりすることも可能です。 "state.v" のようなファイル名でセーブし include を用いて参照すれば良い でしょう。
実行フェーズ表は以下を参照して下さい。
3バス構成の実行フェーズ表


次にオペレーションコードの定義を行います。この記述を行っておくと、命令 の識別を0と1の並びでなく文字列として扱えるので便利です。記述例を以下 に示します。"opcode.v" の様なファイル名でセーブし include で参照すれば 良いでしょう。


//
// Instruction Code
//
`define OP_4      IR[15:12]	// 4 bits OP code Field
`define IR_LDD    4'b0000
`define IR_STD    4'b0001
`define IR_CALL   4'b0010
`define IR_JP     4'b0011
`define IR_JPC    4'b0100
`define IR_JPZ    4'b0101
`define IR_JPS    4'b0110
`define IR_JPV    4'b0111

`define OP_6      IR[15:10]	// 6 bits OP code Field
`define IR_ADD    6'b100000
`define IR_SUB    6'b100001
`define IR_INC    6'b100010
`define IR_DEC    6'b100011
`define IR_OR     6'b100100
`define IR_EOR    6'b100101
`define IR_AND    6'b100110
`define IR_NOT    6'b100111
`define IR_LSL    6'b101000
`define IR_ASL    6'b101001
`define IR_LSR    6'b101010
`define IR_ASR    6'b101011
`define IR_ROL    6'b101100
`define IR_ROR    6'b101101
`define IR_SWP    6'b101111
`define IR_LD     6'b110000
`define IR_ST     6'b110001
`define IR_IN     6'b110010
`define IR_OUT    6'b110011
`define IR_POP    6'b110100
`define IR_PUSH   6'b110101
`define IR_RET    6'b111000
`define IR_MV     6'b111100
`define IR_HALT   6'b111110
`define IR_NOP    6'b111111

`define OP_M      IR[9:8]	// Addressing Mode Field
`define IMM       2'b01		//   Immediate
`define IDX       2'b10		//   Indexed

`define OP_A      IR[13:10]	// ALU Code Field

`define OP_D      IR[3:2]	// Destination Register Field
`define OP_S      IR[1:0]	// Source Register Field
`define RD_ACC    2'b00		// Register Code
`define RD_SP     2'b01
`define RD_IXR    2'b10
`define RD_PC     2'b11

各命令とオペレーションコードとの対応は こちらを参照して下さい。


次は、 ステートの記述 についてみていきます。


| CAD Home |