随着FPGA集成度的不断提高,在单片FPGA中完成复杂的数字信号处理过程变成了现实。譬如:FIR滤波器、FFT以及雷达信号处理中的数字脉冲压缩、数字鉴相等,都可以在单片FPGA中实现。在基于Xilinx XC4000系列FPGA设计的DSP中,分布式运算单元DA扮演着重要的角色。本文介绍其原理及其实现方法。
1 分布式运算单元原理
DA的运算原理非常简单,但是它的应用却十分广泛。
一个线性时不变网络的输出可以用下式表示:
其中, y(n)为第n时刻网络的输出;Xk(n)为第n时刻的第k个输入变量;Ak为第k个输入变量的权值。
在线性时不变系统中,对于所有n时刻,Ak都是常量。如果该网络表现为滤波器,常量Ak 即为滤波器系数,变量Xk为单一数据源的抽样数据(如A/D的输出)。而在时-频转换系统中(如离散傅立叶变换及快速傅立叶变换),常数Ak即为旋转因子值,变量Xk为单一数据源的数据块(多源数据的例子可以在图像处理系统中发现)。
仔细观察式(1)可以看出,单个输出y(n) 需要将k个乘积累加。在以XC4000系列FPGA中的可配置逻辑功能块(CLB)的查找表(Look-Up Table)结构[1]为基础的DA中,这种乘积累加可以由查找表来实现。XC4000系列的CLB结构特点使得它很容易被高效的配置。
为了使得乘法之后的数据宽度不至于展宽,先把数据源数据格式规定为浮点数2的补码形式。需要注意的是,常数Ak 不一定要进行格式转换来匹配输入数据的格式,它可以根据所要求的精度进行定义。
变量Xk可以用下式表示:
其中,Xkb为二进制数,即取值为0或1;Xk0为符号位,Xk0为1表示数据为负,为0表示数据为正。
将式(2)代入式(1)可以得到:
可以看出,每个方括号中进行的是输入变量的某一个数据位和所有常数(A1~Ak)的每一位进行位与并求和。而指数部分则说明了求和结果的位权。现在就可以建立查找表来实现方括号中的操作了,其查找表用所有输入变量的同一位进行寻址,如图1所示。
图1中所示的DA查找表,其宽度为对常数Ak 定义的宽度,深度为2K,K是能够对数据源抽样数据进行处理的数据长度,对于滤波器就表现为滤波器阶数;对于FFT就表现为FFT点数。
这样,式(1)所表示的方程就可以由加法、减法和二进制除法来实现了。但是,DA仅仅是运算方程(1)的核心,要完成式(1)还需要根据系统对时间以及FPGA资源的考虑,选择相应的方法。
2 几种实现方法
2.1 全并行实现方法
市场上已经有大量的通用DSP芯片,这些芯片以并行的乘法、加法运算,地址产生器和片内存储器为主要特点,如TMS320C620x、 ADSP2106x、及各种通用的FFT芯片(如PDSP16510)。为什么还要选择FPGA呢?主要是考虑速度。要实现一个64阶FIR滤波器,如果采用全并行方式,FPGA可做到50MHz的数据率,可以和系统时钟相匹配,这是通用DSP芯片无法做到的。下面就举出全并行的例子。