在高速数据传输领域,FPGA凭借其并行处理能力和可编程特性,成为实现定制化接口协议的理想平台。本文将基于Xilinx Spartan-6 FPGA的PCIe-DMA-DDR3-GbE目标参考设计(TRD),详细解析如何扩展支持Aurora 8B/10B串行协议,构建高性能数据桥接系统。
传统TRD提供了PCIe端点、DMA引擎、DDR3内存控制器和千兆以太网的完整实现,但缺乏对专用串行协议的支持。Aurora 8B/10B作为Xilinx专有的轻量级链路层协议,具有以下优势:
我们的扩展目标是在保留原有以太网功能的同时,新增PCIe到Aurora的数据通路,实现:
扩展后的系统采用分层设计:
code复制[PC系统内存]
↑↓ PCIe DMA
[FPGA逻辑]
├─ 网络路径:保留原TEMAC以太网功能
└─ 内存路径:
├─ Packet FIFO (DDR3)
└─ Aurora 8B/10B IP核
↑↓ GTP收发器
[远端设备]
关键数据流:
原TRD的虚拟FIFO仅支持单端口流模式,我们升级为支持多端口的Packet FIFO:
verilog复制module packet_fifo #(
parameter NUM_PORTS = 2,
parameter BLOCK_SIZE = 64
)(
input wire clk,
input wire rst,
// 用户接口
input wire [31:0] data_in,
input wire sop_in,
input wire eop_in,
// DDR3接口
output wire [31:0] mcb_data,
output wire mcb_en
);
// 包分割逻辑
always @(posedge clk) begin
if (sop_in) begin
// 插入控制字
ctrl_word <= {16'd63, 13'b0, rem, eop_in, sop_in};
blk_cnt <= 0;
end else if (blk_cnt == BLOCK_SIZE-1) begin
// 块边界插入控制字
ctrl_word <= {16'd63, 13'b0, 2'b0, 1'b0, 1'b0};
blk_cnt <= 0;
end else begin
blk_cnt <= blk_cnt + 1;
end
end
endmodule
控制字格式(32位):
| 位域 | 说明 |
|---|---|
| 31:16 | 数据长度(以DW为单位) |
| 15:3 | 保留位 |
| 2 | REM[1] |
| 1 | REM[0] |
| 0 | EOP状态 |
Aurora 8B/10B IP核配置参数:
关键接口信号:
verilog复制aurora_8b10b_0 aurora_inst (
.RESET(reset),
// GTP接口
.RXP(rxp_in), .TXP(txp_out),
// 用户接口
.S_AXI_TX_TDATA(tx_data),
.S_AXI_TX_TVALID(tx_valid),
.M_AXI_RX_TDATA(rx_data),
.M_AXI_RX_TVALID(rx_valid),
// 状态指示
.CHANNEL_UP(channel_up),
.LANE_UP(lane_up)
);
由于Aurora接收端没有ready信号,我们采用NFC避免FIFO溢出:
计算最坏情况延迟:
设计512深度的流控FIFO:
verilog复制// 流控状态机
always @(posedge aurora_clk) begin
case(state)
IDLE: if (fifo_usedw < 128) state <= SEND_XOFF;
SEND_XOFF: if (fifo_usedw > 384) state <= SEND_XON;
SEND_XON: if (fifo_usedw < 128) state <= SEND_XOFF;
endcase
end
新增寄存器组(偏移地址从BAR0开始):
| 地址范围 | 功能描述 |
|---|---|
| 0x9100-0x91FF | 多端口虚拟FIFO控制状态 |
| 0x9200-0x92FF | Aurora状态控制寄存器 |
| 0x9300-0x93FF | Packetizer错误状态 |
关键寄存器示例:
c复制int aurora_check_status(void)
{
u32 reg = ioread32(bar0 + 0x9200);
if (!(reg & 0x3)) {
printk(KERN_WARNING "Aurora link down!\n");
return -EIO;
}
return 0;
}
python复制self.aurora_loopback = tk.IntVar()
tk.Checkbutton(frame, text="Aurora PMA Loopback",
variable=self.aurora_loopback).pack()
通过实测发现三个关键因素影响系统吞吐:
Packet FIFO开销:
MCB端口仲裁:
Aurora NFC延迟:
在XC6SLX45T器件上的资源占用:
| 资源类型 | 用量 | 总量 | 占比 |
|---|---|---|---|
| Slice LUTs | 23,213 | 27,288 | 85% |
| Block RAMs | 42 | 116 | 36% |
| GTP收发器 | 2 | 2 | 100% |
| PLL_ADV | 3 | 4 | 75% |
硬件配置:
code复制125MHz晶振 → IBUFG → PLL_ADV →
├→ 62.5MHz(PCIe)
├→ 78.125MHz(Aurora)
└→ 125MHz(MIG)
调试技巧:
性能调优:
code复制阈值 = (链路延迟 × 线速率) / (8 × 接口宽度)
现象:LANE_UP信号不稳定
排查步骤:
现象:Packet Error Register置位
解决方案:
tcl复制set_input_delay -clock sys_clk 1.2 [get_ports ddr3_dq*]
优化方法:
c复制#define BURST_LEN 256 // 原值128
verilog复制parameter ALMOST_FULL = 480;
parameter ALMOST_EMPTY = 32;
基于本平台可进一步实现:
实际项目中,我们曾利用类似架构实现雷达数据采集系统,持续吞吐稳定在1.2Gb/s,验证了该方案的可靠性。关键经验是:DDR3控制器的校准参数需要根据具体板卡特性精细调整,特别是ZQ校准电阻的阻值容差应控制在1%以内。