在FPGA 平台上实现实时波束形成器 - Xilinx
在FPGA 平台上实现实时波束形成器 - Xilinx
在FPGA 平台上实现实时波束形成器 - Xilinx
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
技 术 长 廊<br />
在 FPGA 平台上<br />
实现实时波束形成器<br />
借 <strong>Xilinx</strong> System Generator 之力,<br />
设计基于 QRD 的灵活波束形成引擎<br />
作者:Chris Dick<br />
<strong>Xilinx</strong> 公司<br />
<strong>Xilinx</strong> 首席 DSP 架构设计师<br />
chris.dick@xilinx.com<br />
Fred Harris<br />
圣地亚哥州立大学教授<br />
fred.harris@sdsu.edu<br />
Miroslav Pajic<br />
Signum Concepts<br />
工程师<br />
miroslav.pajic@signumconcepts.com<br />
Dragan Vuletic<br />
Signum Concepts<br />
工程师<br />
dragan.vuletic@signumconcepts.com<br />
大多数真实环境的通讯系统都包含<br />
多种不同的处理单元。例如,应用程序、<br />
人机界面管理,还有高级网络协议堆栈<br />
处理,都可以在一个通用处理器上很好<br />
地实现。<br />
但是对于高速率、算法复杂的数据<br />
处理(通常有苛刻的实时最后期限限制)<br />
来说,FPGA 一类硬件资源是更佳的选<br />
择。而两者之间的接口视具体情况而定<br />
;FPGA 可以作为预处理器、协处理<br />
器、后处理器,或者三者的某种组合。<br />
关键是如何使这些异构系统能够完美地<br />
互相配合。<br />
赛灵思中国通讯 25 期 © 2007 <strong>Xilinx</strong> Inc. 版权所有。XILINX、<strong>Xilinx</strong> 标志以及本文件中包括的其他品牌名称,是 <strong>Xilinx</strong>, Inc. 的商标。所有其他商标都是其各自所有者的财产。
在本文中,我们将阐述一个灵活、<br />
优化、适应性强的波束形成引擎的开发<br />
过程,此引擎能轻松地通过软件加以控<br />
制。DSP 密集型任务在 FPGA 上运<br />
行,而命令和控制在外部处理器上运行。<br />
波束形成引擎是一个结构新颖的密集型<br />
QR 分解(基于 QRD 的电路)。引擎<br />
和主处理器之间的接口由 <strong>Xilinx</strong> ® System<br />
Generator 设计流程中的共享存储抽象<br />
层实现。<br />
MVDR 波束形成器<br />
自适应波束形成是指将自适应滤波<br />
器应用于空间信号处理。搜集自均距阵<br />
列元素的时间序列经加权和相加,形成<br />
来自选定到达方向的一个信号组件,而<br />
来自其他到达方向的信号组件则被抑制<br />
(见图 1)。当无用信号组件的到达方<br />
向未知或随时间变化而有所变化时,滤<br />
波器权重必须进行自适应调整,以操纵<br />
零信号始终对准这些方向。自适应过程<br />
的执行受到一个条件制约,即操纵矢量<br />
在信号方向要有统一的增益。这种波束<br />
形成器的稳定状态权重形成来自阵列元<br />
素的最小变异无失真响应 (MVDR)。<br />
为使数据可靠,并且由于计算的复<br />
杂性,我们采用了一种基于 QR 分解而<br />
无需直接倒相相关矩阵即可计算所要求<br />
的权重矢量的常用方法。欲了解操作详<br />
情,请参阅 Simon Haykin 所著《自适<br />
应滤波器原理》。<br />
QRD 过程由两个运算符组成:将<br />
复杂输入数据转换成真数据的单一旋<br />
转,以及与之相关的将所选输入数据集<br />
的元素一个个进行零化处理的角-元素<br />
合并器。QRD 过程在图 2 的信号流程<br />
框 图中简洁地作了展示。 该框图是<br />
QRD 最小二乘法解决方案处理器的紧<br />
缩阵列实现。<br />
该阵列包括三种处理单元:边界单<br />
元、内部单元和输出单元。边界单元在<br />
复杂输入样本上实施“矢量”运算,以<br />
使其虚构部分无效,并形成内部单元所<br />
用的旋转角。内部单元通过来自边界单<br />
元的角执行输入值的 Givens 旋转,以<br />
零化所传数据矩阵的非上三角条目。线<br />
性阵列中的输出单元对上三角阵列中的<br />
元素进行处理,以执行所要求的能生成<br />
Direction<br />
of Arrival<br />
Steering Vector<br />
c<br />
s<br />
x<br />
Array Elements<br />
x(2)<br />
x(1)<br />
x(0)<br />
Triangular<br />
Array<br />
Triangular Array<br />
Processing<br />
Node Definitions<br />
x in<br />
x in<br />
x<br />
x out<br />
x 0 (n)<br />
x 1(n)<br />
x 2(n)<br />
x M-1(n)<br />
x(1)<br />
x(0)<br />
0<br />
Adaptive<br />
Algorithm<br />
x(0)<br />
0<br />
0<br />
d(2)<br />
d(1)<br />
d(0)<br />
0,0 0,1 0,2 0,3<br />
c<br />
s<br />
1,1<br />
if xin = 0 then<br />
c 1<br />
s 0<br />
x λ 1/2 x<br />
Otherwise<br />
x'<br />
c<br />
xin s<br />
x'<br />
x x'<br />
1,2<br />
λx 2 + |x in| 2<br />
λ 1/2 x<br />
x'<br />
c<br />
xout cxin - sλ<br />
s<br />
1/2 x<br />
x sxin + cλ 1/2 x<br />
图 1 - 自适应波束生成器结构<br />
1,3<br />
2,2 2,3<br />
xii w^ i<br />
wi = ^<br />
Δ Δ<br />
Δ<br />
(i)<br />
pi zi xii w 0(n)<br />
w 1(n)<br />
w 2 (n)<br />
w M-1(n)<br />
Σ<br />
0 1 2<br />
(i)<br />
zi pi (k-1)<br />
zi ^w k<br />
Linear Array<br />
Linear Array Processing Node Definitions<br />
z i (k-1)<br />
图 2 - 3 x 3 阵列 QRD 矩阵倒相的紧缩阵列实现<br />
技 术 长 廊<br />
= z i<br />
x<br />
(k)<br />
z i (k)<br />
w^ k<br />
+ x* ik w^ k<br />
s(t,θ)<br />
2007 年夏季刊
技 术 长 廊<br />
波束形成器权重的后替代。<br />
我们的目 标是生 产一个密 集 型 的<br />
QRD FPGA 实现。设计包括一个边界单<br />
元,一些内部单元和后替代单元。图 2<br />
中的紧缩阵列被交叠到这个处理资源集<br />
上。之所以需要边界单元,是为了计算<br />
两个角。第一个角<br />
Φ = arctan(ℑ(x in)/ℜ(x in))<br />
将传输到边界单元输入端口的复杂输入<br />
样本转换成真值数据。迫使 xin 的虚构<br />
组件变为 0 的转换,必须应用于和边<br />
界单元相关的同一行中的所有元素;<br />
这一操作是内部单元所执行的任务之一。<br />
相邻两行起始位置中的数据既已获<br />
得真值,第二个角便形成,<br />
Θ = arctan(x ine -jΦ/x)<br />
这个角用来对输入数据中的项逐项进行<br />
零化,最终生成右上三角矩阵 R。边界<br />
单元中所使用的算法可通过严格实 施<br />
图 2 所示的等式用硬件实现。这会要<br />
求硬件支持平方根和除法运算。尽管这<br />
些电路在 FPGA 硬件中通常都已实现,<br />
我们还是设法寻找计算所要求角度的<br />
替代解决方案,与直截了当的明显实现<br />
相比较,替代方案花费的资源成本较小。<br />
一种众所周知并相对简单的计算角<br />
度 的方法是坐 标 旋转数 字 计算机<br />
(CORDIC) 算法的矢量模式。CORDIC<br />
算法是一种能计算大量数学函数的迭代<br />
程序。CORDIC 算法所要求的基本运<br />
算是加、减、移位和表查找运算。所有<br />
这些功能都得到了 FPGA 架构(如<br />
<strong>Xilinx</strong> 出品的 Virtex 系列器件)的<br />
有效支持,所以,该算法的矢量模式是<br />
一个理想选择,可用于构成 QRD 处理<br />
器边界单元的基础。如图 3 所示,边界<br />
单元中应用了两个 CORDIC 引擎。一<br />
个引擎用来计算 φ,另一个引擎用来<br />
计算 θ。<br />
CORDIC 算法具有迭代性质,每次<br />
循环可将角度提高大约 1 位的精度。<br />
对于应用了迭代趺鼓 (N-iteration)<br />
CORDIC 的处理过程,每 N 个时钟周<br />
期就会生成一个新的输出,而每 N 个<br />
时钟周期就提供一组新的运算对象。为<br />
增加边 界单元的处理量,我们为<br />
赛灵思中国通讯 25 期<br />
CORDIC 应用了一个全并行(亦称展<br />
开)架构(此处未显示)。当电路的初<br />
始启动延迟被吸收以后,此单元的启动<br />
速率和完成速率即构成每个时钟周期的<br />
一个新输入/输出。<br />
每一个进入第 m 行内部单元(见<br />
图 4)的数据元素 xin 必须旋转角度<br />
φ,该角度为边界单元为第<br />
而得。<br />
m 行计算<br />
⎡ℜ<br />
⎢<br />
⎣ℑ<br />
()<br />
()<br />
υ<br />
υ<br />
() φ sin()<br />
() φ sin()<br />
⎤ ⎡cos −<br />
⎥ = ⎢<br />
⎦ ⎣cos<br />
θ<br />
θ<br />
⎤⎡ℜ<br />
⎥⎢<br />
⎦⎣ℑ<br />
( )<br />
( ) ⎥ xin<br />
⎤<br />
xin<br />
⎦<br />
为完成 QRD 处理器中的旋转任务<br />
而常用的一种方法是 CORDIC 算法的<br />
旋转模式。另一种方法是直接使用乘法<br />
累加 (MAC) 功能单元,以明显的方<br />
式 进行旋转;这也 是我们的实现所采<br />
用的方法。该设计的目标 FPGA 技术<br />
是 Virtex-4 FPGA。这些器件包括大量<br />
嵌入式 MAC 单元(称作 DSP48 Slice)<br />
阵列。<br />
DSP48 Slice 支持许多种操作代码<br />
(能按每个时钟周期更新 ),这些操<br />
作代码定义了在给定时钟周期内由模块<br />
进行计算的数学运算。前面公式中所指<br />
的四个乘法运算被交叠到一对 DSP48<br />
Slice 上,每个 DSP48 Slice 负责计<br />
( )<br />
图 3 - 基于两个矢量模式的 CORDIC 处理引擎的边界单元架构<br />
图 4 - 应用三个基于 MAC 的 Givens 旋转引擎的紧缩阵列内部单元架构
算两个输出项 ℑ(υ) 和 ℜ(υ) 之一。<br />
计算这两个输出项需要两个时钟周期。<br />
每个时钟周期内都为 DSP 提供一个独<br />
一无二 的操作码 。 让 我们看看数据<br />
ℜ(υ) 的计算过程。第一个时钟周期<br />
里,计算得出 cos(Φ) x ℜ(xin ) 的乘积<br />
并存储在 DSP48 乘积(或称 p)寄存器<br />
中。<br />
第二个时钟周期里,算出 sin(Φ)<br />
x ℑ(xin ) 结果,然后从 p 寄存器所存<br />
储 的数值 中 减去该结果, 得出最终的<br />
输出项。通过类似 的计算过程可得出<br />
ℑ(υ)。内部单元上使用 DSP48 嵌入<br />
式模块而不使用基于 CORDIC 的方<br />
法,可减少计算中的相位延迟,同时还<br />
使实现所需的 FPGA 逻辑架构的数量<br />
降为最低。表 1 所示为 QRD 实现<br />
中 主 要 功 能单元范围的 明细,同时<br />
还显示了该设计的总范围。<br />
内部单元所需的 cos(Φ)、sin(Φ)、<br />
cos(Θ) 和 sin(Θ) 项是用一个简单的<br />
LUT 计算出来的,这个 LUT 将边界单<br />
元中矢量单元计算得出的 Φ 和 Θ 角<br />
映射到相应的正弦和余弦中。线性插补<br />
法被应用于 LUT 的输出样本,以增加<br />
从角到 振幅的 映射的 精确度,同时将<br />
LUT 本身限制在单个 Block RAM 上。<br />
QRD 处理器的输入阵列的行和列<br />
的维数可在运行时进行动态调节,方法<br />
是将新维数写到 FPGA 控制平台中的控<br />
制寄存器上。<br />
表 2 提供了输入数据组几个配置<br />
的时序信息。<br />
设计流程<br />
我们的 QRD 实现使用了基 于<br />
<strong>Xilinx</strong> System Generator for DSP 模式<br />
的设计流程。除了为开发 FPGA 信号处<br />
功能单元 LUT FF DSP48 Slice Block RAM Slice<br />
边界单元 2,145 2,057 3 1 1,266<br />
内部单元 216 329 6 0 176<br />
后替代单元 2,862 3,286 4 1 1,932<br />
QRD 总计 5,411 5,916 13 6 3,530<br />
M N<br />
表 1 - FPGA 中合并 QRD 和后替代阵列的资源利用率<br />
三角形化 后替代<br />
250-MHz 时钟<br />
总周期<br />
周期 周期 所用时间 (m s)<br />
3 3 792 147 939 3.76<br />
8 3 2,112 147 2,259 9.04<br />
5 5 2,540 255 2,795 11.18<br />
9 5 4,572 255 4,827 19.31<br />
7 7 5,656 371 6,027 24.11<br />
10 7 8,080 371 8,451 33.80<br />
9 9 10,476 495 10,971 43.88<br />
11 9 12,804 495 13,299 53.20<br />
10 10 13,630 560 14,190 56.76<br />
表 2 - M x N 矩阵中 FPGA QRD 实现的三角化和后替代阶段的运行时间<br />
技 术 长 廊<br />
理的实现方法提供自然的开发环境外,<br />
System Generator 还具有一套丰富的<br />
功能,用来支持既包括 FPGA 元件又包<br />
括处理器的异构应用的开发。处理器可<br />
以是嵌入式 PowerPC 405 硬 IP 模<br />
块、MicroBlaze 软处理器核或处于<br />
FPGA 外部的处理器。<br />
为本项目开发的波束形成器在 PC<br />
主机和 FPGA 平台之间进行了分割。<br />
在我们的实现中,在 PC 上运行的主应<br />
用更像是波束形成器验证过程(测试平<br />
台)的一个单元,但主应用也可能是随<br />
意而复杂的,随要完成的任务之需而变。<br />
此设计中的波束形成器主应用是一<br />
个 MATLAB 脚本(m 代码),用于仿<br />
真波束形成器网络的传感器阵列。该脚<br />
本仿真一个动态目标,并为移动目标生<br />
成远场辐射图的样本。每个传感器上的<br />
电场样本都是在 MATLAB 中生成并传输<br />
给 FPGA QRD 处理器的。对波束形成<br />
器权重矢量会生成一个新的估值,然后<br />
反馈给 MATLAB 环境作进一步计算。<br />
在此示例中,额外的处理涉及到为<br />
经过更新的复杂权重矢量绘制极坐标辐<br />
射 图。请注意, 主 应用不一定非 要 与<br />
MATLAB 环境有联系,例如,它可以<br />
是用 C 编写的程序。<br />
这种波束形成器应用中一个很有意<br />
思的因素是对主应用(这里是在 PC 上<br />
运行)和 QRD 处理(在 FPGA 平台上<br />
运 行)之间接口的管理。System<br />
Generator 提供了一套共享存储器库<br />
(ROM、RAM、FIFO),它们能提取<br />
几乎所有的处理器/FPGA 接口细节,<br />
并使主机软件和 FPGA 硬件彼此隔离<br />
(图 5)。<br />
波束形成器每次新的更新实际上都<br />
是一个三步过程:<br />
1.每个天线元件收到的新输入样本(由<br />
MATLAB 主应用生成)被传送到<br />
FPGA 上的原位 QRD 引擎上。<br />
2.触发 QRD 处理。<br />
3.新的权重矢量由 FPGA 返回到主机<br />
上。<br />
2007 年夏季刊
技 术 长 廊<br />
共享存储器库模块和相关的应用程<br />
序员界面根据 MATLAB(或 C)中的<br />
名称/空间引用将 FPGA 和 PC 主机之<br />
间的数据传输转换成简单的赋值语句。<br />
例如,新的权重矢量 w(驻留在 MAT-<br />
LAB 工作区中)随新的波束形成器系数<br />
(FPGAWeights) 而更新,其计算通过<br />
FPGA QRD 过程利用简单的赋值语句<br />
w = FPGAWeights 完成。 (FPGAWeights<br />
是在 System Generator 对 QRD 引擎的<br />
描述中赋给一个共享缓冲器的名字。)<br />
这种由 System Generator 框架管<br />
理的主处理器/FPGA 交互作用使异构<br />
应用的开发变得直接、迅速、较少出错,<br />
并使 FPGA 加速引擎(正如此设计中<br />
的 QRD 模块)能在不同的硬件平台间<br />
轻松地实现端 口 连 接,而不必修改<br />
FPGA 源代码(System Generator<br />
模块本身)。<br />
这种接口抽 象 层 支持主应用和<br />
System Generator 资源模块之间的事<br />
务,也支持主应用和 FPGA 平台上运行<br />
的最终设计之间的事务。后一因素对系<br />
统软件和硬件 (FPGA) 维数的验证过程<br />
贡献甚巨,因为这两个组件都可以利用<br />
共享存储器的抽象层实现快速上线。<br />
System<br />
Generator<br />
design flow<br />
insulates<br />
the host<br />
program from<br />
the details of the<br />
FPGA platform<br />
Input<br />
Memory<br />
Buffer<br />
“foo”<br />
FPGA<br />
结论<br />
Matlab or C Application<br />
Matlab or C API<br />
Processing<br />
Kernel<br />
Shared<br />
Memory<br />
Object<br />
在本文中,我们描述了灵活的 QRD<br />
处理器在 FPGA 上的应用,从而实现了<br />
运行时对输入矩阵维数的定义。该设计<br />
采用了基于 CORDIC 的处理(阵列边<br />
界单元)和基于 MAC(阵列内部单 元)<br />
的算法之间的混合体,可与 FPGA(如<br />
<strong>Xilinx</strong> Virtex-4 系列)的计算资源良好<br />
匹配。<br />
所有的边界单元和内部单元处理都<br />
被设置在一个边界单元功能模块和内部<br />
单元功能模块上;然而,值得一提的是,<br />
如果目标应用的处理量要求极高的性能<br />
时,FPGA 平台丰富的资源能支持全并<br />
行紧缩阵列的实现。<br />
System Generator 编程环境使<br />
异构系统(处理器和 FPGA)的快速开<br />
发成为可能,同时使编程人员避免了与<br />
硬件/软件的分配有关的复杂而容易出错<br />
的编程过程。<br />
本文由以下 各方协作完成:<strong>Xilinx</strong><br />
高级系统技术小组 (ASTG)、<strong>Xilinx</strong> DSP 部门<br />
的研发小组、以及我们的合作伙伴 Signum<br />
Concepts 和圣地亚哥州立大学。<br />
Output<br />
Memory<br />
Buffer<br />
“bar”<br />
API is autogenerated<br />
by<br />
System<br />
Generator<br />
图 5 - 通过 System Generator<br />
共享存储器库元件实现的硬件/软件抽象。主应用利用简单的名称/空间引用实现了和 FPGA<br />
存储元件之间的事务(此处所引用的是名称为“foo”和“bar”的存储器)<br />
赛灵思中国通讯 25 期