為什么大量的人會(huì)覺得FPGA難學(xué)?這些道理你都知道嗎?
目前FPGA的應(yīng)用主要是三個(gè)方向:
本文引用地址:http://m.butianyuan.cn/article/201808/391154.htm第一個(gè)方向,也是傳統(tǒng)方向主要用于通信設(shè)備的高速接口電路設(shè)計(jì),這一方向主要是用FPGA處理高速接口的協(xié)議,并完成高速的數(shù)據(jù)收發(fā)和交換。這類應(yīng)用通常要求采用具備高速收發(fā)接口的 FPGA,同時(shí)要求設(shè)計(jì)者懂得高速接口電路設(shè)計(jì)和高速數(shù)字電路板級(jí)設(shè)計(jì),具備EMC/EMI設(shè)計(jì)知識(shí),以及較好的模擬電路基礎(chǔ),需要解決在高速收發(fā)過程中產(chǎn)生的信號(hào)完整性問題。FPGA最初以及到目前最廣的應(yīng)用就是在通信領(lǐng)域,一方面通信領(lǐng)域需要高速的通信協(xié)議處理方式,另一方面通信協(xié)議隨時(shí)在修改,非常不適合做成專門的芯片。因此能夠靈活改變功能的FPGA就成為首選。到目前為止FPGA的一半以上的應(yīng)用也是在通信行業(yè)。
第二個(gè)方向,可以稱為數(shù)字信號(hào)處理方向或者數(shù)學(xué)計(jì)算方向,因?yàn)楹艽蟪潭壬线@一方向已經(jīng)大大超出了信號(hào)處理的范疇。例如早就在2006年就聽說老美將FPGA用于金融數(shù)據(jù)分析,后來又見到有將FPGA用于醫(yī)學(xué)數(shù)據(jù)分析的案例。在這一方向要求FPGA設(shè)計(jì)者有一定的數(shù)學(xué)功底,能夠理解并改進(jìn)較為復(fù)雜的數(shù)學(xué)算法,并利用FPGA內(nèi)部的各種資源使之能夠變?yōu)閷?shí)際的運(yùn)算電路。目前真正投入實(shí)用的還是在通信領(lǐng)域的無線信號(hào)處理、信道編解碼以及圖像信號(hào)處理等領(lǐng)域,其它領(lǐng)域的研究正在開展中,之所以沒有大量實(shí)用的主要原因還是因?yàn)閷W(xué)金融的、學(xué)醫(yī)學(xué)的不了解這玩意。不過最近發(fā)現(xiàn)歐美有很多電子工程、計(jì)算機(jī)類的博士轉(zhuǎn)入到金融行業(yè),開展金融信號(hào)處理,相信隨著轉(zhuǎn)入的人增加,F(xiàn)PGA在其它領(lǐng)域的數(shù)學(xué)計(jì)算功能會(huì)更好的發(fā)揮出來,而我也有意做一些這些方面的研究。不過國(guó)內(nèi)學(xué)金融的、學(xué)醫(yī)的恐怕連數(shù)學(xué)都很少用到,就不用說用FPGA來幫助他們完成數(shù)學(xué)_運(yùn)算了,這個(gè)問題只有再議了。
第三個(gè)方向就是所謂的SOPC方向,其實(shí)嚴(yán)格意義上來說這個(gè)已經(jīng)在FPGA設(shè)計(jì)的范疇之內(nèi),只不過是利用FPGA這個(gè)平臺(tái)搭建的一個(gè)嵌入式系統(tǒng)的底層硬件環(huán)境,然后設(shè)計(jì)者主要是在上面進(jìn)行嵌入式軟件開發(fā)而已。設(shè)計(jì)對(duì)于FPGA本身的設(shè)計(jì)時(shí)相當(dāng)少的。但如果涉及到需要在FPGA做專門的算法加速,實(shí)際上需要用到第二個(gè)方向的知識(shí),而如果需要設(shè)計(jì)專用的接口電路則需要用到第一個(gè)方向的知識(shí)。就目前SOPC方向發(fā)展其實(shí)遠(yuǎn)不如第一和第二個(gè)方向,其主要原因是因?yàn)镾OPC以FPGA為主,或者是在FPGA內(nèi)部的資源實(shí)現(xiàn)一個(gè)“軟”的處理器,或者是在FPGA內(nèi)部嵌入一個(gè)處理器核。但大多數(shù)的嵌入式設(shè)計(jì)卻是以軟件為核心,以現(xiàn)有的硬件發(fā)展情況來看,多數(shù)情況下的接口都已經(jīng)標(biāo)準(zhǔn)化,并不需要那么大的FPGA邏輯資源去設(shè)計(jì)太過復(fù)雜的接口。
而且就目前看來SOPC相關(guān)的開發(fā)工具還非常的不完善,以ARM為代表的各類嵌入式處理器開發(fā)工具卻早已深入人心,大多數(shù)以ARM為核心的SOC芯片提供了大多數(shù)標(biāo)準(zhǔn)的接口,大量成系列的單片機(jī)/嵌入式處理器提供了相關(guān)行業(yè)所需要的硬件加速電路,需要專門定制硬件場(chǎng)合確實(shí)很少。
通常是在一些特種行業(yè)才會(huì)在這方面有非常迫切的需求。即使目前Xilinx將ARM的硬核加入到FPGA里面,相信目前的情況不會(huì)有太大改觀,不要忘了很多老掉牙的8位單片機(jī)還在嵌入式領(lǐng)域混呢,嵌入式主要不是靠硬件的差異而更多的是靠軟件的差異來體現(xiàn)價(jià)值的。
我曾經(jīng)看好的是 cypress的Psoc這一想法。和SOPC系列不同,Psoc的思想史載SOC芯片里面去嵌入那么一小塊FPGA,那這樣其實(shí)可以滿足嵌入式的那些微小的硬件接口差異,比如某個(gè)運(yùn)用需要4個(gè)USB,而通常的處理器不會(huì)提供那么多,就可以用這么一塊FPGA來提供多的USB接口。而另一種運(yùn)用需要6個(gè) UART,也可以用同樣的方法完成。
對(duì)于嵌入式設(shè)計(jì)公司來說他們只需要備貨一種芯片,就可以滿足這些設(shè)計(jì)中各種微小的差異變化。其主要的差異化仍然是通過軟件來完成。但目前cypress過于封閉,如果其采用ARM作為處理器內(nèi)核,借助其完整的工具鏈。同時(shí)開放IP合作,讓大量的第三方為它提供IP設(shè)計(jì),其實(shí)是很有希望的。但目前cypress的日子怕不太好過,Psoc的思想也不知道何時(shí)能夠發(fā)光。
4、數(shù)字邏輯知識(shí)是根本。無論是FPGA的哪個(gè)方向,都離不開數(shù)字邏輯知識(shí)的支撐。FPGA說白了是一種實(shí)現(xiàn)數(shù)字邏輯的方式而已。如果連最基本的數(shù)字邏輯的知識(shí)都有問題,學(xué)習(xí)FPGA的愿望只是空中樓閣而已。而這,恰恰是很多菜鳥最不愿意去面對(duì)的問題。數(shù)字邏輯是任何電子電氣類專業(yè)的專業(yè)基礎(chǔ)知識(shí),也是必須要學(xué)好的一門課。很多人無非是學(xué)習(xí)了,考個(gè)試,完了。
如果不能將數(shù)字邏輯知識(shí)爛熟于心,養(yǎng)成良好的設(shè)計(jì)習(xí)慣,學(xué)FPGA到最后仍然是霧里看花水中望月,始終是一場(chǎng)空的。以上四條只是我目前總結(jié)菜鳥們?cè)趯W(xué)習(xí)FPGA時(shí)所最容易跑偏的地方,F(xiàn)PGA的學(xué)習(xí)其實(shí)就像學(xué)習(xí)圍棋一樣,學(xué)會(huì)如何在棋盤上落子很容易,成為一位高手卻是難上加難。要真成為李昌鎬那樣的神一般的選手,除了靠刻苦專研,恐怕還確實(shí)得要一點(diǎn)天賦。
薦讀:如何學(xué)習(xí)FPGA?為什么你會(huì)覺得FPGA難學(xué)?
1、入門首先要掌握HDL(HDL=verilog+VHDL)
第一句話是:還沒學(xué)數(shù)電的先學(xué)數(shù)電。然后你可以選擇verilog或者VHDL,有C語(yǔ)言基礎(chǔ)的,建議選擇VHDL。因?yàn)関erilog太像C了,很容易混淆,最后你會(huì)發(fā)現(xiàn),你花了大量時(shí)間去區(qū)分這兩種語(yǔ)言,而不是在學(xué)習(xí)如何使用它。當(dāng)然,你思維能轉(zhuǎn)得過來,也可以選verilog,畢竟在國(guó)內(nèi)verilog用得比較多。
接下來,首先找本實(shí)例抄代碼。抄代碼的意義在于熟悉語(yǔ)法規(guī)則和編譯器(這里的編譯器是硅編譯器又叫綜合器,常用的編譯器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿著寫,最后不看書也能寫出來。編譯完代碼,就打開RTL圖,看一下綜合出來是什么樣的電路。
HDL是硬件描述語(yǔ)言,突出硬件這一特點(diǎn),所以要用數(shù)電的思維去思考HDL,而不是用C語(yǔ)言或者其它高級(jí)語(yǔ)言,如果不能理解這句話的,可以看《什么是硬件以及什么是軟件》。在這一階段,推薦的教材是《Verilog傳奇》、《Verilog HDL高級(jí)數(shù)字設(shè)計(jì)》或者是《用于邏輯綜合的VHDL》。不看書也能寫出個(gè)三段式狀態(tài)機(jī)就可以進(jìn)入下一階段了。
此外,你手上必須準(zhǔn)備Verilog或者VHDL的官方文檔,《verilog_IEEE官方標(biāo)準(zhǔn)手冊(cè)-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些語(yǔ)法問題的時(shí)候能查一下。
2、獨(dú)立完成中小規(guī)模的數(shù)字電路設(shè)計(jì)
現(xiàn)在,你可以設(shè)計(jì)一些數(shù)字電路了,像交通燈、電子琴、DDS等等,推薦的教材是夏老《Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程》(第三版)。在這一階段,你要做到的是:給你一個(gè)指標(biāo)要求或者時(shí)序圖,你能用HDL設(shè)計(jì)電路去實(shí)現(xiàn)它。這里你需要一塊開發(fā)板,可以選Altera的cyclone IV系列,或者Xilinx的Spantan 6。還沒掌握HDL之前千萬不要買開發(fā)板,因?yàn)槟阗I回來也沒用。這里你沒必要每次編譯通過就下載代碼,咱們用modelsim仿真(此外還有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等仿真工具),如果仿真都不能通過那就不用下載了,肯定不行的。在這里先掌握簡(jiǎn)單的testbench就可以了。推薦的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。
3、掌握設(shè)計(jì)方法和設(shè)計(jì)原則
你可能發(fā)現(xiàn)你綜合出來的電路盡管沒錯(cuò),但有很多警告。這個(gè)時(shí)候,你得學(xué)會(huì)同步設(shè)計(jì)原則、優(yōu)化電路,是速度優(yōu)先還是面積優(yōu)先,時(shí)鐘樹應(yīng)該怎樣設(shè)計(jì),怎樣同步兩個(gè)異頻時(shí)鐘等等。推薦的教材是《FPGA權(quán)威指南》、《IP核芯志-數(shù)字邏輯設(shè)計(jì)思想》、《Altera FPGA/CPLD設(shè)計(jì)》第二版的基礎(chǔ)篇和高級(jí)篇兩本。學(xué)會(huì)加快編譯速度(增量式編譯、LogicLock),靜態(tài)時(shí)序分析(timequest),嵌入式邏輯分析儀(signaltap)就算是通關(guān)了。如果有不懂的地方可以暫時(shí)跳過,因?yàn)檫@部分還需要足量的實(shí)踐,才能有較深刻的理解。
4、學(xué)會(huì)提高開發(fā)效率
因?yàn)镼uartus和ISE的編輯器功能太弱,影響了開發(fā)效率。所以建議使用Sublime text編輯器中代碼片段的功能,以減少重復(fù)性勞動(dòng)。Modelsim也是常用的仿真工具,學(xué)會(huì)TCL/TK以編寫適合自己的DO文件,使得仿真變得自動(dòng)化,推薦的教材是《TCL/TK入門經(jīng)典》。你可能會(huì)手動(dòng)備份代碼,但是專業(yè)人士都是用版本控制器的,所以,為了提高工作效率,必須掌握GIT。文件比較器Beyond Compare也是個(gè)比較常用的工具。此外,你也可以使用System Verilog來替代testbench,這樣效率會(huì)更高一些。如果你是做IC驗(yàn)證的,就必須掌握System Verilog和驗(yàn)證方法學(xué)(UVM)。推薦的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012語(yǔ)法手冊(cè)》。
掌握了TCL/TK之后,可以學(xué)習(xí)虛擬Jtag(ISE也有類似的工具)制作屬于自己的調(diào)試工具,此外,有時(shí)間的話,最好再學(xué)個(gè)python。腳本,意味著一勞永逸。
5、增強(qiáng)理論基礎(chǔ)
這個(gè)時(shí)候,你已經(jīng)會(huì)使用FPGA了,但是還有很多事情做不了(比如,F(xiàn)IR濾波器、PID算法、OFDM等),因?yàn)槔碚摏]學(xué)好。我大概地分幾個(gè)方向供大家參考,后面跟的是要掌握的理論課。
信號(hào)處理——信號(hào)與系統(tǒng)、數(shù)字信號(hào)處理、數(shù)字圖像處理、現(xiàn)代數(shù)字信號(hào)處理、盲信號(hào)處理、自適應(yīng)濾波器原理、雷達(dá)信號(hào)處理
接口應(yīng)用——如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太網(wǎng)接口)、SATA、光纖、DisplayPort
無線通信——信號(hào)與系統(tǒng)、數(shù)字信號(hào)處理、通信原理、移動(dòng)通信基礎(chǔ)、隨機(jī)過程、信息論與編碼
CPU設(shè)計(jì)——計(jì)算機(jī)組成原理、單片機(jī)、計(jì)算機(jī)體系結(jié)構(gòu)、編譯原理
儀器儀表——模擬電子技術(shù)、高頻電子線路、電子測(cè)量技術(shù)、智能儀器原理及應(yīng)用
控制系統(tǒng)——自動(dòng)控制原理、現(xiàn)代控制理論、過程控制工程、模糊控制器理論與應(yīng)用
壓縮、編碼、加密——數(shù)論、抽象代數(shù)、現(xiàn)代編碼技術(shù)、信息論與編碼、數(shù)據(jù)壓縮導(dǎo)論、應(yīng)用密碼學(xué)、音頻信息處理技術(shù)、數(shù)字視頻編碼技術(shù)原理
現(xiàn)在你發(fā)現(xiàn),原來FPGA會(huì)涉及到那么多知識(shí),你可以選一個(gè)感興趣的方向,但是工作中很有可能用到其中幾個(gè)方向的知識(shí),所以理論還是學(xué)得越多越好。如果你要更上一層,數(shù)學(xué)和英語(yǔ)是不可避免的。
6、學(xué)會(huì)使用MATLAB仿真
設(shè)計(jì)FPGA算法的時(shí)候,多多少少都會(huì)用到MATLAB,比如CRC的系數(shù)矩陣、數(shù)字濾波器系數(shù)、各種表格和文本處理等。此外,MATLAB還能用于調(diào)試HDL(用MATLAB的計(jì)算結(jié)果跟用HDL算出來的一步步對(duì)照,可以知道哪里出問題)。推薦的教材是《MATLAB寶典》和杜勇的《數(shù)字濾波器的MATLAB與FPGA實(shí)現(xiàn)》。
7、足量的實(shí)踐
這個(gè)時(shí)候你至少讀過幾遍芯片手冊(cè)(官網(wǎng)有),然后可以針對(duì)自己的方向,做一定量的實(shí)踐了(期間要保持良好的代碼風(fēng)格,增加元件例化語(yǔ)句的可讀性,繪制流程圖/時(shí)序圖,撰寫文檔的習(xí)慣)。比如:通信類的可以做調(diào)制解調(diào)算法,儀表類的可以做總線分析儀等等。不過這些算法,在書上只是給了個(gè)公式、框圖而已,跟實(shí)際的差距很大,你甚至?xí)X得書上的東西都很膚淺。那么,你可以在知網(wǎng)、百度文庫(kù)、EETOP論壇、opencores、ChinaAET、Q群共享、博客上面找些相關(guān)資料(校外的朋友可以在淘寶買個(gè)知網(wǎng)賬號(hào))。其實(shí),當(dāng)你到了這個(gè)階段,你已經(jīng)達(dá)到了職業(yè)級(jí)水平,有空就多了解一些前沿技術(shù),這將有助于你的職業(yè)規(guī)劃。
在工作當(dāng)中,或許你需要關(guān)注很多協(xié)議和行業(yè)標(biāo)準(zhǔn),協(xié)議可以在EETOP上面找到,而標(biāo)準(zhǔn)(如:國(guó)家標(biāo)準(zhǔn)GB和GB/T,國(guó)際標(biāo)準(zhǔn)ISO)就推薦《標(biāo)準(zhǔn)網(wǎng)》和《標(biāo)準(zhǔn)分享網(wǎng)》。
8、圖像處理(這部分只寫給想學(xué)圖像處理的朋友,也是由淺入深的路線)
Photoshop?;ㄒ?、兩周的時(shí)間學(xué)習(xí)PS,對(duì)圖像處理有個(gè)大概的了解,知道各種圖片格式、直方圖、色相、通道、濾鏡、拼接等基本概念,并能使用它。這部分是0基礎(chǔ),目的讓大家對(duì)圖像處理有個(gè)感性的認(rèn)識(shí),而不是一上來就各種各樣的公式推導(dǎo)。推薦《Photoshop CS6完全自學(xué)教程》。
基于MATLAB或OpenCV的圖像處理。有C/C++基礎(chǔ)的可以學(xué)習(xí)OpenCV,否則的話,建議學(xué)MATLAB。這個(gè)階段下,只要學(xué)會(huì)簡(jiǎn)單的調(diào)用函數(shù)即可,暫時(shí)不用深究實(shí)現(xiàn)的細(xì)節(jié)。推薦《數(shù)字圖像處理matlab版》、《學(xué)習(xí)OpenCV》。
圖像處理的基礎(chǔ)理論。這部分的理論是需要高數(shù)、復(fù)變、線性代數(shù)、信號(hào)與系統(tǒng)、數(shù)字信號(hào)處理等基礎(chǔ),基礎(chǔ)不好的話,建議先補(bǔ)補(bǔ)基礎(chǔ)再來??床欢睦碚撘部梢詴簳r(shí)先放下,或許學(xué)到后面就自然而然地開竅了。推薦《數(shù)字圖像處理》。
基于FPGA的圖像處理。把前面學(xué)到的理論運(yùn)用到FPGA上面,如果這時(shí)你有前面第七個(gè)階段的水平,你將輕松地獨(dú)立完成圖像算法設(shè)計(jì)(圖像處理是離不開接口的,上面第五個(gè)階段有講)。推薦《基于FPGA的嵌入式圖像處理系統(tǒng)設(shè)計(jì)》、《基于FPGA的數(shù)字圖像處理原理及應(yīng)用》。
進(jìn)一步鉆研數(shù)學(xué)。要在算法上更上一層,必然需要更多的數(shù)學(xué),所以這里建議學(xué)習(xí)實(shí)分析、泛涵分析、小波分析等。
下面這兩個(gè)階段是給感興趣的朋友介紹的。
9、數(shù)電的盡頭是模電
現(xiàn)在FPGA內(nèi)部的事情是難不倒你的,但是信號(hào)出了FPGA,你就沒法控制了。這個(gè)時(shí)候必須學(xué)好模電。比如:電路分析、模擬電子技術(shù)、高頻電子線路、PCB設(shè)計(jì)、EMC、SI、PI等等,能設(shè)計(jì)出一塊帶兩片DDR3的FPGA開發(fā)板,就算通關(guān)了。
10、學(xué)無止境
能到這個(gè)境界,說明你已經(jīng)很厲害了,但是還有很多東西要學(xué)的,因?yàn)镕PGA常常要跟CPU交互,也就是說你得經(jīng)常跟軟件工程師交流,所以也得懂點(diǎn)軟件方面的知識(shí)。比如ARM(Xilinx的ZYNQ和Altera的SOC會(huì)用到ARM的硬核)、DSP、Linux、安卓、上位機(jī)(QT、C#、JAVA)都可以學(xué)一下,反正學(xué)無止境的。
11、其它問題
a、為什么不推薦學(xué)習(xí)NIOS II和MicroBlaze等軟核?
性價(jià)比不高,一般的軟核性能大概跟Cortex M3或M4差不多,用FPGA那么貴的東西去做一個(gè)性能一般的CPU,在工程上是非常不劃算的。不如另外加一塊M3。
加上軟核,可能會(huì)影響到其它的邏輯的功能。這是在資源并不十分充足的情況下,再加上軟核,導(dǎo)致布局布線變得相當(dāng)困難。
軟核不開源,出現(xiàn)Bug的時(shí)候,不容易調(diào)試。
工程上很少使用,極有可能派不上用場(chǎng)。
b、為什么不推薦0基礎(chǔ)學(xué)習(xí)ZYNQ或SOC?
容易讓人有傍同心理。傍同心理是指一個(gè)人通過渲染與自己有親近關(guān)系的人的杰出,來掩蓋和彌補(bǔ)自己在這方面的不足,從而獲得心理上的平衡。自己在學(xué)習(xí)很厲害的東西,然后也感覺自己很厲害,但這只是錯(cuò)覺而已。
入門應(yīng)該學(xué)習(xí)盡量簡(jiǎn)單的東西,要么專心學(xué)習(xí)ARM,要么專心學(xué)習(xí)FPGA。這樣更容易有成就感,增強(qiáng)信心。
ZYNQ和SOC的應(yīng)用領(lǐng)域并不廣,還有很多人沒聽過這種東西,導(dǎo)致求職的不利。
開發(fā)工具編譯時(shí)間長(zhǎng),浪費(fèi)較多時(shí)間。
絕大多數(shù)工作,都只是負(fù)責(zé)一方面,也就是說另一方面,很有可能派不上用場(chǎng)。
c、為什么已經(jīng)存在那么多IP核,仍然需要寫HDL?
問這種問題的,一般是學(xué)生,他們沒有做過產(chǎn)品,沒有遇到過工程上的問題。
IP核并非萬能,不能滿足所有需求。
盡量少用閉源IP核,一旦出問題,這種黑匣子很可能讓產(chǎn)品難產(chǎn)。
深入理解底一層次,可以更好地使用高一層次。該法則可以適用于所有編程語(yǔ)言。
評(píng)論