matlab fi工具箱使用
先定义两个运算属性,这两个运算没有饱和和四舍五入,可以直接进行截位操作。
copyF0 = fimath('OverflowAction','Wrap','RoundingMethod','Floor');
F1 = fimath('OverflowAction','Saturate','RoundingMethod','Floor');
fi的语法为
copyfi(value,signed,word_length,fraction_length,F)
其中,WordLength
是字长,FractionLength
是小数点距离LSB的距离,可以是负数。
举个例子,00.000_011101_0000,只保留中间的有效位,量化为011101
,则WordLength=6
,FractionLength=9
000000_0101101_0000.00
,量化为0101101
,则WordLength=7
,FractionLength=-4
范例:
定义定点数a
copya=fi(1.3256,1,6,4,'OverflowAction','Wrap','RoundingMethod','Floor')
运行结果为:
copya =
1.3125
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 6
FractionLength: 4
RoundingMethod: Floor
OverflowAction: Wrap
ProductMode: FullPrecision
SumMode: FullPrecision
查看a的二进制保存形式:
copy>> bin(a)
ans =
'010101'
对a进行截位,只保留高四位,丢掉低两位,结果保存到b中:
copy>> b=fi(a,1,4,2,'OverflowAction','Wrap','RoundingMethod','Floor')
b =
1.2500
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 4
FractionLength: 2
RoundingMethod: Floor
OverflowAction: Wrap
ProductMode: FullPrecision
SumMode: FullPrecision
>> bin(b)
ans =
'0101'
对应到verilog语法可以如此表示:
copywire [5:0] a = 6'b010101;
wire [3:0] b = a[5:2];
对于乘积和加法,可以自定义运算后保留的位宽。具体可参考fimath ProductMode and SumMode
分别有全精度,保留LSB/MSB,自定义精度三种模式。
copyProductMode = 'FullPrecision';
SumMode = 'FullPrecision';
copyProductMode = 'KeepLSB';
ProductWordLength = 12;
SumMode = 'KeepLSB';
SumWordLength = 12;
copyF.ProductMode = 'SpecifyPrecision';
F.ProductWordLength = 8;
F.ProductFractionLength = 7;
F.SumMode = 'SpecifyPrecision';
F.SumWordLength = 8;
F.SumFractionLength = 7;
当设置ProductMode
为KeepLSB
或KeepMSB
时,需要指定ProductWordLength
,分别代表保留低位和保留高位的位宽;当设定为SpecifyPrecision
时,需要指定ProductWordLength
和ProductFractionLength
;当设定为FullPrecision
时,字长属性无效。
举个例子,如果
对其进行截位得到
copywire [5:0] a;
wire [6:0] b;
wire [6:0] c;
wire [12:0] a_times_b;
assign a_times_b = $signed(a)*$signed(b);//full precision
assign c = a_times_b[9:3];//SpecifyPrecision
对于matlab模拟以上操作,下面是截位运算。
copya=fi(1.23,1,6,4,'OverflowAction','Wrap','RoundingMethod','Floor','ProductMode','SpecifyPrecision','ProductWordLength',7,'ProductFractionLength',5);
b=fi(2.54,1,7,4,'OverflowAction','Wrap','RoundingMethod','Floor','ProductMode','SpecifyPrecision','ProductWordLength',7,'ProductFractionLength',5);
c=a*b;
disp(c)
运行结果为
copy -1.0312
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 7
FractionLength: 5
RoundingMethod: Floor
OverflowAction: Wrap
ProductMode: SpecifyPrecision
ProductWordLength: 7
ProductFractionLength: 5
SumMode: FullPrecision
查看
copy>> bin(a)
ans =
'010011'
>> bin(b)
ans =
'0101000'
>> bin(c)
ans =
'1011111'
进行全精度运算:
copya.ProductMode='FullPrecision';
b.ProductMode='FullPrecision';
c=a*b;
disp(c)
bin(c)
结果为
copy 2.9688
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 13
FractionLength: 8
RoundingMethod: Floor
OverflowAction: Wrap
ProductMode: FullPrecision
SumMode: FullPrecision
ans =
'0001011111000'
可以看到,对全精度运算结果从最高的第四位开始截位到最低的第四位,结果是一样的。
最后强调一下,对于乘法运算,两个操作数的'ProductMode','ProductWordLength','ProductFractionLength'
属性值需要一样;
对于加法运算,两个操作数的加法属性也需要一样,否则会报错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步