Xilinx PCIe IP 核详解、FPGA 实现及仿真 (Virtex-7)
Xilinx 7 系列 FPGA 中三种 PCIe IP 核的区别与选型,详细解析了 Virtex-7 Gen3 IP 核的数据链路信号(如 m_axis_cq_tdata)、TLP 包处理逻辑及 BAR 空间映射。内容涵盖 IP 核配置参数、Verilog 接口时序示例以及仿真流程,重点说明了下行命令接收与上行数据上传的 DMA 传输机制,为 FPGA 高速通信设计提供参考。

Xilinx 7 系列 FPGA 中三种 PCIe IP 核的区别与选型,详细解析了 Virtex-7 Gen3 IP 核的数据链路信号(如 m_axis_cq_tdata)、TLP 包处理逻辑及 BAR 空间映射。内容涵盖 IP 核配置参数、Verilog 接口时序示例以及仿真流程,重点说明了下行命令接收与上行数据上传的 DMA 传输机制,为 FPGA 高速通信设计提供参考。

| IP 核名称 | 核心特点 | 用户接口 | 开发难度 | 适用场景 |
| 7 Series Integrated Block for PCI Express | 最基础的 PCIe 硬核,提供物理层和数据链路层 | AXI4-Stream TLP 包 | 最高,需处理 TLP 包 | 需深度定制 PCIe 通信,对资源敏感的项目 |
| AXI Memory Mapped To PCI Express | 桥接 IP,将 PCIe 接口转换为 AXI 接口 | AXI4 内存映射 | 中等,类似操作总线 | FPGA 需主动读写主机内存,平衡效率与灵活性 |
| DMA/Bridge Subsystem for PCI Express (XDMA) | 集成 DMA 引擎,提供一站式解决方案 | AXI4 (另有 AXI-Lite 等辅助接口) | 最低,官方提供驱动 | 高速数据批量传输(如采集卡),追求开发效率 |
注意:
分为四组如下:
s_axis_rq_tdata, s_axis_rq_tuserm_axis_rc_tdata, m_axis_rc_tuserm_axis_cq_tdata, m_axis_cq_tusers_axis_cc_tdata, s_axis_cc_tuser举个例子,PC 传输一组波形数据到 FPGA,并且告诉 FPGA 将波形数据从 DAC 发出去,同时将发出去的信号用 ADC 采集回来通过 FPGA 传输给 PC。这个系统包含三个主要功能:
[图片]
阶段一:PC 传输波形数据和命令到 FPGA
m_axis_cq_tdata, m_axis_cq_tuser// PC 写 FPGA 的命令寄存器
// m_axis_cq_tdata: MWr TLP,地址=命令寄存器,数据=START_DAC
// m_axis_cq_tuser: bar_id=0, addr=0x1000(命令寄存器地址)
// PC 连续写 FPGA 的波形缓冲区
// m_axis_cq_tdata: MWr TLP,地址=波形缓冲区,数据=波形样本
// m_axis_cq_tuser: bar_id=1, addr=波形缓冲区偏移地址
always @(posedge clk) begin
if (m_axis_cq_tvalid && m_axis_cq_tready) begin
// 解析 TLP 头,判断是命令还是数据
case (m_axis_cq_tuser[84:80]) // bar_id
5'b00000: cmd_reg <= m_axis_cq_tdata[31:0]; // 命令寄存器
5'b00001: wave_buffer[write_addr] <= m_axis_cq_tdata; // 波形数据
endcase
end
end
阶段二:FPGA 执行 DAC 输出和 ADC 采集
// DAC 控制状态机
always @(posedge clk) begin
case (state)
IDLE: if (cmd_reg == START_DAC) state <= PLAY_WAVE;
PLAY_WAVE: dac_data <= wave_buffer[read_addr]; read_addr <= read_addr + 1;
if (read_addr == WAVE_LENGTH) state <= IDLE;
endcase
end
// 同步 ADC 采集
always @(posedge clk) begin
if (dac_valid) begin
// 与 DAC 输出同步
adc_buffer[write_adc_addr] <= adc_data;
write_adc_addr <= write_adc_addr + 1;
end
end
阶段三:FPGA 上传采集数据到 PC
s_axis_rq_tdata, s_axis_rq_tuser// PC 预先通过配置寄存器告诉 FPGA 主机内存的物理地址
// m_axis_cq_tdata: MWr TLP,地址=DMA 目标地址寄存器
// FPGA 发起存储器写请求
// s_axis_rq_tdata: MWr TLP,地址=主机内存,数据=ADC 采集数据
// s_axis_rq_tuser: sop=1/0, eop=1/0, bar_id=0
// DMA 状态机
always @(posedge clk) begin
if (dma_start && s_axis_rq_tready) begin
s_axis_rq_tvalid <= 1'b1;
s_axis_rq_tdata <= {tlp_header, adc_buffer[dma_addr]};
s_axis_rq_tuser <= {sop, eop, 3'b000}; // bar_id=0
if (eop) dma_addr <= 0; else dma_addr <= dma_addr + 1;
end
end
[图片] [图片] [图片]
m_axis_cq_tdata/user:下行通道,接收命令和波形数据s_axis_rq_tdata/user:上行通道,上传采集数据s_axis_cc_tdata/user:状态查询响应m_axis_rc_tdata/user:留作未来功能扩展以下行通道为例:当 FPGA 接收来自 PC 的命令和波形数据时,m_axis_cq_tuser 提供了解析 TLP 包所需的全部元数据。
// m_axis_cq_tuser 结构 (位宽因 IP 核版本而异,通常~180bit)
{
// 1. 包边界控制 (最重要的字段)
sop, // [0] Start of Packet - TLP 开始
eop, // [1] End of Packet - TLP 结束
// 2. 地址空间识别
bar_id, // [5:0] 来自哪个 BAR 空间
bar_hit, // [6:0] BAR 命中指示
// 3. 字节级控制
first_be, // [3:0] 第一个 DW 的字节使能
last_be, // [3:0] 最后一个 DW 的字节使能
// 4. 传输控制
discontinue, // 提前终止指示
tkeep, // 字节有效掩码 (独立信号,有时在 tuser 中)
// 5. 事务信息
is_sop0_ptr, // SOP0 指针
is_sop1_ptr, // SOP1 指针
// 6. 错误和状态
err, // 错误指示
parity // 奇偶校验
}
// 解析主机写请求的 Verilog 代码片段
always @(posedge clk) begin
if (m_axis_cq_tvalid && m_axis_cq_tready) begin
// 检查 TLP 包开始
if (m_axis_cq_tuser[0]) begin // sop=1
// 解析 BAR 空间,决定数据路由
case (m_axis_cq_tuser[5:3]) // bar_id 部分位
3'b000: begin // BAR0 - 命令寄存器
cmd_address <= m_axis_cq_tdata[63:32];
current_transfer <= COMMAND;
end
3'b001: begin // BAR1 - 波形数据缓冲区
wave_address <= m_axis_cq_tdata[63:32];
current_transfer <= WAVE_DATA;
end
endcase
// 保存字节使能信息
first_byte_enable <= m_axis_cq_tuser[15:12];
end
// 处理数据
if (current_transfer == WAVE_DATA) begin
// 根据 byte_enable 处理数据
process_wave_data(m_axis_cq_tdata, m_axis_cq_tuser[15:12], first_be,
m_axis_cq_tuser[19:16]); // last_be
end
// 检查 TLP 包结束
if (m_axis_cq_tuser[1]) begin // eop=1
current_transfer <= IDLE;
generate_completion_if_needed();
end
end
end
[图片]
由于是仿真,基本都是默认。
[图片] [图片] [图片] [图片] [图片]
[图片]
Open IP Example design......Run Simulation......Run Behavioral Simulation,注意:180 多 us 才出结果。
[图片]
Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3 Product Guide (PG023)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online