デコーダの記述
先の例で示したように、デコーダの記述は状態遷移の際にデコードのステート
に当たる部分でも記述することが可能です。しかし、場合によっては組合せ回
路として別途記述した方が良い場合もあります。以下ように分岐するかしない
かを決定する制御信号である BRANCH や 命令レジスタから 8ビットの値を読
出す際に上位8ビットの値を全て0にするか1にするかを決定する制御信号で
あるSIGNなどがその例です。
reg BRANCH; // Branch TRUE for decode
reg SIGN; // Sign Extention mode for decode
//------------------------------------------------------------------//
// BRANCH flag & SIGN flag are made from IR and FR
//------------------------------------------------------------------//
always @( IR or FR )
begin
BRANCH <= 1'bx;
SIGN <= 1'bx;
case ( `OP_4 )
`IR_JP : BRANCH<=1;
`IR_JPS : BRANCH<=FR[3];
`IR_JPZ : BRANCH<= ...
`IR_JPV : BRANCH<= ...
`IR_JPC : BRANCH<= ...
default :
case ( `OP_6 )
`IR_ADD : SIGN<=IR[7];
`IR_SUB : ...
`IR_OR : if ( `OP_M==`IMM ) SIGN<=0; else SIGN<=IR[7];
`IR_EOR : ...
`IR_AND : ...
`IR_LD : ...
`IR_ST : ...
endcase
endcase
end
考え方
- BRANCH : 5種類の分岐命令において、分岐する場合のみ“1”になる
ようなデコード出力です。後に設計する制御信号生成において分岐命令の制御
信号を生成する際に、この BRANCH 信号を参照することで簡単に生成すること
ができます。
- SIGN : 命令レジスタから8ビットの値を読出す際に上位8ビットの値を
全て0にするか1にするかを決定する制御信号として用います。この制御は命
令の種類やアドレッシングモードにより異なります。以下に注意して、作成し
て下さい。
- インデクス修飾アドレッシング:この場合、命令レジスタから出力する
値は必ず符号拡張になります。正の値の場合は上位8ビットの値を全て“0”
にするので“0拡張”、負の値の場合は上位8ビットの値を全て“1”にする
ので“1拡張”になります。
- 即値アドレッシングの場合は、命令レジスタから出力する値がそのまま
オペランドになりますが、命令によって上位8ビットとして出力する値が異な
ります。加算および減算命令の場合は“符号拡張”です。また論理和、論理積
および排他的論理和の各論理演算は、アキュムレータの上位8ビットがそのま
ま残るように“0拡張”または“1拡張”します。LD即値では、上位8ビットは
全て“0”にします。
次は、 制御信号生成の記述 についてみていきます。
| CAD Home |