2

Verilog には、バイナリ値の配列があります。減算値の絶対値を取得するにはどうすればよいですか?

Verilog コード:

module aaa(clk);
  input clk;

  reg [7:0] a [1:9];  
  reg [7:0] s [1:9];

  always@(posedge clk)  
  begin
    s[1] = a[1] - a[2];
    s[2] = a[2] - a[3];
    s[3] = a[1] + a[3];
  end
endmodule

私は自分の値s[1]s[2]値が常に正であることを望んでいます。合成可能な Verilog でそれを行うにはどうすればよいですか?

を使用してみsigned regましたが、エラーが表示されます。

4

3 に答える 3

1

@Morgan からの回答に続いて、この操作を実行するシステムに既にモジュールがあったため、ここに私の貢献があります。

module Mod(
  input  signed [11:0] i,
  output signed [11:0] o
  );

  assign o = i[11] ? -i : i; // This does all the magic
endmodule

そして、ここにテストベンチがあります:

module tb;
  reg signed [11:0] i;
  wire signed [11:0] o;

  Mod M(i,o);

  integer t;

  initial begin
    for (t = -10; t < 10; t = t + 1) begin
      #1
      i <= t;
      $display("i = %d, o = %d", i, o);
    end
  end
endmodule

出力は次のとおりです。

i =     x, o =     x
i =   -10, o =    10
i =    -9, o =     9
i =    -8, o =     8
i =    -7, o =     7
i =    -6, o =     6
i =    -5, o =     5
i =    -4, o =     4
i =    -3, o =     3
i =    -2, o =     2
i =    -1, o =     1
i =     0, o =     0
i =     1, o =     1
i =     2, o =     2
i =     3, o =     3
i =     4, o =     4
i =     5, o =     5
i =     6, o =     6
i =     7, o =     7
i =     8, o =     8
于 2016-03-31T23:08:58.960 に答える
1

これは仕事をするはずです:

s[1] <= (a[1]>a[2])?(a[1]-a[2]):(a[2]-a[1]);

注: クロック付きの always ブロックでは常に '<=' を使用する必要があります。

于 2013-10-18T08:32:09.613 に答える