1)負數的原碼:符號位爲1,數值位爲其絕對值。
如下面的-97。
2)計算機和fpga使用的運算都是補碼,而不是原碼。不同bit的減法得到的結果一樣。如果當然原碼就錯了。
例:不同位寬的兩個數相減,fpga相減後,得到的兩個結果。他們都表示的是-6,但是它不是-6的原碼,而是-6的補碼。
4bit 0-6 =-6 8bit 0-6 =-6
0 0 0 0 0 0 0 0 0 0 0 0
- 0 1 1 0 - 0 0 0 0 0 1 1 0
1 0 1 0 1 1 1 1 1 0 1 0
*****************************************************************************
-6的補碼,進行求證,以上說法。
4bit 8bit
原碼: 1 1 1 0 1 0 0 0 0 1 1 0
反碼: 1 0 0 1 1 1 1 1 1 0 0 1
+ 1 + 1
補碼 1 0 1 0 1 1 1 1 1 0 1 0
3)減法補位,根據結果的取值範圍,如果需要多一位,則要補位。 需要用兩個減數 和被減數的符號位取擴位,而不能用0去擴位。
例如: log2_r, log2_b , 取值範圍-2~7.99, 定點化爲 1 /20/16,
diff_rb的取值範圍爲,-10~10,定點化爲1/21/16。位寬的高位需要用符號位去擴展,而不能直接用0擴展。
4)x/(1280*720)
IP核中也有除法,但latency很大,可以將其轉化爲乘法,x*小數。爲了保留精度,將小數轉化爲2進制,分析小數前面有n個0,將小數先左移n位,小數變成整數y。
將x*y,然後將結果截取地位的nbit既可。
/*******************************************************************************************************************
以下部分是引用:
在計算機中,一個有符號數可以用原碼、補碼和反碼錶示。
1) 共同規律:
① 用0表示正號,用1表示負號,且擺放在數據的最高位,有符號數和無符號數表示的根本區別在於無符號數的最高位是數值位,有符號數的最高位是符號位;
② 同一正數的原、補、反碼都相同。
③ 定義區間均對模2n 而言,其中n表示有符號數的二進制代碼位數。
2)其它規律:
① 任一負數的原碼和對應的正數(絕對值相等)的原碼僅是符號位不同;
② 任一負數的反碼是對應的正數的反碼的各位求反,反之亦然;
③ 任一負數的補碼是對應的正數的補碼的各位求反,然後加1,反之亦然;
④ 從定義區間上看
原碼和反碼的定義區間相同,是 –2n-1<X<2n-1;
補碼的定義區間是 –2n-1≤X<2n-1;
⑤ 0的原碼、反碼有+ 0和- 0之分;
0的補碼只有一種表達方式。
例1:設X = +97 求[X]原、[X]反、[X]補 (mod 28)
解:97=1100001B
[X]原=01100001B;
[X]反=[X]補=01100001B。
例2:設X = -97, 求[X]原、[X]反、[X]補 (mod 28)
解:97=1100001B
[X]原=11100001B;
[X]反=10011110B;
[X]補=10011111B。
例3:設X = -137 求[X]原、[X]反、[X]補 (mod 29)
解:137=10001001B
[X]原=110001001B;
[X]反=101110110B;
[X]補=101110111B。
4. 補碼、反碼加減運算規則:
[X+Y]補=[X]補+[Y]補 [X+Y]反=[X]反+[Y]反
[X-Y]補=[X]補+[-Y]補 [X-Y]反=[X]反+[-Y]反
[-Y]補=[[Y]補]補 [-Y]反=[[Y]反]反