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

2025-04-30 15:23   272   0  

完整设备仿真定制固件开发指南

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

目录

第1部分:基础概念

1.介绍

        1.1 本指南的目的

        1.2 目标受众

        1.3 如何使用本指南

2. 关键定义

3. 设备兼容性

    3.1 支持的基于FPGA的硬件

    3.2 PCIe硬件注意事项

    3.3 系统要求

4. 要求

    4.1 硬件

    4.2 软件

    4.3 环境设置

5. 收集捐赠设备信息

    5.1 使用Arbor进行PCIe设备扫描

    5.2 提取和记录设备属性

6. 初始固件定制

    6.1 修改配置空间

    6.2 插入设备序列号(DSN)

7. Vivado项目设置和定制

    7.1 生成Vivado项目文件

    7.2 修改IP模块

第2部分:中级概念与实现

高级固件定制

    8.1 为仿真配置PCIe参数

    8.2 调整BAR和内存映射

    8.3 仿真设备电源管理和中断

仿真设备特定功能

    9.1 实现高级PCIe功能

    9.2 仿真供应商特定特性

事务层数据包(TLP)仿真

    10.1 理解和捕获TLP

    10.2 为特定操作制作自定义TLP

第3部分:高级技术与优化

构建、烧录和测试

    11.1 综合与实现

    11.2 烧录比特流

    11.3 测试与验证

高级调试技术

    12.1 使用Vivado的集成逻辑分析器

    12.2 PCIe流量分析工具

故障排除

    13.1 设备检测问题

    13.2 内存映射和BAR配置错误

    13.3 DMA性能和TLP错误

仿真准确性和优化

    14.1 精确计时仿真技术

    14.2 对系统调用的动态响应

固件开发最佳实践

    15.1 持续测试和文档编制

    15.2 管理固件版本

    15.3 安全考虑

其他资源



前言

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


第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下载页面

  • 确保您直接访问该网站,以避免任何恶意重定向。

  1. 创建账户(如果需要)

  • Arbor可能需要您创建用户账户以访问下载链接。

  • 提供必要的信息,例如您的姓名、电子邮件地址和组织。

  • 如果提示,请验证您的电子邮件以激活账户。

  1. 下载Arbor

  • 登录后,找到Arbor的下载部分。

  • 选择与您的操作系统兼容的版本(例如,Windows 10/11 64位)。

  • 点击下载按钮,将安装程序保存到计算机上的已知位置。

  1. 安装Arbor

  • 找到下载的安装程序文件(例如,ArborSetup.exe)。

  • 右键单击安装程序,选择以管理员身份运行,以确保其具有必要的权限。

  • 按照屏幕上的指示完成安装过程。

    • 接受许可协议。

    • 选择安装目录。

    • 如果需要,可选择创建桌面快捷方式。

  1. 验证安装

  • 完成后,确保Arbor列在您的开始菜单或桌面上。

  • 启动Arbor,确认其无错误打开。

5.1.2 扫描PCIe设备

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

步骤

  1. 启动Arbor

  • 双击桌面上的Arbor图标,或通过开始菜单找到它。

  • 如果用户帐户控制(UAC)提示,请允许应用程序对您的设备进行更改。

  1. 导航到本地系统选项卡

  • 在Arbor界面中,找到导航窗格或选项卡。

  • 点击Local System以访问扫描本地计算机的工具。

  1. 扫描PCIe设备

  • 找到通常位于界面顶部或底部的ScanRescan按钮。

  • 点击Scan/Rescan以启动检测过程。

  • 等待扫描过程完成;根据连接的设备数量,这可能需要一些时间。

  1. 查看检测到的设备

  • 扫描完成后,Arbor将显示所有检测到的PCIe设备列表。

  • 设备通常以其名称、设备ID和其他识别信息列出。

5.1.3 识别捐赠设备

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

步骤

  1. 在列表中找到您的捐赠设备

  • 滚动浏览Arbor检测到的设备列表。

  • 查找与您的捐赠硬件型号匹配的设备。

  • 设备可能按供应商名称、设备类型或功能列出。

  1. 验证设备详细信息

  • 点击设备以选择它。

  • 确认设备ID供应商ID与您的捐赠设备匹配。

    • 提示:这些ID通常可以在设备的文档或制造商的网站上找到。

  1. 查看详细配置

  • 选择设备后,找到并点击查看详细信息属性等选项。

  • 这将打开一个详细视图,显示设备的配置空间和功能。

  1. 与物理硬件进行交叉引用

  • 如果列出了多个类似的设备,请将插槽编号总线地址与安装捐赠设备的物理插槽进行比较。

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 ConfigConfiguration Space选项卡。

  1. 记录相关细节

  • 仔细记录每个所需的字段。

  • 为了准确性,可以使用截图或将值复制到文本文件或电子表格中。

  • 确保十六进制值记录正确,包括0x前缀(如果使用)。

  1. 展开功能列表

  • 查找标记为CapabilitiesAdvanced Features的部分。

  • 记录每个功能及其参数(例如,MSI数量、支持的电源状态)。

  1. 详细检查BARs

  • 对于每个BAR,注意:

    • BAR编号(例如,BAR0)

    • 类型(内存或I/O)

    • 位宽(32位或64位)

    • 大小(例如,256 MB)

    • 可预取状态(是/否)

  1. 保存数据以供参考

  • 将所有信息编入组织良好的文档中。

  • 清晰地标记每个部分,便于在固件定制期间参考。

  1. 仔细检查条目

  • 重新检查所有记录的数据以确保准确性。

  • 通过重新访问Arbor界面,纠正任何差异。

5.2 提取和记录设备属性

在捕获数据后,理解每个属性的意义并确保其已被准确记录至关重要。

确保您已准确记录以下内容

  1. 设备ID

  • 目的:唯一标识设备型号。

  • 用途:对于主机操作系统加载正确的驱动程序至关重要。

  1. 供应商ID

  • 目的:标识制造商。

  • 用途:与设备ID一起用于匹配设备驱动程序。

  1. 子系统ID和子系统供应商ID

  • 目的:指定子系统的设备和供应商ID,允许区分变体。

  • 用途:对于具有多种配置或OEM特定版本的设备很重要。

  1. 修订ID

  • 目的:指示硬件修订版本。

  • 用途:有助于识别可能需要不同驱动程序或固件的特定硬件版本。

  1. 类代码

  • 目的:对设备类型进行分类(例如,大容量存储、网络控制器)。

  • 用途:允许操作系统了解设备的主要功能。

  1. 基地址寄存器(BARs)

  • 目的:定义设备将使用的内存或I/O地址区域。

  • 用途:对于将设备内存映射到系统地址空间至关重要。

  1. 功能

  • 目的:列出设备支持的高级功能。

  • 示例

    • MSI/MSI-X:用于高效中断处理的消息信号中断。

    • 电源管理:如D0、D1、D2、D3hot、D3cold状态。

    • PCIe链路速度/宽度:确定数据传输能力。

  1. 设备序列号(DSN)

  • 目的:设备的唯一64位标识符。

  • 用途:用于高级识别,可能是某些驱动程序所必需的。

最佳实践

  • 组织数据

  • 创建一个结构化的文档或电子表格。

  • 使用清晰的标题和子标题标记每个属性。

  • 包括单位和格式

  • 指明大小的单位(例如,MB、KB)。

  • 对十六进制值使用一致的格式(例如,0x1234)。

  • 与规格交叉引用

  • 如果可用,请查阅设备的数据表以验证值。

  • 这有助于识别任何差异或不寻常的配置。

  • 保护数据

  • 安全地存储收集的信息。

  • 注意任何专有或机密信息。


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图标,或通过开始菜单找到它。

  1. 打开文件

  • 使用文件 > 打开文件,或按Ctrl + O

  • 导航到上述的配置文件路径。

  • 选择pcileech_pcie_cfg_a7.sv,然后点击打开

  1. 验证语法高亮

  • 确保编辑器识别.sv文件扩展名。

  • 如果需要,安装支持SystemVerilog的扩展。

  1. 熟悉文件结构

  • 滚动浏览文件,了解现有的赋值和注释。

  • 查找定义配置寄存器的部分。

6.1.3 修改设备ID和供应商ID

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

步骤

  1. 搜索cfg_deviceid

  • 使用搜索功能(Ctrl + F)。

  • 找到定义cfg_deviceid的行。

  1. 更新设备ID

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

       cfg_deviceid <= 16'h1234;
    • 如果捐赠设备的设备ID是0x1234,则更新为:

  1. 搜索cfg_vendorid

  • 找到定义cfg_vendorid的行。

  1. 更新供应商ID

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

       cfg_vendorid <= 16'hABCD;
    • 如果捐赠设备的供应商ID是0xABCD,则更新为:

  1. 确保正确的格式

  • 确认十六进制值以16'h为前缀。

  • 保持一致的缩进和注释风格。

6.1.4 修改子系统ID和修订ID

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

步骤

  1. 搜索cfg_subsysid

  • 找到定义cfg_subsysid的行。

  1. 更新子系统ID

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

       cfg_subsysid <= 16'h5678;
    • 如果捐赠设备的子系统ID是0x5678,则更新为:

  1. 搜索cfg_subsysvendorid

  • 找到定义cfg_subsysvendorid的行。

  1. 更新子系统供应商ID(如果适用)

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

       cfg_subsysvendorid <= 16'h9ABC;
    • 如果捐赠设备的子系统供应商ID是0x9ABC,则更新为:

  1. 搜索cfg_revisionid

  • 找到定义cfg_revisionid的行。

  1. 更新修订ID

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

       cfg_revisionid <= 8'h01;
    • 如果捐赠设备的修订ID是0x01,则更新为:

6.1.5 更新类代码

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

步骤

  1. 搜索cfg_classcode

  • 找到定义cfg_classcode的行。

  1. 更新类代码

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

       cfg_classcode <= 24'h020000;
    • 如果捐赠设备的类代码是0x020000(以太网控制器),则更新为:

  1. 验证正确的位宽

  • 确保类代码是24位值。

  • 十六进制值应以24'h为前缀。

6.1.6 保存更改

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

步骤

  1. 保存文件

  • 点击文件 > 保存,或按Ctrl + S

  1. 查看更改

  • 重新阅读修改的行以确认准确性。

  • 检查是否有任何语法错误或拼写错误。

  1. 可选 - 使用版本控制

  • 如果使用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

  1. 了解现有赋值

  • 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,则更新为:

  1. 处理DSN不可用的情况

  • 如果捐赠设备没有DSN或不需要DSN,将其设置为零:

     cfg_dsn <= 64'h0000000000000000;  // 无DSN
  1. 确保正确的格式

  • DSN是一个64位值;确保其格式正确。

  • 对十六进制值使用64'h前缀。

  1. 添加注释以增加清晰度

  • 包括一条注释,指明DSN的来源。

     cfg_dsn <= 64'h0011223344556677;  // 捐赠设备的DSN

6.2.3 保存更改

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

步骤

  1. 保存文件

  • 点击文件 > 保存,或按Ctrl + S

  1. 验证语法

  • 查找编辑器中的任何红色下划线或错误指示。

  • 在继续之前,纠正任何问题。

  1. 记录更改

  • 如果使用版本控制,请用适当的消息提交更新。

       git commit -am "在配置中插入捐赠设备的序列号(DSN)"
    • 示例


7. Vivado项目设置和定制

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

7.1 生成Vivado项目文件

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

7.1.1 打开Vivado

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

步骤

  1. 启动Vivado

  • 在开始菜单或桌面上找到Vivado应用程序。

  • 点击打开它。

  1. 选择正确的版本

  • 如果安装了多个版本,确保您使用的版本与您的FPGA兼容(例如,Vivado 2020.1)。

  1. 等待启动屏幕

  • 允许Vivado完全初始化,然后再继续。

7.1.2 访问Tcl控制台

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

步骤

  1. 打开Tcl控制台

  • 在Vivado界面中,转到菜单栏。

  • 点击窗口 > Tcl控制台

  • Tcl控制台将出现在窗口底部。

  1. 调整控制台大小(可选)

  • 拖动控制台的顶部边框,以调整其大小,便于查看。

  1. 清除先前的命令

  • 如果存在任何命令,您可以清除它们,以便干净地开始。

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/
    • 用您系统上的实际位置替换路径。

  1. 验证目录更改

  • 在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
  1. 等待脚本完成

  • 该脚本将执行多个命令:

    • 创建项目。

    • 添加源文件。

    • 配置项目设置。

  • 监视Tcl控制台的进度消息。

  • 解决可能出现的任何错误,例如缺少文件或路径不正确。

  1. 确认项目生成

  • 完成后,控制台将指示项目已创建。

  • 项目文件(.xpr和相关目录)将出现在项目目录中。

7.1.5 打开生成的项目

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

步骤

  1. 打开项目

  • 在Vivado中,点击文件 > 打开项目

  • 导航到您的项目目录。

  1. 选择项目文件

  • 对于Squirrel

     pcileech_squirrel_top.xpr
  • 点击.xpr文件以选择它。

  1. 点击打开

  • Vivado将加载项目,显示设计层次结构和源文件。

  1. 验证项目内容

  • 项目管理器窗口中,确保所有源文件都列出。

  • 检查打开时是否有任何警告或错误。

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或类似名称。

  1. 打开IP定制窗口

  • 右键点击pcie_7x_0.xci

  • 从上下文菜单中选择定制IP

  • IP配置窗口将打开。

  1. 等待IP设置加载

  • IP定制界面可能需要一些时间初始化。

  • 在继续之前,确保所有选项和选项卡都已完全加载。

7.2.2 定制设备ID和BARs

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

步骤

  1. 导航到设备和供应商标识符

  • 在IP定制窗口中,选择设备和供应商标识符选项卡或部分。

  1. 输入设备ID

  • 找到标记为Device ID的字段。

  • 输入捐赠设备的设备ID(例如,0x1234)。

  1. 输入供应商ID

  • 找到Vendor ID字段。

  • 输入捐赠设备的供应商ID(例如,0xABCD)。

  1. 输入子系统ID和子系统供应商ID

  • 输入Subsystem ID(例如,0x5678)。

  • 输入Subsystem Vendor ID(例如,0x9ABC)。

  1. 设置修订ID

  • 输入Revision ID(例如,0x01)。

  1. 设置类代码

  • 输入Class Code(例如,0x020000用于以太网控制器)。

  1. 配置其他标识符(如果可用)

  • 一些IP核允许设置编程接口设备功能等。

  • 根据需要将其与捐赠设备匹配。

7.2.3 配置BAR大小

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

步骤

  1. 导航到基地址寄存器(BARs)

  • 在IP定制窗口中,选择BARs选项卡或部分。

  1. 配置每个BAR

  • 对于BAR0BAR5,根据捐赠设备设置以下参数:

    • 启用BAR:选中或取消选中以匹配捐赠设备。

    • BAR大小:从下拉列表中选择大小(例如,256 MB64 KB)。

    • BAR类型

    • 内存(32位寻址)

    • 内存(64位寻址)

    • I/O

    • 可预取:如果捐赠设备的BAR可预取,则选中。

  1. 示例配置

  • BAR0

    • 已启用

    • 大小:256 MB

    • 类型:内存(64位)

    • 可预取:

  • BAR1

    • 已禁用(如果捐赠设备不使用BAR1)

  1. 确保对齐和不重叠空间

  • 确认映射的总内存不超过FPGA的能力。

  • 确保BAR大小符合PCIe规范要求。

  1. 高级设置(如果适用)

  • 某些设备可能有特殊要求,如扩展ROM BAR。

  • 如果必要,配置这些设置。

7.2.4 完成IP定制

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

步骤

  1. 审查所有设置

  • 浏览IP定制窗口中的每个选项卡。

  • 确认所有条目与捐赠设备的规格相匹配。

  1. 应用更改

  • 点击OKGenerate以应用设置。

  • 如果提示,确认您希望继续更改。

  1. 重新生成IP核

  • Vivado将重新生成IP核以反映新配置。

  • 监视消息窗格以获取任何错误或警告。

  1. 更新项目中的IP

  • 确保更新的IP核已正确集成到您的项目中。

  • Vivado可能会提示更新IP依赖项;允许其执行此操作。

7.2.5 锁定IP核

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

目的

  • 防止覆盖:确保您的手动配置被保留。

  • 保持一致性:在整个构建过程中保持IP核处于已知状态。

步骤

  1. 打开Tcl控制台

  • 在Vivado中,如果尚未打开,转到窗口 > Tcl控制台

  1. 执行锁定命令

  • 输入以下命令:

     set_property -name {IP_LOCKED} -value true -objects [get_ips pcie_7x_0]
  • Enter执行。

  1. 验证锁定

  • 检查消息窗格以确认。

  • IP核现在应标记为已锁定。

  1. 解锁(如有必要)

  • 要在将来进行进一步更改,可以解锁IP核:

     set_property -name {IP_LOCKED} -value false -objects [get_ips pcie_7x_0]
  • 记得在进行更改后重新锁定它。

  1. 记录操作

  • 在您的项目文档中注明IP核已被锁定。

  • 这有助于团队成员了解项目的配置状态。

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。