学会System Generator(14)——不同溢出与量化方式的对比

本文是该系列的第14篇。第5篇中在介绍Gateway In block时谈到了System Generator中的数据类型,及不同的量化和溢出方式。本文将以两个简单的设计实例,更直观地说明不同的量化和溢出方式有什么区别。

溢出(Overflow)方式对比
从Simulink向System Generator的数据转换过程中可能会出现溢出(Simulink中的值超出了所设置数据格式能够表示的范围),Overflow可以设置为不同的处理方式:

  • Wrap:舍弃掉需要表示的值的高位。
  • Saturate:溢出的数转换为(所设置的数据格式能表达的)最大值或最小值。
  • Flag as error:溢出时Simulink会报错(这个选项只在Simulink仿真时有效,在导出到FPGA时仍当作wrap处理)。
  • 在Simulink中添加block按下图连接:

    Gateway In设置为Fix_4_0数据格式。该设计使用AddSub这个block计算5+5(这个block对应于Vivado中的加法器/减法器IP核),不溢出时的运算结果应该用5Bits表示(含符号位),这里将AddSub的输出结果故意设置为Fix_4_0,观察溢出结果。设置如下图,修改AddSub的不同overflow方式:

    1.设置为Wrap
    结果显示为-6。这是因为5+5=0101+0101=01010,最高位为符号位,正确结果为10,而溢出后,Wrap方式会直接舍弃掉溢出的最高位(即符号位0),结果变为了1010,这个值转换为原码后就是-6(1010->1101(除符号位取反)->1110(加1))。

    2.设置为Saturate
    结果显示为7,这是因为带符号数4Bits能表达的最大范围便是7,当发生溢出时,输出结果会饱和在能表示的最大值。

    3.设置为Flag as error
    运行时Simulink会直接提示错误“Overflow detected”:

    量化(Quantization)方式对比
    用有限位宽表示Simulink中的数据类型,必然会产生量化误差。在Quantization中可以选择数据的量化方式:

  • Truncate:直接舍弃不需要的低位。
  • Round(unbiased:+/-Inf):以四舍五入的方式量化。
  • 在Simulink中添加block按下图连接:

    Constant输出常数1.75;Gateway In数据格式设置为Fix_4_1,更改其量化方式:

    1.设置为Round(unbiased: +/-Inf)
    结果显示为2。Round采用的是类似于四舍五入的方式,当处于中间值时会量化到更大的那一个值。这里1.75表示为二进制小数位为“11”,当量化为Fix_4_1格式时需要舍弃掉一位小数位。Fix_4_1与1.75最接近的两个值是“0011”(1.5)和“0100”(2.0)。1.75处于中间值,会量化为更大的2。

    2.设置为Truncate
    结果显示为1.5。这是因为Truncate会直接舍弃低位,1.75的第二个小数位无法表示,直接舍弃,量化到Fix_4_1后变成“0011”表示1.5。

    文章来源:FPGADesigner的博客
    *本文由作者授权转发,如需转载请联系作者本人

    最新文章

    最新文章