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