JDWA 技术文档
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
  • 数据库

    • 数据库教程
    • MySQL免安装版使用指南
    • MySQL性能优化实践
    • Redis入门与实践
    • MinIO快速部署指南
    • MinIO基础使用教程
  • 前端开发

    • 前端开发教程
    • Vue.js开发最佳实践
    • CSS常用技巧与解决方案
    • JavaScript实用技巧与编程模式
    • CSS Grid布局教程
  • 后端开发

    • 后端开发教程
    • Spring Boot实战指南
    • Node.js Express 框架开发实战指南
    • Python Flask 框架开发指南
  • 开发工具

    • 开发工具教程
    • Git 基础教程
    • Git工作流实践指南
    • VS Code 全面使用指南
    • VS Code必装插件推荐
    • Docker基础入门
    • IntelliJ IDEA 使用技巧
    • Eclipse配置与优化
    • Sublime Text 高级技巧
    • Vim 从入门到精通
    • Maven 详解
    • Gradle 入门与进阶
    • Webpack 配置指南
    • npm 与 yarn 使用技巧
    • Makefile 编写指南
    • Navicat 使用指南
    • MCP本地部署教程
  • 虚拟化技术

    • JDWA虚拟化技术专题
    • KVM虚拟机去虚拟化技术详解
  • KVM显卡直通

    • KVM显卡GPU直通教程
  • FPGA仿真固件

    • FPGA仿真固件开发指南
    • 基础-完整设备仿真定制固件开发指南
    • 中级-完整设备仿真定制固件开发指南
    • 高级-完整设备仿真定制固件开发指南

完整设备仿真定制固件开发指南 -- 基础概念

原项目:JPShag/PCILEECH-DMA-FW-Guide-2.0

前言

对于那些想要学习的人,你们选择了真正启迪的道路。你们用本指南所构建的东西将超越这些人能想象的一切。你们正在走向卓越,我们将一起超越他们所建立的失败。

第1部分:基础概念

1. 介绍

1.1 本指南的目的

本指南的主要目的是提供一种分步方法,开发用于基于FPGA设备的自定义直接内存访问(DMA)固件,以准确仿真PCIe硬件。这使得能够实现硬件测试、系统调试、安全研究和硬件仿真等应用。

通过遵循本指南,您将学习如何:

  • 从捐赠设备收集必要信息
  • 定制固件以仿真特定的硬件设备
  • 使用Vivado和Visual Studio Code等工具设置开发环境
  • 了解与PCIe和DMA操作相关的关键概念

1.2 目标受众

本指南适用于:

  • 固件开发人员:对创建用于硬件仿真、测试或绕过硬件限制的自定义固件感兴趣的工程师。
  • 硬件工程师:需要仿真特定设备进行硬件测试和开发的专业人员。
  • 安全研究人员:进行漏洞评估、恶意软件分析或需要硬件仿真的安全测试的个人。
  • FPGA爱好者:对FPGA定制和低级硬件仿真感兴趣的爱好者和学习者。

1.3 如何使用本指南

本指南分为三个部分:

  • 第1部分:基础概念:涵盖开始设备仿真所需的基本概念、设置和初始步骤的固件开发。
  • 第2部分:中级概念与实现:深入讨论更复杂的主题,如高级固件定制、TLP仿真和初始调试技术。
  • 第3部分:高级技术与优化:探索高级调试、故障排除、优化策略和最佳实践。

建议按照指南的顺序进行,以建立牢固的理解,然后再处理高级主题。

2. 关键定义

理解术语对于有效地遵循本指南至关重要。以下是与PCIe、DMA和设备仿真相关的关键定义:

  • DMA(直接内存访问):一种允许硬件设备直接从系统内存读取或写入数据的功能,无需CPU干预,实现高速数据传输。
  • TLP(事务层数据包):PCIe架构中的基本通信单位,封装控制和数据信息。
  • BAR(基地址寄存器):PCIe设备中的寄存器,定义内存和I/O地址区域,将设备内存映射到系统内存空间。
  • FPGA(现场可编程门阵列):一种可重配置的集成电路,可编程以执行特定的硬件功能。
  • MSI/MSI-X(消息信号中断):PCIe设备用于向CPU发送中断的机制,无需使用传统的中断线。
  • 设备序列号(DSN):与特定设备关联的唯一标识符,通常用于高级设备识别。
  • PCIe配置空间:标准化的内存区域,PCIe设备在其中提供关于自身的信息并配置操作参数。
  • 捐赠设备:用于提取配置和识别详细信息以在FPGA上仿真其行为的PCIe硬件设备。

3. 设备兼容性

3.1 支持的基于FPGA的硬件

虽然本指南主要关注 Squirrel DMA (35T) 卡,因为它易于获取,但这些方法也可适用于其他基于FPGA的DMA硬件:

  • Squirrel (35T)
    • 描述:经济实惠的基于FPGA的DMA设备,适用于标准内存获取和设备仿真。
  • Enigma-X1 (75T)
    • 描述:中端FPGA,提供增强的资源,适合更高要求的内存操作。
  • ZDMA (100T)
    • 描述:高性能FPGA,针对快速内存交互进行了优化,适用于广泛的内存读/写。
  • Kintex-7
    • 描述:高级FPGA,具有强大的功能,适用于复杂项目和大规模DMA解决方案。

3.2 PCIe硬件注意事项

为了确保平滑的仿真,必须解决多个PCIe特定功能:

  • IOMMU/VT-d设置
    • 建议:禁用IOMMU(Intel的VT-d)或AMD的等效功能,以允许不受限制的DMA访问。
    • 理由:IOMMU可能会限制DMA操作,可能会干扰内存获取和仿真。
  • 内核DMA保护
    • 建议:在现代系统中禁用内核DMA保护功能。
    • 步骤:
      • Windows:在BIOS/UEFI设置中禁用安全启动或基于虚拟化的安全性(VBS)等功能。
      • 注意:禁用这些功能可能会使系统暴露于安全风险中;确保您在安全的环境中操作。
  • PCIe插槽要求
    • 建议:使用与FPGA设备要求匹配的兼容PCIe插槽(例如,x1、x4)。
    • 理由:确保与主机系统的最佳性能和兼容性。

3.3 系统要求

  • 主机系统
    • 处理器:多核CPU(Intel i5/i7或AMD等效)
    • 内存:至少16 GB RAM
    • 存储:至少有100 GB可用空间的SSD
    • 操作系统:Windows 10/11(64位)或兼容的Linux发行版
  • 外围设备
    • JTAG编程器:用于将固件烧录到FPGA
    • PCIe插槽:确保主机系统有一个兼容DMA卡的可用PCIe插槽

4. 要求

4.1 硬件

  • 捐赠PCIe设备
    • 目的:用于仿真提取设备ID和配置数据的来源。
    • 示例:网络适配器、存储控制器或任何未使用的通用PCIe卡。
  • DMA FPGA卡
    • 描述:能够执行DMA操作的基于FPGA的设备。
    • 示例:Squirrel (35T)、Enigma-X1 (75T)、ZDMA (100T)、Kintex-7
  • JTAG编程器
    • 目的:用于将固件烧录到FPGA上。
    • 示例:Xilinx Platform Cable USB II、Digilent JTAG-HS3

4.2 软件

  • Xilinx Vivado设计套件
    • 描述:用于综合和构建固件项目的FPGA开发软件。
    • 下载:Xilinx Vivado
  • Visual Studio Code
    • 描述:用于编辑Verilog或VHDL代码的代码编辑器。
    • 下载:Visual Studio Code
  • PCILeech-FPGA
    • 描述:用于DMA固件开发的代码库和基础代码。
    • 代码库:PCILeech-FPGA在GitHub上
  • Arbor
    • 描述:用于收集设备信息的PCIe设备扫描工具。
    • 下载:Arbor by MindShare
    • 注意:需要创建账户;提供14天试用。
  • 替代工具
    • Telescan PE
      • 描述:作为Arbor替代的PCIe流量分析工具。
      • 下载:Teledyne LeCroy Telescan PE
      • 注意:免费但需要手动注册批准。

4.3 环境设置

4.3.1 安装Xilinx Vivado设计套件
  • 步骤:
    1. 访问 Xilinx Vivado下载页面
    2. 下载与您的FPGA设备兼容的适当版本
    3. 运行安装程序并按照屏幕指示进行操作
    4. 在安装过程中选择必要的组件
    5. 启动Vivado以确保正确安装
4.3.2 安装Visual Studio Code
  • 步骤:
    1. 访问 Visual Studio Code下载页面
    2. 下载并安装适用于您的操作系统的版本
    3. 安装支持Verilog或VHDL的扩展(例如,Verilog-HDL/SystemVerilog)
4.3.3 克隆PCILeech-FPGA代码库
  • 步骤:
    1. 打开终端或命令提示符
    2. 导航到您想要的目录:
      cd ~/Projects/
      
    3. 克隆代码库:
      git clone https://github.com/ufrisk/pcileech-fpga.git
      
    4. 进入克隆的目录:
      cd pcileech-fpga
      
4.3.4 设置干净的开发环境
  • 建议:在隔离的环境中工作,以防止意外的交互
  • 步骤:
    1. 使用专用的开发机器或虚拟机
    2. 确保没有其他应用程序干扰PCIe操作或FPGA编程

5. 收集捐赠设备信息

准确的设备仿真依赖于仔细提取并复制捐赠设备的关键信息。全面的数据收集使您的FPGA能够忠实地模仿目标硬件的PCIe配置和行为,确保与主机系统的兼容性和功能。

5.1 使用Arbor进行PCIe设备扫描

Arbor 是一款功能强大且用户友好的工具,专为深入扫描PCIe设备而设计。它提供了连接硬件的配置空间的详细见解,使其成为提取设备仿真所需信息的宝贵资源。

5.1.1 安装Arbor

要开始使用Arbor进行设备扫描,您必须首先在系统上安装该软件。

  • 步骤:
    1. 访问Arbor下载页面:
      • 使用您的首选浏览器,导航到官方 Arbor下载页面
      • 确保您直接访问该网站,以避免任何恶意重定向
    2. 创建账户(如果需要):
      • Arbor可能需要您创建用户账户以访问下载链接
      • 提供必要的信息,例如您的姓名、电子邮件地址和组织
      • 如果提示,请验证您的电子邮件以激活账户
    3. 下载Arbor:
      • 登录后,找到Arbor的下载部分
      • 选择与您的操作系统兼容的版本(例如,Windows 10/11 64位)
      • 点击下载按钮,将安装程序保存到计算机上的已知位置
    4. 安装Arbor:
      • 找到下载的安装程序文件(例如,ArborSetup.exe)
      • 右键单击安装程序,选择以管理员身份运行,以确保其具有必要的权限
      • 按照屏幕上的指示完成安装过程:
        • 接受许可协议
        • 选择安装目录
        • 如果需要,可选择创建桌面快捷方式
    5. 验证安装:
      • 完成后,确保Arbor列在您的开始菜单或桌面上
      • 启动Arbor,确认其无错误打开
5.1.2 扫描PCIe设备

安装Arbor后,您可以继续扫描系统中连接的PCIe设备。

  • 步骤:
    1. 启动Arbor:
      • 双击桌面上的Arbor图标,或通过开始菜单找到它
      • 如果用户帐户控制(UAC)提示,请允许应用程序对您的设备进行更改
    2. 导航到本地系统选项卡:
      • 在Arbor界面中,找到导航窗格或选项卡
      • 点击Local System以访问扫描本地计算机的工具
    3. 扫描PCIe设备:
      • 找到通常位于界面顶部或底部的Scan或Rescan按钮
      • 点击Scan/Rescan以启动检测过程
      • 等待扫描过程完成;根据连接的设备数量,这可能需要一些时间
    4. 查看检测到的设备:
      • 扫描完成后,Arbor将显示所有检测到的PCIe设备列表
      • 设备通常以其名称、设备ID和其他识别信息列出
5.1.3 识别捐赠设备

正确识别捐赠设备对于准确的仿真至关重要。

  • 步骤:
    1. 在列表中找到您的捐赠设备:
      • 滚动浏览Arbor检测到的设备列表
      • 查找与您的捐赠硬件型号匹配的设备
      • 设备可能按供应商名称、设备类型或功能列出
    2. 验证设备详细信息:
      • 点击设备以选择它
      • 确认设备ID和供应商ID与您的捐赠设备匹配
        • 提示:这些ID通常可以在设备的文档或制造商的网站上找到
    3. 查看详细配置:
      • 选择设备后,找到并点击查看详细信息或属性等选项
      • 这将打开一个详细视图,显示设备的配置空间和功能
    4. 与物理硬件进行交叉引用:
      • 如果列出了多个类似的设备,请将插槽编号或总线地址与安装捐赠设备的物理插槽进行比较
5.1.4 捕获设备数据

从捐赠设备中提取详细信息对于准确的仿真至关重要。

要提取的信息:

  • 设备ID (0xXXXX):

    • 一个唯一的16位设备型号标识符
  • 供应商ID (0xYYYY):

    • 分配给制造商的16位标识符
  • 子系统ID (0xZZZZ):

    • 标识特定的子系统或变体
  • 子系统供应商ID (0xWWWW):

    • 标识子系统的供应商
  • 修订ID (0xRR):

    • 指示设备的修订级别
  • 类代码 (0xCCCCCC):

    • 定义设备类型的24位代码(例如,网络控制器、存储设备)
  • 基地址寄存器 (BARs):

    • 定义设备使用的内存或I/O空间的寄存器
    • 包括BAR0到BAR5,每个可能为32位或64位
  • 功能:

    • 列出支持的功能,如MSI/MSI-X、电源管理、PCIe链路速度和宽度
  • 设备序列号 (DSN):

    • 如果设备支持,则为64位唯一标识符
  • 步骤:

    1. 导航到PCI配置选项卡:
      • 在设备的详细视图中,找到并选择PCI Config或Configuration Space选项卡
    2. 记录相关细节:
      • 仔细记录每个所需的字段
      • 为了准确性,可以使用截图或将值复制到文本文件或电子表格中
      • 确保十六进制值记录正确,包括 0x 前缀(如果使用)
    3. 展开功能列表:
      • 查找标记为Capabilities或Advanced Features的部分
      • 记录每个功能及其参数(例如,MSI数量、支持的电源状态)
    4. 详细检查BARs:
      • 对于每个BAR,注意:
        • BAR编号(例如,BAR0)
        • 类型(内存或I/O)
        • 位宽(32位或64位)
        • 大小(例如,256 MB)
        • 可预取状态(是/否)
    5. 保存数据以供参考:
      • 将所有信息编入组织良好的文档中
      • 清晰地标记每个部分,便于在固件定制期间参考
    6. 仔细检查条目:
      • 重新检查所有记录的数据以确保准确性
      • 通过重新访问Arbor界面,纠正任何差异

6. 初始固件定制

在详细记录了捐赠设备的信息后,下一步是定制您的FPGA固件,以准确仿真捐赠设备。这涉及修改PCIe配置空间,并确保内存映射正确对齐。

6.1 修改配置空间

PCIe配置空间是定义设备如何被识别和与主机系统交互的关键组件。将此空间定制为匹配捐赠设备对于成功的仿真至关重要。

6.1.1 导航到配置文件

配置空间在您的项目中定义在特定的SystemVerilog(.sv)文件中。

路径:

  • 标准路径:

    pcileech-fpga/pcileech-wifi-main/src/pcileech_pcie_cfg_a7.sv
    
  • 备用路径(取决于目录结构):

    pcileech-fpga/src/pcileech_pcie_cfg_a7.sv
    

注意:

  • 确保您位于正确的项目目录中
  • 文件名可能会根据FPGA型号略有变化(例如,_a7表示Artix-7系列)

6.1.2 在Visual Studio Code中打开文件

编辑配置文件需要一个支持SystemVerilog语法高亮的合适代码编辑器。

步骤:

  1. 启动Visual Studio Code:
    • 点击VS Code图标,或通过开始菜单找到它
  2. 打开文件:
    • 使用文件 > 打开文件,或按Ctrl + O
    • 导航到上述的配置文件路径
    • 选择pcileech_pcie_cfg_a7.sv,然后点击打开
  3. 验证语法高亮:
    • 确保编辑器识别.sv文件扩展名
    • 如果需要,安装支持SystemVerilog的扩展
  4. 熟悉文件结构:
    • 滚动浏览文件,了解现有的赋值和注释
    • 查找定义配置寄存器的部分

6.1.3 修改设备ID和供应商ID

更新这些标识符对于主机系统将仿真设备识别为捐赠设备至关重要。

步骤:

  1. 搜索cfg_deviceid:

    • 使用搜索功能(Ctrl + F)
    • 找到定义cfg_deviceid的行
  2. 更新设备ID:

    cfg_deviceid <= 16'hXXXX;  // 用捐赠设备的设备ID替换XXXX
    

    示例:

    cfg_deviceid <= 16'h1234;  // 如果捐赠设备的设备ID是0x1234
    
  3. 搜索cfg_vendorid:

    • 找到定义cfg_vendorid的行
  4. 更新供应商ID:

    cfg_vendorid <= 16'hYYYY;  // 用捐赠设备的供应商ID替换YYYY
    

    示例:

    cfg_vendorid <= 16'hABCD;  // 如果捐赠设备的供应商ID是0xABCD
    
  5. 确保正确的格式:

    • 确认十六进制值以16'h为前缀
    • 保持一致的缩进和注释风格

6.1.4 修改子系统ID和修订ID

这些标识符提供有关设备变体和硬件修订的其他详细信息。

步骤:

  1. 搜索cfg_subsysid:

    • 找到定义cfg_subsysid的行
  2. 更新子系统ID:

    cfg_subsysid <= 16'hZZZZ;  // 用捐赠设备的子系统ID替换ZZZZ
    

    示例:

    cfg_subsysid <= 16'h5678;  // 如果捐赠设备的子系统ID是0x5678
    
  3. 搜索cfg_subsysvendorid:

    • 找到定义cfg_subsysvendorid的行
  4. 更新子系统供应商ID(如果适用):

    cfg_subsysvendorid <= 16'hWWWW;  // 用捐赠设备的子系统供应商ID替换WWWW
    

    示例:

    cfg_subsysvendorid <= 16'h9ABC;  // 如果捐赠设备的子系统供应商ID是0x9ABC
    
  5. 搜索cfg_revisionid:

    • 找到定义cfg_revisionid的行
  6. 更新修订ID:

    cfg_revisionid <= 8'hRR;   // 用捐赠设备的修订ID替换RR
    

    示例:

    cfg_revisionid <= 8'h01;  // 如果捐赠设备的修订ID是0x01
    

6.1.5 更新类代码

类代码告知主机设备的类型和功能。

步骤:

  1. 搜索cfg_classcode:

    • 找到定义cfg_classcode的行
  2. 更新类代码:

    cfg_classcode <= 24'hCCCCCC;  // 用捐赠设备的类代码替换CCCCCC
    

    示例:

    cfg_classcode <= 24'h020000;  // 如果捐赠设备的类代码是0x020000(以太网控制器)
    
  3. 验证正确的位宽:

    • 确保类代码是24位值
    • 十六进制值应以24'h为前缀

6.1.6 保存更改

在进行所有修改后,保存并查看更改非常重要。

步骤:

  1. 保存文件:

    • 点击文件 > 保存,或按Ctrl + S
  2. 查看更改:

    • 重新阅读修改的行以确认准确性
    • 检查是否有任何语法错误或拼写错误
  3. 可选 - 使用版本控制:

    • 如果使用Git或其他版本控制系统,用有意义的消息提交您的更改
    git add pcileech_pcie_cfg_a7.sv
    git commit -m "更新PCIe配置,包含捐赠设备标识符"
    

6.2 插入设备序列号(DSN)

设备序列号(DSN)是某些设备用于高级功能的唯一标识符。包括它可增强仿真的真实性。

6.2.1 找到DSN字段

DSN通常在同一配置文件中定义。

步骤:

  1. 搜索cfg_dsn:

    • 在pcileech_pcie_cfg_a7.sv中,使用搜索功能(Ctrl + F)查找cfg_dsn
  2. 了解现有赋值:

    • DSN可能设置为默认值或清零
    cfg_dsn <= 64'h0000000000000000;  // 默认DSN
    

6.2.2 插入DSN

更新DSN涉及将其设置为捐赠设备的确切值。

步骤:

  1. 更新cfg_dsn:

    cfg_dsn <= 64'hXXXXXXXX_YYYYYYYY;  // 用捐赠设备的DSN替换
    

    示例:

    cfg_dsn <= 64'h0011223344556677;  // 如果捐赠设备的DSN是0x0011223344556677
    
  2. 处理DSN不可用的情况:

    • 如果捐赠设备没有DSN或不需要DSN,将其设置为零:
    cfg_dsn <= 64'h0000000000000000;  // 无DSN
    
  3. 确保正确的格式:

    • DSN是一个64位值;确保其格式正确
    • 对十六进制值使用64'h前缀
  4. 添加注释以增加清晰度:

    • 包括一条注释,指明DSN的来源
    cfg_dsn <= 64'h0011223344556677;  // 捐赠设备的DSN
    

6.2.3 保存更改

通过保存和查看,完成修改。

步骤:

  1. 保存文件:
    • 点击文件 > 保存,或按Ctrl + S
  2. 验证语法:
    • 查找编辑器中的任何红色下划线或错误指示
    • 在继续之前,纠正任何问题
  3. 记录更改:
    • 如果使用版本控制,请用适当的消息提交更新
    git commit -am "在配置中插入捐赠设备的序列号(DSN)"
    

7. Vivado项目设置和定制

在将固件文件更新为反映捐赠设备的配置后,下一步是将这些更改集成到Vivado项目中。这涉及生成项目文件、定制IP核,并为综合和实现准备设计。

7.1 生成Vivado项目文件

Vivado使用Tcl脚本自动创建和配置项目。通过运行这些脚本,您可以确保所有设置都根据您的FPGA设备正确应用。

7.1.1 打开Vivado

从一个新的Vivado会话开始,确保先前的设置或项目不会干扰您当前的工作。

步骤:

  1. 启动Vivado:
    • 在开始菜单或桌面上找到Vivado应用程序
    • 点击打开它
  2. 选择正确的版本:
    • 如果安装了多个版本,确保您使用的版本与您的FPGA兼容(例如,Vivado 2020.1)
  3. 等待启动屏幕:
    • 允许Vivado完全初始化,然后再继续

7.1.2 访问Tcl控制台

Tcl控制台允许您直接执行脚本和命令。

步骤:

  1. 打开Tcl控制台:
    • 在Vivado界面中,转到菜单栏
    • 点击窗口 > Tcl控制台
    • Tcl控制台将出现在窗口底部
  2. 调整控制台大小(可选):
    • 拖动控制台的顶部边框,以调整其大小,便于查看
  3. 清除先前的命令:
    • 如果存在任何命令,您可以清除它们,以便干净地开始

7.1.3 导航到项目目录

确保Tcl控制台指向您的项目脚本所在的正确目录。

对于Squirrel DMA(35T):

路径:

  • 您的项目目录,通常是:
    C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-wifi-main/
    

步骤:

  1. 设置工作目录:
    • 在Tcl控制台中输入:
      cd C:/Users/YourUsername/Documents/pcileech-fpga/pcileech-wifi-main/
      
    • 用您系统上的实际位置替换路径
  2. 验证目录更改:
    • 在Tcl控制台中输入pwd
    • 控制台应显示当前目录,确认更改

7.1.4 生成Vivado项目

运行适当的Tcl脚本将设置项目,包含所有必要的配置。

步骤:

  1. 运行Tcl脚本:
    • 对于Squirrel(35T):
      source vivado_generate_project_squirrel.tcl -notrace
      
    • 对于Enigma-X1(75T):
      source vivado_generate_project_enigma_x1.tcl -notrace
      
    • 对于ZDMA(100T):
      source vivado_generate_project_100t.tcl -notrace
      
  2. 等待脚本完成:
    • 该脚本将执行多个命令:
      • 创建项目
      • 添加源文件
      • 配置项目设置
    • 监视Tcl控制台的进度消息
    • 解决可能出现的任何错误,例如缺少文件或路径不正确
  3. 确认项目生成:
    • 完成后,控制台将指示项目已创建
    • 项目文件(.xpr和相关目录)将出现在项目目录中

7.1.5 打开生成的项目

现在项目已生成,您可以在Vivado中打开它以进行进一步的定制。

步骤:

  1. 打开项目:
    • 在Vivado中,点击文件 > 打开项目
    • 导航到您的项目目录
  2. 选择项目文件:
    • 对于Squirrel:
      pcileech_squirrel_top.xpr
      
    • 点击.xpr文件以选择它
  3. 点击打开:
    • Vivado将加载项目,显示设计层次结构和源文件
  4. 验证项目内容:
    • 在项目管理器窗口中,确保所有源文件都列出
    • 检查打开时是否有任何警告或错误

7.2 修改IP模块

PCIe IP核是一个关键组件,必须配置以匹配捐赠设备的规格。定制IP核可确保FPGA在PCIe协议级别与捐赠硬件的行为相同。

7.2.1 访问PCIe IP核

PCIe IP核是在您的Vivado项目中实例化的IP模块。

步骤:

  1. 找到PCIe IP核:
    • 在源文件窗格中,确保选择了层次结构选项卡
    • 展开设计层次结构,找到PCIe IP核
      • 通常命名为pcie_7x_0.xci或类似名称
  2. 打开IP定制窗口:
    • 右键点击pcie_7x_0.xci
    • 从上下文菜单中选择定制IP
    • IP配置窗口将打开
  3. 等待IP设置加载:
    • IP定制界面可能需要一些时间初始化
    • 在继续之前,确保所有选项和选项卡都已完全加载

7.2.2 定制设备ID和BARs

在IP核中配置设备标识符对于主机系统正确枚举设备至关重要。

步骤:

  1. 导航到设备和供应商标识符:
    • 在IP定制窗口中,选择设备和供应商标识符选项卡或部分
  2. 输入设备ID:
    • 找到标记为Device ID的字段
    • 输入捐赠设备的设备ID(例如,0x1234)
  3. 输入供应商ID:
    • 找到Vendor ID字段
    • 输入捐赠设备的供应商ID(例如,0xABCD)
  4. 输入子系统ID和子系统供应商ID:
    • 输入Subsystem ID(例如,0x5678)
    • 输入Subsystem Vendor ID(例如,0x9ABC)
  5. 设置修订ID:
    • 输入Revision ID(例如,0x01)
  6. 设置类代码:
    • 输入Class Code(例如,0x020000用于以太网控制器)
  7. 配置其他标识符(如果可用):
    • 一些IP核允许设置编程接口、设备功能等
    • 根据需要将其与捐赠设备匹配

7.2.3 配置BAR大小

BAR定义了设备如何将其内部内存和寄存器映射到主机系统。

步骤:

  1. 导航到基地址寄存器(BARs):
    • 在IP定制窗口中,选择BARs选项卡或部分
  2. 配置每个BAR:
    • 对于BAR0到BAR5,根据捐赠设备设置以下参数:
      • 启用BAR:选中或取消选中以匹配捐赠设备
      • BAR大小:从下拉列表中选择大小(例如,256 MB、64 KB)
      • BAR类型:
        • 内存(32位寻址)
        • 内存(64位寻址)
        • I/O
      • 可预取:如果捐赠设备的BAR可预取,则选中
  3. 示例配置:
    • BAR0:
      • 已启用
      • 大小:256 MB
      • 类型:内存(64位)
      • 可预取:是
    • BAR1:
      • 已禁用(如果捐赠设备不使用BAR1)
  4. 确保对齐和不重叠空间:
    • 确认映射的总内存不超过FPGA的能力
    • 确保BAR大小符合PCIe规范要求
  5. 高级设置(如果适用):
    • 某些设备可能有特殊要求,如扩展ROM BAR
    • 如果必要,配置这些设置

7.2.4 完成IP定制

在配置所有必要的设置后,您需要应用更改。

步骤:

  1. 审查所有设置:
    • 浏览IP定制窗口中的每个选项卡
    • 确认所有条目与捐赠设备的规格相匹配
  2. 应用更改:
    • 点击OK或Generate以应用设置
    • 如果提示,确认您希望继续更改
  3. 重新生成IP核:
    • Vivado将重新生成IP核以反映新配置
    • 监视消息窗格以获取任何错误或警告
  4. 更新项目中的IP:
    • 确保更新的IP核已正确集成到您的项目中
    • Vivado可能会提示更新IP依赖项;允许其执行此操作

7.2.5 锁定IP核

锁定IP核可防止在综合和实现期间的意外更改。

目的:

  • 防止覆盖:确保您的手动配置被保留
  • 保持一致性:在整个构建过程中保持IP核处于已知状态

步骤:

  1. 打开Tcl控制台:
    • 在Vivado中,如果尚未打开,转到窗口 > Tcl控制台
  2. 执行锁定命令:
    • 输入以下命令:
      set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
      
    • 按Enter执行
  3. 验证锁定:
    • 检查消息窗格以确认
    • IP核现在应标记为已锁定
  4. 解锁(如有必要):
    • 要在将来进行进一步更改,可以解锁IP核:
      set_property -name {IP_LOCKED} -value false -objects [get_ips pcie_7x_0]
      
    • 记得在进行更改后重新锁定它
  5. 记录操作:
    • 在您的项目文档中注明IP核已被锁定
    • 这有助于团队成员了解项目的配置状态
Prev
FPGA仿真固件开发指南
Next
中级-完整设备仿真定制固件开发指南