PCIe数据采集系统详解

PCIe数据采集系统详解

        在上篇文章中,废了老大劲儿我们写出了PCIe数据采集系统;其中各个模块各司其职,相互配合。完成了从数据采集到高速存储到DDR3的全过程。今天我们呢就来详细讲解他们之间的关系?以及各个模块的关键点?他们到底是怎么协同工作的?

总体模块图


各模块关键点

1. 在第一个时钟管理模块

有用到:差分时钟缓冲器,MMCM,全局时钟缓冲器

差分时钟缓冲器将PCIe的差分信号转换为单端信号展示,输出但不单列;

MMCM产生 pcie_user_clk_bufg 和 ddr3_user_clk_bufg ,同时产生 pll_locked锁存;

全局时钟缓冲器将pcie_user_clk_bufg 和 ddr3_user_clk_bufg原语应用于全局网络并输出相应信号;


2.在第二个系统控制模块

其主要目的是实现将异步复位信号同步,输出三个复位信号(系统,PCIe,DDR3;均使用了两个同步寄存器打拍同时配合PLL锁存信号)优势有以下:

  1. 消除亚稳态风险,提高系统稳定性。
  2. 简化时序分析,降低设计实现难度。
  3. 精确控制复位释放时序,确保多时钟域系统协调工作。
  4. 增强抗干扰能力,避免复位毛刺引发的问题。

在该模块体现为:确保 PCIe 模块在其专用时钟(pcie_user_clk)稳定后同步释放复位,避免 PCIe 链路初始化错误;控制 DDR3 控制器的复位时序,配合 DDR3 初始化校准流程(init_calib_complete信号),确保内存控制器正确启动。

并且该模块输入一些系统标志如:pcie_perst_n(PCIe物理层复位);init_calib_complete(DDR3初始化完成标志)等,以供相应模块使用,在本系统控制模块未处理,但是经由属于系统的控制部分所以列出。

接收系统状态和错误标志,通过 LED 实时显示


3.第三个PCIe模块

出现了user_clk(125M)user_clk(125M)user_clk(125M)use从r_clk(125M

必须与第一个时钟管理模块进行区分的是:pcie_user_clk(125M);

  • pcie_user_clk 是系统为 PCIe 模块提供的时钟源。
  • user_clk 是 PCIe IP 核向用户逻辑输出的同步时钟,确保数据在用户逻辑和 PCIe 之间正确传输。
  • user_clk的特殊作用PCIe IP 核内部会根据链路状态(如 Gen1/Gen2/Gen3)动态调整时钟相位和频率user_clk是 IP 核内部同步后的时钟,确保与 PCIe 事务时序(非事务层)严格对齐。

PCIe 端点模块的内部结构: PCIe 端点 IP 核通常包含:

  • 物理层(PHY):处理电气信号,使用参考时钟(如 100MHz 差分时钟)。
  • 链路层 / 事务层:处理 TLP(事务层包),使用系统提供的pcie_user_clk
  • 用户接口:提供与用户逻辑通信的时钟(即user_clk)。

在该模块中,输入的是差分信号与复位信号;主要输出用户时钟,MMIO接口与链路完成标志。

数据通道采用 128 位宽接口(PCIe Gen2 标准),带字节使能控制;

    // 参数定义:PCIe基地址寄存器(BAR)大小parameter BAR0_SIZE = 16'h1000;   // 4KBparameter BAR1_SIZE = 16'h4000;   // 16KB// 内部信号wire        pcie_clk;             // PCIe时钟wire        pcie_rst_n;           // PCIe复位 (低有效)wire [63:0] cfg_dw0, cfg_dw1, cfg_dw2, cfg_dw3; // 配置空间数据字
  1. BAR 寄存器:定义 PCIe 配置空间中内存映射区域的大小
  2. 配置空间:PCIe 设备通过 64 字节配置空间向主机暴露参数

PCIe 设备通过一个256 字节的配置空间向主机暴露自身参数,类似一个 "设备档案"。
主机通过读取这个空间了解设备信息(如厂商、功能、支持的 BAR 数量等),并配置设备行为。

  1. 前 64 字节(标准头):所有 PCIe 设备必须实现,包含通用信息

    • 设备标识:Vendor ID、Device ID、Class Code 等
    • 基地址寄存器 (BAR):定义设备可访问的内存 / IO 空间,存储主机分配给设备的基地址
    • 中断配置:IRQ 线、MSI/MSI-X 支持
  2. 后 192 字节:可选扩展区域,用于高级功能(如 PCIe 能力结构)

为什么需要 BAR?

  1. 地址解耦:设备无需预先知道主机分配的地址,通过 BAR 动态映射
  2. 资源管理:主机可根据系统情况灵活分配地址空间
  3. 多设备共存:多个 PCIe 设备可共享同一地址空间,通过 BAR 区分
  4. 安全隔离:主机可限制设备访问的地址范围,提高系统安全性

同时在MMIO控制器例化部分,实现了将 PCIe 事务转换为 FPGA 内部存储器读写操作(存储器映射)

PCIe 初始化流程详解

PCIe 设备初始化需要完成复杂的状态转换,代码中的状态机对应以下关键阶段:

  1. 复位阶段 (INIT_RESET)

    • 等待系统复位释放
    • 初始化内部计数器和标志位
  2. 链路训练阶段 (INIT_WAIT_LT)

    • 监测link_up信号,确认物理层连接建立
    • 超时处理防止链路训练失败导致的死锁
  3. 数据链路层初始化 (INIT_WAIT_DLL)

    • 等待数据链路层锁定(dll_up信号)
    • 建立可靠的数据传输通道
  4. 进入 L0 工作状态 (INIT_WAIT_L0)

    • 确认 LTSSM 状态机进入 L0 状态(正常工作状态)
    • 完成 PCIe 初始化的最后阶段
  5. 初始化完成 (INIT_COMPLETE)

    • 设置pcie_init_done标志,通知系统 PCIe 链路就绪
    • 持续监测链路状态,确保连接稳定

4.第四个MMIO控制器模块

输入了MMIO数据/地址,实现了 PCIe 总线与 FPGA 内部逻辑之间的 MMIO (存储器映射 I/O) 控制器,负责解析 PCIe 事务层包 (TLP) 并转换为内部寄存器访问。

在该模块编写中,就是使用了正常的always逻辑进行数据的解析打包与传输,没有任何技巧(简化了设计),同时定义了两个内存映射区域的基地址;提供了基础的 PCIe 到内部寄存器的映射功能,但缺少:

完整的TLP解析逻辑,BAR地址范围审查,背压机制(发送通道就绪时才能接收新数据),同时MMIO的错误清楚机制并没有撰写;后续可根据具体的项目要求改进。

示例代码如下:

module mmio_controller (input       clk,            // 用户时钟 (125MHz)input       reset_n,        // 复位信号// PCIe数据通道input [127:0] rx_data,      // 接收数据input [15:0]  rx_be,        // 接收字节使能input         rx_valid,     // 接收数据有效output        rx_ready,     // 接收准备好// 省略其他接口...// 新增错误处理接口input  [7:0]  error_flags,  // 外部错误标志输入output        mmio_clear_error, // 清除错误命令output [7:0]  active_errors // 当前活跃错误
);// 寄存器地址定义localparam ERROR_STATUS_REG = 32'h0000_0004; // 错误状态寄存器localparam ERROR_CLEAR_REG  = 32'h0000_0008; // 错误清除寄存器// 内部信号reg [31:0] mmio_addr_reg;reg        mmio_rd_reg, mmio_wr_reg;reg [127:0] mmio_wdata_reg;reg [7:0]   error_status;  // 错误状态寄存器reg         clear_error_cmd; // 清除错误命令暂存// 错误状态更新always @(posedge clk or negedge reset_n) beginif (!reset_n) beginerror_status <= 8'h00;end else begin// 错误标志可以被设置,但只能通过写清除寄存器清除error_status <= error_status | error_flags;// 处理错误清除命令if (mmio_wr_reg && (mmio_addr_reg == ERROR_CLEAR_REG)) beginerror_status <= error_status & (~mmio_wdata_reg[7:0]);endendend// 地址解码增强always @(posedge clk or negedge reset_n) beginif (!reset_n) beginmmio_addr_reg <= 0;mmio_rd_reg <= 0;mmio_wr_reg <= 0;mmio_wdata_reg <= 0;clear_error_cmd <= 0;end else if (rx_valid) begin// 解析PCIe接收数据中的MMIO地址和命令mmio_addr_reg <= rx_data[31:0];mmio_wdata_reg <= rx_data[127:32];mmio_rd_reg <= rx_data[128];mmio_wr_reg <= rx_data[129];// 检测错误清除命令clear_error_cmd <= mmio_wr_reg && (mmio_addr_reg == ERROR_CLEAR_REG);endend// 输出错误清除信号(脉冲有效)assign mmio_clear_error = clear_error_cmd;// 输出当前活跃错误assign active_errors = error_status;// 其他代码保持不变...
endmodule

5.第五个数据采集模块

输入了开始采集命令start_acq(ctrl);输出标志是采集完成信号;

其功能是双通道采集数据,然后打包数据块进行输出,以适应于高速传输模式;

前面单独出过一篇文章来讲解。


6.第六个DMA引擎控制模块

输入的是用户时钟(125M),数据输入,DMA启动信号;主要输出DDR3的写数据;其核心功能是实现高速数据传输,将采集模块的缓冲区数据搬移到 DDR3。

本模块的关键点主要是突发模式的配置与高速传输状态接收

前面单独出过一篇文章来讲解。


7. 第七个DDR3控制器模块

输入的是时钟ddr3_user_clk(200M),输出init_calib_complete信号,代表DDR3初始化校准完成就绪;

其功能是控制 DDR3 存储器的初始化、校准和数据读写。

实际上在代码编写时,主要是将Xilinx MIG IP 核在程序中例化,进而将DDR3物理层接口出现;

实现了用户接口和 MIG IP 核之间的信号转换


在第八个顶层模块中,实现了对前面模块的例化,同时创建了系统状态机用于协调管理各个模块,见上篇文章!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025云智算技术白皮书

1. 云智算的演进背景 传统云计算面临三大挑战&#xff1a; 算力需求激增&#xff1a;AI大模型训练需十万卡级GPU集群&#xff0c;资源调度能力不足。网络性能瓶颈&#xff1a;TB级参数同步对低时延、高吞吐要求远超传统网络架构。服务形态单一&#xff1a;IaaS/PaaS无法覆盖A…

C语言编程中的时间处理

最简单的time 在C语言编程中&#xff0c;处理时间最简单的函数就是time了。它的原型为&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH&#xff0c;即1970年1月1日的零点零时零分&#xff0c;到当前的秒数。 输入参数可以是NULL。…

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域&#xff0c;神经网络&#xff08;NNs&#xff09;凭借其强大的表示学习能力&…

InitVerse节点部署教程

项目介绍: InitVerse 是一个为新兴企业量身定制的自动化 Web3 SaaS 平台,只需单击几下即可快速开发和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根据需求动态调整计算资源,实现高效的任务处理,同时提供更高的安全性、可用性和可扩展性。 系统要求: C…

阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代

0.前言 阿里巴巴于2025年5月14日正式开源了其最新的AI视频生成与编辑模型——通义万相Wan2.1-VACE。这一模型是业界功能最全面的视频生成与编辑工具&#xff0c;能够同时支持多种视频生成和编辑任务&#xff0c;包括文生视频、图像参考视频生成、视频重绘、局部编辑、背景延展…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…

Vue3封装公共图片组件

对图片加载做的处理: 图片加载状态响应式管理图片访问错误的处理机制图片懒加载可通过slot支持自定义加载动画其他监听事件的处理及向上传递 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主图 -…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

Python-感知机以及实现感知机

感知机定义 如果有一个算法&#xff0c;具有1个或者多个入参&#xff0c;但是返回值要么是0&#xff0c;要么是1&#xff0c;那么这个算法就叫做感知机&#xff0c;也就是说&#xff0c;感知机是个算法 感知机有什么用 感知机是用来表示可能性的大小的&#xff0c;我们可以认…

STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析

知识点1【TRGO的介绍】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;触发输出&#xff09;&#xff0c;是定时器的一种功能。 它可以作为外设的启动信号&#xff0c;比如ADC转换&#xff0c;DAC输出&#xff0c;DMA请求等。 对于ADC来说&#xff0c;可以通过…

Qwen3技术报告解读

https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 节前放模型&#xff0c;大晚上的发技术报告。通义&#xff0c;真有你的~ 文章目录 预训练后训练Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型结构…

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定&#xff1f;一个进程是否可以绑定多个端口号&#xff1f; 4、部分常见指令…

实现RTSP低延迟播放器,挑战与解决方案

随着低延迟直播需求的快速增长&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器逐渐成为实时视频流传输中的核心技术之一。与WebRTC&#xff08;Web Real-Time Communication&#xff09;相比&#xff0c;RTSP在实时性和网络延迟方面面临诸多挑战&…

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 引言 在边缘计算与AI推理场景中&#xff0c;GPU-NPU异构计算架构已成为突破算力瓶颈的关键技…

探索C语言中的二叉树:原理、实现与应用

一、引言 二叉树作为一种重要的数据结构&#xff0c;在计算机科学领域有着广泛的应用&#xff0c;无论是在操作系统的文件系统管理&#xff0c;还是在数据库的索引构建中&#xff0c;都能看到它的身影。在C语言中&#xff0c;我们可以利用指针灵活地构建和操作二叉树。接下来&…

使用libUSB-win32的简单读写例程参考

USB上位机程序的编写&#xff0c;函数的调用过程. 调用 void usb_init(void); 进行初始化 调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数&#xff0c;获得已找到的USB总线序列&#xff1b;然后通过链表遍历所有的USB设备&#xff0c;根据已知的要打开USB设…

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…

【Arthas实战】常见使用场景与命令分享

简介: Arthas是一款Java诊断工具&#xff0c;适用于多种场景&#xff0c;如接口响应变慢、CPU占用过高、热更新需求等。其核心命令包括实时监控面板&#xff08;dashboard&#xff09;、线程状态查看&#xff08;thread&#xff09;、方法调用链路追踪&#xff08;trace&#x…