2012-04-08 3 views
3

5命令の制御信号の値を書き留める必要がある宿題をしています。最初にサンプルを見つけようとしています(下のコード)。私がする必要のある5つの指示は、

Address Code  Basic     Source 

0x00400014 0x12120004 beq $16,$18,0x0004 15 beq $s0, $s2, exit 
0x00400018 0x8e080000 lw $8,0x0000($16)  16 lw $t0, ($s0) 
0x0040001c 0x02118020 add $16,$16,$17  17 add $s0, $s0, $s1 
0x00400020 0xae08fffc sw $8,0xfffc($16)  18 sw $t0, -4($s0) 
0x00400024 0x08100005 j 0x00400014   19 j loop 

です。そして、彼が行った例は、addi $ s1、$ 0,4です。今、私はそれを持っています:

Address Code  Basic     Source 
    0x00400028 0x20110004 addi $16,$0,4   20 addi  $s1, $0, 4 

私は基本的な列の4が間違っていると思います。正しい答えは何でしょうか?

相続人は、彼はそのために、その下にやったサンプルは、彼は、制御信号とを参照している図である。beq $s0, $s2, exit

##-------------------------- 
# Example 
# addi $s1, $0, 4 
# Although not supported as in Figure 4.24, the instruction can be easily 
# supported with minor changes in the control circuit. 

instruction_address=0x00400028 
instruction_encoding=0x20110004 

OPcode=0b001000 

Jump=0 
Branch=0 
Jump_address=0x00440010 # not used in this instruction 
Branch_address=0x0040003C # not used in this instruction 

Read_register_1=0b00000 
Read_register_2=0b10001 
Sign_extend_output=0x00000004 

ALUSrc=1   # pick the value from sign_extend_output 
ALUOp=0b00   # assume the same value as load/store instruction 
ALU_control_input=0b0010 # add operation, as in load/store instruction 

MemRead=0 
MemWrite=0 
MemtoReg=0   # select the ALU result 

RegDst=0 
Write_register=0b10001  #register number for $s1 
RegWrite=1 

##-------------------------- 

enter image description here

+0

実際に質問されていません。 – blackcompe

答えて

4

は、最初の命令の内訳を調べることができます。

命令アドレスは、上記のアドレス列の下に与えられます。0x00400014。あなたはエンコーディングも持っています:0x12120004。エンコーディングはマシン命令です。バイナリで命令を表します:000100 10000 10010 0000000000000100

これはI型命令です。 6ビットの第1のグループはオペコードであり、第2の5つのグループはソースレジスタであり、第3の5つのグループは一時レジスタであり、最後の16のグループは即値である。

オペコードは0b000100です。これはI型命令なので、ターゲットにジャンプしていないので、Jump信号は0です。しかし、我々は分岐しているので、Branch信号は1です。

Jump_Addressを見つけるには、無視されても、最下位26ビット:10000 10010 0000000000000100を調べます。アドレスはワード・アライメントされているので、ジャンプ・オフセットを次の命令とターゲット・アドレス間の符号付き差とすることによって、到達可能なアドレスの範囲を拡大することができます。言い換えると、ターゲットアドレスが次の命令(PC相対アドレッシング)から8バイト離れた場合は、2を使用してオフセットを表します。これがオフセット2ビットを左にシフトする必要がある理由です。つまり、Jump_Address = 10 00010 01000 0000000000010000または0x8480010となります。

使用するBranch_Addressを見つけるには、最下位16ビット:0000000000000100を調べます。これは符号が拡張され、左に2ビットシフトして0000000000000000 0000000000010000または0x00000010になります。この即値は、次の命令を指すプログラムカウンタに加算されます:0x00400018。最終的にはBranch_Address = 0x00400028で終了します。私はexitラベルが、あなたが上に掲示した後に、j命令の直後に次の指示を指していると仮定しています。

レジスタは簡単です。 Read_register_1 = 0b10000およびRead_register_2 = 0b10010

Sign_extend_outputは、即時フィールドの符号拡張:0x00000004です。

ALU制御信号をオンにします。 ALUSrcは、レジスタファイルとALUの間のマルチプレクサを制御します。 beq命令では2つのレジスタを使用する必要があるため、レジスタファイルからRead data 2レジスタを選択する必要があります。 addi命令のように、ALU計算に即値フィールドを使用していません。したがって、ALUSrc0です。

ALUOpおよびALU_control_inputは、オペコードから作成されたハードワイヤードの値です。 ALUOp = 0b01およびALU_control_input = 0b0110。 Pg。 323 of コンピュータの組織とデザイン、4th。 HennesseyおよびPattersonの版改訂版およびthisウェブページは、beq命令のための適切な制御信号を有する表を有する。 Pg。 318は、ALU制御ビットマッピングを有するテーブルを有する。

MemReadおよびMemWriteは、メモリにアクセスしていないため、0です。 MemToRegMemWriteが0であるためX(Do not care)です。 RegWrite0です。これは、登録ファイルに書き込んでいないためです。 RegWriteが0であるのでRegDstXです。そして最後にWrite_registerを見つけるには、ビット16-20(命令メモリとレジスタファイルの間のマルチプレクサを見てください)をとります。これは0b10010です。

+0

私の証明、ありがとう! – jfisk

+0

私の唯一の質問ALU_control_inputの導出方法 – jfisk

関連する問題