FPGA截位操作

①参考文献

MATLAB模拟不同的截位操作
FPGA里的截位问题

②直接截位误差

在这里插入图片描述

其实直接截位之所以出现直流分量可以这样直观的来认识:从matlab程序中也可以看出,对于FPGA信号截位来说,实际上就是向下取整;对于有符号数来讲,正数向下取整在数轴上是向原点零靠近,然后负数向下取整则是远离原点零了,这是因为负数以补码形式表示,它的补码所对应的无符号数经截位后向原点零靠近了,换算成有符号的负数时,则是远离原点零了。因此截位实际造成的效果是信号整体向负无穷方向平移了,即对于一个白噪声序列来讲,原本均值为零,截位后均值变为了负数。
在这里插入图片描述

③常见的几种截位方式

1、Truncate:直接截位,就是正数取floor,负数按绝对值取ceil(常用但有直流分量)

最简单,容易产生直流偏置,因为是向下取整,因此整数和负数对零点的偏移量不同,导致信号整体向下平移,在大信号时不明显,但在小信号时非常明显

MATLAB:

'假设我们要截低5位,a是待截数据
floor(32/32) = 1   floor(33/32) = 1  floor(48/32) = 1 
floor(63/32) = 1 floor(64/32) = 2
floor(-32/32) = -1 floor(-33/32) = -2   
floor(-48/32) = 2 floor(-63/32) = -2 floor(-64/32) = -2

b = floor(a/2^5);

Verilog:

32:  10'b00_0010_0000  33: 10'b00_0010_0001    48: 10'b00_0011_0000
63: 10'b00_0011_1111   64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111   -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001
b = a[9:5]

2、Rounding:舍入截位,就是所有数按绝对值取四舍五入,相当于matlab 的round函数(常用且最精确)

在这里插入图片描述

①判断数据的符号;② 如果符号为正,则将数据加上2^ (n-1);③ 如果符号为负,则将数据加上2^(n-1)-1;④ 截掉数据的低n 位。

MATLAB:

'假设我们要截低5位,a是待截数据
round(32/32) = 1   round(33/32) = 1  round(48/32) = 2 
round(63/32) = 2 round(64/32) = 2
round(-32/32) = -1 round(-33/32) = -1   
round(-48/32) = -2 round(-63/32) = -2 round(-64/32) = -2

b = round(a/2^5);

Verilog:

32:  10'b00_0010_0000  33: 10'b00_0010_0001    48: 10'b00_0011_0000
63: 10'b00_0011_1111   64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111   -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001


if(a >= 0) 
b1 = a + 10'b00_0001_0000
b = b1[9:5]
else if(a < 0) 
b1 = a + 10'b00_0000_1111
b = b1[9:5] 

3、负数直接截位后+1,就是所有数都按绝对值取floor(常用且较精确)

MATLAB:

if a<0
b=floor(a/2^5)+1;%截去低5位后加1
else
b=floor(a/2^5);%直接截位
end
//即在直接截位的基础上修正了一下负数,直接截位导致信号整体向下偏移以1,现在给负数加上1,则无任何偏移

Verilog:

32:  10'b00_0010_0000  33: 10'b00_0010_0001    48: 10'b00_0011_0000
63: 10'b00_0011_1111   64: 10'b00_0100_0000
-32: 10'b11_1110_0000 -33: 10'b11_1101_1111   -48: 10'b11_1101_0000
-63: 10'b11_1100_0001 -64: 10'b11_1100_0001


if(a >= 0) 
b = a[9:5];
else 
b = a[9:5] +1'b1;
end

4、负数取绝对值后再截位

if a<0
b=-floor(-a/2^5);%负数取绝对值后截去低5位再变回原来符号
else
b=floor(a/2^5);%直接截位
end
后三种方式都是对称截位,即正负数距零点的位置相同,因此都不会出现直流分量,其中舍入截位的精度最高。

④FPGA里的几种截位方式

在这里插入图片描述
Truncation:直接截位
Non-symmetric Rounding to Positive:先把数据加上0.5,然后舍弃数据的低位。相当于matlab的floor(x+0.5)
Non-symmetric Rounding to Negative:先把数据加上0.4999999…,然后舍弃数据的低位.。相当于matlab的ceil(x-0.5)
Symmetric Rounding to Highest Magnitude:相当于matlab 的round函数,取整的时候按小数位四舍五入
Symmetric Rounding to Zero:这种截位方式不会发生溢出,取整的时候按小数位四舍五不入,前面是五入
Convergent Rounding to even 和Convergent Rounding to odd:收敛舍入选择中点的舍入方向为奇数或偶数,而不是正数或负数。 这可能是有利的,因为中点舍入方向决策的平衡基于奇数或偶数出现的概率,即使在输入信号的均值远离零时,在大多数情况下这通常是相等的。 该功能是通过添加舍入常数来实现的,就像在其他模式中一样,然后检查 LSB 上的特定模式以检测中点并强制 LSB 为零(舍入到偶数)或 1(舍入到奇数) ) 当出现中点时。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⑤ MATLAB的几种取整方式

在这里插入图片描述

⑥cic滤波器里的位宽扩展

An Economical Class of Digital Filters for Decimation and Interpolation
高速cic插值滤波器的位宽与优化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 7
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值