導讀——不是每個人都能成為一代宗師,因為在一個時代宗師只有少數人,成不了宗師,可以選擇成為門派高手,立足武林的六合一之路無外乎秘密武器、江湖規矩、內功心法、武術動作、內功修煉及實戰經驗。修煉六脈神劍,成為高手,行走江湖,行俠仗義,斬奸除惡,開啟江湖人生!
0.引言——高手沒有天賦,只有初心、選擇、努力和毅力

圖1 工業視覺處理(圖片來源:自電子元件技術)
圖像處理是通過對圖像進行增強、復原、重建、分析及特征識別等處理以得到目標結果,在工業、消費電子、安防等領域具有廣泛的應用。FPAG支持實時流水線運算(跟工廠流水線作業一樣、不同的工序可以同時開展),具有高實時性特點(通過并行作業、可以在極短的時間內完成任務),是圖像處理應用的主要平臺,在一些高并發性、實時性要求較高的應用領域,只能通過FPGA實現。
FPGA圖像工程師的薪資水平普遍較高,但綜合能力要求極高,又是算法、又是編程,又是硬件,不是迫不得已或者興趣,很多人一開始就選擇放棄,實際入門真的是這樣子嗎?跟很多技術一樣,難不在技術本身,在學習的初心、態度、流程及方法,下面是本人基于多年的經驗整理FPGA圖像工程師晉級之路。
1.選武器——倚天QUARTUS、屠龍VIVADO,掌控優先
FPGA開發的工具平臺包括綜合編譯工具、仿真工具、代碼編寫工具及入門開發板,選好用好工具平臺不僅可以降低入門難度,還利于快速提升設計開發能力。工具平臺選擇以易于入門,便于熟練掌控,利于升級為基本原則,下面是有關工具平臺選擇、使用方法及相關資料的分享:
(1)選開發工具
①綜合編譯工具——優選QUARTUS,升級VIVADO
主流的FPGA廠商主要有:國際Intel、Xinlinx、Lattice等,國內的紫光同創、京微齊力、高云半導體等,每家廠商都有自己的開發工具,解決新建工程、仿真綜合,配置管腳、下載和在線調試等問題,功能大同小異,差異主要存在于操作習慣、性能及操作方法等方面。主流的開發工具主要有來自Intel的QUARTUS和Xilinx的ISE、VIVADO,其中ISE是XILINX較早開發的版本,適用中低端芯片的開發,VIVADO是XILINX近期推出的開發平臺,適用于XILINX的中高端芯片的開發(不支持低端芯片的開發)。
表1 QUARTUS與VIVADO比較

相比而言,QUARTUS無論是對資源的要求,還是使用簡單性都要優于VIVADO,但功能的齊全性低于VIVADO,綜合市面上Intel的FPGA開發板相對比較便宜,建議初學者先選擇QUARTUS入門學習,掌握熟悉之后,根據個人情況及開展具體項目的要求,再學習使用VIVADO。
備注——綜合編譯工具下載地址:
1) QUARTUS軟件安裝包,建議安裝18.1精簡版本的,不需要破解。
下載地址:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=429&extra=page%3D1
2) VIVADO軟件安裝包,建議安裝2018.2版本的,在XILINX官網可注冊LICENSE。
下載地址:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=435&highlight=vivado
②仿真工具——業界主流MODELSIM
QUARTUS與VIVADO都自帶仿真器,但是不好使用,目前業界基本都是使用MODELSIM作為FPGA仿真工具,基本是標配。
備注——仿真工具下載地址:
下載及安裝教程地址:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=430&extra=page%3D1
③代碼編寫工具——優選GVIM,可選NOTEPAD++
QUARTUS、VIVADO、MODELSIM都自帶有代碼編寫器,但交互性不好,強烈建議選用GVIM、NOTEPAD++等代碼編寫工具。
在Windows系統環境下,可以采用NOTEPAD++,特別是從軟件轉行過來,已經習慣NOTEPAD++使用的開發者。但如果想在IC設計、IC驗證或者FPGA上走得更遠,強烈建議選擇GVIM,一方面IC行業基本都在使用GVIM,另一方面來自于工具本身功能足夠強大,不僅支持常規的編輯、復制、刪除、查找、替換等功能,而且支持“命令行”輸入。
備注——Windows版本GVIM工具下載地址:
下載及安裝教程地址:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=431&extra=page%3D1
(2)開發工具使用
①VIVADO和QUARTUS使用方法
VIVADO和QUARTUS的功能,最常用的功能包括:新建工程、選好芯片型號、配置好管腳、綜合編譯和上板調試等功能。各個工具都是大同小異,但要注意學習FPGA不是學工具,而是學習如何設計、學習如何定位問題和解決問題。
備注——VIVADO和QUARTUS使用資料推薦:
VIVADO使用教程鏈接:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1023&extra=page%3D1
QUARTUS使用教程鏈接:
https://pan.baidu.com/s/1Zf-bjXF4v72tXx2NnEfCsw
提取碼:yknc
②Modelsim使用方法
掌握Modelsim工具的基本使用,主要包括:新建工程,添加文件,編譯,VSIM仿真及查看仿真波形等。
(3)選開發平臺
學習FPGA編程,開發板是標配平臺,市面上FPGA的開發板非常多:100~200元的入門級產品,500~1000元的進階產品,數千上萬元的高級產品。對于初學者可以選擇點撥FPGA之入門開發板、MP801、新起點FPGA開發板、AC620 FPGA開發板等。
2.掃規矩——Verilog江湖明規矩講武德,走馬觀花留印象
選好工具、開發板,接下來就是學習FPGA的編程語言——Verilog和VHDL,其中VHDL在教學科研中較為常見,實際的應用中基本都是以Verilog為主,風格與C語言類似,強烈建議學習Verilog。傳統的學習模式都是選一兩本教材反復研讀理解每一個語法的細節,翻了一遍沒感覺,再翻一遍,也沒記住多少,一兩個月下來還是不知道如何編寫。其實對于大多數初學者而言,這樣的學習模式是無效率的,因為短期內無法理清語法規則,如何使用。因此,強烈建議找一兩本經典教材,花兩三天時間走馬觀花過一遍,不需要追求掌握細節,有印象大概明白即可,使用的時候再回過頭來查,使用多了自然就會明白,這跟小孩走路一樣,一開始總是別扭,找到感覺了自然就靈活了。重點理解:
表2 重點理解Verilog知識點

推薦的書:
1) 夏老師的《verilog HDL數字系統設計教程》,這是一本經典的verilog書籍,已出版十幾年,一直很受歡迎;
2) 《FPGA至簡原理與應用》,該書還沒有出版,只有電子版,配套視頻講解幫助學習。
3.掌心法——FPGA軟硬心法核心在至簡,避免走火入魔
FPGA的設計
(1)FPGA軟硬件設計思維風格
FPGA需要編程實現,但實際是硬件設計,這與軟件設計有本質的區別:
① 軟件設計思維風格

圖2 軟件思維設計風格
軟件設計思維即指熟悉的C、C++、Java等軟件編程的思維,可以邊寫代碼,邊看處理看結果,風格如圖2所示。圖3是基于軟件設計思維實現Y=a+b*c+d/e計算的過程。

圖3 a+b*c+d/e的軟件設計思維實現過程
② 硬件設計思維風格
硬件設計思維與軟件設計思維有較大的區別,軟件設計思維只需要考慮邏輯,基本不用考慮時序的問題,但是硬件設計思維處理模塊功能,還需要考慮模塊之間的耦合時序問題,具體設計風格如圖4所示。圖5是基于硬件設計思維實現Y=a+b*c+d/e計算的過程。

圖4 硬件設計思維風格

圖5 a+b*c+d/e的硬件設計思維實現過程
相比成熟的軟件設計思維風格,硬件設計的思維風格被提及得不多,很多初學者尤其是有一定軟件基礎的碼農朋友,一時半會無法轉過彎,因此感覺到很難,那難在哪里?特別是在定位查找問題的時候

圖7 軟硬件設計思維查找問題的區別
就像圖7所示一樣,軟件是按順序執行,哪里有錯很容易找出出錯的地方;而FPGA只有在結果不對的時候,再回去找出問題的點,但那么多模塊,到底是哪個出錯了,是比較難定位的,這就是FPGA的難點之一。
(2)設計思維風格選擇——4大建議2個推薦
軟件設計思維和硬件設計的思維風格區別明顯,在選擇之前先通過表3了解兩種風格的優缺點。
表3 軟硬件設計思維風格優缺點

如何選擇合適的設計思維風格?建議兩種風格都學習,結合起來用,在學的過程中先易后難,對于硬件設計思維,碰到困難問題,先放下,重效果實現暫時忽略細節,等知識經驗積累豐富了,很多問題就會迎刃而解。具體6個建議如下:
1) 軟件入門,硬件進階:采用軟件設計思維入門,同時注意硬件設計思維的存在,當設計水平遇到瓶頸時,學習硬件設計思維;
2) 軟件硬件同步學習:兩種設計思維相互補充,互相促進;
3) 小項目軟件思維入門,大項目硬件升級:入門以后,隨著大項目工作或者學習的開展,強烈建議采用硬件設計思維,這是一個優秀FPGA工程師必須具備的基本素質,很多企業也會有類似的要求,比如華為要求“一個always只能設計一個信號”,其根本上就是要求工程師要用硬件的思維來設計。
4) 硬件設計思維避免牛角尖:學習硬件設計思維,一定要避免鉆牛角尖,切記不要以為是一定要想明白才去寫代碼、才去仿真驗證,想不明白或者不能通過查資料,討論等途徑解決,就無法開展工作。FPGA設計思維尤其是硬件設計思維只是一個過程,正常的學習動作是寫一點代碼仿真一下,在設計過程中理解,在理解中改動設計,這才是正途。
推薦學習資源:
1) 專業的、標準的硬件設計思維學習資源科選擇——《FPGA高手修煉》,該學習資源可以很好訓練FPGA代碼設計;
2) FPGA的模塊設計技巧,可參考《FPGA架構設計》。
(3)編譯出錯定位
使用開發工具過程經常會碰到很多問題,出來根據提示信息查找定位問題之外,也可以通過網絡尋找同類問題解決方案。
備注——QUARTUS問題【匯總貼】推薦
常見QUARTUS問題匯總網址:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=901;
(4)學會習仿真調試
仿真測試是FPGA工程師必須掌握的技能,FPGA工程師的基本工作狀態是一個循環胎,即設計——仿真——調試——設計,因此,需要掌握相關的仿真調試方法,邊設計邊仿真調試,不斷修正錯誤,直至完成設計目標。具體的要掌握的技能如下:
①測試文件的寫法
1) 熟悉測試文件的格式:明確一個測試文件的基本組成要素,如模塊名、信號定義、例化和產生測試激勵等。
2) 掌握時鐘和復位信號的產生方法:了解時鐘、復位等信號的產生;
3) 掌握信號激勵的產生方法:激勵怎么產生,就是用那個initial語句,延時xx時間,給就一個1,再延時xx時鐘,就給一個0。掌握這種基本的語法邏輯,在實際中基本夠用了,具體參考如圖8所示。

圖8 信號激勵產生示例
掌握以上測試文件的編寫方法,在實際中基本已經夠用了,相比而言更重要的是看仿真波形。
②MODELSIM編譯錯誤的處理方法
在MODELSIM編譯過程中,如果代碼有錯誤時,軟件會提示報錯,并且會提示哪一行出錯,例如圖3所示。

圖9 編譯報錯示意圖
圖9提示:在pkt_check_tb.v這個文件,第34行,信號“din”有錯誤,可以去34行查看問題,關于問題查看與定位梳理以下6點建議:
1) 務必查看錯誤提示,不管愿不愿意看英文,這是必須要掌握的基本技能;
2) 強烈建議少用翻譯軟件理解錯誤提示,依賴翻譯信息容易失去重點,在查找問題時,很多時候不需要全部理解,抓住關鍵詞即可。如圖3所示,文件名叫pkt_check_tb.v,是第34行,是信號din有錯,這些信息已經足夠了,然后根據提示打開pkt_check_tb.v文件,去34行,找到din信號,去看這代碼跟標準的代碼比,有哪些不同,就可以把問題查找出來;
3) 錯誤位置上下文也要看,在處理編譯錯誤時,不要只看提示錯誤的行,上下的行業好看。有時候上行的錯,會在下行中提示;
4) 不要害怕出現錯誤,在FPGA開發過程中,遇到錯誤時正常現象,而且很多時候,錯誤并沒有那么多,常見的錯誤基本都是:信號定義錯誤,例如reg信號定義成wire,wire信號定義成reg;信號位寬有錯,信號沒定義等等;
5) 可以借助網絡尋找解決問題的辦法:在學習、開發過程,經常會遇到很多問題,可以通過網絡尋找同類問題的解決辦法,比如MODELSIM/仿真問題帖子:www.fpgabbs.cn/forum.php?mod=viewthread&tid=951;
④錯誤問題的定位方法
與軟件開發一樣,調試是FPGA開發最為耗時的一個環節,需要根據代碼和波形,找出邏輯的錯誤。但與時序軟件設計項目,FPGA的調試難度較大,不像軟件那樣支持但步調試,FPGA是一個并行硬件,所有模塊是一起工作。在實際的工作中,更考驗心態及心細程度,一般采用二分法樹藤摸瓜解決問題,比如一個工程分為ABCDE5部分,現在E的結果有問題,具體定位過程如下:
1) 先看C是否正確,如果正確,說明錯誤由DE導致,如果錯誤,說明錯誤由AB引起;
2) C正確:檢查D的結果,如果D正確,則錯誤由E產生,反之由D產生;
3) 如果C錯誤:檢查A的輸出,如果A正確,則錯誤由B產生,反之由A產生;
4) 就這樣一級一級排查,最終總會定位到問題所在點。
更多的FPGA問題定位技巧可參考:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=268
(5)在線調試
經過綜合編譯,下一步就是上板測試看效果。仿真通過不代表就是正確的,仿真只是模擬的仿真,僅說明“邏輯”正確,實際中還會有很多因素影響結果,比如管腳配置錯誤、硬件故障、信號干擾等問題。不同的開發工具都對應不同的在線調試工具,QUARTUS自帶的SIGNALTAP、ISE自帶的CHIPSCOPE,VIVADO本身的調試工具。在線調試工具與仿真工具類似,區別在于仿真通過電腦模擬,在線調試工具是抓取實際信號呈現結果。
備注1:在線工具具有局限性,只能看一小部分的信號以及有限的數據量,這意味著在線調試工具只能定位未知的小BUG,邏輯設計還是要靠仿真來保證。
備注2——SIGNALTAP的使用方法資源推薦:
Signaltap使用教程鏈接:
https://pan.baidu.com/s/1o6ti4Zr31mRw2qKYrMQQQg
提取碼:pj5s
4.仿動作——依葫蘆畫瓢入門案例,學基本動作要領
仿寫現成案例是最快速也是最簡單的學習方法,建議仿寫案例從簡單開始逐步過渡到,在仿寫的過程中逐步掌握Verilog語法、計數器、位寬擴展等復雜應用并熟悉工具使用。推薦的仿寫案例如下:
1) LED燈系列:1位閃爍燈、4位閃爍燈、PWM呼吸燈等;
2) 數碼管系列:數碼管動態掃描、秒表、數字時鐘等;
這些案例都可以通過互聯網搜索到,或者通過購買開發板獲得,具體的學習建議如下:
1) 抄寫練習混臉熟:抄寫一遍,以熟悉工具流程和熟悉語法為目的,并在抄寫過程中理解常用的編程語法;
2) 盲寫練習漲經驗:盲寫一遍,上板調試看結果,如有問題對比源碼定位問題,盲寫效果比抄寫效果要好,印象更加深刻;
3) 謹慎擴展練習有耐心:在語法、工具還不熟悉,設計思維還沒形成的情況下,不建議擴展功能,因為容易出錯,浪費時間還打擊信心。建議先仿寫、盲寫基本案例一個周期,通過對比學習中不斷提升基礎能力;
4) 謹慎開展設計有信心:很多初學者學一兩個星期就開始設計,以為已經具備FPGA設計能力,這是誤區。一般情況,FPGA和芯片設計工程師開始一兩年都是開展驗證的工作。優先的工程師都是建立在閱讀理解、仿寫及修改大量代碼的基礎上,才能逐步掌握設計能力。因此,開始設計不出來是正常的現象,沒必要灰心。
5) 結合工具積累技巧:在學習過程中,結合QUARTUS、VIVADO、MODELSIM等工具和開發平臺,不斷積累并掌握掌握仿真、定位問題等技巧。
5.習基礎——萬丈高樓平地起,基礎決觸達定高度
以上是FPGA知識,要進階成為FPGA圖像工程師,除了FPGA基礎知識之外,還需要掌握圖像的概念及圖像處理的方法,與FPGA學習一樣,一開始并不需要去深度研讀圖像處理的相關原理書籍,可以通過仿寫VGA顯示顏色、VGA顯示矩陣、VGA顯示圓、VGA顯示動畫和VGA顯示圖片等圖像基本實驗掌握圖像處理的基本概念:
1) 理解圖像時序:理解圖像傳輸的信號時序,例如行、場同步信號等;
2) 理解圖像格式:理解圖像的RGB888、RGB565、RAW12等數據格式;
3) 理解圖像顯示方法:理解一幅圖像是如何將像素數據傳到VGA、LED等顯示設備進行顯示的,是如何對齊的。理解這些,有助于實現畫中畫、圖像拼接、裁減等高級功能的實現;
4) 理解圖片動畫實現方法:動畫本質上是多幅圖像的滾動顯示,本質上也是圖像顯示。通過動畫的實現方法,可以實現更種游戲的實現;
5) 理解圖像存儲的處理法
6.練實戰——閉門造車、戰場上只能被KO
通過圖像基礎案例之后,可以開展一個具有代表性、完整性的FPGA圖像處理項目——FPGA圖像邊緣檢測,具體完成的內容包括:
1) 圖像采集——OV7670:具體的內容包括OV7670傳感器的配置、圖像采集;(選擇OV7670是因為該傳感器資料眾多,具有代表性,在掌握圖像采集之后,可通過舉一反三掌握AD、DA的配置方法,甚至可以延伸聯系LVDS、MIMP及HDMI等圖像視頻接口);
2) 圖像處理:包括灰度轉換、圖像格式轉換、高斯濾波、SOBEL邊緣檢測算法(也可嘗試中值濾波、腐蝕等圖像處理算法);
3) 圖像存儲:與嵌入式計算機不同,FPGA的存儲是一個難點,需要在硬件邏輯下考慮不同幀圖像的處理關系,需要注意時序及存儲容量的控制。
通過項目實踐,掌握圖像采集、圖像處理、圖像存儲及圖像顯示等常見圖像處理的功能,同時對圖像數據帶寬等概念有了深入的理解和認識,比如1080P、4K和8K等。
備注——FPGA圖像邊緣檢測實踐資料
http://www.fpgabbs.cn/thread-879-1-1.html
總結與后續——高手過招,每一個傷疤都是大牛的墊腳石
至此,一步一個腳印走完六步法,完成圖像邊沿檢測的項目,基本走完從小白到FPGA圖像工程師入門之路,無論是知識還是信心都有了質的飛躍。如果能在學習過程中學會舉一反三、觸類旁通,找個心儀的工作問題不會太大。
能力和經驗的提升是一個長期的過程,強烈建議基于上述知識基礎及問題解決的技巧,開展更多的項目實踐、比如圖像的放大縮小、車牌識別、手勢識別等,LVDS、MIPI、HDMI接口等高速接口,也可以開展4K、8K圖像處理掌握更高速、更復雜的FPGA圖像處理項目。在成功喜悅和失敗煎熬的錘煉下,你或許也會跟我一樣感慨,成為大牛并沒有想象中那么難!