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



















評論