2013-10-17 91 views
1

在Verilog中,我有一個二進制值數組。我如何取減值的絕對值?Verilog:如何取絕對值

Verilog代碼:

module aaa(clk); 
    input clk; 

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

    [email protected](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,但它顯示一個錯誤。

+1

闕對我來說不是很清楚。你能提供你想要的輸入,輸出和你的錯誤信息嗎? – jkshah

回答

1

這應該做的工作:

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

注意:你應該總是在永遠主頻塊使用 '< ='。

+0

我認爲他的意思是| a [1] |和| a [2] |並沒有要求| a [1] -a [2] | – pooria

3

不管數字是否爲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 

注意:使用=是因爲它是一個組合塊,如果使用觸發器(邊緣觸發器),請使用@TzachiNoy提到的<=

0

剛剛從如下的@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 
+0

12位數字範圍從2047到-2048。由於0x800的兩個讚語是0x800,您的verilog代碼是否會返回-2048的0x800? – user1164199

+0

@ user1164199你自己回答了。 沒有12位對應-2048的正數。 因此,您需要使用13位「o」電線或未設置爲無符號。不管哪種方式,按位,結果都不會改變。在verilog中,對於adition和sign inversion,signed關鍵字不會改變任何值,只會影響顯示。 附加接線o2: 接線接線[11:0] o2 = o; 將具有相同的位值,並將顯示2048爲正值,就像你想要的。 – mentatkgs