IC學習筆記(一)——Verilog加減法及四捨五入
1、加減法計算
①兩個位寬相同,定標相同的數相加時,首先將兩個數各擴充套件1個符號位再加,以保證不溢位;
wire [15:0] a;//Q(16,1)
wire [15:0] b;//Q(16,1)
wire [16:0] c;
wire [15:0] d;
assign c = {a[15],a} + {b[15],b};//各擴充套件1個符號位再加,保證不溢位
assign d = 飽和(c);//Q(16,1)
②兩個位寬不一致的數相加時,先整數部分和小數部分都要對齊,再擴充套件符號位加;
wire [9:0] a;//Q(10,1)
wire [15:0] b;//Q(16,7)
wire [16:0] c;
wire [15:0] d;
assign c = {{7{a[9]}},a} + {b[15],b};//先對齊,再擴充套件符號位加
assign d = 飽和(c);// Q(16,7)
2、四捨五入
在進行資料截位時,如果一個M bit的數A要四捨五入成N bit的數B,M>N,有偏估計和無偏估計兩種方法:
① 有偏
Negative numbers to the closest representable number in the direction of negative infinity.
wire [N:0] C;
wire [N-1:0] D;
assign C = A[M-1:M-N-1] + 1’b1;
assign D = C[N:1];
即assign D= A[M-1:M-N-2] + A[M-N-1];
②無偏估計
由上圖可以看出,有偏估計四捨五入的值向絕對值大的方向偏,無偏估計四捨五入的值收斂。
a=!A[M-1] & (&A[M-2:M-N]);//判斷高N位是不是正最大值
b=!(|A[M-N-2:0]) & (&A[M-N:M-N-1]);
c=|A[M-N-2:0] & A[M-N-1];
assign B=((b|c)&(!a))?(A[M-1:M-N]+1'b1):A[M-1:M-N];
①兩個位寬相同,定標相同的數相加時,首先將兩個數各擴充套件1個符號位再加,以保證不溢位;
wire [15:0] a;//Q(16,1)
wire [15:0] b;//Q(16,1)
wire [16:0] c;
wire [15:0] d;
assign c = {a[15],a} + {b[15],b};//各擴充套件1個符號位再加,保證不溢位
assign d = 飽和(c);//Q(16,1)
②兩個位寬不一致的數相加時,先整數部分和小數部分都要對齊,再擴充套件符號位加;
wire [9:0] a;//Q(10,1)
wire [15:0] b;//Q(16,7)
wire [16:0] c;
wire [15:0] d;
assign c = {{7{a[9]}},a} + {b[15],b};//先對齊,再擴充套件符號位加
assign d = 飽和(c);// Q(16,7)
2、四捨五入
在進行資料截位時,如果一個M bit的數A要四捨五入成N bit的數B,M>N,有偏估計和無偏估計兩種方法:
① 有偏
有偏估計採用MATLAB中的round演算法:
Positive numbers to the closest representable number in the direction of positive infinity.Negative numbers to the closest representable number in the direction of negative infinity.
wire [N:0] C;
wire [N-1:0] D;
assign C = A[M-1:M-N-1] + 1’b1;
assign D = C[N:1];
即assign D= A[M-1:M-N-2] + A[M-N-1];
②無偏估計
無偏估計採用MATLAB中convergent演算法:當一個數小數部分大於0.5時,四捨五入結果為整數部分加1;如果小數部分等於0.5時,四捨五入結果為離它最近的偶數;如果小數部分小於0.5,四捨五入結果為這個數的整數部分。
首先判斷高N位是否表示正最大值,若不是正最大值,如果A[M-N-2:0]不全為0,當A[M-N-1]=1時,四捨五入結果為A[M-1:M-N]+1'b1;如果A[M-N-2:0]全為0,且A[M-1:M-N]為奇數,當A[M-N-1]=1時,四捨五入結果為A[M-1:M-N]+1'b1;其餘情況下,四捨五入結果為A[M-1:M-N]。由上圖可以看出,有偏估計四捨五入的值向絕對值大的方向偏,無偏估計四捨五入的值收斂。
a=!A[M-1] & (&A[M-2:M-N]);//判斷高N位是不是正最大值
b=!(|A[M-N-2:0]) & (&A[M-N:M-N-1]);
c=|A[M-N-2:0] & A[M-N-1];
assign B=((b|c)&(!a))?(A[M-1:M-N]+1'b1):A[M-1:M-N];
相關文章
- C++ 四捨五入與不四捨五入C++
- java中的四捨五入-銀行家舍入法Java
- oracle中round()四捨五入Oracle
- JavaScript數字四捨五入JavaScript
- Day42--四捨五入
- 【轉載】Verilog對資料進行四捨五入(round)與飽和(saturation)截位
- JavaScript四捨五入的改進JavaScript
- JavaScript toFixed() 四捨五入規則JavaScript
- iOS小數四捨五入總結iOS
- DELPHI四捨五入問題解決
- JavaScript 賭運氣的四捨五入JavaScript
- JS四則運算與四捨五入精度問題及解決方案JS
- Verilog實現加減乘除運算
- 那些關於JS四捨五入的事JS
- C語言中四捨五入問題總結C語言
- cmake學習筆記(五)筆記
- JVM 學習筆記(五)JVM筆記
- springboot 學習筆記(四)Spring Boot筆記
- goLang學習筆記(四)Golang筆記
- TS學習筆記(四)筆記
- ONNXRuntime學習筆記(四)筆記
- kettle學習筆記(四)——kettle輸入步驟筆記
- Dubbo學習筆記(一) 入門筆記
- JavaScript入門-學習筆記(一)JavaScript筆記
- mssql sqlserver 取消數值四捨五入的方法分享SQLServer
- BigDecimal使用ROUND_HALF_UP進行四捨五入Decimal
- Java中數字的四捨五入和取整Java
- Kubernetes學習筆記(五):卷筆記
- DP學習筆記(五)(2024.11.16)筆記
- c++學習筆記(五)C++筆記
- 字典--Python學習筆記(五)Python筆記
- activiti學習筆記(四)managementService筆記
- 四元數 學習筆記筆記
- DP學習筆記(四)(2024.10.2)筆記
- c++學習筆記(四)C++筆記
- 學習筆記-Verilog實現IIC匯流排協議筆記協議
- CANopen學習筆記(一)CANopen入門筆記
- 記一次flink入門學習筆記筆記