30.07.2013 Views

在FPGA 平台上实现实时波束形成器 - Xilinx

在FPGA 平台上实现实时波束形成器 - Xilinx

在FPGA 平台上实现实时波束形成器 - Xilinx

SHOW MORE
SHOW LESS

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 期

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!