表1. BBP寄存器映射
控制(微处理器)接口
AXI-Lite接口用于通过处理器控制和监控BBP。使用ADI公共库(hdl/library/common/up_axi.v)中的up_axi模块,可以轻松推断该接口模块。该模块将AXI-Lite接口转换为简单内存,如读取和写入总线。和任何其他ADI IP一样,添加内部寄存器和内存。寄存器映射如表1所示。
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 up_reg0 end else begin
up_wack if ((up_wreq_s == 1’b1) && (up_waddr == UP_
REG0_ADDRESS)) begin
up_reg0 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 up_rdata end else begin
up_rack if ((up_rreq_s == 1’b1) && (up_raddr == UP_
REG0_ADDRESS)) begin
up_rdata end else begin
up_rdata end
end
end
相同地址转换也适用于读取。读取数据仅在请求时驱动,否则设置为零。这是因为up_axi模块将单个读取数据从各个地址组传递到OR门。因此,未选择的地址组需要驱动读取数据零。
如上方寄存器映射表中所列,BBP有三个地址空间。常见寄存器空间映射至0x000、发送(DAC)映射至0x800 (0x200),接收(ADC)映射至0xC00 (0x300)。软件(Linux用户空间应用程序)应当将发送数据包数据写入缓冲器,并从另一个缓冲器中读取接收到的数据包数据。数据包大小选择为32字节,带有3字节前同步码和1字节CRC。
实现
BBP设计在硬件中实施和测试。硬件是两个评估板的组合:具有Zynq FPGA设备的Xilinx 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所示。
表1. BBP寄存器映射
控制(微处理器)接口
AXI-Lite接口用于通过处理器控制和监控BBP。使用ADI公共库(hdl/library/common/up_axi.v)中的up_axi模块,可以轻松推断该接口模块。该模块将AXI-Lite接口转换为简单内存,如读取和写入总线。和任何其他ADI IP一样,添加内部寄存器和内存。寄存器映射如表1所示。
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 up_reg0 end else begin
up_wack if ((up_wreq_s == 1’b1) && (up_waddr == UP_
REG0_ADDRESS)) begin
up_reg0 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 up_rdata end else begin
up_rack if ((up_rreq_s == 1’b1) && (up_raddr == UP_
REG0_ADDRESS)) begin
up_rdata end else begin
up_rdata end
end
end
相同地址转换也适用于读取。读取数据仅在请求时驱动,否则设置为零。这是因为up_axi模块将单个读取数据从各个地址组传递到OR门。因此,未选择的地址组需要驱动读取数据零。
如上方寄存器映射表中所列,BBP有三个地址空间。常见寄存器空间映射至0x000、发送(DAC)映射至0x800 (0x200),接收(ADC)映射至0xC00 (0x300)。软件(Linux用户空间应用程序)应当将发送数据包数据写入缓冲器,并从另一个缓冲器中读取接收到的数据包数据。数据包大小选择为32字节,带有3字节前同步码和1字节CRC。