實現穩健的微控制器到 FPGA SPI 介面:第 3 部分 - FPGA 頂級模組

本貼文繼續探討微控制器(uC)到 FPGA 介面。

第 1 部分:介紹了指導大型系統開發的 Verilog 設計概念。介紹暫存器傳輸電平(RTL)設計準則的關鍵部分,如時脈邊界、頻閃器的使用和雙緩衝區的必要性。

第 2 部分:介紹了 SPI 協定。回想一下,所選的協定改編自 802.3 乙太網路框架,具有可變有效載荷長度和循環冗餘校驗(CRC)等概念,以提供資料完整性的度量。

上一期的重點是指令和回應框架,這裡重複如圖 1 所示。命令框架描述了從 uC 到 FPGA 的資訊傳輸協定。回應框架描述了從 FPGA 到 uC 的資料流。回想一下,該協定是為使用 SPI 的全雙工通訊而設計的。這個要求需要仔細注意與 FPGA 硬體相關的時序。回應框架必須在接收到命令框架時即時產生。 例如,當 uC 向 FPGA 發送長度位元組時,FPGA 同時發送使用者定義的狀態標誌。同樣,當 uC 為命令框架發送 CRC 時,FPGA 為回應框架發送 CRC。

這種即時串流要求使設計變得複雜。因此,本文將特別以框圖格式描述頂級 FPGA 實作。未來的部分將從深入分析雙緩衝模組開始,深入研究各個 FPGA 模組。

圖1: 命令和回應框架構成了 uC 到 FPGA SPI 協定的基礎。

從 10000 英尺高度看 uC 到 FPGA 的資料傳輸

高階 FPGA 硬體視圖如圖 2 所示。 我們先從右到左的概覽開始,以便更好地理解硬體的操作。如果您還沒有這樣做,您可能想回顧一下第 1 部分,它指出了與系統級設計相關的一些挑戰,特別是關於雙緩衝區的部分。

在右上角,我們發現一個 PWM 模組。要注意的是,這個模組有一個 16 位元介面。同時,有一個隱含的期望,即使用 8 位元格式透過 SPI 傳輸數據,如圖 1 所示。這是有問題的,因為如果 PWM 一次更新一個字節,將會發生意外操作。相反,所有 16 位元必須同步暫存,確保所有 16 位元在單一時脈週期內呈現給 PWM。

這種同步更新由雙緩衝器執行。此模組接收來自 SPI 硬體和方塊圖中間的各種緩衝和控制模組的資料。 雙緩衝區等待,直到兩個位元組都被接收,並同時更新 PWM。然後,PWM 模組將在已知的起始位置(如下一個 PWM 佔空比的開始)實現變化。

每個雙緩衝區都以兩個參數實例化,包括位元組寬度和位址,如圖 3 所示。 選擇位元組寬度以符合相關硬件,如 16 位元 PWM 或 32 位元直接數位合成器(DDS)。該位址與圖 1 所示的命令框架相關。 例如,要將 PWM 設定為佔空比,具有代表性的最小指令訊框將是:0x07, 0x00, 0x00, 0x02, 0x00, 0xAA, 0x55, 0xFD, 0x07。在本例中,我們將把 0xAA55 的值寫入位於位址 0x0200 的 16 位元 PWM。 在這個例子中,設定為 0x0000 的讀取位址並不重要。 請注意,CRC 模組將在以後的文章中探討。

圖2 :顯示 FPGA 資料流的頂層 FPGA 方塊圖。

繼續從右向左的旅程,我們遇到了由緩衝區提供的訊息寫入器和由 SPI 介面提供的 CRC 驗證器。訊息寫入器代理程式由結束框架頻閃和 CRC 驗證器觸發。此頻閃表示已接收圖 1 所示的命令框架,並透過將接收到的 CRC 與 CRC 驗證器計算出的 CRC 進行比較來驗證。 啟動後,雙緩衝區寫入器將框架緩衝區的內容傳送到與各種 FPGA 硬體模組(如 PWM、DAC 和 DDS)相關的雙緩衝區。

框架緩衝器是資料完整性驗證過程的關鍵元件。 首先,框架緩衝區在資料通過 SPI 介面傳入時收集資料。同時,CRC 驗證器正在計算流資料的 CRC。如圖 1 所示,CRC 被附加到框架中。 因此,在接收整個訊框之前,CRC 和訊框驗證的完整性是未知的。框架緩衝區是至關重要的,因為它允許 CRC 完成的時間。它允許在 FPGA 硬體對資料進行操作之前對資料進行驗證。緩衝器消除了對損壞幀所做的更改進行 unwind 的需要。

正如圖 1 和圖 2 的框架協定所暗示的那樣,長度、讀取、寫入位址欄位和有效負載都由雙緩衝區寫入器處理。當 CRC 被驗證後,雙緩衝區寫入器將斷言基底址和第一個有效負載位元組。 然後,它將發送一個寫頻閃,啟動雙緩衝區內的第一個位元組範圍的緩衝區。 然後雙緩衝區寫入器將移動到下一個數據,重複該過程 N 次。 其中 N 為訊框長度欄位減去標頭欄位的 5 個位元組。透過檢查如圖 3 所示的雙緩衝區的結構,可以更好地理解這個過程。

圖3:雙緩衝區的框圖表示。

回想一下,每個雙緩衝區都是用一個基址和一個長度實例化的。它有一個受控制的操作序列。 在雙緩衝區內的所有位元組級第一階段緩衝區被填滿後,雙緩衝區將自動將資訊傳輸到第二階段。這種自動傳輸簡化了訊息寫入器的設計,因為它不需要控制雙緩衝區的操作。相反,它可以自由地一個位元組接一個位元組地傳輸框架負載。

在繼續討論 uC 到 FPGA 資料流之前,我們對雙緩衝區寫入器的速度進行了評論。 回想一下,圖 2 中的所有項目在一個時脈域內都是同步的。在接收到 CRC 驗證器的頻閃後,雙緩衝區寫入器將以僅受 FPGA 100MHz 時脈限制的速率寫入雙緩衝區。因此,讀取 100% 全框架緩衝器大約需要 5 個 uS。

緩衝區從位置 8’b05 讀取到 8’bFF。同時,uC 有能力啟動另一個框架,同時填充幀緩衝區,因為它正在被清空。干擾不是問題,因為 FPGA 訊息寫入器將比 uC 填充緩衝區更快地清空緩衝區。即使 SPI 模組被替換為四進位或八進位 SPI,該聲明也應該是正確的。

技術提示:諷刺的是,本文所述的 uC 到 FPGA 介面可以從基於 FPGA 的軟核心處理器中受益。 這包括將專用 uC 實例化到 FPGA 結構中,用於 uC 到 FPGA 介面。 對於 Xilinex FPGA, PicoBlaze 等控制器將是一個很好的匹配。這個小型狀態機可以替換除 SPI 模組、各種雙緩衝區及其相關週邊裝置之外的所有內容。這取決於你用彙編器編碼的能力,它可能仍然是一個優雅的解決方案。還有其他強大的選擇,例如使用傳統 C 編程的 MicroBlaze。您甚至可以使用 Xilinx Zynq 將 uC 移動到 FPGA 中。類似的選項可用於大多數 FPGA 平台。

從 10000 英尺看 FPGA 到 uC 的資料傳輸

本系列文章中所描述的 SPI 介面是全雙工的,能夠發送單獨的讀寫位址,如圖 1 所示。這是一個流處理過程,其中資料被時脈輸入 MOSI 線上的 FPGA,同時將資料傳送到 MISO 線上的 uC。 現在,我們將使用從右到左的訊號流來檢查圖 2 中概述的 RTL FPGA 傳輸過程。

如本系列的第 1 部分所述,雙緩衝區進程是一個基本需求。對於圖 2 左下角所示的實體來說,這一點最為明顯。觀察 FPGA 的選擇器開關,16 位元 DAC,使用者定義的狀態標誌和錯誤訊息計數都已暫存。 在每個 SPI 框架的開始處捕獲資料。這種暫存確保資料值在流回 uC 時不會改變。這消除了與更新多位元組資料的一個位元組相關的危險。

從 FPGA 到 uC 的所有資料流都會傳送到圖 2 右下角所示的多工器。多工器的選擇過程根據指令框架的讀取位址決定,如圖 1 所示。當 SPI 介面輸入一個位元組時,控制機器將把多工器推進到下一個連續的讀取位址。此操作允許具有獨立讀寫尋址的全雙工通訊。例如,FPGA 滑動開關可以在寫入 PWM 的同時進行讀取。為了簡單起見,圖 2 中的多工器被簡化為隱式的 N 位元組輸入到位元組寬度輸出。

請注意,圖 2 中有兩個 CRC 驗證器實例。如前所述,上層模組涉及 uC 到 FPGA 的數據,而下層模組涉及 FPGA 到 uC 的資料流。

從 FPGA 繼續從右到左的資料流到 uC 資料 RTL,我們看到較大的複用器的輸出呈現給 CRC 驗證器。 它也透過一個較小的複用器在它的方式到 SPI 介面和最終 MISO 線。回想一下,CRC 驗證器模組在流資料上建構 CRC。較小的 MUX 允許將 CRC 附加到 FPGA 到 uC 訊息。這個切換動作是基於 MSG Reader Control 對框架緩衝區中儲存的 Num_bytes 的理解。

請繼續關注第4部分,我們將探索雙緩衝區模組的 Verilog 實作。

歡迎您的評論和建議。特別歡迎進一步討論高階 RTL 系統設計方法。