跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

Xilinx PCIe IP 核详解、FPGA 实现及仿真 (Virtex-7)

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

ArchDesign发布于 2026/4/5更新于 2026/5/2031 浏览
Xilinx PCIe IP 核详解、FPGA 实现及仿真 (Virtex-7)

一、Xilinx 几种 IP 核区别

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 等辅助接口)最低,官方提供驱动高速数据批量传输(如采集卡),追求开发效率

注意:

  1. 硬件平台限制:不同系列的 Xilinx FPGA(如 7 系列、UltraScale、Versal)支持的 PCIe 代数和通道数可能不同。在选择 IP 核前,请务必确认您的 FPGA 型号是否支持所需的 PCIe 配置(如 Gen3 x8)。
  2. 资源与性能权衡:XDMA 虽然易用,但会消耗更多的 FPGA 逻辑资源。在资源紧张的设计中需要仔细评估。
  3. 驱动与系统集成:使用 XDMA 或 AXI Memory Mapped IP 时,通常需要配合驱动。XDMA 虽有官方驱动,但据反馈在某些版本下可能存在一些小问题,需要留意。

二、PCIe 介绍及使用

(一)版本说明

  • 工具:Vivado 2016.4
  • 芯片:xc7vx690tffg1157-2
  • PCIe:Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3(相比之前介绍的 7 Series Integrated Block for PCI Express 较新)

(二)数据信号区别

(1)哪几组

分为四组如下:

  • s_axis_rq_tdata, s_axis_rq_tuser
  • m_axis_rc_tdata, m_axis_rc_tuser
  • m_axis_cq_tdata, m_axis_cq_tuser
  • s_axis_cc_tdata, s_axis_cc_tuser
(2)都是啥
1)举例说明

举个例子,PC 传输一组波形数据到 FPGA,并且告诉 FPGA 将波形数据从 DAC 发出去,同时将发出去的信号用 ADC 采集回来通过 FPGA 传输给 PC。这个系统包含三个主要功能:

  1. PC → FPGA:传输 DAC 波形数据
  2. FPGA:控制 DAC 输出并同步 ADC 采集
  3. FPGA → PC:上传 ADC 采集数据

[图片]

阶段一: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=波形缓冲区偏移地址
      
    • FPGA 侧处理:
      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 采集

  • FPGA 内部逻辑:
    // 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
  • 过程:
    • DMA 传输准备:
      // 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
      
    • FPGA 侧 DMA 引擎:
      // 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
      
2)8 个数据链路的使用分析

[图片] [图片] [图片]

3)哪些是必要的
  • 必须使用的 4 个核心链路:
    • m_axis_cq_tdata/user:下行通道,接收命令和波形数据
    • s_axis_rq_tdata/user:上行通道,上传采集数据
  • 推荐使用的 2 个辅助链路:
    • s_axis_cc_tdata/user:状态查询响应
  • 可以暂不使用的 2 个链路:
    • m_axis_rc_tdata/user:留作未来功能扩展
4)tuser 到底是个啥

以下行通道为例:当 FPGA 接收来自 PC 的命令和波形数据时,m_axis_cq_tuser 提供了解析 TLP 包所需的全部元数据。

i. 主要字段详解:
// 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   // 奇偶校验
}
ii. 实际应用示例:
// 解析主机写请求的 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
iii. 关键字段应用场景

[图片]

iv. 重要注意事项
  1. 位宽变化:不同 Xilinx IP 核版本和 PCIe 配置下,tuser 信号的位宽和字段位置可能不同。
  2. 文档参考:必须查阅对应的 PG195 或 PG213 文档获取确切格式。
  3. 字节序:注意 PCIe 的小端字节序,数据在总线上可能需要重新排列。
  4. 对齐要求:first_be/last_be 用于处理非双字对齐的访问。

三、IP 如何配置

(一)配置参数

由于是仿真,基本都是默认。

[图片] [图片] [图片] [图片] [图片]

(二)配置完成

[图片]

四、仿真

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)

目录

  1. 一、Xilinx 几种 IP 核区别
  2. 二、PCIe 介绍及使用
  3. (一)版本说明
  4. (二)数据信号区别
  5. (1)哪几组
  6. (2)都是啥
  7. 1)举例说明
  8. 2)8 个数据链路的使用分析
  9. 3)哪些是必要的
  10. 4)tuser 到底是个啥
  11. i. 主要字段详解:
  12. ii. 实际应用示例:
  13. iii. 关键字段应用场景
  14. iv. 重要注意事项
  15. 三、IP 如何配置
  16. (一)配置参数
  17. (二)配置完成
  18. 四、仿真
  19. 五、参考
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • JDK 版本切换与 SQL Server SSL 连接问题排查
  • Coze AI 智能体平台低代码应用开发全流程指南
  • Streamlit AI 对话界面实现:CSS :has() 选择器与 Flex 布局反转
  • DeepSeek 新手入门:从零掌握 AI 搜索工具
  • GitHub Awesome Copilot 项目解析:社区驱动的 AI 编程助手增强工具库
  • VSCode Copilot 登录失败排查与解决方案
  • 科学家证实高脂饮食致肥胖可能促进癌细胞生长
  • IntelliJ IDEA 下载、安装与配置详解
  • Phi-3-Vision-128K-Instruct 开源镜像:国产昇腾/寒武纪平台适配指南
  • Python 学习路线与经典书籍推荐:从入门到高级开发
  • C++ 关联式容器:map 与 set 详解
  • SpringAI Agent 开发:使用 Agent Skills 进行代码评审
  • AI 绘画提示词大全:从入门到精通的创意指南
  • DeepSeek 中冷启动数据与多阶段训练的作用
  • Linux 进程间通信:匿名管道原理与实现
  • Python 爬虫基础知识与 Requests 库使用指南
  • 底部弹出菜单实现详解:基于 Dialog 与 RecyclerView 的自定义组件
  • AIGC 试用:AI 辅助软件开发流程实践
  • OpenClaw 多节点访问 Gateway 的配置指南
  • 大模型本地部署指南:基于 llama.cpp 在 CPU 上运行 LLaMA2

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online