VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比
MATLAB定点运算仿真,对比VIVADO计算的结果
目录
前言
一、VIVADO与MATLAB单精度浮点数运算结果对比
二、MATLAB定点运算仿真
总结
前言
本文介绍了怎么在MATLAB中使用单精度浮点数进行运算,另外还将MATLAB单精度浮点数运算的结果和VIVADO浮点数IP核运算的结果作了对比,会发现二者结果是吻合的。最后还介绍了怎么在MATLAB中进行定点运算的仿真,也将其和VIVADO仿真的结果进行了对比,二者也是吻合的。
提示:创作不易,有帮助请一键三连!
一、VIVADO与MATLAB单精度浮点数运算结果对比
首先用MATLAB产生一组测试数据,
a=randn(1);mat2str(a)
b=randn(1);mat2str(b)
aa=single(a);mat2str(aa)
num2hex(aa)
bb=single(b);mat2str(bb)
num2hex(bb)
cc=aa*bb;mat2str(cc)
num2hex(cc)
ans =
'0.5376671395461'
ans =
'1.83388501459509'
ans =
'0.537667155265808'
ans =
'3f09a48e'
ans =
'1.8338850736618'
ans =
'3feabcbf'
ans =
'0.986019790172577'
ans =
'3f7c6bcb'
MATLAB产生了两个单精度的数,并计算了这两个数的乘法,还给出了相应的4字节数据表示值。这里需要注意的是,按理来说,单精度浮点数应该只有7位小数,但是MATLAB在展示结果时依然采用的双精度浮点数,所以小数位数多于7位。包括VIVADO仿真界面也是如此。
数值表示 | 字节表示 | |
aa | 0.537667155265808 | 3f09a48e |
bb | 1.8338850736618 | 3feabcbf |
cc=aa*bb | 0.986019790172577 | 3f7c6bcb |
以上是MATLAB的运算结果,下面是VIVADO以单精度浮点数计算的结果
对比可以发现,MATLAB和VIVADO计算的结果是相等的。这样我们在编写算法时就可以先用MATLAB模拟FPGA运算仿真验证算法性能了。
一组数据有可能是偶合,再随机测试一组数据,确保真的对得上。MATLAB再运行一次,得:
ans =
'-2.25884686100365'
ans =
'0.862173320368121'
ans =
'-2.25884675979614'
ans =
'c01090f2'
ans =
'0.862173318862915'
ans =
'3f5cb764'
ans =
'-1.94751739501953'
ans =
'bff94840'
MATLAB结果如表格所示:
数值表示 | 字节表示 | |
aa | -2.25884675979614 | c01090f2 |
bb | 0.862173318862915 | 3f5cb764 |
cc=aa*bb | -1.94751739501953 | bff94840 |
VIVDO计算结果如下:
对比依然可以发现,MATLAB和VIVADO计算的结果是相等的。
综上,VIVADO中的单精度浮点数的运算能用MATLAB的计算来模拟,此处只验证了乘法,推测其他运算也是没问题的,不放心的读者可自行验证加减除。
二、MATLAB定点运算仿真
方法比较简单,就是把数乘上2^(位宽)后四舍五入再进行运算,相当于把数给扩大,只有整数部分。注意这个位宽是不包含符号位的。运算完后需要截位就自行截位,不需要截位就不用截位。
MATLAB代码及运算结果如下:
leng=15; % 不含符号位
a=randn(1)+1j*randn(1);
aa=round(a*2^(leng));mat2str(aa)
real_a=dec2hex(real(aa),4)
imag_a=dec2hex(imag(aa),4)
b=randn(1)+1j*randn(1);
bb=round(b*2^(leng));mat2str(bb)
real_b=dec2hex(real(bb),4)
imag_b=dec2hex(imag(bb),4)
c=aa*bb
mat2str(c)
real_c=dec2hex(real(c),8)
imag_c=dec2hex(imag(c),8)
ans =
'-28340-985i'
real_a =
'914C'
imag_a =
'FC27'
ans =
'-5403+20569i'
real_b =
'EAE5'
imag_b =
'5059'
c =
1.7338e+08 - 5.7760e+08i
ans =
'173381485-577603505i'
real_c =
'0A55976D'
imag_c =
'DD92784F'
同样的,给出VIVADO中调用定点复数乘法器运算得到的结果。
对比十六进制表示的输入和输出,可发现MATLAB的结果和VIVADO的结果完全吻合。
总结
从结果来看,在MATLAB中也能模拟VIVADO中的单精度浮点运算和定点运算。