SoC實戰(zhàn):MCU+可編程邏輯如何重塑嵌入式開發(fā))
最近在琢磨一塊工業(yè)采集模塊的主控選型朋友順手遞了塊評估板給我說是有意思的東西讓我試試水。這塊板子叫AG32第一眼看上去就是個普普通通的MCU開發(fā)板但翻完數(shù)據(jù)手冊我才發(fā)現(xiàn)它不是簡單的單片機而是把MCU和可編程邏輯電路做到同一顆芯片里的異構(gòu)SoC。折騰了一周多demo跑了幾個坑也踩了不少今天就把我對AG32 MCU特性的盤點、實際使用感受以及為什么我認為它是異構(gòu)SoC入門的好選擇一次性寫清楚。如果你現(xiàn)在正在做嵌入式產(chǎn)品對FPGA/CPLD有興趣但又不想一上來就啃復(fù)雜的純FPGA流程或者你正被MCU外部邏輯芯片的雙芯片方案折騰得心煩那這篇文章應(yīng)該能給你不少參考。我不會只貼數(shù)據(jù)手冊上的參數(shù)更多會講這芯片在實際工程里怎么用、哪里順手、哪里又容易翻車。1. 為什么這個MCU可編程邏輯的組合值得入門先說個反直覺的結(jié)論異構(gòu)SoC并不神秘過去幾十年里你在各種設(shè)備里見到的組合芯片很多都是這么干的。只不過以前這類芯片大多是專用規(guī)格門檻高、資料少、價格貴普通開發(fā)者根本碰不到。AG32這類產(chǎn)品的出現(xiàn)把異構(gòu)SoC拉到了普通MCU開發(fā)者的舒適區(qū)里。傳統(tǒng)上如果電路里既要一顆MCU做控制又需要一些不規(guī)則的邏輯轉(zhuǎn)換、時序匹配或者快速并行處理工程師通常的做法是主控旁邊再加一顆小CPLD或者FPGA。硬件上多一顆芯片就意味著多一路電源、多一組電平轉(zhuǎn)換、多幾根布線還要處理兩套芯片之間的通信握手、復(fù)位時序、啟動順序。一旦邏輯需要修改又是一輪硬件聯(lián)調(diào)。我見過最夸張的項目一顆主控旁邊掛了三四顆邏輯芯片板子改版改了五次光排線序就排到崩潰。AG32的思路是把這兩顆芯片揉在一起。片內(nèi)集成了基于RISC-V指令集的MCU主控又保留了一塊規(guī)模不大但實際可用的可編程邏輯類似CPLD的架構(gòu)兩者通過芯片內(nèi)部的互聯(lián)總線通信對外看是一個整體對內(nèi)你能同時寫C代碼和硬件邏輯代碼。它的MCU部分提供了主頻上百兆、Flash和SRAM都有主流MCU級別的配置外設(shè)也齊而邏輯部分等效門數(shù)雖然比不上大FPGA但干那些傳統(tǒng)的膠合邏輯、接口擴展、硬件加速的活綽綽有余。這個組合對入門的價值特別大。你可以先只把AG32當(dāng)成一顆普通MCU用跑通了基礎(chǔ)工程之后再去觸碰那部分可編程邏輯。它不像純FPGA那樣存在開機之前代碼能跑嗎的恐懼感因為MCU本身就是一個你已經(jīng)很熟悉的被驗證過的世界。你完全可以通過給外設(shè)邏輯加功能的方式一步步理解硬邏輯和軟程序之間的差別。從這個角度說它確實是異構(gòu)SoC比較好的入門跳板。2. AG32的硬指標(biāo)內(nèi)核、存儲器、外設(shè)與電氣性能盤點既然要盤點特性規(guī)格不能泛泛而談。我把手頭這手冊上比較關(guān)鍵的信息按工程選型最關(guān)心的維度整理了一下。先聲明一下AG32是個系列不同型號配置有差異我這里就按典型配置來聊你們拿開發(fā)板的時候注意看具體絲印。CPU內(nèi)核與主頻MCU部分基于32位RISC-V內(nèi)核支持標(biāo)準指令集帶有硬件乘法除法跑操作系統(tǒng)或者裸機都沒問題。主頻方面常見型號可以運行在百兆赫茲以上這個性能水平應(yīng)對工業(yè)控制、數(shù)據(jù)采集、人機交互類應(yīng)用是完全夠用的。RISC-V內(nèi)核的好處是工具鏈開源透明指令集干凈調(diào)試起來不像黑盒那么難受壞處是生態(tài)里某些第三方庫可能還沒有仔細適配尤其是做協(xié)議?;蛘咚惴ㄒ浦驳臅r候需要你自己多花點時間做兼容性測試。存儲器配置典型配置下片內(nèi)Flash做到256KB上下SRAM也能到128KB左右部分型號可能更大。對于中小規(guī)模的嵌入式應(yīng)用這個容量能裝下實時操作系統(tǒng)、圖形界面庫的一部分、通信協(xié)議棧以及應(yīng)用代碼大部分場景不用外掛存儲器。如果確實需要更大內(nèi)存片上的存儲控制器也支持外部擴展具體要看型號的封裝和引腳引出情況。外設(shè)資源外設(shè)這塊UART、SPI、I2C、CAN、ADC、PWM這些常規(guī)接口基本都是標(biāo)配高級一點的型號還會帶USB和以太網(wǎng)控制器。GPIO的數(shù)量和復(fù)用情況需要仔細對手冊我實測下來它的IO復(fù)用方式和傳統(tǒng)MCU略有區(qū)別尤其是接近可編程邏輯區(qū)域的那幾個引腳可能同時被固件外設(shè)和邏輯外設(shè)共享分配引腳時要留出余量免得后期想加功能發(fā)現(xiàn)引腳被占死了。電氣環(huán)境與封裝工作電壓、IO容忍電壓、溫度范圍這些參數(shù)不同型號標(biāo)稱不同工業(yè)級產(chǎn)品選型時留意一下工作溫度上限以及ADC參考電壓是否獨立引出。封裝從小型QFN到帶較多引腳的LQFP都有手工焊接和PCB設(shè)計都有對應(yīng)選擇。我還注意到它的電源引腳分布比較密建議PCB布局時把去耦電容做得近一點電源質(zhì)量對內(nèi)部邏輯運行穩(wěn)定性影響不小這個后面講坑的時候還會提到。下面這張表是我評估時最在意的幾個維度方便對照評估維度典型表現(xiàn)工程影響CPU架構(gòu)32位RISC-V工具鏈開源調(diào)試透明生態(tài)需自行驗證主頻百兆赫茲級工業(yè)控制、數(shù)據(jù)采集、人機交互夠用Flash/SRAM256KB/128KB級中小型應(yīng)用免外擴存儲可編程邏輯小規(guī)模CPLD類架構(gòu)適合接口轉(zhuǎn)換、編碼解碼、狀態(tài)機加速外設(shè)串口、SPI、I2C、CAN、ADC、PWM等覆蓋大多數(shù)工控與物聯(lián)網(wǎng)場景封裝小型QFN到LQFP手工焊接和量產(chǎn)貼片都能找到合適型號3. 可編程邏輯部分才是它的靈魂能替CPU扛哪些活很多人第一次拿到AG32發(fā)現(xiàn)它邏輯部分規(guī)模不大就以為這只是個噱頭。實際上可編程邏輯在異構(gòu)SoC里的價值不在規(guī)模而在它能把CPU從那些它干不好的事情里解放出來。CPU天生擅長的是順序邏輯一條一條指令往下執(zhí)行處理復(fù)雜分支、跑算法、管理協(xié)議棧。但有兩類事它天生干不好一類是要求嚴格時序并行的比如同時產(chǎn)生多路相位精確的PWM波形另一類是高頻、低延遲的簡單操作比如每隔幾百納秒采樣一次外部信號這種活如果全用中斷去響應(yīng)CPU會被打斷得暈頭轉(zhuǎn)向?qū)崟r性還未必達標(biāo)??删幊踢壿嬊∏∈歉蛇@類活的專家。在AG32片內(nèi)MCU和可編程邏輯之間通過內(nèi)部總線交互對軟件開發(fā)者來說邏輯部分更像是一個你自定義的專用外設(shè)。你可以用Verilog或VHDL寫一段邏輯把它映射到片內(nèi)的可編程架構(gòu)上然后讓CPU通過寄存器讀寫來使用它。這種交互模式比板級兩顆芯片通信快得多也簡單得多。我這周實際驗證了一個典型的場景習(xí)慣上用軟件做數(shù)碼管動態(tài)掃描就是一個循環(huán)不斷切換位選和數(shù)據(jù)一旦主程序里有其他耗時操作顯示就閃爍。我把動態(tài)掃描邏輯挪到可編程邏輯里MCU只需要往寄存器里寫一次要顯示的數(shù)剩下的移位、位選、消隱全部由硬件邏輯完成CPU可以完全不管顯示這塊騰出來的時間去做通信和數(shù)據(jù)處理。體驗非常直觀這不比你在中斷里數(shù)周期舒服多了適合放到可編程邏輯里的功能我列個參考范圍數(shù)字接口時序轉(zhuǎn)換把慢速并行數(shù)據(jù)轉(zhuǎn)成串行輸出或者把高速串行輸入按特定時序解析CPU只做最終的字節(jié)處理。增量編碼器解碼四倍頻、方向判別、脈沖計數(shù)全部由硬件完成CPU定時讀取計數(shù)器即可。PWM精細控制多路互補輸出、死區(qū)時間插入、故障引腳快速封鎖硬件邏輯可以在幾個時鐘周期內(nèi)響應(yīng)軟件趕不上這個速度。本地狀態(tài)機比如按鍵消抖、機械開關(guān)的防抖邏輯、紅外遙控信號采集與識別這些邏輯放硬件里軟件負擔(dān)可以忽略。接口擴展與電平適配用少量引腳實現(xiàn)SPI/I2C時序模擬或者并轉(zhuǎn)串、串轉(zhuǎn)并。反過來哪些事不適合放在可編程邏輯里復(fù)雜算法、浮點運算、動態(tài)內(nèi)存管理、需要頻繁更新策略的業(yè)務(wù)邏輯這些還是老老實實放在CPU里跑?;驹瓌t很簡單凡是規(guī)則明確、重復(fù)執(zhí)行、速度敏感的往硬件邏輯里塞凡是情況多變、依賴上下文、需要學(xué)習(xí)和調(diào)整的留在軟件里。把這條劃清楚異構(gòu)SoC才算用到位。4. 從拿到開發(fā)板到跑通第一個混合工程的完整路徑這部分是我實際走通的過程也是最容易勸退新手的環(huán)節(jié)。AG32的開發(fā)環(huán)境和傳統(tǒng)MCU不太一樣你既要照顧MCU那套工具鏈還要處理可編程邏輯那套工具鏈聽起來復(fù)雜但實際走一遍我發(fā)現(xiàn)它已經(jīng)被封裝得比較友好了。環(huán)境準備開發(fā)板到手后先別急著寫代碼。第一步是到官網(wǎng)下載對應(yīng)的集成開發(fā)環(huán)境和驅(qū)動不同評估板的調(diào)試器驅(qū)動略有差異Windows下裝好驅(qū)動后在設(shè)備管理器里能看到虛擬串口和調(diào)試接口就算正常。MCU側(cè)的代碼官方提供基于Eclipse的IDE集成了GCC工具鏈和調(diào)試配置界面跟主流的嵌入式IDE差不多用過別的IDE的人基本不需要額外學(xué)習(xí)成本。可編程邏輯側(cè)則是官方那套PL開發(fā)工具新建工程、編寫Verilog、綜合布線、生成下載文件流程跟主流FPGA工具類似只是規(guī)模小所以跑得很快。第一步點亮LED先確認MCU端正常我習(xí)慣先建一個裸機工程點亮LED。GPIO的庫函數(shù)和常見MCU的寫法非常接近配置時鐘、配置引腳方向、翻轉(zhuǎn)電平編譯后通過調(diào)試器下載開發(fā)板上的LED秒亮。這一步是為了確認環(huán)境、調(diào)試器、時鐘和復(fù)位鏈路都是通的。如果這一步就卡住九成是驅(qū)動沒裝好或者調(diào)試器固件版本和IDE不匹配別急著懷疑板子壞了。第二步寫一個簡單邏輯讓PL動起來PL端我建議做的第一個實驗不是復(fù)雜功能而是在可編程邏輯里做一個8位計數(shù)器并用其中兩位接到LED上這樣你能肉眼看到計數(shù)翻轉(zhuǎn)。新建PL工程選好器件的封裝型號編寫一個幾行的Verilog模塊然后做引腳分配——把計數(shù)器輸出分配到開發(fā)板上指定的LED引腳。綜合布線生成比特流文件之后有些型號需要把PL配置和MCU固件打包在一起通過IDE的燒錄功能一次下載有些則可以直接單獨下載PL部分。我用的開發(fā)板需要把兩部分合到一個鏡像里第一次沒注意只下載了MCU固件觀察到的現(xiàn)象是邏輯完全不工作。第三步讓CPU和PL通信起來CPU訪問可編程邏輯實話說這在AG32上被做成了類似訪問片內(nèi)外設(shè)的方式。在PL工程里定義一組寄存器接口比如一個控制寄存器、一個狀態(tài)寄存器、幾個數(shù)據(jù)寄存器綜合后在MCU側(cè)會有對定的基地址映射。MCU端程序直接往這個地址范圍寫值就能控制PL內(nèi)部邏輯的狀態(tài)。我第一次嘗試時往控制寄存器寫了一個使能位PL里一個計數(shù)器的計數(shù)使能立刻就變了CPU和邏輯之間的數(shù)據(jù)通道就這么打通了速度很快沒有傳統(tǒng)雙芯片之間各種握手協(xié)議的負擔(dān)。關(guān)鍵排查點時鐘和復(fù)用引腳兩個我實際踩過的坑值得單獨拿出來說。第一是時鐘來源PL部分的邏輯時鐘不一定和MCU主頻一致有些開發(fā)板默認用獨立晶振有些則用MCU輸出的時鐘如果你的邏輯跑起來完全無反應(yīng)先查時鐘約束和引腳分配是否匹配。第二是恢復(fù)引腳復(fù)用我剛才提到靠近邏輯區(qū)域的部分引腳是復(fù)用可編程IO和普通GPIO的如果PL工程里占用了某個引腳MCU端的庫函數(shù)配置同樣引腳會有沖突。規(guī)劃功能時我建議畫一張引腳占用表軟件工程師和邏輯工程師都按這張表來分配可以有效避免后期扯皮。我實際把邏輯計數(shù)器跑通后又順手做了一路軟件定時器觸發(fā)的中斷和PL并行處理結(jié)合的小實驗整體體驗下來從零到混合工程能跑大約花了大半天。這個門檻比我預(yù)想中低很多如果你之前玩過任何一款MCU或者接觸過一點FPGA上手只會更快。5. 用AG32能做出什么樣的產(chǎn)品級項目場景拆解光看參數(shù)和demo可能還不過癮我結(jié)合手頭實際在評估的幾個方向聊聊AG32這類異構(gòu)SoC適合落到什么產(chǎn)品上。沒有兩片完全一樣的板子但場景思路是通用的。工業(yè)采集與運動控制這是我比較看好的方向。工業(yè)現(xiàn)場常常需要同時處理多路編碼器脈沖、限位開關(guān)信號、急停信號還要跑控制環(huán)。傳統(tǒng)上編碼器解碼用硬件計數(shù)器芯片或者外部CPLD控制環(huán)用MCU跑板子上芯片一多可靠性就下降。用AG32這類單芯片方案編碼器四倍頻解碼和計數(shù)放在可編程邏輯里PWM輸出和故障封鎖也放在可編程邏輯里主控RISC-V只負責(zé)跑控制算法和通信協(xié)議。PCB面積可以縮小板級故障點也少了。我搭了一個模擬的電機測速回路編碼器信號進邏輯計數(shù)器MCU定期讀取并折算速度CPU占用率比純軟件解碼低了一個數(shù)量級實時性還更好。人機交互與儀表顯示數(shù)碼管、段碼LCD、多路LED和按鍵掃描這些看似簡單的外設(shè)在帶有RTOS的產(chǎn)品里經(jīng)常成為中斷資源殺手。把顯示刷新和按鍵掃描放到可編程邏輯里之后軟件層只需要維護一個顯示緩沖區(qū)和按鍵隊列邏輯部分自動完成動態(tài)掃描和消抖。我在開發(fā)板上跑了帶FreeRTOS的測試原來進臨界區(qū)保護顯示數(shù)據(jù)的地方現(xiàn)在幾乎都省掉了代碼清爽不少。對于電子價簽、儀器面板、小型控制器這類產(chǎn)品這個方案挺合適的。通信協(xié)議轉(zhuǎn)換與接口適配另一個實用場景是多協(xié)議轉(zhuǎn)換。比如一個網(wǎng)關(guān)設(shè)備要把一路UART的數(shù)據(jù)轉(zhuǎn)成某種自定義串行協(xié)議還要同時并出幾路控制信號。UART的波特率生成、幀格式轉(zhuǎn)換、位流處理都可以在可編程邏輯里做MCU側(cè)只做高層協(xié)議解析和路由。尤其是那些對幀間隔有嚴格要求的協(xié)議純軟件中斷經(jīng)常顧此失彼硬件邏輯處理位流是降維打擊。下面這張表可以幫你快速判斷一個項目是否適合用AG32來落地項目特征適合傳統(tǒng)MCU適合AG32這類異構(gòu)SoC純邏輯控制GPIO翻轉(zhuǎn)為主是可行但優(yōu)勢不明顯需要嚴格時序并行輸出偏吃力非常合適多路編碼器/脈沖計數(shù)中斷壓力大邏輯側(cè)天然優(yōu)勢復(fù)雜協(xié)議頻繁更新策略適合建議高層留在CPU顯示/按鍵等重復(fù)外設(shè)管理可用但占資源推薦邏輯側(cè)卸載單芯片低成本小型化更成熟省外置邏輯芯片有優(yōu)勢6. 選擇AG32之前這些問題最好先想清楚夸了半天也得把丑話說在前面。AG32雖然把異構(gòu)SoC的門檻拉低了不少但它畢竟不是萬能藥選型之前有幾個問題值得你認真考慮。工具鏈和生態(tài)的成熟度傳統(tǒng)MCU的生態(tài)太成熟了隨便一搜就是大把現(xiàn)成驅(qū)動、例程、中間件和社區(qū)問答。AG32這類產(chǎn)品雖然基礎(chǔ)工具鏈已經(jīng)可用但第三方庫的適配、社區(qū)討論的深度和廣度跟那些發(fā)展了十幾年的MCU平臺相比還是有差距。如果你做的是快速迭代的消費類產(chǎn)品團隊又全是MCU背景上Vivado風(fēng)格的邏輯工具會有學(xué)習(xí)成本。我的建議是先做技術(shù)預(yù)研讓團隊里一個人專門攻關(guān)PL部分其他人繼續(xù)寫MCU應(yīng)用不要一上來就讓全團隊轉(zhuǎn)型。成本并不總是更低單芯片替代雙芯片賬面上看省了一顆芯片的成本和一片板子的面積但也要看具體用量和采購渠道。AG32這類芯片的供應(yīng)和價格受原廠和分銷體系影響比較大。如果你的產(chǎn)品用量很大傳統(tǒng)MCU加一顆國產(chǎn)CPLD的組合價格上未必輸?shù)绻憧粗氐氖茄邪l(fā)效率、小型化和供應(yīng)鏈簡單化異構(gòu)SoC的綜合成本優(yōu)勢就體現(xiàn)出來了。我個人的判斷是中小批量、對小型化敏感、邏輯功能相對固定的產(chǎn)品AG32這類方案值得優(yōu)先考慮。開發(fā)流程的變化這一點最容易被剛?cè)腴T的團隊忽略。傳統(tǒng)MCU項目里硬件工程師畫完板子軟件工程師寫代碼基本是解耦的。但在異構(gòu)SoC項目里MCU固件和可編程邏輯鏡像需要一起構(gòu)建、一起燒錄、聯(lián)合調(diào)試。你在芯片內(nèi)部劃了一部分由硬件邏輯實現(xiàn)的功能這些功能在驗證階段不能只靠示波器看信號還要在仿真環(huán)境里跑邏輯功能仿真。這意味著團隊里得有能看懂硬件描述語言的工程師哪怕只負責(zé)簡單的邏輯模塊。純軟件工程背景的團隊建議從極簡的邏輯功能開始比如先做IO擴展再逐步深入。寫給想入門異構(gòu)SoC的朋友的結(jié)論如果你問我要不要從AG32開始學(xué)習(xí)異構(gòu)SoC我的答案是如果你是做嵌入式開發(fā)的手頭正好要用到類似功能那它確實是一個非常好的切入點。它讓你不用面對純FPGA的復(fù)雜啟動、配置和時序收斂問題又能真真切切理解CPU和可編程邏輯各自擅長什么。先從點亮LED開始再給它加一個硬件計數(shù)器之后你就會慢慢習(xí)慣用哪些事情可以甩給硬件做的視角去看待項目這個視角本身就是異構(gòu)計算最有價值的收獲。我個人在使用中最深的體會是AG32讓我重新思考了外設(shè)這個詞的邊界。過去外設(shè)是芯片設(shè)計者定死的UART、SPI、定時器現(xiàn)在外設(shè)可以是我自己用幾行邏輯畫出來的。這種自由度是傳統(tǒng)MCU給不了的也是異構(gòu)SoC最迷人的地方。至于它能做出什么產(chǎn)品最終取決于你的想象力芯片只是把門檻降下來了而已。