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.pswp.cn/diannao/83413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83413.shtml
英文地址,請注明出處:http://en.pswp.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…