FPGA工作原理與基本知識介紹

FPGA工作原理

FPGA採用了邏輯單元陣列LCA這樣一個概念,內部包括可配置邏輯模組CLB、輸出輸入模組IOB和內部連線三個部分。FPGA利用小型查詢表(16&TImes;1RAM)來實現組合邏輯,每個查詢表連線到一個D觸發器的輸入端,觸發器再來驅動其他邏輯電路或驅動I/O,由此構成了即可實現組合邏輯功能又可實現時序邏輯功能的基本邏輯單元模組,這些模組間利用金屬連線互相連線或連線到I/O模組。FPGA的邏輯是透過向內部靜態儲存單元載入程式設計資料來實現的,儲存在儲存器單元中的值決定了邏輯單元的邏輯功能以及各模組之間或模組與I/O間的聯接方式,並最終決定了FPGA所能實現的功能, 加電時,FPGA晶片將EPROM中資料讀入片內程式設計RAM中,配置完成後,FPGA進入工作狀態。掉電後,FPGA恢復成白片,內部邏輯關係消失,因此,FPGA能夠反覆使用。FPGA的程式設計無須專用的FPGA程式設計器,只須用通用的EPROM、PROM程式設計器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片FPGA,不同的程式設計資料,可以產生不同的電路功能。FPGA是由存放在片內RAM中的程式來設定其工作狀態的,因此,工作時需要對片內的RAM進行程式設計。使用者可以根據不同的配置模式,採用不同的程式設計方式。

FPGA的基本特點

1)採用FPGA設計ASIC電路(專用積體電路),使用者不需要投片生產,就能得到合用的晶片。

2)FPGA可做其它全定製或半定製ASIC電路的中試樣片。

3)FPGA內部有豐富的觸發器和I/O引腳。

4)FPGA是ASIC電路中設計週期最短、開發費用最低、風險最小的器件之一。

5) FPGA採用高速CMOS工藝,功耗低,可以與CMOS、TTL電平相容。

可以說,FPGA晶片是小批次系統提高系統整合度、可靠性的最佳選擇之一。

FPGA晶片結構

FPGA工作原理與基本知識介紹

目前主流的FPGA仍是基於查詢表技術的,已經遠遠超出了先前版本的基本效能,並且整合了常用功能(如RAM、時鐘管理和DSP)的硬核(ASIC型)模組。FPGA晶片主要由7部分完成,分別為:可程式設計輸入輸出單元、基本可程式設計邏輯單元、完整的時鐘管理、嵌入塊式RAM、豐富的佈線資源、內嵌的底層功能單元和內嵌專用硬體模組。

FPGA的基本結構

1。 可程式設計輸入輸出單元(IOB)

可程式設計輸入/輸出單元簡稱I/O單元,是晶片與外界電路的介面部分,完成不同電氣特性下對輸入/輸出訊號的驅動與匹配要求。為了便於管理和適應多種電器標準,FPGA的IOB被劃分為若干個組(bank),每個bank的介面標準由其介面電壓VCCO決定,一個bank只能有 一種VCCO,但不同bank的VCCO可以不同。只有相同電氣標準的端口才能連線在一起,VCCO電壓相同是介面標準的基本條件。

FPGA工作原理與基本知識介紹

I/O塊內部結構圖

FPGA工作原理與基本知識介紹

典型的IOB內部結構示意圖

2。 可配置邏輯塊(CLB)

CLB是FPGA內的基本邏輯單元。CLB的實際數量和特性會依器件的不同而不同,但是每個CLB都包含一個可配置開關矩陣,此矩陣由4或6個輸入、一些 選型電路(多路複用器等)和觸發器組成。開關矩陣是高度靈活的,可以對其進行配置以便處理組合邏輯、移位暫存器或RAM。

4。 嵌入式塊RAM(BRAM)

大多數FPGA都具有內嵌的塊RAM,這大大拓展了FPGA的應用範圍和靈活性。塊RAM可被配置為單埠RAM、雙埠RAM、內容地址儲存器 (CAM)以及FIFO等常用儲存結構。CAM儲存器在其內部的每個儲存單元中都有一個比較邏輯,寫入 CAM中的資料會和內部的每一個數據進行比較,並返回與埠資料相同的所有資料的地址,因而在路由的地址交換器中有廣泛的應用。除了塊RAM,還可以將 FPGA中的LUT靈活地配置成RAM、ROM和FIFO等結構。在實際應用中,晶片內部塊RAM的數量也是選擇晶片的一個重要因素。

5。 豐富的佈線資源

佈線資源連通FPGA內部的所有單元,而連線的長度和工藝決定著訊號在連線上的驅動能力和傳輸速度。FPGA晶片內部有著豐富的佈線資源,根據工藝、長度、寬度和分佈位置的不同而劃分為4類不同的類別。第一類是全域性佈線資源,用於晶片內部全域性時鐘和全域性復位/置位的佈線;第二類是長線資源,用以完成晶片 Bank間的高速訊號和第二全域性時鐘訊號的佈線;第三類是短線資源,用於完成基本邏輯單元之間的邏輯互連和佈線;第四類是分散式的佈線資源,用於專有時鐘、復位等控制訊號線。

在實際中設計者不需要直接選擇佈線資源,佈局佈線器可自動地根據輸入邏輯網表的拓撲結構和約束條件選擇佈線資源來連通各個模組單元。從本質上講,佈線資源的使用方法和設計的結果有密切、直接的關係。

6。 底層內嵌功能單元

內嵌功能模組主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等軟處理核。現在越來越豐富的內嵌功能單元,使得單片FPGA成為了系統級的設計工具,使其具備了軟硬體聯合設計的能力,逐步向SOC平臺過渡。

DLL和PLL具有類似的功能,可以完成時鐘高精度、低抖動的倍頻和分頻,以及佔空比調整和移相等功能。

7。 內嵌專用

一、FPGA原理

FPGA中的基本邏輯單元是CLB模組,一個CLB模組一般包含若干個基本的查詢表、暫存器和多路選擇器資源,因此FPGA中的邏輯表示式基於LUT的。

FPGA內部的程式設計資訊一般儲存在SRAM單元中,因此通常的FPGA都是基於SRAM的,所以掉電後資訊會丟失,下次上電需要先配置才能使用。

著重介紹Xilinx FPGA,

二、FPGA產品的速度等級

速度等級一般反映一款晶片的效能,速度等級越高,說明晶片內的邏輯延時和佈線延時越小,設計的效能要求也越容易達到,隨之付出的成本也越大。

對Xilinx FPGA,速度等級一般有“-1”、“-2”、“-3”等,數字越大,速度等級越高,芯片價錢也越貴。

對Intel FPGA,速度等級一般有“-6”、“-7”、“-8”,數字越小表示速度等級越高、價錢越貴。

三、FPGA內部資源

邏輯資源塊是FPGA內部最重要的資源,Xilinx稱其為CLB(configurable logic block);

7系列中,FPGA內部三大主要資源:可程式設計邏輯單元、可程式設計I/O單元、佈線資源

1、可配置邏輯單元(configurable logic block)

CLB在FPGA中最為豐富,由兩個SLICE構成,SLICE分為SLICEL(L:Logic)和SLICEM(M:Memory),因此CLB可分為CLBLL和CLBLM兩類;

SLICEL和SLICEM內部都包含4個6輸入查詢表(LUT6)、3個數據選擇器(MUX)、1個進位鏈(carry chain)和8個觸發器(Flip-Flop);

2、儲存單元(Block RAM)

Block RAM可以被配置為同步、非同步、單埠、雙埠的RAM或FIFO,或者ROM;

3、運算單元(DSP48E1)

當FPGA需要複雜的運算時,會使用DSP48E1,例如乘法;

首先看數位電路,瞭解什麼是與或非,各種觸發器,各種邏輯閘,注意!瞭解即可,但是是怎麼工作的一定要透徹透徹透徹透徹!(FPGA用的是HDL也就是硬體描述語言,程式是用來描述你的邏輯閘的,數電是根基!)書的話我看的是電子技術基礎(數字部分)康華光的 這本書還附帶verilog語言的入門哦!

再看FPGA設計與應用類的書,詳細瞭解FPGA這個器件,它為什麼而生,為什麼流行,特點,缺點。這個要是有英文功底,直接奔看英文。像ALTERA,XILINX,這兩家的網站都是巨NB的。沒功底,看 FPGA設計與應用 西安電子科技大學出版社的 講的很細。可以當手冊來查,這麼久了還一直在我抽屜裡沒丟呢。

再次看VHDL,或verilog語言的書。

這裡有分歧,前者語法嚴格,適合做大系統,入門困難,但學會了對硬體的結構會有更深的理解。

後者根據C語言改編,如果你有C語言基礎,學這個容易上手,缺點是系統級別描述不行,沿襲了C語言的靈活,也帶來了語法上的不嚴格,但是其作用面廣,新手推薦,底層描述做的很好。

這裡我常用的VHDL,只能推薦VHDL的 硬體描述語言VHDL教程 西安交通大學出版社 姜雪松

如果學verilog,先看看C語言的書,基礎要打牢,不然程式碼上了規模,你就悲劇了。回頭看很吃力!

再看HDL設計軟體的使用書 我用的是QUARTUS II軟體,貌似的就是款軟體了,這樣的書,當做一個手冊就行了,主要是介紹如何使用軟體,告訴你怎麼建工程,怎麼輸入程式,畫原理圖,編譯糾錯,時序模擬,都在這裡了,軟體用的好,比用的差的相隔很大哦!不會的時候狂翻書。

這裡就隨便買本什麼書就OK了,上網搜FPGA系統設計與例項,大把的。

如果你想速成,那就上網看影片吧,這樣主要是面對應用的,一個小時內讓你的板子執行起來。早期起來的快,活學活用,就是後期沒有系統理論支援,會有些吃力,特別是大專案那完全是個悲劇。國內做的可以的,我知道的就是周立功了,艾米電子也可以吧。這兩家都有學習板,不過後者的教程抄襲的前者的。前者功底深厚些,資金不緊張就買前者吧。速成的話,數電書一定一定必備,邊看邊學比較好。其餘的書可以適量買點。

這麼多,其實只要有興趣,慢慢學,入門也不難,板子就去網購吧。

我們先談一下FPGA基本知識:

FPGA(Field-Programmable Gate Array),即現場可程式設計門陣列,它是在PAL、GAL、CPLD等可程式設計器件的基礎上進一步發展的產物。它是作為專用積體電路領域中的一種半定製電路而出現的,既解決了定製電路的不足,又克服了原有可程式設計器件閘電路數有限的缺點。

  1、硬體設計基本原則

(1)速度與面積平衡和互換原則:一個設計如果時序餘量較大,所能跑的頻率遠高於設計要求,能可以透過模組複用來減少整個設計消耗的芯片面積,這就是用速度優勢換面積的節約;反之,如果一個設計的時序要求很高,普通方法達不到設計頻率,那麼可以透過資料流串並轉換,並行複製多個操作模組,對整個設計採用“乒乓操作”和“串並轉換”的思想進行處理,在晶片輸出模組處再對資料進行“並串轉換”。從而實現了用面積複製換取速度的提高。

(2)硬體原則:理解HDL本質

(3)系統原則:整體把握

(4)同步設計原則:設計時序穩定的基本原則

2、Verilog作為一種HDL語言,對系統行為的建模方式是分層次的。比較重要的層次有系統級、演算法級、暫存器傳輸級、邏輯級、門級、電路開關級。

3、實際工作中,除了描述模擬測試激勵時使用for迴圈語句外,極少在RTL級編碼中使用for迴圈,這是因為for迴圈會被綜合器展開為所有變數情況的執行語句,每個變數獨立佔用暫存器資源,不能有效的複用硬體邏輯資源,造成巨大的浪費。一般常用case語句代替。

4、if…else…和case在巢狀描述時是有很大區別的,if…else…是有優先順序的,一般來說,個if的優先順序,一個else的優先順序。而case語句是平行語句,它是沒有優先順序的,而建立優先順序結構需要耗費大量的邏輯資源,所以能用case的地方就不要用if…else…語句。

補充:1。也可以用if…; if…; if…;描述不帶優先順序的“平行”語句。

5、FPGA一般觸發器資源比較豐富,而CPLD組合邏輯資源更豐富。

  6、FPGA和CPLD的組成:

FPGA基本有可程式設計I/O單元、基本可程式設計邏輯單元、嵌入式塊RAM、豐富的佈線資源、底層嵌入功能單元和內嵌專用硬核等6部分組成。

CPLD的結構相對比較簡單,主要由可程式設計I/O單元、基本邏輯單元、佈線池和其他輔助功能模組組成。

7、Block RAM:

3種塊RAM結構,M512 RAM(512bit)、M4K RAM(4Kbit)、M-RAM(64Kbit)。

M512 RAM:適合做一些小的Buffer、FIFO、DPRAM、SPRAM、ROM等;

M4K RAM:適用於一般的需求

M-RAM: 適合做大塊資料的緩衝區。

Xlinx 和 LatTIce FPGA的LUT可以靈活配置成小的RAM、ROM、FIFO等儲存結構,這種技術被稱為分散式RAM。

補充:但是在一般的設計中,不提倡用FPGA/CPLD的片內資源配置成大量的儲存器,這是處於成本的考慮。所以儘量採用外接儲存器。

8、善用晶片內部的PLL或DLL資源完成時鐘的分頻、倍頻率、移相等操作,不僅簡化了設計,並且能有效地提高系統的精度和工作穩定性。

  9、非同步電路和同步時序電路的區別

非同步電路:

電路邏輯有用組合電路實現;

非同步時序電路的缺點是容易產生毛刺;

不利於器件移植;

不利於靜態時序分析(STA)、驗證設計時序效能。

同步時序電路:

電路邏輯是用各種觸發器實現;

電路主要訊號、輸出訊號等都是在某個時鐘沿驅動觸發器產生的;

同步時序電路可以很好的避免毛刺;

利於器件移植;

利於靜態時序分析(STA)、驗證設計時序效能。

  10、同步設計中,穩定可靠的資料取樣必須遵從以下兩個基本原則:

(1)在有效時鐘沿到達前,資料輸入至少已經穩定了取樣暫存器的Setup時間之久,這條原則簡稱滿足Setup時間原則;

(2)在有效時鐘沿到達後,資料輸入至少還將穩定保持取樣暫存器的Hold時鐘之久,這條原則簡稱滿足Hold時間原則。

  11、同步時序設計注意事項:

非同步時鐘域的資料轉換。

組合邏輯電路的設計方法。

同步時序電路的時鐘設計。

同步時序電路的延遲。同步時序電路的延遲常用的設計方法是用分頻或者倍頻的時鐘或者同步計數器完成所需的延遲,對比較大的和特殊定時要求的延時,一般用高速時鐘產生一個計數器,根據計數產生延遲;對於比較小的延遲,可以用D觸發器打一下,這樣不僅可以使訊號延時了一個時鐘週期,而且完成了訊號與時鐘的初次同步。在輸入訊號取樣和增加時序約束餘量中使用。另外,還有用行為級方法描述延遲,如“#5 a《=4’0101;”這種常用於模擬測試激勵,但是在電路綜合時會被忽略,並不能起到延遲作用。

Verilog 定義的reg型,不一定綜合成暫存器。在Verilog程式碼中常用的兩種資料型別是wire和reg型,一般來說,wire型指定的資料和網線透過組合邏輯實現,而reg型指定的資料不一定就是用暫存器實現。

  12、常用設計思想與技巧

(1)乒乓操作;

(2)串並轉換;

(3)流水線操作;

(4)非同步時鐘域資料同步。是指如何在兩個時鐘不同步的資料域之間可靠地進行資料交換的問題。資料時鐘域不同步主要有兩種情況:

兩個域的時鐘頻率相同,但是相差不固定,或者相差固定但是不可測,簡稱為同頻異相問題。

兩個時鐘頻率根本不同,簡稱異頻問題。

兩種不推薦的非同步時鐘域操作方法:一種是透過增加Buffer或者其他門延時來調整取樣;另一種是盲目使用時鐘正負沿調整資料取樣。

  13、模組劃分基本原則:

(1)對每個同步時序設計的子模組的輸出使用暫存器(用暫存器分割同步時序模組原則)。

(2)將相關邏輯和可以複用的邏輯劃分在同一模組內(呼應系統原則)。

(3)將不同最佳化目標的邏輯分開。

(4)將送約束的邏輯歸到同一模組。

(5)將儲存邏輯獨立劃分成模組。

(6)合適的模組規模。

(7)頂層模組不進行邏輯設計。

  14、組合邏輯的注意事項

(1)避免組合邏輯反饋環路(容易毛刺、振盪、時序違規等)。

解決:

A、牢記任何反饋迴路必須包含暫存器;

B、檢查綜合、實現的warning資訊,發現反饋迴路(combinaTIonal loops)後進行相應修改。

(2)替換延遲鏈。

解決:用倍頻、分頻或者同步計數器完成。

(3)替換非同步脈衝產生單元(毛刺生成器)。

解決:用同步時序設計脈衝電路。

(4)慎用鎖存器。

解決:

A、使用完備的if…else語句;

B、檢查設計中是否含有組合邏輯反饋環路;

C、對每個輸入條件,設計輸出操作,對case語句設定default操作。特別是在狀態機設計中,有一個default的狀態轉移,而且每個狀態也有一個default的操作。

D、如果使用case語句時,特別是在設計狀態機時,儘量附加綜合約束屬性,綜合為完全條件case語句。

小技巧:仔細檢查綜合器的綜合,目前大多數的綜合器對所綜合出的latch都會報“warning”,透過綜合可以較為方便地找出無意中生成的latch。

  15、時鐘設計的注意事項

(1)同步時序電路推薦的時鐘設計方法:

時鐘經全域性時鐘輸入引腳輸入,透過FPGA內部專用的PLL或DLL進行分頻/倍頻、移相等調整與運算,然後經FPGA內部全域性時鐘佈線資源驅動到達晶片內所有暫存器和其他模組的時鐘輸入端。

FPGA設計者的5項基本功:模擬、綜合、時序分析、除錯、驗證。

對於FPGA設計者來說,練好這5項基本功,與用好相應的EDA工具是同一過程,對應關係如下:

1。 模擬:Modelsim, Quartus II(Simulator Tool)

2。 綜合:Quartus II (Compiler Tool, RTL Viewer, Technology Map Viewer, Chip Planner)

3。 時序:Quartus II (TImeQuest TIming Analyzer, Technology Map Viewer, Chip Planner)

4。 除錯:Quartus II (SignalTap II Logic Analyzer, Virtual JTAG, Assignment Editor)

5。 驗證:Modelsim, Quartus II(Test Bench Template Writer)

掌握HDL語言雖然不是FPGA設計的全部,但是HDL語言對FPGA設計的影響貫穿於整個FPGA設計流程中,與FPGA設計的5項基本功是相輔相成的。

對於FPGA設計者來說,用好“HDL語言的可綜合子集”可以完成FPGA設計50%的工作——設計編碼。

  練好模擬、綜合、時序分析這3項基本功,對於學習“HDL語言的可綜合子集”有如下幫助:

1。 透過模擬,可以觀察HDL語言在FPGA中的邏輯行為。

2。 透過綜合,可以觀察HDL語言在FPGA中的物理實現形式。

3。 透過時序分析,可以分析HDL語言在FPGA中的物理實現特性。

對於FPGA設計者來說,用好“HDL語言的驗證子集”,可以完成FPGA設計另外50%的工作——除錯驗證。

1。 搭建驗證環境,透過模擬的手段可以檢驗FPGA設計的正確性。

2。 全面的模擬驗證可以減少FPGA硬體除錯的工作量。

3。 把硬體除錯與模擬驗證方法結合起來,用除錯解決模擬未驗證的問題,用模擬保證已經解決的問題不在除錯中再現,可以建立一個迴歸驗證流程,有助於FPGA設計專案的維護。

FPGA設計者的這5項基本功不是孤立的,必須結合使用,才能完成一個完整的FPGA設計流程。反過來說,透過完成一個完整的設計流程,才能有效地練習這5項基本功。對這5項基本功有了初步認識,就可以逐個深入學習一些,然後把學到的知識再次用於完整的設計流程。如此反覆,就可以逐步提高設計水平。採用這樣的循序漸進、螺旋式上升的方法,只要透過培訓入了門,就可以自學自練,自我提高。

市面上出售的有關FPGA設計的書籍為了保證結構的完整性,對FPGA設計的每一個方面分開介紹,每一方面雖然深入,但是由於缺少其他相關方面的支援,讀者很難付諸實踐,只有通讀完全書才能對FPGA設計獲得一個整體的認識。這樣的書籍,作為工程培訓指導書不行,可以作為某一個方面進階的參考書。

對於新入職的員工來說,他們往往對FPGA的整體設計流程有了初步認識,5項基本功的某幾個方面可能很紮實。但是由於某個或某幾個方面能力的欠缺,限制了他們獨自完成整個設計流程的能力。入職培訓的目的就是幫助他們掌握整體設計流程,培養自我獲取資訊的能力,通過幾個設計流程來回的訓練,形成自我促進、自我發展的良性迴圈。在這一過程中,隨著對工作涉及的知識的廣度和深度的認識逐步清晰,新員工的自信心也會逐步增強,對個人的發展方向也會逐步明確,才能積極主動地參與到工程專案中來。

  總結幾點:

1)看程式碼,建模型

只有在腦海中建立了一個個邏輯模型,理解FPGA內部邏輯結構實現的基礎,才能明白為什麼寫Verilog和寫C整體思路是不一樣的,才能理解順序執行語言和並行執行語言的設計方法上的差異。在看到一段簡單程式的時候應該想到是什麼樣的功能電路。

2)用數學思維來簡化設計邏輯

學習FPGA不僅邏輯思維很重要,好的數學思維也能讓你的設計化繁為簡,所以啊,那些看見高數就頭疼的童鞋需要重視一下這門課哦。舉個簡單的例子,比如有兩個32bit的資料X[31:0]與Y[31:0]相乘。當然,無論Altera還是Xilinx都有現成的乘法器IP核可以呼叫,這也是簡單的方法,但是兩個32bit的乘法器將耗費大量的資源。那麼有沒有節省資源,又不太複雜的方式來實現呢?我們可以稍做修改:

將X[31:0]拆成兩部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],則X1左移16位後與X2相加可以得到X;同樣將Y[31:0]拆成兩部分Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],則Y1左移16位後與Y2相加可以得到Y;則X與Y的相乘可以轉化為X1和X2 分別與Y1和Y2相乘,這樣一個32bit*32bit的乘法運算轉換成了四個16bit*16bit的乘法運算和三個32bit的加法運算。轉換後的佔用資源將會減少很多,有興趣的童鞋,不妨綜合一下看看,看看兩者差多少。

3)時鐘與觸發器的關係

“時鐘是時序電路的控制者”這句話太經典了,可以說是FPGA設計的聖言。FPGA的設計主要是以時序電路為主,因為組合邏輯電路再怎麼複雜也變不出太多花樣,理解起來也不沒太多困難。但是時序電路就不同了,它的所有動作都是在時鐘一拍一拍的節奏下轉變觸發,可以說時鐘就是整個電路的控制者,控制不好,電路功能就會混亂。

打個比方,時鐘就相當於人體的心臟,它每的跳動就是觸發一個 CLK,向身體的各個器官供血,維持著機體的正常運作,每一個器官體統正常工作少不了組織細胞的構成,那麼觸發器就可以比作基本單元組織細胞。時序邏輯電路的時鐘是控制時序邏輯電路狀態轉換的“發動機”,沒有它時序邏輯電路就不能正常工作,因為時序邏輯電路主要是利用觸發器儲存電路的狀態,而觸發器狀態變換需要時鐘的上升或下降沿!由此可見時鐘在時序電路中的作用!

簡單說一下體會吧,歸結起來就多實踐、多思考、多問。實踐出真知,看100遍別人的方案不如自己去實踐一下。實踐的動力一方面來自興趣,一方面來自壓力,我個人覺得後者更重要。有需求會容易形成壓力,也就是說能在實際的專案開發中鍛鍊,而不是為了學習而學習。在實踐的過程中要多思考,多想想問題出現的原因,問題解決後要多問幾個為什麼,這也是經驗積累的過程,如果有寫專案日誌的習慣更好,把問題及原因、解決的辦法都寫進去。還要多問,遇到問題思索後還得不到解決就要問了,畢竟個人的力量是有限的,問同學同事、問搜尋引擎、問網友都可以,一篇文章、朋友們的點撥都可能幫助自己快速解決問題。