一直以來,覺得自己關於FPGA方面,摸不到“低”——對底層架構認識不清,夠不着“高”——沒真正獨立做過NB的應用,如高速、復雜協議或算法、神經網絡加速等高大上的應用,所以能力和認識水平都處於中間水平。這段時間做時序優化,感覺心有余而力不足了,可能要觸及手動布局布線了,打開Device布局圖才開始有興趣探究一些底層結構的東西。
可能翻開任何一本有關FPGA的書籍,上來就會介紹FPGA的歷史,原理,內部結構什么的,大部分人看着都極其枯燥,常常要么直接略過,要么就看一遍,久了也就忘記了(部分靠翻譯文檔的書作者該好好反思)。我硬着頭皮去彌補之前缺失的一些基礎知識,結合Xilinx A7 芯片,總結一下自己的收獲。
1. 總覽
平台:Vivado
芯片:XC7A200
FPGA主要有六部分組成:可編程輸入輸出單元、可編程邏輯單元、完整的時鍾管理、嵌入塊狀RAM、布線資源、內嵌的底層功能單元和內嵌專用硬件模塊。其中最為主要的是可編程輸出輸出單元、可編程邏輯單元和布線資源。
2. 可配置邏輯單元
可配置邏輯單元(Configurable Logic Block,CLB)在FPGA中最為豐富,由兩個SLICE組成。由於SLICE有SLICEL(L:Logic)和SLICEM(M:Memory)之分,因此CLB可分為CLBLL和CLBLM兩類。
點擊內部的邏輯單元,通過陰影區別包含的范圍,你可以清晰的看到結構划分的層級。在旁邊窗口可以清晰的看到選中部分的屬性(Properties)。
來,再放大,放大到一個SLICEL,如下圖所示。
SLICEL和SLICEM內部都包含4個6輸入查找表(Look-Up-Table,LUT6)、3個數據選擇器(MUX)、1個進位鏈(Carry Chain)和8個觸發器(Flip-Flop),下面分部分介紹的時候,時不時可以再回頭看這張結構圖。
2.1 6輸入查找表(LUT6)
雖然SLICEL和SLICEM的結構組成一樣,但兩者更細化的結構上略有不同,區別在於LUT6上(如下圖所示),從而導致LUT6的功能有所不同(如下表格所示)。
LUT功能 | SLICEL | SLICEM |
---|---|---|
邏輯函數發生器 | v | v |
ROM | v | v |
分布式RAM | v | |
移位寄存器 | v |
上邊的功能可以看到,不論是SLICEL還是SLICEM,他們的LUT6都可以作為ROM使用,配置為64x1(占用1個LUT6,64代表深度,1代表寬度)、128x1(占用2個LUT6)和256(占用4個LUT6)的ROM。
另外既然SLICEM中的M代表memory的意思,所以增加了更多存儲功能。可以配置為RAM,尤其指分布式RAM。其中RAM的寫操作為同步,而讀操作是異步的,即與時鍾信號無關。如果要實現同步讀操作,則要額外占用一個觸發器,從而增加了意識時鍾的延遲(Latency),但提升了系統的性能。這就解釋了為什么我們實現RAM同步讀寫的時候,讀出輸出要延遲一個clk。一個LUT6可配置64x1的RAM,當RAM的深度大於64時,會占用額外的MUX(F7AMUX,F7BMUX,F8MUX,即一個SLICE中的那3個MUX)。
SLICEM中的LUT還可以配置為移位寄存器,每個LUT6可實現深度為32的移位寄存器,且同一個SLICEM中的LUT6(4個)可級聯實現128深度的移位寄存器。
2.2 選擇器(MUX)
SLICE中的三個MUX(Multiplexer:F7AMUX,F7BMUX和F8MUX)可以和LUT6聯合共同實現更大的MUX。事實上,一個LUT6可實現4選1的MUX。
SLICE中的F7MUX(F7AMUX和F7BMUX)的輸入數據來自於相鄰的兩個LUT6的O6端口。
一個F7MUX和相鄰的兩個LUT6可實現一個8選1的MUX。因此,一個SLICE可實現2個8選1的MUX。
4個LUT6、F7AMUX、F7BMUX和F8MUX可實現一個16選1的MUX。因此,一個SLICE可實現一個16選1的MUX。
2.3 進位鏈(Carry Chain)
進位鏈用於實現加法和減法運行。就是結構圖中,中間那個大的部分,可以看到它內部實際還包含4個MUX和4個2輸入異或門(XOR)。
異或運算是加法運算中必不可少的運算。
2.4 觸發器(Flip-Flop)
每個SLICE中有8個觸發器。這個8個觸發器可分為兩大類:4個只能配置為邊沿敏感的D觸發器(Flip-Flop)和4個即可配置為邊沿敏感的D觸發器又可配置為電平敏感的鎖存器(Flop&Latch)。當后者被用作鎖存器的時候,前者將無法使用。
當這8個觸發器都用作D觸發器時,他們的控制端口包括使能端CE、置位/復位端口S/R和時鍾端口CLK是對應共享的,也就是就是說共用的。{CE,S/R,CLK}稱為觸發器的控制集。顯然,在具體的設計中,控制集種類越少越好,這樣可以提高觸發器的利用率。那么怎樣減少控制集種類呢?我的理解是:
- 減少時鍾種類,即頻率越少越好;
- 統一規范的設計邏輯,如復位。
S/R端口可配置為同步/異步置位或同步/異步復位,且高有效,因此可形成4種D觸發器,如下表所示。
原語(Primitive) | 功能描述 | 原語(Primitive) | 功能描述 |
---|---|---|---|
FDCE | 同步使能,異步復位 | FDRE | 同步使能,同步復位 |
FDPE | 同步使能,異步置位 | FDSE | 同步使能,同步置位 |
在我們的常規設計中,FDCE和FDPE占了絕大多數。
說到高有效,讓我想起了一個大家習以為常,但很少深究的問題:為什么一開始接觸FPGA的時候,都告訴我們低電平復位?后來查了一些資料,有說從功耗、噪聲可靠性方面考慮等等,但是偶然看到Xilinx和Altera兩家芯片的觸發器不一樣!如下圖所示,Xilinx的觸發器是高電平復位,而Altera的觸發器時低電平復位。所以這也是需要考慮的一點嗎?
參考文獻:
- 《7 Series FPGAs Configurable Logic Block》(UG474)
- 《VIVADO從此開始》——高亞軍著(強烈推薦此書!!!!本博客論述部分大多來自高老師的書)