2015-01-06 58 views
0

我sqauring一個16.16定點二進制數,然後將結果與比較整數。平方後,16.16數字變爲64位二進制數。 我不知道我的代碼是否正確,並且每個16.16定點數的平方都在範圍內。 另外我無法設置正確的語句來表示32.32定點結果。比較定點二進制數與的整數

僞代碼

reg [31:0] n;  //the 32 Bit number we want to square 
    reg [63:0] res; //out result register after squaring n 
    integer i;   

    ... 
    res = n * n;  // squaring n 
    i = 1; 
    /* compare with some integer - bigger than i */ 
    if(res[63:32] >= i && res[31:0] > 0) 
    begin ...do something ... end 

    /* compare with some integer - less/equal than i */ 
if((res[63:32] < i && res[31:0] >= 0) || (res[63:32] <= i && res[31:0] == 0)) 
    begin ...do something... end 
... 

在測試平臺我想代表該結果爲32.32定點二進制數 - 但顯示當這表示不會給我正確的浮點值:

res[63:32] + $bitstoreal({1'b0,15'b011111111111111,{fer3[31:0],{81{1'b0}} }) -1; 

回答

2

有一個similar question其中討論定點寬度,...乘以一個32位的32位的答案將融入64位。您與16.16 X 16.16正確的是32.32

的Verilog轉化爲實數可以是自動的,如果操作正確,按比例爲顯示n * 2**-16一些不起作用。 n * 2.0**-16因爲我們使用了2.0,所以使用浮點而不是整數來完成計算。

NB:2**n是2到n的功率。 2^n在某些語言中,但是在Verilog中,^是XOR。

使用真正的比較縮放的一個簡單的例子:

reg [31:0] n; //16.16 
reg [63:0] n_sq; //32.32 
real n_sq_real; // Floating Point 

always @* begin 
    n_sq = n * n; 
end 

initial begin 
    #1ps; 
    n = { 16'd2, 16'b1000_0000_0000_0000}; //2.5 
    #1ns; 

    $display("n %f, n squared %f", (n * 2.0**-16), n_sq * 2.0**-32); 

    n_sq_real = n_sq * 2.0**-32 ; 

    $display("n_sq_real %f", n_sq_real); 
end 

返回:

# n 2.500000, n squared 6.250000 
# n_sq_real 6.250000 

example on EDA Playground

如果只是比較整數你可以通過移出小數位截斷你的電話號碼,即n_sq * 2.0**-32成爲n_sq >> 32

或者你可以通過小數位的數量規模的整數。

n_sq >= i<<32 ; 

在以Verilog當天定點數的末端只是整數由2至這就是一些位可以表示分數的信息的功率縮放。

+0

是,這個偉大的工程。你幫了很多忙,我的錯誤更根本。我在代碼中的錯誤位置做了實際的平方。它是在我的代碼中的順序部分完成的。接下來的是,這個數字的平方在兩個時鐘週期內沒有改變,但是要平方的數量應該改變。非常感謝! –

+0

@kt很高興幫助。 – Morgan