1、简介
在介绍Gateway In block时谈到了System Generator中的数据类型,及不同的量化和溢出方式。本文将以两个简单的设计实例,更直观地说明不同的量化和溢出方式有什么区别。
2、溢出(Overflow)方式对比
从Simulink向System Generator的数据转换过程中可能会出现溢出(Simulink中的值超出了所设置数据格式能够表示的范围),Overflow可以设置为不同的处理方式:
在Simulink中添加block按下图连接:
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58744-tu_1zai_simulinkzhong_tian_jia_blockan_xia_tu_lian_jie_.png)
Gateway In设置为Fix_4_0数据格式。
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58745-tu_2gateway_inshe_zhi_wei_fix_4_0shu_ju_ge_shi_.png)
PS:数据格式的显示,勾选下图位置设置:
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58746-tu_3psshu_ju_ge_shi_de_xian_shi_gou_xuan_xia_tu_wei_zhi_she_zhi_.png)
该设计使用AddSub这个block计算6+6
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58747-tu_4gai_she_ji_shi_yong_addsubzhe_ge_blockji_suan_66.png)
不溢出时的运算结果应该用5Bits表示(含符号位),这里将AddSub的输出结果故意设置为Fix_4_0,观察溢出结果。设置如下图,修改AddSub的不同overflow方式:
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58748-tu_5xiu_gai_addsubde_bu_tong_overflowfang_shi_.png)
设置为Wrap
结果显示为-4。
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58749-tu_6jie_guo_xian_shi_wei_-4.png)
这是因为6+6=0110+0110=01100,最高位为符号位,正确结果为12,而溢出后,Wrap方式会直接舍弃掉溢出的最高位(即符号位0),结果变为了1100,这个补码值转换为原码后就是-4(1100–>1011(除符号位取反)–>1100(加1))。
设置为Saturate
结果显示为7。
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58750-tu_7jie_guo_xian_shi_wei_7.png)
这是因为带符号数4Bits能表达的最大范围便是7,当发生溢出时,输出结果会饱和在能表示的最大值。
设置为Flag as error
运行时Simulink会直接提示错误“Overflow detected”
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58751-tu_8yun_xing_shi_simulinkhui_zhi_jie_ti_shi_cuo_wu_overflow_detected.png)
3、量化(Quantization)方式对比
用有限位宽表示Simulink中的数据类型,必然会产生量化误差。在Quantization中可以选择数据的量化方式:
在Simulink中添加block按下图连接:
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58752-tu_9zai_simulinkzhong_tian_jia_blockan_xia_tu_lian_jie_.png)
Constant输出常数1.75;Gateway In数据格式设置为Fix_4_1,更改其量化方式:
设置为Round(unbiased: +/-Inf)
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58753-tu_10she_zhi_wei_round.png)
结果显示为2。
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58754-tu_11jie_guo_xian_shi_wei_2.png)
Round采用的是类似于四舍五入的方式,当处于中间值时会量化到更大的那一个值。这里1.75表示为二进制小数位为“11”,当量化为Fix_4_1格式时需要舍弃掉一位小数位。Fix_4_1与1.75最接近的两个值是“0011”(1.5)和“0100”(2.0)。1.75处于中间值,会量化为更大的2。
设置为Truncate
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58755-tu_12she_zhi_wei_truncate.png)
结果显示为1.5。
![](http://xilinx.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017415-58756-tu_13_jie_guo_xian_shi_wei_1.5.png)
这是因为Truncate会直接舍弃低位,1.75的第二个小数位无法表示,直接舍弃,量化到Fix_4_1后变成“0011”表示1.5。
---------------------
作者:碎碎思
来源:CSDN
原文:https://blog.csdn.net/Pieces_thinking/article/details/83758528