制御信号生成の記述
各状態において必要な制御信号が出力されるように記述します。
制御すべき制御信号には以下の図で破線で示しているような信号があります。
以下の記述を参考にして、制御信号生成回路を完成させましょう。
対応する実行フェーズ表は こちら を参照して下さい。
なお、制御信号の記述例についての簡単な説明は
こちら を参考にしてください。
また、このファイル内で、ALUの演算コードを設定する部分があります。この
ファイルでALUの演算コードが使用できるよう "alu_op.v" を include してお
きましょう。
`include "alu_op.v"
module dec_seq ( ... );
......
reg ICS, HALT;
......
reg [3:0] ALU;
//------------------------------------------------------------------//
// Controls
//------------------------------------------------------------------//
always @( STATE or FR or IR )
begin
ICS <= 0;
HALT <= 0;
DBI1 <= 0; DBI2 <= 0;
MREQ <= 0; IORQ <= 0; RW <= 0;
ACC_R <= 0; ACC_W<= 0;
IXR_R <= 0; IXR_W<= 0;
SP_R <= 0; SP_W <= 0;
PC_R <= 0; PC_W <= 0; PC_I <= 0;
AR_W1 <= 0; AR_W2<= 0;
IR_R12<= 0; IR_R8P1<= 0; IR_R8P2<=0; IR_R8M2<=0; IR_W<=0;
FR_W <= 0;
ALU <= `IPAS;
case ( STATE )
`HALTING : HALT<=1;
`V1 : MREQ<=1;
`V2 : begin MREQ<=1; PC_W<=1; DBI1<=1; end
`F1 : begin PC_R<=1; AR_W2<=1; PC_I<=1; end
`F2 : MREQ<=1;
`F3 : begin MREQ<=1; IR_W<=1; DBI1<=1; end
// `DEC :
//
// LD Imm.
//
`LDI_1 : begin IR_R8P1<=1; ACC_W<=1; ICS<=1; end
//
// LD index
//
`LDX_1 :
begin
IXR_R<=1; AR_W1<=1;
IR_R8P2 <= !SIGN;
IR_R8M2 <= SIGN;
ALU <= `IADD;
end
`LDX_2 : MREQ<=1;
`LDX_3 : begin MREQ<=1; ACC_W<=1; DBI1<=1; ICS<=1; end
//
// LD Direct
//
`LDD_1 : begin IR_R12<=1; AR_W2<=1; end
`LDD_2 : MREQ<=1;
`LDD_3 : begin MREQ<=1; DBI1<=1; ACC_W<=1; ICS<=1; end
//
// ST index
//
`STX_1 :
begin
...... ; ...... ;
...... ;
...... ;
...... ;
end
`STX_2 : begin ...... ; ...... ; end
`STX_3 : begin ...... ; ...... ; ...... ; end
`STX_4 : begin ...... ; ...... ; ...... ; end
//
// ST Direct
//
`STD_1 : begin ...... ; ...... ; end
`STD_2 : begin ...... ; ...... ; end
`STD_3 : begin ...... ; ...... ; ...... ; end
`STD_4 : begin ...... ; ...... ; ...... ; end
//
// CALL
//
`CALL_1: begin ...... ; ...... ; ...... ; ...... ; end
`CALL_2: begin ...... ; ...... ; end
`CALL_3: begin ...... ; ...... ; ...... ; end
`CALL_4: begin ...... ; ...... ; end
`CALL_5: begin ...... ; ...... ; ...... ; end
//
// Branch Instructions
//
`JP_1 : begin ...... ; ...... ; ...... ; end
//
// Binary Instructions
// ADD, SUB, OR, EOR, AND
`BIOP_IMM_1 :
begin
...... ; ...... ; ...... ;
...... ;
...... ;
...... ; ...... ;
end
//
// BIOP Index
// ADD, SUB, OR, EOR, AND
`BIOP_IDX_1 :
begin
IXR_R<=1; AR_W1<=1;
IR_R8P2 <= !SIGN;
IR_R8M2 <= SIGN;
ALU <= `IADD;
end
`BIOP_IDX_2 : MREQ<=1;
`BIOP_IDX_3 : begin MREQ<=1; ACC_R<=1; ACC_W<=1; ALU<=`OP_A;
FR_W<=1; DBI2<=1; ICS<=1; end
//
// INC & DEC & MV
//
`INC_DEC_MV :
begin
case ( `OP_S )
`RD_ACC : ...... ;
`RD_SP : ...... ;
`RD_IXR : ...... ;
`RD_PC : ...... ;
endcase
case ( `OP_D )
`RD_ACC : ...... ;
`RD_SP : ...... ;
`RD_IXR : ...... ;
`RD_PC : ...... ;
endcase
case ( `OP_6 )
`IR_INC : begin ...... ; ...... ; end
`IR_DEC : begin ...... ; ...... ; end
endcase
...... ;
end
// Mono operand instructions
// NOT and all shift instructions
`MONO_1 : begin ...... ; ...... ; ...... ; ...... ; ...... ; end
//
// INPUT instruction
//
`IN_1 : begin ...... ; ...... ; end
`IN_2 : ...... ;
`IN_3 : begin ...... ; ...... ; ...... ; ...... ; end
//
// OUTPUT instruction
//
`OUT_1 : begin ...... ; ...... ; end
`OUT_2 : begin ...... ; ...... ; end
`OUT_3 : begin ...... ; ...... ; ...... ; end
`OUT_4 : begin ...... ; ...... ; ...... ; end
//
// POP
//
`POP_1 : begin ...... ; ...... ; ...... ; ...... ; end
`POP_2 : ...... ;
`POP_3 : begin ...... ; ...... ; ...... ; ...... ; end
//
// PUSH
//
`PUSH_1 : begin ...... ; ...... ; ...... ; ...... ; end
`PUSH_2 : begin ...... ; ...... ; end
`PUSH_3 : begin ...... ; ...... ; ...... ; end
`PUSH_4 : begin ...... ; ...... ; ...... ; end
//
// RET
//
`RET_1 : begin ...... ; ...... ; ...... ; ...... ; end
`RET_2 : ...... ;
`RET_3 : begin ...... ; ...... ; ...... ; ...... ; end
//
// HALT
//
`HALT_1 : begin HALT<=1; ICS<=1; end
//
// NOP
//
`NOP_1 : ICS<=1;
endcase
end
次は、 シミュレーション により正しく動作するか
どうか確認します。
| CAD Home |