FPGA研發心得~~轉

FPGA是個什麼玩意?
首先來說:
FPGA是一種器件。其英文名 feild programable gate arry 。很長,但不通俗。通俗來說,是一種功能強大似乎無所不能的器件。通常用於通信、網絡、圖像處理、工業控制等不同領域的器件。就像ARM、DSP等嵌入式器件一樣,成爲無數碼農碼工們情感傾瀉而出的代碼真正獲得生命的地方。只不過,一樣的編程,卻是不一樣的思想。嵌入式軟件人員看到的是C。而FPGA工程師看到是硬件描述語言,verilog或VHDL。軟件看到是函數、對象、重構。FPGA工程師則是模塊、流水、複用。從現象上看,都是代碼到下載程序再到硬件上運行。不能只看現象而忽略本質。FPGA 開發本質上是設計一顆IC,“**的身子,丫鬟的命”不是所有verilog/VHDL代碼,都能獲得青睞去流片成爲真正的芯片,而更多的則成爲運行在FPGA器件上,成爲完成相同功能的替代品。其實現的功能卻一點也不遜色於百萬身價流片的近親。從而成爲獨樹一幟的行業。
FPGA開發的流程,是通過verilog/VHDL等硬件描述語言通過EDA工具編譯、綜合、佈局佈線成爲下載文件,最終加載到FPGA器件中去,完成所實現的功能。那硬件描述語言描述的是什麼?這裏描述的就是組合邏輯電路和時序邏輯電路。組合邏輯電路就是大家所熟知的 與門、或門、非門。時序邏輯電路則是觸發器。數字芯片上絕大部分邏輯都是這兩種邏輯實現的。也就是基本上每個電子行業的人所學過的數字電路。順便說一下,感謝香農大師,在其碩士畢業論文<繼電器與開關電路的符號分析>就奠定了數字電路的的根基。只不過在FPGA中,與或非的操作變成了查找表的操作。於是所有的數字電路變成了查找表和寄存器,這就構成了FPGA的基礎。查找表負責邏輯實現,寄存器存儲電路狀態。二者配合,雙劍合璧,天衣無縫。這是最初的FPGA的雛形。 現代FPGA內部出了查找表和寄存器之外,還有RAM塊,用於存儲大量的數據塊,這是因爲RAM塊較寄存器來存儲大量數據更能節省芯片實現的面積。FPGA內部的時序電路則需要時鐘的輸入,通常FPGA內部需要時鐘種類較多,因此需要在片內產生所需的的相關的時鐘,如不同頻率,不同相位的時鐘,因此時鐘管理單元DCM/PLL也是必不可少的內部部件。除此之外,FPGA內部還包括接口I/O,I/O分爲普通I/O和高速I/O,高速I/O支持例如高速的SERDES,用於實現XAUI,PCIE等高速接口,這些接口動輒幾Gbps到10Gbps以上。此外種類多種多樣的硬核IP也是各FPGA廠商差異化競爭利器,例如POWERPC、ARM等硬核IP。從而構成CPU+FPGA於一體的集可編程性和可重構的處理平臺。因此,相對來所,FPGA雖然發展有二三十年的歷史,其基本架構一直不變不大。
回到問題開始的地方,FPGA的英文翻譯過來是現場可編程門陣列。這是相對ASIC來說的,ASIC的硬件也可看做是門陣列,但是其是非可編程的器件。流片完成其功能就固化了,而FPGA的可編程性就在其能夠重新下載配置文件,來改變其內在的功能,這就是其可編程性的由來。從前端開發流程來說,FPGA和ASIC開發並無二至。由於ASIC開發一次性投入成本較高,FPGA無疑是一種經濟的替代方案,用於實現的高速的數據並行處理。如業務能夠支撐大規模應用並且協議固化,則能夠分攤成本的ASIC實現就有成本的優勢。
FPGA作爲一種器件,技術上主要壟斷在少數大公司手中,那就是雙巨頭ALTERA和XILINX。除此之外還有一些份額相對較小的公司,例如ACTEL和LATTICE。不止是FPGA的硬件芯片,其配套的EDA工具技術壁壘更高。因此相對於CPU來說,FPGA的國產化更不樂觀,不過已經有國內的廠商來從事這一行業,例如國微和京微雅格等,也在一些細分市場上推出自己的FPGA產品。
FPGA和他那些小夥伴們 (一) 系統架構組成
通常來講,“一個好漢三個幫”,一個完整的嵌入式系統中由單獨一個FPGA使用的情況較少。通常由多個器件組合完成,例如由一個FPGA+CPU來構成。通常爲一個FPGA+ARM,ARM負責軟件配置管理,界面輸入外設操作等操作,FPGA負責大數據量運算,可以看做CPU的專用協處理器來使用,也常會用於擴展外部接口。常用的有ARM+FPGA,DSP+FPGA,或者網絡處理器+FPGA等種種架構形式,這些架構形式構成整個高速嵌入式設備的處理形態。
不得不說的是,隨着技術的進步,現在CPU中集成的單元也隨之增加,例如TI的“達芬奇”架構的處理器內部通常由ARM+DSP構成。同時異構的處理器形態業逐漸流行,如ARM9+ARM7的結構。這類一個主要處理系統(ARM9)外帶輔助處理系統(ARM7)的設計,同樣成爲現在處理器設計的流行方向。主處理系統運行嵌入式操作系統,而輔助處理單元則專注某一些的專用領域的處理。這些系統的應用減少了FPGA作爲CPU協處理單元的領域。因爲畢竟FPGA相比ARM等流行嵌入式處理器價格要相對較高。
在這種情形下,FPGA的廠商似乎也感受到了壓力,不約而同推出了帶ARM硬核的FPGA,例如ALTERA的 和XILINX的ZYNQ和ALTERA的SOC FPGA。這是即是互相競爭的需要,也是同衆多CPU廠商一掰手腕的傑總。即使在這兩種在趨勢下,經典的處理器+FPGA的設計仍然可看做爲高性能嵌入式系統的典型配置。
經典的處理器+FPGA的配置中有多種的架構形式,即多個處理器單元,可能是ARM,MIPS,或者DSP,FPGA也可能是多片的配置,具體架構形式於具體處理的業務相關和目標設備的定位也相關。因爲FPGA作爲簡單業務流大數據量的處理形態仍然是CPU無可比擬的優勢,FPGA內部可以開發大量業務數據並行,從而實現高速的數據處理。
在實現高速處理方面,CPU的另一個發展趨勢是多核,多核處理器也能處理大數據量的業務的並行,例如業界TERILA已推出64核的多核處理器,採用MIPS處理器,通過二維MASH網絡連接在一起,形成NOC的結構。在性能上已經和現有的高速FPGA的處理能力上不相上下。但是多核處理器的不得不說的問題就是,同一業務流分配到多核處理上後,如需交互,例如訪問同一資源,就會造成讀寫的緩存一致的問題,解決的這一問題的天然思路是加鎖,即在變量訪問上加自旋鎖,但是帶來的問題就是處理性能的急劇下降。而FPGA無論並行處理和同一變量的訪問,都可以變成工程師的設計水平的問題,沒有原理性的挑戰。
沒有一種器件可以滿足全人類的衆多需求,因此不用擔心FPGA沒有用武之地。必定是一系列產品的組合。下面主要介紹一下FPGA可以作爲現今熱門場景的幾種應用。
(1)網絡存儲產品,特別是現在的NAS,或者SAN設備上,其存儲的時間、接口、安全性等都要求較高,而FPGA無論處理性能還是擴展接口的能力都使其在這一領域大有作爲。現在高端FPGA單片就可以擴展32個或者更多4G或者8G的FC接口。並且其協議處理相對的固定,也使FPGA在這一領域有大量的可能應用。
(2)高速網絡設備,現在高速網絡設備10G、40/100G以太網設備領域,同樣FPGA也是關鍵的處理部件。特別是IPv6的商用化及大數據對於基礎設施的高要求,都使這一領域的處理應用會逐漸廣泛,這一領域通常是高速網絡處理器(NP)+FPGA的典型架構。
(3)4G等通信設備,對於新一代通信基站的信號處理,FPGA+DSP陣列的架構就是絕配。特別是在專用處理芯片面世之前,這樣的架構可以保證新一代通信基礎設施的迅速研發和部署。
沒有完美的架構,只有合適的組合,各種芯片和架構都是爲應用服務,互相的滲透是趨勢,也是必然。FPGA相對處理器的可編程領域,仍然屬於小衆(雖然人數也不少)。但是正像一則笑話所說:大腿雖然比根命根子粗,但決沒有命子重要。這算開個玩笑。FPGA的實現爲以後的芯片化留下了許多可能和想象空間,從而在應用大量爆發時通過芯片化來大幅降低成本,這這也正是其他可編程器件所不能比擬的。
FPGA和他那些小夥伴們 (二) 器件互聯
系統架構確定,下一步就是FPGA與各組成器件之間互聯的問題了。通常來說,CPU和FPGA的互聯接口,主要取決兩個要素:
(1)CPU所支持的接口。
(2)交互的業務。
通常來說,FPGA一般支持與CPU連接的數字接口,其常用的有EMIF,PCI,PCI-E,UPP,網口(MII/GMII/RGMII),DDR等接口。作爲總線類接口,FPGA通常作爲從設備與CPU連接,CPU作爲主設備通過訪問直接映射的地址對FPGA進行訪問。根據是否有時鐘同步,通常總線訪問分爲同步或異步的總線,根據CPU外部總線協議有所不同,但數據、地址、控制信號基本是總線訪問類型中總線信號所不能省略的。CPU手冊中會對信號定義和時序控制有着詳細的說明,FPGA需要根據這些詳細說明來實現相應的邏輯。同時CPU還可以對訪問時序進行設置,比如最快時鐘,甚至所需的最小建立時間和保持時間,這些一般CPU都可以進行設置,而這些具體參數,不僅影響FPGA的實現,也決定總線訪問的速度和效率。對於同步總線,只需要根據輸入時鐘進行採樣處理即可,但對於異步總線,則需要的對進入的控制信號進行同步化處理,通常處理方式是寄存兩拍,去掉毛刺。因此用於採樣的時鐘就與CPU所設置的總線參數相關,如採樣時鐘較低,等控制信號穩定後在譯碼後輸出,一個總線操作週期的時間就會相對較長,其處理的效率也相對較低;假如採樣時鐘過快,則對關鍵路徑又是一個挑戰,因此合理設定採樣頻率,便於接口的移植並接口的效率是設計的關鍵點和平衡點。
對於總線型的訪問來說,數據信號通常爲三態信號,用於輸入和輸出。這種設計的目的是爲了減少外部連線的數量。因爲數據信號相對較多一般爲8/16/32位數據總線。總線的訪問的優勢是直接映射到系統的地址區間,訪問較爲直觀。但相對傳輸速率不高,通常在幾十到100Mbps以下。這種原因的造成主要爲以下因素(1)受制總線訪問的間隔,總線操作週期等因素,總線訪問間隔即兩次訪問之間總線空閒的時間,而總線操作週期爲從發起到相應的時間。(2)不支持雙向傳輸,並且FPGA需主動發起對CPU操作時,一般只有發起CPU的中斷處理一種方式。這種總線型操作特點,使其可以用作系統的管理操作,例如FPGA內部寄存器配置,運行過程中所需參數配置,以及數據流量較小的信息交互等操作。這些操作數據量和所需帶寬適中,可以應對普通的嵌入式系統的處理需求。
對於大數據流量的數據交互,一般採用專用的總線交互,其特點是,支持雙向傳輸,總線傳輸速率較快,例如GMII/RGMII、Upp、專用LVDS接口,及SERDES接口。專用SERDES接口一般支持的有PCI-E,XAUI,SGMII,SATA,Interlaken接口等接口。GMII/RGMII,專用LVDS接口一般處理在1GbpS一下的業務形式,而PCI-E,根據其型號不同,支持幾Gbps的傳輸速率。而XAUI可支持到10Gbps的傳輸速率,lnterlaken接口可支持到40Gbps的業務傳輸。
對於不同所需的業務形式及處理器的類型,則可選擇相應的接口形式,來傳輸具體的業務。現今主流FPGA中都提供的各種接口的IP。選擇FPGA與各型CPU互聯接口,一般選擇主流的應用交互方案,特殊的接口缺少支撐IP,導致開發、調試、維護和兼容性的成本都較大,同時注意系統的持續演進的需要,如只在本項目使用一次,而下一項目或開發階段已摒棄此類接口,則需提前規劃技術路線。畢竟一個穩定、高效的接口互聯是一個項目成功的基礎。
不是所有的嵌入式系統都需要“高大上”的接口形式,各類低速的穩定接口也同樣在FPGA的接口互聯中有着重要的角色,其中UART、SPI、I2C等連接形式也非常的常見。畢竟,一個優秀的設計不是“高大上”的堆積,而是對需求最小成本的滿足。適合的纔是最美的。
靈活性的陷阱
如果說用一個詞來描述FPGA的特性,靈活性肯定名列前茅。
FPGA的靈活性在於:
(一)I/O的靈活性,其可以通過其I/O組成各種接口與各種器件連接,並且支持不同的電氣特性。
(二)內部存儲器靈活性,可以通過IP生成工具生成各種深度和寬度的RAM或者FIFO等。
(三)邏輯的靈活性,內部邏輯通可生成的各種類型IP。
對於I/O接口來說,FPGA的I/O可以支持不同類型的電平和驅動能力,各I/O未定義之前其地位平等,例如一個數據信號可將其約束在任意引腳,只要其電平符合連接的規範。因此硬件工程師基於這種認識,在PCB佈線時,基於佈線需要,便調整其佈線的順序,例如互換兩個信號的位置。通常情況上,這種調整是沒有任何問題的。但是隨着FPGA的接口IP核硬核化的趨勢,逐漸由很多的接口IP不能支持這種調整。例如對於較早的SDRAM或者DDRSDRAM來說,在xilinx和ALTERA的FPGA上,其數據、地址信號等都是可調的。但是隨着DDR2,DDR3接口的出現,其IP接口,只能支持在某個BANK並且例化結束後直接生成相應的約束文件,而這些的改動將會導致佈局佈線的錯誤。另一些例子則是一些高速SERDES的組合。例如對於XAUI接口來說,其硬核IP(ALTERA)上就不支持4組SERDES的順序互換,這將會影響其硬核FCS的編碼。如果板級連接上與PHY的順序與FPGA例化IP的約束不一致,則其硬核PCS就不能佈局佈線通過(軟核FCS可以支持調整)。這種靈活性認識導致硬件板級互聯的問題可謂屢見不鮮,特別是系統複雜度的上升,板級連線的增加,將會導致設計人員疏忽從而掉入“靈活性的陷阱”。解決此類問題的方法。包括(1)預評估,在設計之前就在FPGA上評估所需的接口的邏輯佔用、約束位置、時鐘需求等等,預先評估給系統設計提供相應的數據支撐和設計參考。(2)溝通,對於設計的變更,要進行有效溝通,不能使鐵路警察,各管一段。(3)設計評審,雖然老套,但每個環節上的評審能有效減少掉入類似陷阱的機率。
對於內部存儲資源,大多數FPGA工程師就是拿來就用的狀態。而缺少整體內部memory規劃,一般來說,對於單端口、雙端口、假雙端口,各型芯片手冊中都有明確的定義,例如xilinx的SPATAN3系列中最小RAM單元爲18K。一個RAM例化最小單位就是18K。而新的器件中最小單位一般爲9K。也就是說雖然工程師例化的較小的RAM,例如25616.只有4K,但是其也佔用一個最小單元,根據器件的不同而不同。而亂用雙端口導致RAM資源的過分佔用則是更常見的設計問題。FPGA內部對於單個RAM能夠支持的真雙端口是有限制的。舉例說明,對於ALTERA的9K的存儲單元一般支持51218的雙端口RAM。但如果是一個25632的雙端口則需要佔用2個9K的存儲RAM。也就是說,RAM器件的能力是有限的,這取決於RAM的外部互聯線是有限的,以剛纔說的25632的雙端口RAM來說,其需要數據線就是64根(雙端口),對於單個RAM的連線資源來說,這是FPGA內部邏輯資源難以承受的。所以根據器件特定,合理規劃內部memory資源,才能在最大限度的達到高效的利用。
FPGA內部可以例化各型IP,基於IP的複用的可以大大增加研發的進度。但是各種IP的互聯之間則需對IP的特性瞭解清楚,明確IP是否爲業務所需的IP。有的IP和工程所需可能只是名稱一致,但其功能卻不是你想要的。例如網口IP在MII連接方式下,是用於FPGA連接PHY的操作。如果FPGA與CPU通過MII連接,現有的IP則難以滿足需求。這是因爲MII連接PHY其所有的時鐘都是PHY提供的。CPU的設計也是與PHY連接,其時鐘也有PHY提供。而如果二者連接,就變成都等着對方提供時鐘,則就變成沒有時鐘。這種調試問題相對來說容易解決,不過在系統規劃是,就需要對整個IP是否能夠滿足系統的設計要求,有着明確的判斷。
靈活性是FPGA最大的特性,在設計中避開那些靈活性的陷阱,才能從FPGA整體上提升設計能力,而不是做只會寫Verilog的碼農。畢竟FPGA設計不是軟件設計,其最終要成爲變成硬件承載的,每一行語句都要考慮其綜合後的電路,才能真正領會FPGA設計的精髓。
“合抱之木,生於毫末;九層之臺,起於壘土;千里之行,始於足下。” 老子《道德經》

對於新手來說,如何上手調試FPGA是關鍵的一步。
對於每一個新設計的FPGA板卡,也需要從零開始調試。
那麼如何開始調試?
下面介紹一種簡易的調試方法。
(1) 至少設定一個輸入時鐘 input sys_clk;
(2) 設定輸出 output [N-1:0] led;
(3)設定32位計數器 reg [31:0] led_cnt;
(4) 時鐘驅動計數器開始工作
always@(posedge sys_clk)
led_cnt <= led_cnt + 1
(5)輸出led信號。
assign led = led_cnt[M:N];
程序完成。
(6)設定管教約束
如果爲XILINX FPGA ,在UCF文件中 NET “sys_clk” LOC = 管腳名稱
如果爲ALTERA FPGA ,在QSF文件中,添加 set_location_assignment 管腳名稱 -to sys_clk
其他管腳,可依次類推。
(7)編譯,佈局、佈線,生成配置文件。
XILINX 生成BIT文件。
ALTERA 生成SOF文件
(8)連接JTAG,下載相應的配置文件。
(9)觀察是否閃燈(肉眼可見)。
關於閃燈的解釋如下:
assign led = led_cnt[M:N]; led_cnt 爲32bit的信號,需要幾個閃燈,則根據輸入時鐘的頻率和肉眼能夠分辨的時間(100ms)。如輸出時鐘爲25Mhz。則閃燈看見的位置能夠分批到10hz。需分頻2.5M= 32‘h2625A0,因此,則需要輸出至少爲led_cnt[21]位,才能看到閃燈。

雖然程序簡單,但是,通過調試可以確認:
(1)首先可確定JTAG下載器的正確連接,能夠正常下載下載文件。如不能,常見問題包括
(一)檢查是否安裝驅動。
(二)下載器是否由紅燈變成黃燈/綠燈。如紅燈亮一般情況下,JTAG的與電路板VCC沒有供電。
(三)檢查JTAG連接的線序。
(四)檢查JTAG電路,檢查原理圖上TMS,TDI,TDO的上拉和下拉電阻是否與datasheet中一致。
通過以上四種方式,可排除絕大部分JTAG下載的錯誤。
(2)可以判斷晶振是否起振,下載後無燈閃。
(一)首先,示波器查看晶振頻率,觀察晶振的輸出,如無輸出,查看晶振的電源和地信號,如電源正常,而晶振無反應,則更換晶振。
(二)如無示波器,也有替代的方法,通過嵌入式邏輯分析儀抓信號(任意信號)。如邏輯分析儀點擊採樣後無反應,則無時鐘輸入。
這是因爲邏輯分析儀也需要時鐘進行邏輯值的存儲。
(3)如正常下載後閃燈,證明該FPGA板卡硬件設計上能夠達到最低限度的FPGA調試狀態。
最後,說明一下,爲什麼是閃燈而不是亮燈的程序,這是因爲,首先閃燈可以判斷外部晶振工作正常,並且由於LED等通常爲上拉,也就是說邏輯值0表示燈亮,而也不排除某硬件工程師非要下拉。邏輯1表示亮。因此採用閃燈更加方便。
問題:爲什麼LED燈值爲什麼要上拉?
這是因爲:LED上拉後,需要燈亮時電流由外部電源提供,而下拉,燈亮時電流由芯片的CMOS電路驅動。這種在設計中應避免。
勿用諱言,現在國內FPGA開發還處於小作坊的開發階段,一般都是三、四個人,七八臺機器.小作坊如何也能做出大成果。這是每個FPGA工程師都要面臨的問題。架構設計是面臨的第一關。經常有這樣的項目,需求分析,架構設計匆匆忙忙,號稱一兩個月開發完畢,實際上維護項目就花了一年半時間。主要包括幾個問題,一,性能不滿足需求。二,設計頻繁變更。三,系統不穩定,調試問題不收斂。
磨刀不誤砍柴工,FPGA設計的需求分析是整個設計第一步。如何將系統的功能需求,轉換成FPGA的設計需求,是FPGA架構設計的首要問題。首先, 需要明確劃分軟件和硬件的邊界。軟件主要處理輸入輸出、界面顯示、系統管理、設備維護。而FPGA則負責大數據流的處理。
如果使用幾百元FPGA實現了一個十幾元單片機就能完成的功能,就算實現的非常完美,那麼這是一個什麼樣的神設計?任何一個項目都要考慮成本,研發成本、物料成本、維護成本等等。FPGA的使用位置必定是其他器件難以企及的優勢。
因此對於一個FPGA架構設計,其首先需要考慮就是性能,如沒有性能的需求,其他的處理器ARM就可能替代其功能。其次就是接口,用於處理器擴展其沒有的接口,作爲高速接口轉換。最後,需要考慮就是可維護性,FPGA的調試是非常耗時的,一個大型的FPGA的編譯時間在幾小時甚至更高(通過嵌入式分析儀抓信號,每天工作8小時,只能分析兩到三次)。而軟件調試只需make,編譯時間以秒來記(這個問題可以通過提升編譯服務器性能改善而不能消失,本質上要考慮可測性設計)。如果不考慮維護性和可測性,調試成本和壓力就非常之大。
通常,FPGA的大部分架構設計可以採用數據流驅動的方式來實現,例子1,假設一個實現視頻解壓縮FPGA的設計,輸入是無線接口,輸出爲顯示屏。那麼輸入輸出的接口基本就能確定。以數據流爲驅動可以粗略劃分,輸入接口->解壓縮模塊->視頻轉換模塊->顯示接口。如需要視頻緩衝,則確定是否需要連接外部存儲器。那就需要確認在什麼位置進行數據的緩衝。通過要支持顯示的畫面的質量,就能確認最大碼流,同樣可以計算視頻解壓模塊和轉換模塊的計算能力,從而導出所需的內部總線寬度,系統頻率,以及子模塊個數等等。例子2,某支持通過有線電視網上網電視IP網關,同樣也是輸入的普通IP網絡,輸出爲有線調試網的調試解調器。將IP報文等長填充後,在固定時隙內送入有線電視網中,同樣也是基於數據流驅動的方式。
數據流驅動式架構,可以作爲FPGA設計中一個最重要的架構。通常來說應用於IP領域、存儲領域、數字處理領域等較大型FPGA設計都是數據流驅動式架構,主要包括輸入接口單元,主處理單元,輸出接口單元。還可能包括,輔助處理單元、外部存儲單元。這些單元之間一般採用流水式處理,即處理完畢後,數據打包發完下一級處理。其中輸入輸出可能有多個,此時還需要架構內部實現數據的交換。
另一種較爲常用的架構方式爲調用式架構,即一般FPGA通過標準接口如PCI、PCI-E,CPCI,PCI-X,EMIF等等。各種接口,FPGA內部實現某一加速單元,如視頻加速,數據處理,格式轉換等操作。這種結構基本基本圍繞FPGA接口、加速單元展開,屬於數據的反饋類型,即處理完數據又反饋回接口模塊。
其他雖然各型各樣,如SOPC,如各型接口,但本質上其都是爲上述架構服務的,或做配置管理替代外部CPU,或在數據流中間傳遞中間參數。或在內部實現CPU+協處理器的架構,因此說,無他變化。
孫子兵法雲:“兵無常勢,水無常形”。但是對於一種設計技術來說,沒有一種固定演進的架構和設計,那麼項目的整個設計層次總是推到重來,從本質上說,就是一種低水平重複。如果總結規律,提煉共性,才能在提升設計層次,在小作坊中取得大成果。
架構設計漫談(二)穩定壓倒一切
敏捷開發宣言中,有一條定律是“可以工作的軟件勝過面面俱到的文檔”。如何定義可可以工作的,這就是需求確定後架構設計的首要問題。而大部分看這句話的同志更喜歡後半句,用於作爲不寫文檔的藉口。
FPGA的架構設計最首先可以確定就是外接接口,就像以前說的,穩定可靠的接口是成功的一半。接口的選擇需要考慮幾個問題。
1, 有無外部成熟IP。一般來說,ALTERA和XILINX都提供大量的接口IP,採用這些IP能夠提升研發進度,但不同IP在不同FPGA上需要不同license,這個需要通過代理商來獲得(中國國情,軟件是不賣錢的)。
2, 自研接口IP,能否滿足時間、進度、穩定性、及兼容性的要求。
案例1設計一個網絡接口在邏輯設計上相對簡單,比如MII接口等同於4bit數據線的25MHZ樣,而RGMII可以使用雙沿125Mhz的採樣專用的雙沿採樣寄存器完成(使用寄存器原語)。但是如何支持與不同PHY連接一個兼容性問題(所謂設計挑PHY的問題,這個問題後面詳述)。
案例2:CPU通過接口連接FPGA時,如果CPU此時軟復位,則有管腳會上拉,此時如果該管腳連接FPGA接口是控制信號且控制信號高電平有效,則此時FPGA邏輯必然出錯。同樣FPGA在配置時,管教輸出高阻,如此時CPU上電且板級電路管腳上拉,則同樣會導致CPU採樣出錯(誤操作的問題)。
不能只是考慮編寫verilog代碼仿真能對就行,接口設計應該站在系統的角度來看問題,問題不是孤立的,還是互相聯繫。
設計中,如果需要存儲大量數據,就需要在外部設計外部存儲器,這是因爲FPGA內部RAM的數量是有限的。是採用SRAM、DDR2、DDR3。這就需要綜合考慮存儲數據大大小,因爲SRAM的容量也有限,但是其接口簡單,實現簡單方便,且讀取延時較小。DDR2、DDR3的容量較大,接口複雜,但FPGA內部有成熟IP可用,但是讀取的延時較大,從發起讀信號到讀回數據一般在十幾個時鐘週期以上。如果對數據時延有要求,需要上一次存儲數據作爲下一次使用,且數據量不太大(幾百K到幾兆),則SRAM是較好的選擇。而其他方面DDR2/DDR3是較好的選擇。爲什麼不用SDRAM或者DDR。這是因爲設計完畢,採購會告訴你,市場上這樣老的芯片基本都停產了。
FPGA接口在設計選擇的原則就是:能力夠用,簡單易用。特別值得一提的是高速SERDES接口,最好使用廠商給的參考設計,有硬核則不選擇軟核,測試穩定後,一定要專門的位置約束,避免後面添加的邏輯擁擠後影響到接口時序,也可避免接口設計人員與最終的邏輯設計人員扯皮(不添加過多邏輯,接口是好用的)。一個分析高速SERDES的示波器,採樣頻率至少20G甚至更高以上,動輒上百萬,出現問題,不一定有硬件條件可調試。
回到開頭,如何定義“可用的”設計,穩定我想是前提,而接口的穩定性更是前提的前提。這裏穩定包括,滿負荷邊界測試,量產、環境試驗等一系列穩定可靠。而在架構設計中,就選擇成熟的接口,能有效的避免後續流程中的問題,從源頭保證產品的質量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章