MacでVerilogのシミュレーションをしてみる5
MacでVerilogのシミュレーションをしてみる1 - k-igrsの日記
MacでVerilogのシミュレーションをしてみる2 - k-igrsの日記
MacでVerilogのシミュレーションをしてみる3 - k-igrsの日記
MacでVerilogのシミュレーションをしてみる4 - k-igrsの日記
の続き。
レジスタに直値を代入する命令を追加する。
parameter OP_MOV_IM = 8'h03;
オペランドの指定により、命令の次のリードデータについて、
B6 B5 0 0 メモリからR0に読み込み 0 1 メモリからR1に読み込み 1 0 メモリからR2に読み込み 1 1 メモリからR3に読み込み
を行う。
Fetch → Decode → 次のメモリからレジスタに格納するデータを読み込む →レジスタにリードしたデータを書いてFetchに戻る処理を追加する。
MOVE IMM命令への分岐を記述する。
assign path_movim = (op_code == OP_MOV_IM ) ? 3'b011 : 3'b000;
assign state_sel = path_jump | path_movrm | path_movim;
ステートマシンにMOVE IMM命令のパスを追加する。
case ( state ) 4'b0000:begin Q <= 4'b0001; end 4'b0001:begin if ( STATE_SEL == 3'b000 ) Q <= 4'b0010; else if ( STATE_SEL == 3'b001 ) begin Q <= 4'b0011; PC <= PC + 1; end else if ( STATE_SEL == 3'b010 ) begin Q <= 4'b0101; PC <= PC + 1; end else if ( STATE_SEL == 3'b011 ) begin Q <= 4'b1000; PC <= PC + 1; end end 〜略〜 4'b1000: begin Q <= 4'b1001; end 4'b1001: begin Q <= 4'b0000; PC <= PC + 1; end
RDBはステート1000bとFetchに戻った時アクティブにする。
assign pre_rdb = 〜略〜 ((Q == 4'b0001) && (op_code == OP_MOV_IM)) ? 1'b0 : ( Q == 4'b1001) ? 1'b0 : 1'b1;
内部レジスタへ直値のメモリデータを読み込む処理を記述する。
always @( posedge CK, negedge RB ) if ( RB == 1'b0 ) begin R0 <= 16'h0000; R1 <= 16'h0000; R2 <= 16'h0000; R3 <= 16'h0000; end else if (((Q == 4'b0110)||(Q == 4'b1000)) && (RDB == 1'b0) ) begin case ( op_rand[6:5] ) 2'b00: R0 <= DI; 2'b01: R1 <= DI; 2'b10: R2 <= DI; 2'b11: R3 <= DI; endcase end
レジスタに直値を代入するプログラムを書いてシミュレーションを実行して確認する。
0000
0001
0300 <- R0に0123hを読み込む
0123
0320 <- R1に4567hを読み込む
4567
0340 <- R2に89abhを読み込む
89ab
0360 <- R3にcdefhを読み込む
cdef
0012
0013
実行結果