如今,无线系统无处不在,无线设备和服务的数量也在持续增长。完整RF系统的设计是一项多学科设计挑战,其中模拟RF前端是最关键的部分。然而,AD9361等集成RF收发器的可用性大大降低了此类设计的RF挑战。这些收发器为模拟RF信号链提供数字接口,并允许轻松集成到ASIC或FPGA进行基带处理。基带处理器(BBP)允许用户数据在终端应用和收发器设备之间的数字域中进行处理。使用系统建模工具(如 Simulink)也可以轻松设计基带处理器设计。但是,新手用户可能会发现很难理解和填写通信系统难题的这一部分。本文是设计和实现用于空中通信系统的简单RF基带处理器的适度尝试。该设计采用AD9361 FPGA参考设计框架,在AD-FMCOMMS2-EBZ和Xilinx ZC706平台上实现。
本文的第一部分详细介绍了该基带处理器的一般设计原则。本节主要是对BBP的理论介绍。在第二部分中,使用ADI公司的AD9361 FPGA参考设计讨论BBP的实际硬件实现。需要注意的是,主要设计目标是使设计尽可能简单,并在实验室环境中演示快速无线数据传输。在使用并因此干扰RF频谱方面存在法规和其他影响。
底座设计
典型的RF系统如图1所示,直接RF系统除外。图 1 中仅显示了一条数据路径,相反的方向是该数据路径的镜像。本文所讨论的基带处理器允许以这样一种方式处理数据,即在RF两个系统之间通过空中传输数据。下面讨论基本设计要求。
图1.射频系统框图。
数据在两个正交信号 I&Q 上重复
请注意,载波是独立且彼此异步的。因此,发射和接收载波之间存在相位和频率偏移。这对接收器的解调有不利影响。一个重要的问题是信号反转,正交信号可能会反转它们的作用,因为偏移周期性地合并和漂移。克服这种模糊性的简单方法是在两个正交信号上重复相同的数据。
数据串行传输和接收(按位)
在大多数情况下,BBP的RF前端接口是DAC和ADC。这些是模拟信号的数字接口。因此,不可能简单地将数据发送到DAC输入,并期望在ADC输出端获得相同的数据。数据串行传输,将单比特数据映射到DAC的全分辨率。类似地,数据以串行方式接收,从ADC的全分辨率解映射。这提供了充足的冗余。如果这些是 16 位转换器,接收器将从可能的 65536 数据集中做出 1 或 0 的决定。仅此一项就大大简化了解码。
I&Q信号彼此正交
RF前端器件(如AD9361)是I/Q收发器。如果输入是正交信号,则这些设备工作得最好。这些器件通常沿两条数据路径具有内部I/Q匹配和校正功能,以抵消它们之间的任何变化。惯例是实数(I)信号是余弦函数,虚数(Q)信号是正弦函数。
调制方案为 BPSK
可以部署所有常见的方法,信号的幅度,频率或相位调制。检测相位差相对容易。由于数据是串行传输的,因此自然选择二进制相移键控(BPSK)。
位间隔为 8 个样本
数据需要时序信息,位间隔。最大可能的位间隔是采样周期。为了使接收器保持简单,需要充足的时间来解码信号并做出决定。最简单的时序恢复方法是过零和峰值检测。在这种情况下,峰值将不一致。因此,选择过零来检测和跟踪位间隔。两个系统之间也存在载波差异。在某些情况下,样本在用户数据的任一端可能不明确。正弦信号的每半允许四个样本,位间隔设置为八个样本。因此,有效传输速率是采样频率除以 8。
数据没有直流内容
定时和相对相位恢复基于信号的过零。因此,各个信号需要不含任何直流成分。它还要求信号允许每个位间隔至少跨越一个零点。正弦信号具有这两种特性,并且非常适合上述BPSK调制方案。
数据被打乱
用户数据是任意的,很可能是一长串 1 或 0。需要对数据进行加扰,以便接收器的定时和相位恢复能够更有效地跟踪信号。
数据以数据包形式传输
接收器上的信号预计具有幅度、频率和相位误差,因为系统彼此异步。解调信号是传输信号相对于本地载波的相位变化。运营商可能会跟踪一段时间,接受数据命中,然后再次跟踪。因此,设计需要准备好承受一些数据丢失。为了支持这一点,数据以数据包的形式传输。可以重复几个数据包来代替整个数据。
使用 CRC 验证数据包
数据包带有循环冗余校验 (CRC),以便允许接收方在不匹配时丢弃数据包并请求再次发送数据包。
在每个前导码期间进行时序和相位校正
数据包标头带有一个前导码,用于将其与接收到的数据流区分开来。接收器还使用该前导码来复位信号的时序和相位信息,以解调数据包数据。
内置性能指标
接收方还支持统计计数器,例如接收、丢弃或更正的数据包数。这些计数器用于测量和监控性能指标,包括误码率和有效数据率。
总之,数据以数据包的形式串行传输和接收。数据包带有前导码和 CRC。数据在收发器设备之前的中间正交信号上进行BPSK调制和解调。中间信号频率,因此数据的比特率是采样率的八分之一。具有上述设计细节的基带处理器模块如图2和图3所示。
图2.BBP传输功能框图
图3.BBP接收功能框图。
发送器读取数据字节(字符宽度),并将其转换为带有标头或前导码的数据包。CRC 被添加到数据包的尾端。然后对数据包数据进行加扰和序列化。然后,单比特数据在与收发器接口之前对余弦(I)和正弦(Q)功能进行相位调制。
在接收方向上,离线模块恢复并跟踪调制信号的时间间隔和相对相位。此信息用于从输入的ADC样本中恢复串行数据。然后将它们组装成数据包并进行解扰。在数据包的末尾,比较CRC,如果不匹配,则丢弃数据包。如果CRC匹配,则数据将传递给最终用户。
实现
BBP 设计在硬件中实现和测试。该硬件是两块评估板的组合:采用 Zynq FPGA 器件的赛灵思 ZC706 评估板和采用 AD9361 收发器的 AD-FMCOMMS3-EBZ 评估板。ADI公司提供了支持该硬件的完整参考设计。这种开源设计是免费提供的,完全支持,并在主要工具版本中更新。硬件详细信息可在以下 URL 中找到:
ZC706
AD-FMCOMMS3-EBZ
Zynq SOC
AD9361
ADI GitHub 存储库
ZC706 和 AD-FMCOMMS3-EBZ HDL 参考设计
AXI AD9361 IP
ADI参考设计是支持Linux框架的嵌入式系统。它由ARM处理器周围的各种外围设备组成。AD9361器件与axi_AD9361 IP外设接口。它在RF器件和系统存储器之间传输原始采样数据。®®
外围设备和设备通过 Linux 内核驱动程序进行初始化和控制。BBP 作为与axi_AD9361接口的另一个 IP 外设实现。BBP IP因历史原因被命名为axi_xcomm2ip。Linux 中的用户空间应用程序用于控制、发送和接收系统之间的数据。
在ADI参考设计中,axi_AD9361 IP与发射方向的解包模块(util_upack)和接收方向的包装模块(util_cpack)接口。在发射方向,BBP数据插入解包模块和AD9361内核之间。为了不影响默认数据路径,BBP 支持可选的数据路径多路复用器来选择解压缩的数据源或 BBP 数据源。BBP 允许将参考设计数据路径作为默认路径,并且仅在启用时选择 BBP 数据源。在接收方向,BBP仅与AD9361内核接口。参考设计数据路径不受影响。这允许框架工作不受阻碍地启动和设置系统。系统设置完成后,BBP 将启用,以通过覆盖默认数据路径来允许数据传输。ADI参考设计中BBP的框图如图4所示。
图4.BBP IP 框图。
本文中讨论的设计、初始化和数据传输使用此硬件。该设置只需要一对HDMI显示器,一个键盘和鼠标以及天线。这些系统彼此完全异步,但确实需要相同的设置。数据在每个方向上通过不同的载体传输。设备1的发射载波频率和设备2的接收载波频率相同,但在另一个方向上不同。但是,如果在环回中使用单个设备,则发射和接收载波必须具有相同的频率。BBP的HDL设计采用ADI库模块。®
控制(微处理器)接口
AXI-Lite 接口用于控制和监视处理器的 BBP。该接口模块使用ADI公共库(hdl/library/common/up_axi.v)中的up_axi模块简单推断。该模块将 AXI-Lite 接口转换为简单的存储器,如读写总线。内部寄存器和存储器的添加方式与任何其他ADI IP一样。寄存器映射详见表1。
地址 | 寄存器名称 | 类型 | ||
领域 | 名字 | 描述 | 违约 | |
0x000 | XCOMM2IP_VERSION | 反渗透 | ||
31:0 | 版本 | IP 版本。 | 0x40063 | |
0x008 | XCOMM2IP_SCRATCH | 乌尔曼 | ||
31:0 | 抓 | 刮刮乐寄存器 | 0x0 | |
0x800 | XCOMM2IP_TX_RESET | 乌尔曼 | ||
0 | TX_RESET | 如果设置为 0x1,则重置传输。此位必须设置为 0x0 才能正常运行。 | 0x1 | |
0x804 | XCOMM2IP_TX_ENABLE | 乌尔曼 | ||
0 | TX_ENABLE | 如果设置为 0x0,则数据路径不受影响,解压缩数据将传输到 DAC。如果设置为0x1,则BBP数据传输到DAC。 | 0x0 | |
0x808 | XCOMM2IP_TX_REQ | 乌尔曼 | ||
0 | TX_REQ | 如果由软件设置,则在传输方向上启动数据包传输。传输完成后,硬件会自行清除此位。 | 0x0 | |
0x80C-0x87C | XCOMM2IP_TX_PKT_DATA_3-XCOMM2IP_TX_PKT_DATA_31 | W | ||
7:0 | TX_PKT_DATA_3-TX_PKT_DATA_31 | 分组数据字节为3至31。硬件将前三个字节用于标头,最后一个字节用于 CRC。 | W | |
0xC00 | XCOMM2IP_RX_RESET | 乌尔曼 | ||
0 | RX_RESET | 如果设置为 0x1,则重置接收。此位必须设置为 0x0 才能正常运行。 | 0x1 | |
0xC08 | XCOMM2IP_RX_REQ | 乌尔曼 | ||
0 | RX_REQ | 如果由硬件设置,则表示已收到数据包,需要由软件读取。软件必须在读取数据包数据后清除此位。所有后续数据包都将被丢弃,直到软件清除此位。 | 0x0 | |
0xC0C-0xC7C | XCOMM2IP_RX_PKT_DATA_3-XCOMM2IP_RX_PKT_DATA_31 | W | ||
7:0 | RX_PKT_DATA_3-RX_PKT_DATA_31 | 分组数据字节为3至31。硬件将前三个字节用于标头,最后一个字节用于 CRC。 | W |
下面介绍了up_axi模块端口及其端口映射。
up_rstn:AXI 接口复位(异步低电平有效),连接到s_axi_aresetn。
up_clk:AXI 接口时钟,连接到s_axi_aclk。
up_axi_*:AXI 接口信号,连接到等效的 s_axi_* 端口。
up_wreq、up_waddr、up_wdata up_wack:内部写入接口,up_wreq信号被置位以指示写入请求以及地址和数据。请求需要通过up_wack端口进行确认。
简单的寄存器写入实现如下。
always @(negedge up_rstn or posedge up_clk)
begin
if (up_rstn == 0) begin
up_wack <= ‘d0;
up_reg0 <= UP_REG0_RESET_VALUE;
end else begin
up_wack <= up_wreq_s;
if ((up_wreq_s == 1’b1) && (up_waddr == UP_ REG0_ADDRESS)) begin
up_reg0 <= up_wdata[UP_REG0_WIDTH-1:0];
end
end
end
该模块在两者之间执行地址转换。AXI 接口使用字节地址,但内部总线使用 DWORD 地址。结果是up_axi模块删除 AXI 地址的两个最低有效位以生成内部 DWORD 地址。
up_rreq、up_raddr、up_rdata up_rack:内部读取接口(up_rreq信号)被断言为指示读取请求以及地址。请求需要通过up_rack端口以及读取的数据进行确认。
上面为读取实现的相同寄存器如下所示。
always @(negedge up_rstn or posedge up_clk)
begin
if (up_rstn == 0) begin
up_rack <= ‘d0;
up_rdata <= ‘d0;
end else begin
up_rack <= up_rreq_s;
if ((up_rreq_s == 1’b1) && (up_raddr == UP_ REG0_ADDRESS)) begin
up_rdata <= up_reg0;
end else begin
up_rdata <= 32‘d0;
end
end
end
相同的地址转换也适用于读取。读取数据仅在请求时驱动,否则设置为零。这是因为up_axi模块将各个地址块的单个读取数据传递到OR门。因此,未选择的块需要将读取数据驱动为零。
BBP 有三个地址空间,如上面的寄存器映射表中所列。公共寄存器空间映射到0x000,发送(DAC)映射到0x800(0x200),接收(ADC)映射到0xC00(0x300)。软件(Linux用户空间应用程序)期望将传输的数据包数据写入缓冲区,并从另一个缓冲区读取接收到的数据包数据。数据包大小选择为 32 字节,带有 3 字节前导码和 1 字节 CRC。
数据接口
AD9361接口内核由两对16位I/Q数据组成,用于接收和发送方向的两个通道。内核与AD9361数字接口的运行时钟相同。在2R2T模式下,这是采样率的4×。在1R1T模式下,这是采样率的2×。有效数据速率由有效信号控制。因此,在2R2T模式下,每四个时钟置位一次有效。在 1R1T 模式下,每两个时钟置位一次有效。BBP 设计用于支持 2R2T 和 1R1T 模式。它使用单个发射和接收通道。内部逻辑在2R2T和1R1T模式下均以采样速率运行。然后,BBP 以时钟频率与接口内核传输数据。这样做是为了演示BBP内的时钟转换。在许多情况下,用户可能希望以采样速率运行BBP逻辑,而不管收发器的接口速率如何。
采样频率下的内部时钟使用 Xilinx 基元 BUFR 和 BUFG 生成。BUFR是一个分频器,BUFG是一个高扇出时钟缓冲器。也可以为此目的使用MMCM。内部时钟的生成方式如下。
parameter XCOMM2IP_1T1R_OR_2T2R_N = 0; localparam XCOMM2IP_SCLK_DIVIDE = (XCOMM2IP_1T1R_OR_2T2R_N == 1) ? “2” : “4”;
BUFR #(.BUFR_DIVIDE(XCOMM2IP_SCLK_DIVIDE)) i_bufr (
.CLR (1’b0),
.CE (1’b1),
.I (clk),
.O (s_clk_s));
BUFG i_bufg (
.I (s_clk_s),
.O (s_clk));
使用BUFR和BUFG可确保时钟的频率锁定,但会牺牲相位确定性。最大相位模糊度是接口时钟的单个周期。这很容易通过带有同步信号的四级寄存器阵列进行补偿。但是,该设计使用双端口RAM模块来实现数据传输。这是有意作为常见信号处理要求的用例示例完成的。双端口RAM元件使用ADI库存储器模块(ad_mem)进行推断。
传输接口
在传输方向上,处理器将数据包数据写入缓冲区(参见上面的寄存器映射表)。然后,它请求硬件发送此数据包。BBP 不断向设备发送数据包。在数据包的开头,它会检查是否有任何请求。如果没有挂起的请求,它将传输空闲数据包。如果请求挂起,则会读取并传输数据包缓冲区。
发送逻辑使用自由运行的位计数器以位宽运行。当位计数器0x0时,缓冲区读取地址将更新。由于处理器请求可能在数据包传输期间的任何时间发生,因此会立即捕获并在数据包传输开始时清除该请求。在数据包传输开始时,如果请求处于挂起状态,则会将其确认回处理器接口。该请求用于在缓冲区数据或空闲数据之间进行选择。
图5.传输数据路径。
数据包数据的前两个字节设置为 0xfff0。第三个字节用于指示空闲 (0xc5) 或数据 (0xa6) 数据包。CRC 字节作为数据包的最后一个字节插入。CRC 多项式是 x8 + x2 + x + 1。除标头外的所有字节都将被打乱。加扰多项式与 SONET/SDH (x7 + x6 + 1) 相同。
余弦和正弦查找表用于生成调制载波。位间隔等于八个样本中信号的完整周期(0至2π)。位数据用于反转信号。然后将数据写入一个小缓冲器,并使用接口时钟根据来自AD9361接口内核的有效信号进行读取。
接收接口
在接收方向,I/Q数据被监视0xfff0的报头模式。这是在数据包传输中出现一次的唯一模式。可以发送数据包数据,以便加扰器输出重复此模式。软件不鼓励和防止这种情况。该系列连续12位间隔的同相数据序列用于通过定时恢复模块复位和跟踪接收器时序和相位。因此,它重置其时序计数器并将其相位值设置为 0x1。此序列之后的第一个反转被认为是0x0的。在此之后,定时恢复模块在整个数据包传输过程中保持其状态。
数据恢复模块对信号进行平均,并对信号的当前相位做出决定。然后将其与时序恢复模块跟踪的相对相位进行比较。在发生冲突的情况下,决策基于过去对信号的变化。这是因为冲突通常由相位切换引起。
图6.接收数据路径。
然后将解调的位数据组装成字节并进行解扰。如果数据为空,则数据将写入传输缓冲区。CRC 在数据包末尾进行验证。如果匹配并且写入了传输缓冲区,则会通知处理器接口。该软件应监视此请求,如果设置,则通过读取其内容来清空缓冲区。然后,它必须清除请求以允许进一步的数据包传输。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !