FPGA之學習FPGA需要注意的地方

2021-06-26 22:01:56 字數 3871 閱讀 9192

任何乙個硬體工程師對fpga都不會陌生,就好比c語言對於軟體工程師來說是必修課程一樣,只要是電子相關專業的學生,都要學習可程式設計邏輯這門課程。fpga的英文全稱是field programmable gate 

array,即現場可程式設計門陣列,它是在pal、gal、epld等可程式設計器件的基礎上進一步發展的產物。

從表象看,programmable這個單詞確實能夠很好的描述fpga的特點,但這也使得很多初學者走了不少彎路。一說到程式設計,大家不免聯想到

coding,因為軟體程式設計的思想對工程師來說已經是根深蒂固了。因此,很多初學者都會問乙個相同的問題,兩種硬體程式語言vhdl和verilog,應該學哪個?即使明確了要學習哪種設計語言,也會一頭紮進浩瀚的語法中,走向歧途。有些初學者寫了大量的**,在demo板上跑了n個試驗,可還是覺得不懂

fpga,甚至搞不清楚它和微控制器的區別。這是為什麼?其實,這都歸結乙個原因,就是被「可程式設計」這3個字給迷惑了,也就是說,沒有弄清楚fpga的本質是什麼。因此,對於fpga的學習也就不著法門,事倍功半,浪費了不少時間,卻仍然達不到效果。

fpga是作為專用積體電路(asic)領域中的一種半定製電路而出現的,既解決了定製電路的不足,又克服了原有可程式設計器件閘電路數有限的缺點。因此,從底層來看,fpga還是屬於積體電路的範疇。就當前的技術而言,使用fpga開發專案還是全部基於數位電路設計的,所以,fpga的「可程式設計」也就是實現不同的數位電路邏輯。這與所謂的軟體程式設計有著本質的區別!歸根結底,fpga設計就是電路設計,因此,對於每個fpga工程師來說,在做設計時必須在腦中

有電路的模樣,這很重要!那麼,到底該如何有效地學習fpga呢?其實,很簡單,只要從以下7點著手,循序漸進,日積月累,就完全能夠對fpga設計游刃

有餘。1. 

首先,必須了解fpga的結構和效能。不同廠家,不同系列的fpga晶元都有不同的結構和效能,但是萬變不離其中。剛開始,從掌握幾款典型的高階晶元開始,例如altera公司的stratix iii和xilinx公司的virtex 

5。之後,再去了解其它系列的晶元就很容易了。至於lattice和actel公司的晶元,當使用時再了解也不遲,因為學習主流的東西才會更加有效!許多有關fpga的教科書都會以幾款常用的晶元為例,講述fpga的基本結構和原理。初學者看了後,總覺得過於抽象,有點不知所云的感覺。因此,為了深刻理解fpga,必須要有紮實的數位電路基礎!在數位電路裡,最基本的就是邏輯和時序。工程師必須明白fpga內部邏輯結構和數位電路基本電路結構的關係。例如,任何4個輸入訊號的組合邏輯都可以通過fpga提供的4輸入lut來實現。如果使用xilinx的晶元,移位暫存器既可以通過多個觸發器級聯實現,也

可以通過lut來實現。通常,初學者可以設計出正確的邏輯,但卻很容易忽略時序。在i/o口的設計中,與時序相關的缺陷對於產品是致命的,會影響產品的可

靠性。因此,在掌握了結構後,還必須關注晶元的一些重要時序引數,例如i/o口時鐘的建立時間、保持時間和從觸發器到輸出的延遲時間,以及晶元內部工作時

鐘的最高頻率等等。只有充分掌握了所使用晶元的結構和效能,才能設計出乙個合理的系統,才能保證fpga的設計可靠穩定。fpga廠商提供的大量文件是乙個不錯的學習資料。

2. fpga既然是「可程式設計」,自然離不開程式語言。其實,早期的工程師大多使用原理圖輸入方式進行邏輯設計,這是一種更接近於電路設計的設計方式。這種設計方式對設計者要求較高,而且也不利於移植和維護,因此vhdl和verilog才漸漸流行起來。這兩種語言,無所謂孰優孰劣,只不過verilog發展的比vhdl好,而且和將來可能一統天下的systemverilog比較接軌。它們都是硬體描述語言。既然叫硬體描述語言,自然是和軟體世界裡的程式設計不一樣,所以,初學者不能把它當作軟體程式語言來學習,否則就會捨本逐末。如果僅僅只是從事fpga邏輯設計和做簡單的功能**,只需學習最簡單的語法就夠了。那些用於寫驗證指令碼的語法,完全不用學,基本用不上。語言僅僅只是乙個工具,尤其在硬體設計裡,**寫得漂不漂亮,並不重要,最關鍵的是設計思想。記住,fpga工程師是在設計電路,而不是在「程式設計」!

3. 很多任務程師會談到演算法的重要性,認為必須懂得很多演算法。沒錯,好的演算法對於設計來說猶如利器一般。可是,研究演算法和如何實現演算法是兩個不同的概念,研究算

法是在做數學題,實現演算法才是工程師的職責。這裡並不是說fpga工程師不用去研究演算法,而是強調職責所在。不同的演算法,我們對其原理的研究和理解的要求也是不同的。例如8b/10b編碼,只要你懂得在**需要使用它就夠了,現成的ip 

core可以直接呼叫。但是,諸如fec編譯碼這樣的演算法,則只有了解了基本原理後才可能懂得如何實現。對於演算法,fpga工程師的重點就是在於「如何實現」!。另外,演算法之外,邏輯設計裡常用的設計方法必須懂得,例如,桌球操作、流水線設計和分時復用等等。還有常用的邏輯模組,如非同步fifo、狀態機,這些其實都是數位電路裡最基礎的東西,但是對於初學者來說,在做fpga設計時未必會正確的使用。

4. fpga設計必須有乙個好的設計流程來支撐。**寫完後,花大量時間做完善的功能**和驗證是很有必要的。可是一些工程師並不重視**和驗證,而是迫不及待的上板除錯。碰到bug後就在**上修修補補,運氣好的話,bug表面上是解決了,可真正深層次的原因卻未必發現,給產品留下了隱患。乙個好的設計流程

要求大多數bug在前期工作中必須解決掉,功能**和驗證則是乙個很有效也很重要的步驟。除了**驗證,綜合和佈線也必須重視,這要求我們必須仔細瀏覽編

譯報告和時序報告,因為,許多時序問題都能通過報告反映出來。有時候,一些工程師碰到時序問題,僅僅做時鐘反相來調整資料和時鐘的相位關係,或者修改綜合

和佈線的引數,仍無法解決問題。尤其是在用了高速時鐘的設計裡,大多數情況,我們只有修改**裡的邏輯才能滿足設計的時序要求。這些也只有仔細分析了報告後,才能對症下藥。另外,對於大多數同步邏輯設計來說,時序**是沒有必要的,這一步完全可以省略。

5. 現階段,fpga發展的三大方向就是soc,高速i/o和dsp。在有限的時間裡,選擇乙個領域進行主攻是有必要的,只有明確了目標,才會更加投入。soc設計要求設計者對軟體程式設計、cpu原理甚至是作業系統比較了解才行,因為soc就是乙個軟硬體結合的系統。高速i/o設計則要求設計者掌握許多模擬

電路的基本知識以及一些常用的通訊協議,例如,sdh、gbe、pci-e等等。fpga在dsp領域的使用是近幾年興起的乙個發展方向。fpga由於其

號處理常用演算法。這3個方向完全不同,切勿囫圇吞棗,一切通吃!「術業有專功」,資深的高階工程師也很難在多個方向都取得成就。當然,若能在乙個領域有較深的研究,同時,對另外兩個領域也有一定的了解,那就更好了。

6. 乙個優秀的fpga工程師,必須做到「一專多能」。所謂的「一專」當然是指在fpga設計領域的專業深度,而「多能」則是要求工程師對其它專業領域也要有

所了解和掌握。例如,對於設計乙個soc系統來說,c語言就必須學習,否則對於片上系統的架構就可能不合理。另外,對於設計高速i/o口的工程師來說,電

路板原理設計和pcb設計則需要有所了解。只有掌握了預加重、均衡以及阻抗匹配等這些與模擬電路相關的概念,才可能在設計和除錯中得心應手。

7. 最後一點,也是最難的一點,這也是邁向高階工程師的關鍵,就是fpga的設計需要乙個好的系統架構方案和合理的模組化分。這有助於fpga的除錯和維護,也便於多人共同開發,尤其是在使用大規模fpga時,這也就是常說的top-down設計方式。把乙個龐大的、複雜的設計化分成若干個小模組,而且層次要分明,不能扁平化,這需要設計者對設計必須有全面深刻的理解。乙個雜亂無序的設計對於後期的維護是災難性的,尤其是對於接手者來說,若要修改某個邏輯,可以說是苦不堪言。從這一點看,初學者的問題都可以在這裡找到答案。fpga學什麼?就是學習系統級的電路設計。所以,fpga工程師的發展方向就是系統工程師。

以上7點若能有深刻理解,則就能看清fpga的本質了。市場的瞬息變化,要求電子產品必須對市場具有高敏感性,產品從方案設計到市場投放的時間越來越短,fpga在其**不可沒。另外,在面對cost 

down時,fpga也起著不可或缺的作用。在當今時代,fpga已經在通訊、資料處理、網路、儀器、工業控制、軍事和航空航天等眾多領域得到了廣泛應

用。隨著功耗和成本的進一步降低,fpga還將進入更多的應用領域,相信fpga工程師也必將會有乙個更加廣闊的施展空間。

FPGA機器學習之學習的方向

我可能還有些不一樣的我感覺我能做到的人工智慧,不想去說機械人打敗人類,還有很多像科幻片裡面的機械人一樣的狀態,我沒那個本事。我想做的事情很簡單,讓機器的眼睛看懂普通事物,做一些簡單的事情就可以了。所以我主要的方向就是,機器視覺。那我計畫如何一步一步向前走呢?或者說我要學習哪些東西呢?我目前的內容都是...

FPGA機器學習之學習的方向

我可能還有些不一樣的我感覺我能做到的人工智慧,不想去說機械人打敗人類,還有很多像科幻片裡面的機械人一樣的狀態,我沒那個本事。我想做的事情很簡單,讓機器的眼睛看懂普通事物,做一些簡單的事情就可以了。所以我主要的方向就是,機器視覺。那我計畫如何一步一步向前走呢?或者說我要學習哪些東西呢?我目前的內容都是...

FPGA中狀態機實現需要注意的地方

寫狀態機時需要注意的地方 1 狀態機的狀態編碼大概有三種 二進位制編碼,格雷碼,獨熱碼。其中二進位制編碼就是000 001 010 011 100這類的逐漸加一 格雷碼就是相鄰兩個狀態只有一位數不一樣,000 001 011 010之類的 獨熱碼的意思是有多少個狀態那麼狀態碼就有多少位,比如說狀態機...