FPGA開發(fā)避坑指南:紫光同創(chuàng)PDS約束文件與引腳配置詳解)
用國產(chǎn)FPGA開發(fā)最容易被忽略卻又最坑的環(huán)節(jié)就是約束文件。很多入門的朋友在仿真階段一切正常一到上板就點(diǎn)不亮或時(shí)序亂跳查來查去根源往往不是Verilog代碼寫錯(cuò)了而是引腳沒配對、約束沒寫全。這篇文章就圍繞紫光同創(chuàng)的PDS開發(fā)環(huán)境把約束文件到引腳配置這條線徹底捋清楚適合剛開始接觸國產(chǎn)FPGA、或者從其他平臺(tái)切過來想快速上手的開發(fā)者。1. 為什么寫紫光同創(chuàng)國產(chǎn)FPGA工具鏈的現(xiàn)狀與上手門檻1.1 國產(chǎn)FPGA工具的現(xiàn)狀與定位紫光同創(chuàng)是目前國產(chǎn)FPGA里比較有代表性的一家產(chǎn)品線覆蓋了Titan、Logos、Compa等系列從幾十K邏輯單元的小規(guī)模器件到上百萬門級(jí)的中大規(guī)模器件都有布局。在國產(chǎn)替代的大背景下很多通信、工控、視頻處理項(xiàng)目開始評估和導(dǎo)入紫光同創(chuàng)的方案。但說實(shí)話相比國外兩大廠那套成熟得不能再成熟的開發(fā)工具國產(chǎn)工具鏈的生態(tài)確實(shí)還在追。PDS作為紫光同創(chuàng)官方的主開發(fā)環(huán)境界面和操作邏輯上能看到很多主流工具的影子但細(xì)節(jié)差異不小文檔也相對零散。這也是我寫這篇東西的動(dòng)機(jī)之一——把實(shí)際踩過的坎記錄下來讓后來的人少走彎路。1.2 PDS工具鏈的整體認(rèn)知PDS全稱Pango Design Suite是基于Eclipse框架的FPGA集成開發(fā)環(huán)境支持原理圖、Verilog、VHDL等多種設(shè)計(jì)入口集成了綜合、布局布線、時(shí)序分析、位流生成和在線調(diào)試等功能。首次打開PDS界面布局對用過Vivado或Quartus的人來說不會(huì)太陌生但有幾個(gè)地方要特別注意PDS的工程管理方式更接近Quartus的工程文件風(fēng)格一個(gè)工程對應(yīng)一個(gè).prj文件。約束文件后綴是.fdc這不是FPGA標(biāo)準(zhǔn)格式而是紫光同創(chuàng)自己的約束文件格式。程序下載通過DSCDebug Scan Chain和HSDHardware System Debugger兩個(gè)工具完成前者負(fù)責(zé)下載配置后者負(fù)責(zé)片上邏輯分析。很多從Vivado轉(zhuǎn)過來的朋友第一個(gè)不習(xí)慣就是約束文件格式。Vivado用XDCPDS用FDC語法上有相似之處但指令名稱和書寫習(xí)慣有差異不能直接復(fù)制粘貼必須手動(dòng)轉(zhuǎn)換。這個(gè)細(xì)節(jié)決定了你能否順利完成從源碼到上板的最后一公里。2. 從工程模板到項(xiàng)目骨架創(chuàng)建你的第一個(gè)PDS工程2.1 新建工程時(shí)就要想清楚的幾件事新建工程這個(gè)操作看似簡單但里面有幾個(gè)坑如果前期沒想清楚后面改起來非常痛苦。第一器件型號(hào)一定要選對。同一個(gè)系列里封裝不同、速度等級(jí)不同引腳約束和時(shí)序約束都會(huì)有差異。比如Logos系列的PGL12G和PGL22G雖然管腳兼容性較好但資源量不同綜合時(shí)PDS對器件的適配策略也不同。選錯(cuò)型號(hào)最直接的后果是布局布線時(shí)報(bào)資源不足或引腳不存在。第二工程命名盡量用字母、數(shù)字和下劃線不要帶中文和特殊符號(hào)。PDS對中文路徑的支持不完善工程路徑里有中文某些版本在綜合或生成位流時(shí)會(huì)報(bào)亂碼路徑錯(cuò)誤。這個(gè)坑我見過不止一次最后都是把整個(gè)工程復(fù)制到純英文路徑才解決。第三綜合策略的選擇。PDS提供面積優(yōu)先、速度優(yōu)先和平衡策略三種選項(xiàng)。入門階段默認(rèn)的平衡策略就好不要在早期為了追求某個(gè)極端指標(biāo)去選激進(jìn)策略否則綜合時(shí)間成倍增加結(jié)果可能還不理想。新建工程的流程大體是File - New Project - 填寫名稱和路徑 - 選擇器件系列和具體型號(hào) - 添加設(shè)計(jì)文件或暫時(shí)跳過 - 完成。工程創(chuàng)建后PDS會(huì)自動(dòng)生成一個(gè)包含src、constr、sim等目錄結(jié)構(gòu)的工程框架但目錄不會(huì)在本地文件系統(tǒng)里全部自動(dòng)創(chuàng)建很多是邏輯映射。你需要在本地手動(dòng)建好目錄再把文件加入工程這樣工程可移植性更好。2.2 工程目錄結(jié)構(gòu)與文件類型解析一個(gè)規(guī)范的PDS工程本地目錄建議這樣組織project/ ├── prj/ # 工程文件.prj存放處 ├── src/ # RTL源碼.v、.sv、.vhd ├── constr/ # 約束文件.fdc ├── sim/ # 仿真文件testbench ├── ip/ # IP核相關(guān).pcp、.ipx等 └── output/ # 綜合布線輸出、位流文件對應(yīng)的文件類型我整理了一個(gè)表格方便你對照文件后綴類型作用.prj工程文件記錄工程配置、文件列表、綜合布線選項(xiàng).fdc約束文件引腳約束、時(shí)序約束、區(qū)域約束.v / .svRTL源碼設(shè)計(jì)代碼PDS支持Verilog和SystemVerilog.pcpIP配置參數(shù)文件保存IP核的參數(shù)配置.bit / .bin位流文件最終下載到FPGA的配置文件.jtag下載鏈描述文件描述JTAG鏈路拓?fù)淅斫夤こ探Y(jié)構(gòu)后你會(huì)發(fā)現(xiàn)PDS把src和constr分開管理是有道理的。修改RTL代碼和修改約束文件是兩類不同性質(zhì)的工作分開存放可以避免誤操作。實(shí)際項(xiàng)目中我習(xí)慣在RTL代碼里用(* LOC xxx *)這類屬性做臨時(shí)約束但正式的引腳約束一定寫進(jìn).fdc保持代碼的通用性。3. 約束文件的本質(zhì)時(shí)序約束、物理約束與引腳配置的關(guān)系3.1 為什么要寫約束綜合器默認(rèn)行為的局限性很多初學(xué)者會(huì)問一個(gè)問題我在代碼里已經(jīng)定義了input clk和output led為什么還要額外寫約束這是因?yàn)榫C合工具默認(rèn)不知道你的信號(hào)要具體對接到芯片的哪個(gè)物理引腳上也不知道時(shí)鐘信號(hào)的頻率目標(biāo)。綜合器能做的只是邏輯綜合——把RTL代碼映射成LUT、FF、DSP等底層資源但不負(fù)責(zé)這個(gè)信號(hào)從哪個(gè)焊盤進(jìn)出。如果沒有約束文件工具會(huì)自由分配引腳結(jié)果就是你下載程序后外部信號(hào)根本接不到你要的位置。約束文件在PDS里承擔(dān)了三類職責(zé)物理約束確定端口到具體引腳的映射關(guān)系包括I/O電平標(biāo)準(zhǔn)、驅(qū)動(dòng)強(qiáng)度、上下拉等電氣屬性。時(shí)序約束聲明時(shí)鐘頻率、生成時(shí)鐘關(guān)系、輸入輸出延遲為布局布線提供時(shí)序目標(biāo)。區(qū)域約束把邏輯塊限定在芯片特定區(qū)域內(nèi)多die器件還會(huì)涉及die間的邏輯分配。這三類約束不是孤立的它們共同決定了最終實(shí)現(xiàn)的物理可行性和時(shí)序收斂性。我的經(jīng)驗(yàn)是入門階段先掌握引腳約束把電平和位置配準(zhǔn)時(shí)序約束在時(shí)鐘頻率較高或有明確接口協(xié)議要求時(shí)再系統(tǒng)學(xué)習(xí)區(qū)域約束屬于進(jìn)階優(yōu)化手段前期不必深究。3.2 引腳約束語法與常用約束詳解PDS的FDC約束文件語法上大量借鑒了SDCSynopsys Design Constraints風(fēng)格但引腳約束部分有自己的特色。一個(gè)典型的引腳約束長這樣# 引腳位置約束 set_property LOC R4 [get_ports clk_50m] set_property LOC T3 [get_ports led[0]] # 電平標(biāo)準(zhǔn) set_property IOSTANDARD LVCMOS33 [get_ports clk_50m] set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}] # 電流驅(qū)動(dòng)強(qiáng)度 set_property DRIVE 8 [get_ports {led[*]}] # 上下拉設(shè)置 set_property PULLUP true [get_ports key_n]注意幾個(gè)細(xì)節(jié)PDS中g(shù)et_ports配合數(shù)組信號(hào)時(shí)用{led[*]}的寫法花括號(hào)不能省否則引用不到整組信號(hào)。LOC的實(shí)際引腳編號(hào)可以在PDS的引腳規(guī)劃視圖里查也可以查芯片數(shù)據(jù)手冊的封裝引腳圖兩者必須一致。除了引腳約束FDC里還有一組極其常用的約束——時(shí)鐘約束create_clock -name clk_50m -period 20.0 [get_ports clk_50m]這句聲明了名為clk_50m的時(shí)鐘周期20納秒對應(yīng)50MHz。時(shí)鐘約束是對設(shè)計(jì)進(jìn)行時(shí)序分析的基礎(chǔ)沒有它PDS的時(shí)序報(bào)告就是空白的。對于PLL生成的時(shí)鐘還需要用create_generated_clock聲明工具才能正確分析跨時(shí)鐘域路徑。3.3 時(shí)序約束的基本思路時(shí)序約束的核心不是把工具逼到極限而是把設(shè)計(jì)意圖如實(shí)告訴工具。它回答了三個(gè)問題時(shí)鐘長什么樣、數(shù)據(jù)相對時(shí)鐘什么時(shí)候有效、輸入輸出路徑上還有什么延時(shí)。對于入門項(xiàng)目最基礎(chǔ)的是主時(shí)鐘約束和異步復(fù)位釋放約束。主時(shí)鐘約束上面已經(jīng)寫了。異步復(fù)位釋放需要用到set_false_path或set_max_delay這屬于中級(jí)內(nèi)容初級(jí)可以先了解概念。PDS的時(shí)序報(bào)告分建立時(shí)間setup和保持時(shí)間hold兩類對應(yīng)表格里會(huì)有slack松弛量這一列。slack為正說明時(shí)序滿足為負(fù)說明不滿足需要優(yōu)化邏輯路徑或調(diào)整約束。關(guān)于時(shí)序約束我最想強(qiáng)調(diào)的是不要為了消除時(shí)序報(bào)錯(cuò)而盲目放寬約束。時(shí)序約束是設(shè)計(jì)規(guī)格的數(shù)字化表達(dá)如果確實(shí)跑不到目標(biāo)頻率放寬約束只是掩耳盜鈴。正確做法是定位關(guān)鍵路徑優(yōu)化邏輯級(jí)數(shù)再配合PDS提供的綜合策略調(diào)整。這部分展開講內(nèi)容非常多入門階段做到主時(shí)鐘約束正確即可。4. 引腳配置實(shí)戰(zhàn)從原理圖到PDS的完整鏈路4.1 讀原理圖引腳規(guī)劃的關(guān)鍵信息拿到一塊FPGA開發(fā)板或自己畫的核心板第一步不是開軟件而是讀原理圖。原理圖里標(biāo)明了FPGA每個(gè)Bank的電壓域、每個(gè)引腳在外圍電路上連接到什么器件、每個(gè)信號(hào)的電氣要求這些東西是引腳規(guī)劃的原始依據(jù)。讀原理圖關(guān)注的重點(diǎn)有三處FPGA器件型號(hào)與封裝確認(rèn)同一型號(hào)下不同封裝的引腳編號(hào)規(guī)則。Bank電壓引腳所在Bank的VCCO電壓決定了該Bank支持的I/O電平標(biāo)準(zhǔn)。比如Bank接3.3V那這個(gè)Bank上的引腳只能用LVCMOS33、LVTTL33等3.3V電平硬要用LVCMOS18會(huì)出問題。特殊引腳配置引腳如JTAG、MODE、DONE、時(shí)鐘專用引腳MRCC、SRCC、高速收發(fā)器引腳如果器件有等都不是普通I/O使用時(shí)必須遵守專用規(guī)則。一塊典型的開發(fā)板原理圖中LED通常掛到普通I/O按鍵可能掛了上拉電阻UART的TX/RX接到FPGA的接收發(fā)送引腳晶振輸出接到全局時(shí)鐘引腳。這些信息在原理圖上都標(biāo)注得清清楚楚照著抄到約束文件里即可。4.2 在PDS中進(jìn)行引腳分配的三種方式PDS提供三種引腳分配方式各有適用場景。第一種手動(dòng)編輯FDC文件用set_property LOC逐條寫。這種方式適合引腳數(shù)量較少比如幾十個(gè)引腳的入門設(shè)計(jì)優(yōu)點(diǎn)是直觀可控缺點(diǎn)是很機(jī)械信號(hào)一多容易漏寫或?qū)戝e(cuò)。第二種使用PDS自帶的Pin Planner視圖。在工程中打開Tools - Pin Planner可以圖形化看到所有I/O Bank和引腳。左側(cè)是設(shè)計(jì)中待分配的端口列表右側(cè)是封裝引腳圖選中一個(gè)端口再雙擊對應(yīng)的物理引腳就可以綁定。這種方式直觀適合學(xué)習(xí)和驗(yàn)證。第三種導(dǎo)入第三方工具生成的引腳分配文件。如果你的原理圖工具如OrCAD能導(dǎo)出引腳映射表格或者項(xiàng)目里有其他FPGA平臺(tái)已有的約束文件可以轉(zhuǎn)換成CSV格式后通過Pin Planner的Import功能導(dǎo)入。這個(gè)方式適合大型項(xiàng)目能大幅提升效率。實(shí)際項(xiàng)目中我常用的路徑是先從原理圖整理一張Excel引腳清單確認(rèn)信號(hào)名、器件引腳、電平標(biāo)準(zhǔn)、Bank電壓四列信息然后直接編寫FDC文件或用CSV導(dǎo)入。這樣既保留了紙面文檔又減少了GUI手動(dòng)操作的時(shí)間。4.3 用Circuit Editor檢查規(guī)劃效果引腳分配完成后不要急著綜合先打開PDS的Circuit Editor或者Device View檢查一遍。這個(gè)視圖會(huì)根據(jù)你當(dāng)前選中的器件渲染出芯片內(nèi)部的Bank分布和引腳占用情況。檢查重點(diǎn)有沒有引腳被分配到不適合的位置比如普通信號(hào)占用了CCLK配置引腳。同一Bank內(nèi)電平標(biāo)準(zhǔn)是否一致電壓域是否沖突。哪些引腳是有效的哪些在目標(biāo)封裝中不存在。PDS在引腳沖突時(shí)通常會(huì)報(bào)DRC設(shè)計(jì)規(guī)則檢查錯(cuò)誤但早期的版本DRC不是實(shí)時(shí)的要等你點(diǎn)擊驗(yàn)證或跑綜合時(shí)才爆出來。所以養(yǎng)成保存FDC后主動(dòng)跑一次DRC的習(xí)慣可以省去很多來回折騰的時(shí)間。5. 上板驗(yàn)證的第一步LED閃爍工程的全流程復(fù)盤5.1 代碼、約束與下載的完整操作從零開始把LED閃爍工程跑通看起來簡單但每一步都有對應(yīng)的陷阱。我把完整流程和注意事項(xiàng)列出來你按順序做即可。第一步寫一個(gè)簡單的分頻器點(diǎn)亮LED。代碼不用復(fù)雜哪怕是直接給led信號(hào)一個(gè)翻轉(zhuǎn)邏輯加一定延時(shí)的電路也行。但要注意PDS對代碼的綜合優(yōu)化在默認(rèn)情況下會(huì)比較激進(jìn)如果信號(hào)輸出恒為0綜合器可能會(huì)把對應(yīng)邏輯優(yōu)化掉引腳上反而測量不到波形。為了讓LED可控且可見建議代碼里加一個(gè)計(jì)數(shù)器module led_flash( input clk_50m, input rst_n, output reg led ); reg [25:0] cnt; always (posedge clk_50m or negedge rst_n) begin if (!rst_n) begin cnt 26d0; led 1b0; end else begin cnt cnt 1b1; if (cnt 26d49_999_999) begin cnt 26d0; led ~led; end end end endmodule第二步編寫FDC約束文件。假設(shè)demo板上LED接到了T3引腳時(shí)鐘引腳是R4復(fù)位按鍵接到了K16引腳# 時(shí)鐘約束50MHz create_clock -name clk_50m -period 20.0 [get_ports clk_50m] # 引腳位置約束 set_property LOC R4 [get_ports clk_50m] set_property IOSTANDARD LVCMOS33 [get_ports clk_50m] set_property LOC K16 [get_ports rst_n] set_property IOSTANDARD LVCMOS33 [get_ports rst_n] set_property PULLUP true [get_ports rst_n] set_property LOC T3 [get_ports led] set_property IOSTANDARD LVCMOS33 [get_ports led]注意復(fù)位按鍵加了PULLUP true這是因?yàn)楹芏嚅_發(fā)板按鍵接地外部沒有上拉電阻通過啟用內(nèi)部上拉可以保證按鍵未按下時(shí)復(fù)位信號(hào)是穩(wěn)定的高電平。第三步綜合與布局布線。在PDS流程導(dǎo)航里依次執(zhí)行Synthesis、Place Route。綜合完成后查看綜合報(bào)告里的資源使用情況和DRC告警。常見告警比如LUT_as_memory、signal led is unconnected之類需要逐條確認(rèn)不能無視。第四步生成位流并下載。點(diǎn)擊Generate BitstreamPDS會(huì)生成.bit文件然后打開DSC工具配置JTAG鏈路加載位流文件下載。下載成功后觀察開發(fā)板LED是否按預(yù)期閃爍。如果一切順利你完成了人生第一個(gè)紫光同創(chuàng)FPGA工程。如果不順利看下一節(jié)。5.2 下載與調(diào)試中排查問題的基礎(chǔ)思路下載環(huán)節(jié)出問題大概率集中在三個(gè)方面。第一JTAG鏈路檢測不到器件。檢查下載器驅(qū)動(dòng)是否安裝、JTAG連線是否正確、芯片是否供電。PDS的DSC工具里有一個(gè)Auto Detect按鈕點(diǎn)擊后應(yīng)該能掃到器件型號(hào)。掃不到就逐個(gè)環(huán)節(jié)排查尤其是下載器與板子的連接順序有些板子有多個(gè)JTAG菊花鏈器件需要設(shè)置正確的鏈位置參數(shù)。第二下載成功但LED不動(dòng)作。先用萬用表或示波器測量FPGA引腳是否有電平變化。如果有變化但LED不亮可能是驅(qū)動(dòng)能力不足或LED極性接反檢查原理圖確認(rèn)LED是低電平點(diǎn)亮還是高電平點(diǎn)亮。如果引腳無輸出回到PDS的Hardware Manager里查看內(nèi)部信號(hào)確認(rèn)邏輯是否正常。第三燒寫后掉電丟失。FPGA的SRAM-based架構(gòu)本來就要求每次上電重新配置如果你想掉電保存需要生成.bin文件并燒錄到外部SPI Flash。PDS在生成位流時(shí)可以同時(shí)生成多種格式選擇SPI Flash對應(yīng)的格式即可具體燒錄操作在DSC工具里選擇Flash模式。排查問題的思路比具體操作重要得多。我的習(xí)慣是從物理層往邏輯層查先確認(rèn)引腳有信號(hào)嗎再確認(rèn)信號(hào)波形對嗎最后才去看代碼邏輯。很多人一上來就懷疑代碼寫錯(cuò)了花大量時(shí)間改邏輯結(jié)果最后發(fā)現(xiàn)是引腳約束寫反了白白浪費(fèi)半天。6. 入門之后必須正視的幾個(gè)高頻坑點(diǎn)6.1 復(fù)位信號(hào)的亞穩(wěn)態(tài)處理FPGA復(fù)位相關(guān)的亞穩(wěn)態(tài)問題在入門階段不容易遇見但在真實(shí)項(xiàng)目里幾乎是必踩。核心原因是復(fù)位信號(hào)釋放時(shí)刻距離時(shí)鐘沿太近時(shí)FF的復(fù)位端可能進(jìn)入亞穩(wěn)態(tài)導(dǎo)致復(fù)位置位后出現(xiàn)不確定狀態(tài)。解決思路是使用異步復(fù)位同步釋放電路reg rst_n_r1; reg rst_n_r2; always (posedge clk_50m or negedge rst_n) begin if (!rst_n) begin rst_n_r1 1b0; rst_n_r2 1b0; end else begin rst_n_r1 1b1; rst_n_r2 rst_n_r1; end end內(nèi)部邏輯統(tǒng)一使用rst_n_r2作為復(fù)位信號(hào)這樣復(fù)位釋放經(jīng)過兩級(jí)FF同步把亞穩(wěn)態(tài)概率降到極低。這個(gè)技巧在PDS工程里同樣適用工具不會(huì)自動(dòng)幫你做復(fù)位同步邏輯必須自己寫。6.2 LVDS和差分信號(hào)的約束寫法FPGA的高速接口比如LVDS、MIPI、SerDes越來越多地出現(xiàn)在項(xiàng)目中PDS對應(yīng)支持的約束句法也需要單獨(dú)掌握。普通的單端引腳用一個(gè)LOC搞定差分信號(hào)則要指定主引腳和從引腳。LVDS信號(hào)在FDC里通常只約束P端位置N端由工具自動(dòng)推導(dǎo)但電平標(biāo)準(zhǔn)要寫成IOSTANDARD LVDS。另一個(gè)和LVDS相關(guān)的坑是LVDS對Bank電壓有要求很多FPGA的LVDS只能工作在特定Bank。如果芯片型號(hào)不支持該Bank作LVDS布局布線階段會(huì)報(bào)錯(cuò)。這個(gè)問題看起來是約束問題本質(zhì)是選型問題需要在硬件設(shè)計(jì)階段就確認(rèn)Bank配置而不是等到開發(fā)時(shí)才改。6.3 布局布線順序與多die器件的特殊約束在不熟悉PDS布局布線的底層邏輯之前我建議初學(xué)者不要修改任何布局布線的默認(rèn)選項(xiàng)。PDS的Place Route分為多個(gè)階段包括全局布局、詳細(xì)布局、全局布線、詳細(xì)布線每一步都有日志輸出。如果時(shí)序不滿足要先去讀時(shí)序報(bào)告找到關(guān)鍵路徑而不是盲目加區(qū)域約束。多die FPGA器件的約束就更特殊了不同die之間通過Die-to-Die接口通信約束時(shí)需要在FDC里聲明die分配或使用工具提供的跨die自動(dòng)優(yōu)化。入門時(shí)可以不了解細(xì)節(jié)但必須知道有這個(gè)概念信號(hào)跨die時(shí)走線延遲和資源占用都不同于單die如果設(shè)計(jì)規(guī)模大、接口多建議在初始階段就用區(qū)域約束把模塊擺到合理的die上否則布線很難收斂。6.4 仿真和實(shí)際行為不一致的原因最后一個(gè)高頻坑點(diǎn)功能仿真通過了上板后表現(xiàn)卻和仿真不一致。這不是PDS特有的問題而是FPGA開發(fā)普遍存在的現(xiàn)象。原因通常是仿真里沒有包含時(shí)序信息而實(shí)際電路存在傳播延遲、組合邏輯競爭和I/O時(shí)序。對仿真結(jié)果要有正確的期待功能仿真只能驗(yàn)證邏輯正確性不能驗(yàn)證時(shí)序收斂性。要把仿真和上板之間的gap縮小最簡單的方法是做post-Place Route仿真網(wǎng)表后仿真PDS支持在布局布線后生成帶時(shí)序信息的仿真模型。但這會(huì)顯著增加仿真時(shí)間入門階段遇到不一致問題時(shí)可以先查約束再查時(shí)鐘最后查I/O標(biāo)準(zhǔn)八成問題都出在這三個(gè)地方。7. 從入門到進(jìn)階的路徑建議7.1 值得關(guān)注的FPGA學(xué)習(xí)方向在把你的第一塊紫光同創(chuàng)板子跑通之后進(jìn)階方向可以根據(jù)自己的領(lǐng)域和興趣選擇。通信接口方向是工程需求量最大的建議學(xué)習(xí)UART、SPI、I2C、LVDS這幾個(gè)基礎(chǔ)接口再往上升級(jí)到以太網(wǎng)、PCIe、DDR控制器。其中UART是最適合動(dòng)手模仿的起點(diǎn)寫一個(gè)UART RX接收模塊用串口助手發(fā)數(shù)據(jù)到FPGA再用邏輯分析儀抓波形驗(yàn)證這個(gè)過程能把FPGA開發(fā)的完整閉環(huán)體驗(yàn)一遍。圖像處理方向適合對算法感興趣的開發(fā)者。從簡單的灰度轉(zhuǎn)換開始逐步做到濾波、邊緣檢測用FPGA的并行流水線思維去實(shí)現(xiàn)和軟件實(shí)現(xiàn)是完全不同的體驗(yàn)。這個(gè)方向?qū)r(shí)序收斂的要求明顯提高正好倒逼你學(xué)習(xí)更系統(tǒng)的時(shí)序約束。開源項(xiàng)目是最值得花時(shí)間研究的資源。紫光同創(chuàng)官方社區(qū)和GitHub上已經(jīng)有了一些開源項(xiàng)目從簡單的LED到完整的MCU軟核、電機(jī)控制、顯示驅(qū)動(dòng)等都有。挑選一個(gè)和你工作方向貼近的項(xiàng)目通讀代碼、理解約束、跑通仿真比閉門造車效率高得多。7.2 遇到問題時(shí)應(yīng)該去哪里找答案國產(chǎn)FPGA生態(tài)還在建設(shè)中遇到問題時(shí)信息獲取渠道比國外FPGA少很多但也不是沒有路子。第一選擇是官方文檔。PDS安裝目錄下的doc文件夾里包含了用戶手冊、約束指南、時(shí)序分析指南內(nèi)容非常詳細(xì)。這個(gè)文檔目錄很多人在安裝時(shí)自動(dòng)忽略了實(shí)際上它比任何網(wǎng)絡(luò)教程都可靠。第二選擇是官方技術(shù)支持。紫光同創(chuàng)有完整的技術(shù)支持體系代理商也可以提供原廠咨詢。和國外大廠不太一樣的地方是國產(chǎn)原廠的技術(shù)支持響應(yīng)更直接只要你問的問題夠具體比如貼出報(bào)錯(cuò)日志、工程版本、器件型號(hào)通常能得到針對性解答。第三選擇是社區(qū)和群聊。FPGA開發(fā)者社區(qū)里關(guān)于紫光同創(chuàng)的討論逐漸增多但信息質(zhì)量參差不齊。搜索的時(shí)候用器件型號(hào)加錯(cuò)誤碼的方式比用自然語言描述問題更有效。論壇里也有官方的FAE出沒找到他們維護(hù)的帖子價(jià)值很大。7.3 個(gè)人項(xiàng)目練習(xí)的推薦順序與工具習(xí)慣如果你想把紫光同創(chuàng)FPGA作為長期技能來積累我建議按以下順序安排練習(xí)項(xiàng)目項(xiàng)目1LED流水燈。掌握工程創(chuàng)建、引腳約束、綜合下載全流程。項(xiàng)目2按鍵控制數(shù)碼管。學(xué)習(xí)輸入處理、消抖、有限狀態(tài)機(jī)寫法涉及多個(gè)普通I/O配置。項(xiàng)目3UART收發(fā)。學(xué)習(xí)串行通信協(xié)議在FPGA中的實(shí)現(xiàn)配合串口助手調(diào)試。項(xiàng)目4DDS信號(hào)發(fā)生器。學(xué)習(xí)頻率控制字、相位累加器、DAC接口時(shí)序這是數(shù)字信號(hào)處理的基礎(chǔ)。項(xiàng)目5圖像邊緣檢測。學(xué)習(xí)行緩存、流水線并行、時(shí)序約束挑戰(zhàn)一個(gè)完整的實(shí)時(shí)視頻鏈路。每個(gè)項(xiàng)目都建議建立自己的Checklist器件型號(hào)、工程路徑、關(guān)鍵代碼段、約束文件、踩坑記錄。這個(gè)習(xí)慣在項(xiàng)目多起來之后價(jià)值巨大。我自己就是從第三個(gè)項(xiàng)目開始記錄工程筆記后面再遇到類似問題基本不用重新排查翻筆記就能找到答案。國產(chǎn)FPGA工具鏈的確還不夠完美但它的進(jìn)步速度比我預(yù)想的快。你花在PDS上的學(xué)習(xí)成本不會(huì)白費(fèi)國產(chǎn)器件正在越來越多的場合被納入方案選型提前掌握一套國產(chǎn)工具鏈的完整開發(fā)流程在項(xiàng)目上需要的時(shí)候就能少一點(diǎn)手忙腳亂多一點(diǎn)從容。