Verilog:如何取绝对值

Pra*_*ton 2 verilog hdl vlsi

在 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
Run Code Online (Sandbox Code Playgroud)

我想我s[1]s[2]值总是正的。我怎样才能在可综合的 verilog 中做到这一点?

我试过使用signed reg,但它显示一个错误。

Mor*_*gan 6

无论数字是否为signed二进制补码,仍然使用它在位级别正确执行加法和减法。

如果将数字解释为有符号数,则 MSB 可用于判断它是正 (0) 还是负 (1)

要绝对数字只是根据 MSB 反转:

reg [31:0] ans    ; // Something else drives this value
reg [31:0] abs_ans; // Absolute version of ans
// invert (absolute value)
always @* begin
  if (ans[31] == 1'b1) begin
    abs_ans = -ans;
  end
  else begin
    abs_ans = ans;
  end
end
Run Code Online (Sandbox Code Playgroud)

注意:使用=是因为它是一个组合块,如果使用触发器(边缘触发器),请使用<=@TzachiNoy 提到的。