“之前的文章嵌入式基礎(chǔ)構(gòu)架 from andrew@labs介紹了大型嵌入式項(xiàng)目的構(gòu)架,本文將深入介紹 MCU 到 FPGA 的內(nèi)存映射方案。”
首先回顧,我為未來多數(shù)大型嵌入式項(xiàng)目規(guī)劃的架構(gòu)是:使用較大規(guī)模(AMD Xilinx Kintex-7 或 Artix/Kintex UltraScale+)FPGA 處理高速數(shù)據(jù)層,搭配 STM32H735 作為控制層,兩者通過內(nèi)存映射接口連接。
為何選擇雙芯片方案?
這讓人聯(lián)想到 Xilinx Zynq/Versal 等 SoC FPGA 平臺(tái),但存在幾個(gè)關(guān)鍵差異使其更符合我的需求和偏好:
? 在裸機(jī)無操作系統(tǒng)或精簡 RTOS 環(huán)境下,使用 MCU 級(jí)的 Cortex-M 內(nèi)核比應(yīng)用處理器更易編程
? 大容量片上 SRAM(564kB)和Flash(1MB)免除了耗時(shí)的 DDR SDRAM 布局需求(典型固件 RAM/Flash 使用量均<200kB)
? 分離式引腳布局(兩個(gè)小型 BGA 而非單個(gè)大型 BGA)在較少 PCB 層數(shù)下更易扇出,布局時(shí)可靈活安排 FPGA 與 MCU 間距
? 分布式架構(gòu)強(qiáng)化安全邊界:FPGA 可拒絕未經(jīng)驗(yàn)證的 MCU 比特流,F(xiàn)PGA 也無法訪問 MCU 內(nèi)存及外設(shè)
? 可靈活搭配不同 MCU 與 FPGA 組合,優(yōu)化功能、IO、BOM 成本等參數(shù)
? STM32 內(nèi)置硬件 AES 和隨機(jī)數(shù)發(fā)生器 IP 核,而 Zynq(令人驚訝地)缺失這些功能
內(nèi)存接口
經(jīng)過幾次四線 SPI 方案的失敗嘗試,我最終確定使用靈活存儲(chǔ)控制器(FMC)作為 STM32 的 AXI 總線與 FPGA 內(nèi)部互連之間的主控端橋接方案。該模塊高度可配置,可支持傳統(tǒng)(如PC133)SDRAM、異步/同步SRAM/PSRAM、并行NOR/NAND閃存等接口。
最關(guān)鍵的是,與 STM32H735 的 OCTOSPI 外設(shè)不同,F(xiàn)MC 模塊自身不包含硬件緩存或預(yù)取機(jī)制:僅依賴 Cortex-M7 提供的常規(guī) L1 指令/數(shù)據(jù)緩存。甚至無需調(diào)整這些緩存,因?yàn)?FMC 的首個(gè)存儲(chǔ)區(qū)默認(rèn)映射在地址 0xc000_0000,且 MPU(內(nèi)存保護(hù)單元)已將其預(yù)配置為強(qiáng)序、無緩存、設(shè)備內(nèi)存類型,完全無需手動(dòng)修改MPU寄存器來禁用該地址范圍的緩存。
對于 FPGA 橋接而言,最適用的 FMC 操作模式是同步 PSRAM 模式。該模式提供連續(xù)時(shí)鐘(在內(nèi)存訪問突發(fā)間隙仍保持運(yùn)行,F(xiàn)PGA 可據(jù)此驅(qū)動(dòng)內(nèi)部邏輯、鎖相環(huán)等),并支持硬件等待信號(hào),允許FPGA在流水線延遲或低速外設(shè)導(dǎo)致響應(yīng)時(shí)間超過FMC寄存器預(yù)設(shè)等待周期時(shí)主動(dòng)暫停總線。
連接26個(gè) LVCMOS33 電平引腳(包括時(shí)鐘、16位復(fù)用地址/數(shù)據(jù)總線、控制信號(hào)、字節(jié)寫使能、1個(gè)片選和3個(gè)高位地址線)約占用7系列HR或 UltraScale+ HD I/O Bank 的半數(shù)資源。此配置為 FPGA 提供1 MB地址空間(2^(16+3) = 512K個(gè)16位字尋址能力),若需更復(fù)雜設(shè)計(jì)擴(kuò)展地址空間,還可額外引出更多地址線。
硬件設(shè)計(jì)
由于手頭沒有現(xiàn)成整合 MCU、FPGA 及互連走線的開發(fā)板,我快速在 KiCAD 中設(shè)計(jì)了一款測試板。該板采用六層生益 S1000-2M 基材(成本優(yōu)化的 FR-4 材料),因無高速信號(hào)需求且追求低成本。
此板設(shè)計(jì)用于搭配第二代 48V 至 12V 中間總線轉(zhuǎn)換器(IBC),并承擔(dān)其啟動(dòng)驗(yàn)證功能,因此集成了 PicoBlade 控制接口和 Mini-Fit Jr 12V 輸入連接器。盡管已收到新版 IBC 板,但因時(shí)間不足尚未貼片,目前暫時(shí)使用庫存的第一代改進(jìn)版IBC原型供電。
板載器件包括:
? QFN-48 封裝的 STM32L431 作為電源管理與時(shí)序控制器(便于在復(fù)雜設(shè)計(jì)前驗(yàn)證功能并開發(fā)固件)
? 201-BGA 封裝的 STM32H735 作為主處理器
? FTGB196 封裝的 Xilinx XC7S25 Spartan-7 FPGA 作為橋接端。雖可用更低規(guī)格FPGA(如庫存的XC7S6或15),但為將其打造為通用 FPGA+MCU 開發(fā)平臺(tái),并滿足啟動(dòng)階段邏輯分析儀核所需的邏輯資源與 RAM,最終選擇XC7S25。
FPGA與MCU通過多接口互連:
前述FMC接口
OCTOSPI通道
10/100 RMII接口
當(dāng)前固件未啟用 OCTOSPI 與 RMII,原因包括前文討論的緩存問題及FMC遠(yuǎn)超RMII的傳輸速率(后續(xù)詳述)。
MCU 的第二 OCTOSPI 通道連接至未使用的四線 SPI Flash,計(jì)劃未來探索其應(yīng)用。OCTOSPI 本為外置 Flash 設(shè)計(jì),先前遇到的異常均源于將其強(qiáng)行適配非目標(biāo)場景。
FPGA擴(kuò)展接口:
? RGMII連接KSZ9031RNX千兆以太網(wǎng)PHY
? PMOD接口用于GPIO擴(kuò)展
? 4個(gè)LED狀態(tài)指示燈
MCU獨(dú)立擴(kuò)展:
? 專用PMOD接口
? 4個(gè)LED指示燈
集成平臺(tái)
STM32H735是一款高度復(fù)雜的芯片(數(shù)據(jù)手冊篇幅達(dá)3357頁),因此本文僅圖示討論相關(guān)的功能模塊。
從 MCU 視角看,F(xiàn)PGA 映射為一個(gè) 64 MB 的 APB SFR 地址空間(本板僅實(shí)現(xiàn) 1 MB 物理連接),起始地址為 0xc000_0000。在鏈接腳本中,我將該區(qū)域命名為 FMC_APB1 和 FMC_APB2,以避免與 MCU 片上 APB1/APB2 總線(位于 0x4000_0000 外設(shè)地址段)產(chǎn)生混淆。
當(dāng)前未支持64位訪問,因 FPGA 端總線為32位且尚未實(shí)現(xiàn)將64位突發(fā)傳輸拆分為兩次32位事務(wù)的邏輯。32位讀/寫訪問已完全支持(含等待狀態(tài)傳播);16位與8位訪問基本實(shí)現(xiàn),但由于多數(shù)外設(shè)原生支持32位寄存器,目前對此類窄位寬訪問的全面測試優(yōu)先級(jí)較低。
FPGA設(shè)計(jì)(基于SystemVerilog實(shí)現(xiàn))包含以下模塊:
? 三速 10/100/1000 RGMII MAC,搭配內(nèi)存映射式 RX FIFO 與 TX FIFO
? MDIO 控制器
? 32位 GPIO 端口,連接至 PHY 復(fù)位引腳、雜項(xiàng)控制/狀態(tài)信號(hào)、FPGA內(nèi)部信號(hào)及PMOD引腳
? 若干輔助模塊,用于查詢FPGA器件ID、溫度監(jiān)控及其他系統(tǒng)健康傳感器
FPGA端AMBA互連實(shí)現(xiàn) 我長期回避在FPGA設(shè)計(jì)中使用 AMBA 互連,主要因 Xilinx 強(qiáng)制將 AXI(龐大且笨重)作為通用方案,且每個(gè)控制信號(hào)均需獨(dú)立端口(何必如此?)。不過自 Vivado 對 SystemVerilog 接口提供良好支持后(約2017年時(shí)雖支持接口但無法處理接口數(shù)組),這一情況有所改觀。
最終決定采用32位APB協(xié)議作為內(nèi)部控制平面互連標(biāo)準(zhǔn)而非全盤AXI化。其優(yōu)勢包括: 輕量化設(shè)計(jì),顯著節(jié)省資源; 寄存器配置場景下速率完全夠用;必要時(shí)該協(xié)議亦可承載可觀數(shù)據(jù)吞吐。
設(shè)計(jì)頂層架構(gòu)主要由IO聲明與APB互連網(wǎng)絡(luò)構(gòu)成。
FMC 橋接器
FMC橋接器是 STM32 FMC 總線與 AMBA APB 協(xié)議的雙向轉(zhuǎn)換模塊(完整實(shí)現(xiàn)細(xì)節(jié)可查閱源碼)。
該橋接器包含內(nèi)部PLL(當(dāng)前僅支持7系列 FPGA,UltraScale+ 支持即將加入),通過鎖定自由運(yùn)行的FMC時(shí)鐘生成兩個(gè)同頻輸出時(shí)鐘。輸出時(shí)鐘相位可根據(jù)具體 FPGA 的 IO 時(shí)序要求、板級(jí)走線延遲等因素調(diào)整,以優(yōu)化建立/保持時(shí)間裕量。
? 捕獲時(shí)鐘:用于采樣輸入FMC控制/寫數(shù)據(jù)信號(hào),并向FPGA內(nèi)部負(fù)載輸出APB PCLK時(shí)鐘
? 發(fā)射時(shí)鐘:用于向MCU回傳讀數(shù)據(jù)
在較高時(shí)鐘頻率下,可能需要將發(fā)射時(shí)鐘相位相對于捕獲時(shí)鐘后移,以提升系統(tǒng)同步總線的時(shí)序裕量(此處向ST工程師喊話:下一代 FMC 能否加入 DQS 等源同步讀時(shí)鐘機(jī)制?)
該橋接器將 FMC 事務(wù)直接轉(zhuǎn)換為 APB 讀寫操作,并根據(jù) FMC 字節(jié)寫使能信號(hào)設(shè)置 APB PSTRB 信號(hào)。APB 延遲通過 NWAIT 信號(hào)反饋至 FMC 總線,因此外設(shè)可任意延長響應(yīng)時(shí)間(但會(huì)導(dǎo)致STM32的AXI總線阻塞,需注意風(fēng)險(xiǎn))。
當(dāng)前 PSLVERR 信號(hào)尚未啟用,未來計(jì)劃將其映射為鎖存中斷信號(hào),觸發(fā) MCU 端 "segfault" ISR 進(jìn)行錯(cuò)誤處理。
APB#(.DATA_WIDTH(32), .ADDR_WIDTH(20), .USER_WIDTH(0)) fmc_apb();FMC_APBBridge#( .CLOCK_PERIOD(7.27), //137.5 MHz .VCO_MULT(8), //1.1 GHz VCO .CAPTURE_CLOCK_PHASE(-30), .LAUNCH_CLOCK_PHASE(-30)) fmcbridge( .apb(fmc_apb), .clk_mgmt(clk_125mhz), .fmc_clk(fmc_clk), .fmc_nwait(fmc_nwait), .fmc_noe(fmc_noe), .fmc_ad(fmc_ad), .fmc_nwe(fmc_nwe), .fmc_nbl(fmc_nbl), .fmc_nl_nadv(fmc_nl_nadv), .fmc_a_hi(fmc_a_hi), .fmc_cs_n(fmc_ne1));
APB橋接器設(shè)計(jì)
我的APB橋接模塊通過單個(gè)APB請求者端口,將其橋接至任意數(shù)量的完成者節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)映射至連續(xù)且等長的地址空間區(qū)域(通過SystemVerilog接口數(shù)組配置)。該架構(gòu)摒棄了繁瑣的GUI地址空間編輯器與自動(dòng)代碼生成,僅通過參數(shù)化模塊實(shí)現(xiàn)。
在復(fù)雜系統(tǒng)中,外設(shè)通?;旌洗嬖趦深愋枨螅?/p>
? 精簡型:僅需少量控制位的小型寄存器映射
? 復(fù)雜型:包含內(nèi)存映射緩沖區(qū)的較大規(guī)模設(shè)計(jì)
本架構(gòu)采用橋接樹結(jié)構(gòu)應(yīng)對此需求。測試系統(tǒng)的根橋接器劃分兩個(gè)64 kB總線段:
通用外設(shè)段:二次劃分為1 kB子段
以太網(wǎng)FIFO段:二次劃分為4 kB子段
橋接器采用純組合邏輯設(shè)計(jì),以最大化時(shí)序-延遲權(quán)衡的靈活性。實(shí)際應(yīng)用中,開發(fā)者可根據(jù)目標(biāo) PCLK 頻率需求,在關(guān)鍵路徑插入寄存器切片以滿足時(shí)序收斂要求。
//Two 16-bit bus segments at 0xc000_0000 (APB1) and c001_0000 (APB2)APB#(.DATA_WIDTH(32), .ADDR_WIDTH(16), .USER_WIDTH(0)) rootAPB[1:0]();//Root bridgeAPBBridge#(.BASE_ADDR(32'h0000_0000),//MSBs are not sent over FMC.BLOCK_SIZE(32'h1_0000),.NUM_PORTS(2)) root_bridge (.upstream(fmc_apb_pipe),.downstream(rootAPB));//Pipeline stages at top side of each root in case we need to improve timingAPB#(.DATA_WIDTH(32), .ADDR_WIDTH(16), .USER_WIDTH(0)) apb1_root();APBRegisterSlice#(.DOWN_REG(0), .UP_REG(0)) regslice_apb1_root(.upstream(rootAPB[0]),.downstream(apb1_root));APB#(.DATA_WIDTH(32), .ADDR_WIDTH(16), .USER_WIDTH(0)) apb2_root();APBRegisterSlice#(.DOWN_REG(0), .UP_REG(0)) regslice_apb2_root(.upstream(rootAPB[1]),.downstream(apb2_root));性能 為實(shí)測接口傳輸速率,我編寫了極簡版 iperf3 兼容服務(wù)端程序作為基準(zhǔn)測試。盡管實(shí)際應(yīng)用中不會(huì)對基于 FPGA 的 STM32 系統(tǒng)進(jìn)行極限吞吐壓測(未實(shí)現(xiàn)速率限制),但此測試可有效評(píng)估互連帶寬性能。
測試選擇反向 UDP 模式(STM32發(fā)送端,PC接收端)以最小化 CPU 占用,聚焦總線壓力測試。需注意:此結(jié)果僅作為互連帶寬對比基準(zhǔn),不代表實(shí)際應(yīng)用代碼(需處理復(fù)雜任務(wù))可達(dá)到的性能水平。
當(dāng)前 APBEthernetInterface 驅(qū)動(dòng)未啟用 DMA,僅通過忙循環(huán)實(shí)現(xiàn)數(shù)據(jù)內(nèi)存拷貝(微調(diào)對齊優(yōu)化)。由于所有內(nèi)存訪問均由 CPU 執(zhí)行,為最大化性能,將數(shù)據(jù)包緩沖區(qū)及 TCP/IP 協(xié)議棧內(nèi)部數(shù)據(jù)結(jié)構(gòu)均置于 DTCM(緊耦合內(nèi)存)中。
在 FMC 時(shí)鐘 125MHz、PLL輸出時(shí)鐘相位均設(shè)為 -30度(考慮 BUFG 插入延遲)的配置下,當(dāng)前測試固件可實(shí)現(xiàn)10秒持續(xù) 284 Mbps 的吞吐量。
當(dāng)前方案仍有提速空間。FMC 理論上可運(yùn)行于當(dāng)前速率兩倍(250MHz),但實(shí)際測試中穩(wěn)定性欠佳。在下一代"正式"設(shè)計(jì)中,計(jì)劃采用更高性能 FPGA(但需注意 UltraScale+ HDIO 相較7系列 HR 可能略慢),并通過時(shí)序約束優(yōu)化與PLL相位調(diào)試探索極限速率。不過就當(dāng)前需求而言,284 Mbps已完全足夠。
結(jié)論
整體實(shí)現(xiàn)出乎意料地順利,接口即插即用且運(yùn)行穩(wěn)定。受限于總線系統(tǒng)同步特性,超 125MHz 的高頻運(yùn)行可能面臨挑戰(zhàn)。雖探索過動(dòng)態(tài) PLL 重配置與類鏈路訓(xùn)練方案,但實(shí)際必要性存疑。
未來代碼演進(jìn)方向可能包括: FMC端支持64位傳輸及采用AHB替代APB協(xié)議以降低順序傳輸開銷。但可以預(yù)見,該架構(gòu)將成為我大型FPGA+MCU項(xiàng)目的長期技術(shù)基座。
本文轉(zhuǎn)載自:https://serd.es/2024/07/24/Memory-mapping-an-FPGA-from-a-STM32.html,經(jīng)校對及翻譯。
-
FPGA
+關(guān)注
關(guān)注
1644文章
22007瀏覽量
616375 -
mcu
+關(guān)注
關(guān)注
146文章
17915瀏覽量
362566 -
嵌入式
+關(guān)注
關(guān)注
5145文章
19597瀏覽量
316131 -
STM32
+關(guān)注
關(guān)注
2291文章
11022瀏覽量
363411 -
內(nèi)存映射
+關(guān)注
關(guān)注
0文章
15瀏覽量
7530
發(fā)布評(píng)論請先 登錄
嵌入式系統(tǒng)內(nèi)存管理
RTOS和Linux中的內(nèi)存映射及移植方法
如何實(shí)現(xiàn)FPGA進(jìn)行內(nèi)存映射的GPMC接口進(jìn)行通信?
如何在MCU上進(jìn)行內(nèi)存管理與分配
STM32中的內(nèi)存映射被劃分為哪幾部分
為什么要進(jìn)行內(nèi)存對齊操作呢
基于SPB的FPGA嵌入式音頻處理系統(tǒng)的設(shè)計(jì)

嵌入式系統(tǒng)的內(nèi)存指針操作
嵌入式項(xiàng)目實(shí)戰(zhàn)經(jīng)驗(yàn)

STM32 內(nèi)存分配解析及變量的存儲(chǔ)位置

評(píng)論