-2

2 つの 8 ビット入力 (a と b) と 1 つの 2 ビット入力 (sel) を持つ、eightbit palu という Verilog モジュールを作成します。このモジュールの出力は、8 ビット信号 f と 1 ビット信号 ovf です。これらの出力の値は、操作を決定する sel 信号の値に基づいて変更する必要があります。

**s[1:0]   f[7:0]         ovf           Description**

 0 0     a + b (add)    overflow         a plus b

 0 1     b (inv)           0             Bitwise inversion of b

 1 0     a · b (and)       0             Bitwise AND of a and b

 1 1      a | b (or)       0             Bitwise OR of a and b

上記の割り当てがあり、これまでのところ verilog にあるものは次のとおりです。

module eightbit_palu(input [7:0]a,
                     input [7:0]b,
                     input [1:0]sel,
                     output [7:0]f,
                     output ovf);
     reg (f, ovf);
     always @ (a, b, sel);
     case(sel)
         2’b00: f = a + b;
         2’b01: f = ~b;
         2’b10: f = a & b;
         2’b11: f = a | b;
     endcase
endmodule

私は Verilog を初めて使用するので、これが正しいかどうか、またはオーバーフロー値についてどうすればよいかわかりません。ヒント/提案はありますか?

4

1 に答える 1

0

加算器の出力の長さを余分なビットで拡張すると、キャリーが実行されるとそのビットが設定されます。次のスニペットは、8 ビットのキャリーアウト加算器として (少なくとも XST によって) 合成されます。

2'b00: {ovf, f} = a + b;

これはオーバーフローの連結であり、LHS とその連結への代入をもたらします。

ラッチの合成を防ぐために、デフォルト値を ovf に設定することを忘れないでください (これはほとんど適切ではありません)。

always @ (a, b, sel) begin
     ovf = 0; // default
     case(sel)
         2'b00: {ovf, f} = a + b;
         2'b01: f = ~b;
         2'b10: f = a & b;
         2'b11: f = a | b;
     endcase
end
于 2016-01-31T18:33:03.657 に答える