一、了解FPGA的結構和性能
首先,必須了解FPGA的結構和性能。不同廠家,不同系列的FPGA芯片都有不同的結構和性能,但是萬變不離其中。剛開始,可以先上手低端芯片,例如Altera的Cyclone VI,然后可以掌握幾款典型的高端芯片,例如Altera的Stratix III和Xilinx的Virtex 5。之后,再去了解其它系列的芯片就很容易了。至于Lattice和Actel公司的芯片,當使用時再了解也不遲,因為學習主流的東西才會更加有效。
很多FPGA的相關的教材都會以幾款常用的芯片為例,講述FPGA的基本結構和原理。初學者看了后,總覺得過于抽象,有點不知所云的感覺。因此,為了深刻理解 FPGA,必須要有扎實的數字電路基礎。
在數字電路里,最基本的就是邏輯和時序。工程師必須明白 FPGA 內部邏輯結構和數字電路基本電路結構的關系。例如,任何4個輸入信號的組合邏輯都可以通過FPGA 提供的4輸入LUT來實現。如果使用Xilinx的芯片,移位寄存器既可以通過多個觸發(fā)器級聯實現,也可以通過LUT來實現。
通常,初學者可以設計出正確的邏輯,但卻很容易忽略時序。在I/O口的設計中,與時序相關的缺陷對于產品是致命的,會影響產品的可靠性。因此,在掌握了結構后,還必須關注芯片的一些重要時序參數,例如I/O口時鐘的建立時間、保持時間和從觸發(fā)器到輸出的延遲時間,以及芯片內部工作時鐘的最高頻率等等。
只有充分掌握了所使用芯片的結構和性能,才能設計出一個合理的系統,才能保證FPGA的設計可靠穩(wěn)定。FPGA廠商提供的大量文檔也是一個很不錯的學習資料。畢竟后續(xù)參與項目開發(fā)是需要去了解及靈活使用產品手冊的,提前熟悉也是很不錯的。
二、“可編程”,硬件描述語言
FPGA既然是“可編程”,自然離不開編程語言。其實,早期的工程師大多使用原理圖輸入方式進行邏輯設計,這是一種更接近于電路設計的設計方式。這種設計方式對設計者要求較高,而且也不利于移植和維護,因此VHDL和Verilog HDL才漸漸流行起來。
就這兩種語言,無所謂孰優(yōu)孰劣,只不過就目前的企業(yè)研發(fā)而言,Verilog HDL的商業(yè)性發(fā)展的比 VHDL 好一些,而且和將來可能一統天下的 System Verilog 比較接軌。當然兩者都掌握肯定是極好的,而且難度也不是很大。它們都是硬件描述語言,既然叫硬件描述語言,自然是和軟件的編程不一樣。所以,初學者不能把它當作軟件編程語言來學習,否則就會舍本逐末。
如果僅僅只是從事FPGA邏輯設計和做簡單的功能仿真,只需學習最簡單的語法就夠了。那些用于寫驗證腳本的語法,完全不用學,基本用不上。語言僅僅只是一個工具,尤其在硬件設計里,就語言來說,代碼寫得漂不漂亮,并不重要,最關鍵的是設計思想。記住,FPGA工程師是在設計電路,而不是“編程”。
對于硬件電路設計以及軟件編程有什么區(qū)別,下面也簡單的提幾點。硬件電路設計(硬件描述語言):
不是編程,設計的時候先有電路,然后用語言描述出來。
時序要求更嚴,需要考慮建立時間和保持時間,及隨之而來的亞穩(wěn)態(tài)。
Coding style 會明顯的影響電路性能。邏輯都一樣,但是 DFF(D觸發(fā)器) 的位置不一樣,就可能導致時序不滿足。
并行化。執(zhí)行順序不再是 CPU 的順序執(zhí)行,而是多個并行的流水線。比如快速傅立葉 FFT。比如路由器的 CAM,單次動作完成整表查表。
通用應用層軟件編程:
軟件匯編語言(Assembly Language),面向機器的程序設計語言。
主要關心邏輯和抽象,關心代碼量大了之后復雜度可控。硬件資源較多,硬件性能差別較大,不需要針對特定資源設計。
邏輯分層較多,來源于抽象的性能損耗可以接受。甚至于現在很多主流語言構建在虛擬機和解釋器上。
非實時。
不需要了解底層硬件原理。
三、算法重要性,理論可行性
很多工程師會談到算法的重要性,認為必須懂得很多算法。
沒錯,好的算法對于設計來說猶如利器一般??墒?,研究算法和如何實現算法是兩個不同的概念,研究算法是在做數學題,實現算法才是工程師的職責。
這里并不是說FPGA工程師不用去研究算法,而是強調職責所在。在企業(yè)中做研發(fā),你會發(fā)現稍微有些規(guī)模的公司,都會有定崗定責這么一說,所以上述問題可能就會有專門的算法工程師去搞定。小公司或者創(chuàng)業(yè)公司就不好說了,基本上都是打雜為主,干著自己的主業(yè),還得帶著其他崗位的副業(yè),這很現實也很真實,哈哈哈。
不同的算法,我們對其原理的研究和理解的要求也是不同的。例如8B/10B編碼,只要你懂得在哪里需要使用它就夠了,現成的IP Core可以直接調用。但是,諸如FEC編解碼這樣的算法,則只有了解了基本原理后才可能懂得如何實現。
對于算法,FPGA工程師的重點就是在于“如何實現”。另外,算法之外,邏輯設計里常用的設計方法必須懂得,例如,乒乓操作、流水線設計和分時復用等等。還有常用的邏輯模塊,如異步FIFO、狀態(tài)機,這些其實都是數字電路里最基礎的東西,但是對于初學者來說,在做FPGA設計時未必會正確的使用。
四、設計流程
FPGA設計必須有一個好的設計流程來支撐。代碼寫完后,花大量時間做完善的功能仿真和驗證是很有必要的??墒且恍┕こ處煵⒉恢匾暦抡婧万炞C,而是迫不及待的上板調試。
碰到BUG后就在代碼上修修補補,運氣好的話,BUG表面上是解決了,可真正深層次的原因卻未必發(fā)現,給產品留下了隱患。
一個好的設計流程要求大多數BUG在前期工作中必須解決掉,功能仿真和驗證則是一個很有效也很重要的步驟。
除了仿真驗證,綜合和布線也必須重視,這要求我們必須仔細瀏覽編譯報告和時序報告。因為,許多時序問題都能通過報告反映出來。有時候,一些工程師碰到時序問題,僅僅做時鐘反相來調整數據和時鐘的相位關系,或者修改綜合和布線的參數,仍無法解決問題。
尤其是在用了高速時鐘的設計里,大多數情況,我們只有修改代碼里的邏輯才能滿足設計的時序要求。這些也只有仔細分析了報告后,才能對癥下葯。另外,對于大多數同步邏輯設計來說,時序仿真是沒有必要的,這一步完全可以省略。
五、深度學習及廣度學習
現階段,FPGA發(fā)展的方向也可以理解企業(yè)中應用廣泛的方向,大概以下幾點,包括SOC,高速接口(高速I/O),數字信號處理(DSP),人工智能方向等。在有限的時間里,選擇一個領域方向進行主攻是有必要的,只有明確了目標,才會更加投入。一句話總結就是,在專研深度的同時,也要拓展專業(yè)的廣度。
SOC設計要求設計者對軟件編程、CPU原理甚至是操作系統比較了解才行,因為SOC就是一個軟硬件結合的系統。高速I/O設計則要求設計者掌握許多模擬電路的基本知識及一些常用的通信協議,例如:SDH、GbE、PCI-E等等。FPGA在DSP領域的使用是近幾年興起的一個發(fā)展方向。FPGA由于其內在的并行特性,能以很高的效率實現DSP算法中計算量較大的模塊,非常適合視頻和圖像處理等對DSP性能要求越來越高的新興應用,設計者需要掌握數字信號處理常用算法。
至于近幾年很火熱的人工智能方向,其實怎么說呢,個人接觸的所謂的“人工智能”,還是噱頭性太強,沒有太大的實際意義的應用,尤其是實用性的應用感不是很強烈,倒是出現不少借著噱頭賺錢的空殼企業(yè)。對于人工智能,硬件還是主要在于加速方向,這個還是可以很明顯看出來的。畢竟硬件的加速方面,軟件是沒法比擬的,以上純屬個人觀點,如有異議,當我沒說,哈哈哈,不想辯論了。
這幾個方向完全不同,切勿囫圇吞棗,一切通吃,“術業(yè)有專功”,資深的高級工程師也很難在多個方向都取得成就。當然,若能在一個領域有較深的研究,同時,對另外其他專業(yè)領域也有一定的了解,那就更好了。
當然,一個優(yōu)秀的FPGA工程師,必須力爭做到“一專多能”。所謂的“一?!碑斎皇侵冈贔PGA設計領域的專業(yè)深度,而“多能”則是要求工程師對其它專業(yè)領域也要有所了解和掌握。例如,對于設計一個SOC系統來說,C語言就必須學習,否則對于片上系統的架構就可能不合理。另外,對于設計高速I/O口的工程師來說,電路板原理設計和PCB設計則需要有所了解。只有掌握了預加重、均衡以及阻抗匹配等這些與模擬電路相關的概念,才可能在設計和調試中得心應手。
六、設計思想,設計方法
其實這一點應該緊接著第五點開始或者放在第五點之前,但是個人感覺這一點很重要,于是乎壓個軸,純屬個人理解,僅供參考。
第六點,也會最后一點,也是最難的一點,這也是邁向高級工程師的關鍵,就是FPGA的設計需要一個好的系統架構方案和合理的模塊化分。這有助于FPGA的調試和維護,也便于多人共同開發(fā),尤其是在使用大規(guī)模FPGA時,這也就是常說的Top-Down設計方式。
把一個龐大的、復雜的設計化分成若干個小模塊,而且層次要分明,不能扁平化,這需要設計者對設計必須有全面深刻的理解。一個雜亂無序的設計對于后期的維護是災難性的,尤其是對于接手者來說,若要修改某個邏輯,可以說是苦不堪言。舉個最簡單的例子,如果你接觸過很多的電子硬件工程師或者FPGA工程師,你會發(fā)現絕大多數工程師都很反感去看別人的代碼,盡管有些代碼很簡單,如果有條理有標準,也許還是可以去減緩上述的感覺的。
從這一點看,初學者的問題都可以在這里找到答案。FPGA學什么?就是學習系統級的電路設計。所以,FPGA工程師的發(fā)展方向就是系統工程師,就可以說是綜合能力的發(fā)展,職業(yè)發(fā)展。
電子發(fā)燒友App



















評論