IC學習筆記(一)——Verilog加減法及四捨五入

還是匿名吧發表於2018-05-03
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,有偏估計和無偏估計兩種方法:
有偏

 

有偏估計採用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];

相關文章