1. 程式人生 > 其它 >FPGA IO

FPGA IO

今天想和大家一起聊聊 FPGA 的 IO。


先說說我當年入門的經歷吧。國內的大學有 FPGA 開發條件的實驗室並不太多,當年大學的那幫同學有的做ARM,有的做 linux,很少有人做 FPGA,當時學 FPGA 僅僅是由於非常渴望的好奇心。所以,在淘寶買了一塊開發板,就開始了自己的 FPGA 之路。

大部分開發板的內容主要是教學員怎麼樣寫 Verilog 程式碼,很少會對 FPGA 的晶片架構做詳細的說明和解讀,所以當年面試的時候就碰到了一個很尷尬的事情,面試官第一個問題問的就是:用的是哪顆 FPGA,核心電壓是多少?當時就懵了,雖然做了快一年 FPGA,我還沒有關注過晶片的核心電壓···。

但其實熟悉 FPGA 的基本架構,瞭解 FPGA 的晶片內部資源真的很重要!

雖然很多 FPGA 工程師都是寫程式碼,但是作為硬體程式設計工程師,如果不熟悉 FPGA 的底層資源和架構,是很難寫出高質量的程式碼——至少很難寫出複雜邏輯的高質量程式碼,也很難站在系統的層面去考慮晶片的選型等問題。那熟悉 FPGA 架構,首先最主要的一點,我們先來了解 FPGA 的 IO。

FPGA 的 IO 命名。FPGA 晶片 IO 命名方式太多,管腳也多,讓人感覺很亂。這是我當年的感覺,諸如會經常聽到:A13,B14···BANK34,BANK12····MIO0,EMIO···。但這確實是 FPGA 的特點,FPGA 可以相容多種不同的電壓標準,也有豐富的 IO。

首先,FPGA 的 IO 物理命名規則,也就是我們做管腳約束時候的命名,晶片通常是長方體或者正方體,所以命名通常採用字母+數字組合的方式,從上到下是字母(A,B,C,D```),從左到右是數字(1,2,3```),所以諸如:A13(見下圖),就是圖上標紅的位置,這個是 xilinx 的一顆晶片示意圖,其它廠商的 FPGA 晶片也類似。

其次,FPGA 的功能命名規則。功能命名規則每個廠家都會自己的一套規則,但都大同小異,我們重點來講述一下 xilinx 的命名(xilinx 的文件是行業標杆,其它 FPGA 廠家的資料多多少少會參考 xilinx)。通常 xilinx 的功能命名格式為:IO_LXXY#/IO_XX。其中:


(1) IO 代表使用者 IO;


(2) L 代表差分,XX 代表在當前 BANK 下的唯一標識號,Y=[P|N]表示 LVDS 訊號的 P 或者 N;


(3) #表示 Bank 號。

比如,我們的原理圖中有一個 IO 的名字為:IO_L13P_T2_MRCC_12,那通過功能命名的規則我們就可以知道,這是一個使用者 IO,支援差分訊號,是 BANK12 的第 13 對差分的 P 埠,與此同時它也是全域性時鐘網路輸入管腳(MRCC 是全域性時鐘網路)。

再次,什麼是 Bank。Bank 是一組物理位置和特性相近的 IO 的總稱,同一 BANK 的電壓的基準是一致的,因此,通常如果我們需要各種不同標準的電壓,可以通過給到 BANK 的電壓基準不同的方式來實現多種電平標準的輸入輸出。通常封裝越大,BANK 數量也越多,可以支援電壓標準也越多。如下圖就是 ZYNQ 7030 的一個 IO BANK 分佈圖:

除了 FPGA 的使用者 IO 外,還有很多其他的功能 IO,如下載介面,模式選擇介面,還有 MRCC,也即我們前文講到的全域性時鐘網路和區域性時鐘網路等。其中最值得關注的是 FPGA 的電源引腳,其中 ZYNQ 器件包含兩套完全獨立的供電系統,一套是嵌入式端的電源(PS),一套是邏輯端的電源(PL),兩套供電系統完全獨立,因此也沒有先後上電的時序需求。如下:

通常包含的電壓有:
(1) 核心電壓,Vccpint 和 Vccint 分別為 PS 的核心電壓和 PL 的內容電壓,核心電壓的大小通常和工藝相關,如 48nmXILINX器件的核心電壓為 1.2v,28nm 的 ZYNQ 器件的核心電源為 1.0v(通常電壓都有一個範圍,範圍也和速度等級相關),當然,電壓越低,在同樣邏輯規模和主頻下,對應的功耗也會越低。

(2)Vccpaux 和 Vccaux 分別為 PS 和 PL 的輔助電壓。在 ZYNQ 器件中為 1.8v。

(3) Vccpll 為內部鎖相環供電電壓。

(4) Vcc_mio0 為 PS 的 MIO0 BANK 的基準電壓,VCCO_DDR 為 PS 端的 DDR 的電壓,此電壓通常和選擇的 DDR 顆粒相關,如(DDR3,LDDR3 等相對應的值就有所不同,這一部分我們都要在相關視訊中做詳細解讀)。

(5) Vccon 這部分就我們前面講到的 PL 端的 Bank 基準。

對於純邏輯的 FPGA 器件,由於沒有 PS 端,因此相應的 PS 端供電就沒有,只有 PL 端的供電,實現更簡單。

最後,我們來聊聊 FPGA 的上電。和所有的器件一樣,FPGA 的上電遵循一定的上電邏輯,通常情況下 SRAM 結構(XILINX、Altera 等都屬於 SRAM 結構)的上電時間會比 FLASH 結構的(Microm,Actel 等)上電時間要長。有些國產 FPGA 為了簡化 BOM 成本(如安路半導體)不需要使用者特別關注上電時序,用單電源供電,晶片內部控制上電時序。雖然不合理的上電時序有時候也能讓 FPGA 正常工作,但不正常的上電或掉電過程有可能會造成瞬時電流過大,無法保證上電期間 FPGAIO 為三態,甚至損壞晶片,因此需要設計者特別關注上電時序。針對 XILINX FPGA 的上電通常需要遵循以下規則:


(1)在 PS 端,Vccpint,Vccpaux,Vccpll 一起上電,後啟動 PS 的 Vcco 電源(Vcco_mio0,Vcco_mio1,Vcco_ddr),其中 PS_POR_B 在上電期間應保持低電平,直到核心,輔助電壓,PLL 電壓和 BANK 的電壓達到相應閾值。掉電的順序和上電順序保持一致。

(2)在 PL 端,推薦的上電順序依次為 Vccint,Vccbram,Vccaux,Vccaux_io,Vcco。其中,如果 Vccint 和 Vccbram 是相同的電壓,則可以採用同一電源供電,同時啟動。Vccaux,Vccaux_io 和 Vcco 為同一電壓則亦可以採用同一電源,同時啟動。

除此,在設計 FPGA 的原理圖中要需要特別關注 Serdes 的供電(不同的廠家,甚至同一廠家不同的器件對 Serdes 都有不同的名稱,如:GTH,GTX 等等,但實質都是自同步的高速序列收發器,支援的速率有所差別),不使用的情況下需相應的懸空或者接地。