2016-04-03 8 views
0

クロック、リセット、命令語(最下位バイト)からの即値、およびALUからのゼロ出力を入力として受け入れるVerilogモジュールを作成し、出力用のプログラムカウンタ(PC)です。このアーキテクチャでは、分岐があるときに次のPCの値は現在のPCの値に分岐命令から抽出されたオフセットを足したものでなければならないことに注意してください。オフセットは2の補数で表されるので、分岐先の範囲はPC-128からPC + 127です。256の命令メモリがあるため、PCの値は0xFFを超えないようにしてください。ハードウェアでこの状態を確認する必要はありません。分岐付きVerilogプログラムカウンタ

これまで私がこれまで行ってきたことはありますが、これは不完全であるとわかりました。私は即座に何をすべきか、または分岐命令に何かを追加する必要があるかどうかはわかりません。助け/提案?

module pc(input clk, 
    input rst, 
    input [7:0] immediate, 
    input alu_output, 
    output [7:0] pc) 

reg [7:0] pc; 

[email protected](posedge clk) 
    begin 
     if(rst) 
      begin 
       pc <= 0; 
      end 
     else 
      begin 
       pc <= pc + 1; 
      end    
    end 
endmodule 

答えて

0

私は一般的に他の人の宿題をやっているのではないので、私はあなたを助けようとします。

テキストが指定されていませんが、絶対分岐(ジャンプとも呼ばれます)を実行できるはずです。

分岐の場合は、加算器を使用する必要があります。あなたはすでに加算器を使用しています。PC = PC + 1操作では、この加算器を分岐のために再利用することは本当にうれしいでしょう。この加算器は、PCレジスタの前のどこかに配置する必要があります。追加するものは、回路によって決定されなければなりません。

あなたのプログラムカウンタのことができるようにする必要があります。命令ワードまたはからの即時負荷が、分岐値を追加したり、を追加します。これらの3つの操作の1つは、特定の条件が与えられたときに実行されます。デジタル回路では、マルチプレクサは条件に基づいて意思決定を行う優れた方法です。 私はあなたの条件が何であるか把握し、これがどのように働く必要があるかについての素敵な人物を描くことをお勧めします。その後、あなたはそれをプログラムしようとします。

+0

彼が何を望んでいることは相対ジャンプであるだけ正しさのために、彼の即値としてではない絶対ジャンプがPCにロードされていない、ジャンプをするために、現在のPCに追加されます。 – Unn

+0

私は両方について書いたのかはっきりしていませんか?私はちょうど先に行って、彼はそれを指定していないが、彼の割り当ては両方が必要であると仮定した。 – Hida

0

あなたは仕事の大部分を自分で行っています。もう1つのコントロール入力を追加しないでください。branchと呼んでください。 branchが0の場合、既に持っているとおりにpc <= pc +1と書いてください。 branchが1である場合、次のように記述:

{{24{immediate[8] }}符号は、即時の符号ビットを拡張する、すなわち即時繰り返す
begin 
    next_pc = pc +{ {{24{immediate[8] }}, immediate[8:0] }; 
    if (next_pc > 255) 
     next_pc = 255; 

    pc <= next_pc; 
end 

[8]、24回。

0

分岐命令であるかどうかを示す入力が必要です。

通常、プロセッサの観点からは、PCを通常インクリメントする必要があるか、分岐/ジャンプ命令があるかを示すために、命令のサブセットが使用されます。

あなたの場合、分岐命令を示すために余分な入力をすることができます。

always @ (posedge clk) 
begin 
    if (rst) 
    pc <= 'h0; 
    else if (branch_inst) // Extra input port "branch_inst" 
    pc <= pc + immediate; // immediate in 2's complement, signed form 
    else 
    pc <= pc + 1'b1; 
end