Matlab 定点化 (fixed point designer)-入门1
欢迎关注微信公众号:小鱼FPGA
“ 当把算法用FPGA实现时,我们必须要考虑定点化问题。matlab的fixed point designer就是帮助我们定点化的工具”
**01
定点化基本概念**
在做算法电路时,一般是先搭建软件模型,搭建软件模型可以用C,python,matlab等方式。
但是一般写出来的软件模型的运算数据类型都是浮点型运算,当要用FPGA实现,转成Verilog一般都是利用定点化运算。
什么是定点化运算呢。比如:
a*b=c
当 a=0.21 b=2时。
如果是浮点运算,毫无疑问答案为 c=0.42。
但是当用定点化数据去算。如a,b,c当用9位二进制去表示小数位,2位表示整数位,1表示符号位。那么这个精度就是 1/(2^9)=0.001953125
因此:
定点化之后的十进制 a = 0.208984375,相应的二进制表示为 000_001101011
定点化之后的十进制 b = 2,相应的二进制表示为 010_000000000
定点化之后的十进制 c = a*b = 0.41796875 ,相应的二进制为 000_011010110
可以看到,跟浮点数运算的结果之间存在一定的误差。
定点化之后可以看到,精度跟小数位位宽有关;小数位位宽越大,精度越高,那么误差越小。
当然同时整数位的位宽要保证在运算中数据不溢出。
比如 2.3+4 = 6.3 。 当整数位只有2位表示时,其最大只能表示4,因此这就产生了溢出。
**02
Matlab Fixed point designer**
Matlab定点化工具(Fixed point designer)的基本思想就是根据你提供的输入激励以及你将希望利用的数据位宽去帮你建议小数位位宽。因此输入激励一定要尽可能齐全,以保证设计的正确性。
当小数位宽确定后,你根据定点化之后的数据类型再去做一遍运算,看最后运算结果的误差是否在可接受的范围内,如过误差不能接受,你可以继续优化数据位宽。
当然fixed point desinger 也会帮助我们检查溢出问题,如果发生溢出,你可以选择增加整数位宽。
大家可以先去官网搜索相关资料
一个可以帮助快速入门的例子:https://ww2.mathworks.cn/help/fixedpoint/ug/convert-fir-filter-to-fixed-point-with-types-separate-from-code.html
完整的参考技术文档:https://ww2.mathworks.cn/help/pdf_doc/fixedpoint/index.html
当然matlab还有HDL CODER这个工具(支持从Matlab转Verilog或者VHDL),HDL CODER就用到了Fixed point。
其相关参考资料: