很多人在剛接觸FPGA時都有著無從下手的體驗,包括剛開始做FPGA開發時候的筆者亦如此。針對這種情況,新手要多做試驗,多思考,然后試著寫些小的程序,再在FPGA上驗證功能,如果不是想要的就再調試,慢慢的就可以學習到一些實際的東西。FPGA終極目標不是理論,而是實現實踐的路徑,成為“書蟲”肯定是不行的,所以建議大家多動動手。
做開發需要什么樣的心態?個人性格我覺得這個是勉強不來的,有的人做銷售,不需要什么技術和技巧,因為他從小就能說會道,周邊的人都比較喜歡,和別人溝通,交際這方面比較擅長。如果是這樣的人,就適合做銷售和行政之類,和別人打交道的工作,如果你讓這些人做技術,他坐不住,處處感覺別扭。
有的人做研究,從小就沉默寡言,喜歡發呆思考問題,數理化總能不怎么學都能考試高分,但是如果家里來了親戚,確害羞的不愛說話,也就是人們常說的木訥。這些人適合做技術。如果你讓這些人做銷售,單子估計一個也接不到。所以我覺得不管做什么,根絕自己的性格找到合適的工作,這樣身心愉悅。實際上,開發工作也是一項較累人的工作。
回歸正題,FPGA首先要了解硬件,大部分做FPGA不太關注硬件問題,都認為硬件不是FPGA的問題,這就大錯特錯了,硬件設計的好壞直接影響到FPGA工作的質量。
做FPGA需要注意調試各類驅動芯片,如果做通信的話,有各種通信芯片,主要包括PHY芯片,通信交換芯片,光纖驅動芯片等,各類芯片。另外還有各種通信接口。這些接口和芯片需要時間去調試和積累,這些不是在論壇上能完成的,這個過程是要在實驗室來完成的。另外,定位FPGA的位置,FPGA要了解的大部分不是FPGA知識,而是硬件知識和軟件知識,這是因為FPGA的位置,FPGA的硬件和軟件的橋梁。
目前FPGA的發展方向分為接口統一化(類似于AXI系接口)、硬件語言軟件化、系統化。以后FPGA開發難度會越來越下降,也是技術開發的方向。在幾年前,硬件很吃香,現在幾乎不需要硬件工程師,其實并不是不需要,而是硬件越來越標準化,一個行業越來越標準,說明開發的難度也隨之降低。
FPGA代碼其中一個最重要的步驟就是仿真。仿真簡單的說,就是驗證代碼是否正確,其中就包含了很多仿真的東西,測試平臺的搭建,庫的建立等等。最讓我們忽略的恐怕就是線延時了。
有時仿真正確,但是加載到FPGA里面就不正確了,這是為什么呢?忽略了一個問題,那就是線延時。接口從FPGA到接口芯片肯定鋪銅線過去了,中間這段走線是有延時。所以在仿真時,測試平臺要在庫和頂層之間加上一定的延時,來保證我們代碼的正確。
那么目前FPGA的主要生產廠商有哪些?有哪些區別?
2.Xilinx開發平臺是ISE
3.Actel ,開發平臺是Libero
4.Lattice
5.Atmel
其中Altera作為世界老牌可編程邏輯器件的廠家,是可編程邏輯器件的發明者,開發軟件MAX+PLUSII和QuartusII。記得上學的時候用的用的就是altera的芯片,當時的工具也是MAX,現在感覺當時的軟件很強大了,現在感覺比較弱智了,下載FPGA就是用串口,當時的時鐘速率也就是25M左右,用的是試驗箱,就是一個大箱子,里面有板子和說明,板子上還有8位數碼管和跳線。
Xilinx是FPGA的發明者,擁有世界一半以上的市場,提供90%的高端65nmFPGA產品,開發軟件為ISE,其產品主要用于軍用和宇航。
畢業后就是xilinx的,altera的很少用,大家一定問為什么,我也畢業的時候也是這樣問老大的,老大說altera的不好用,我也有點氣不忿兒,現在看來確實是這樣,總結幾點:
1:xilinx的資源豐富,新手會說很雜不容易用,但是如果上手之后,里面的資源確實會為你處理帶來方便,比如說BUFG,IODELAY,ODDR,OBUFT等等這些小的資源,還有一些IPcore,altera的好像要少些。
2:xilinx邏輯量比較大,一些大容量的FPGA好像altera沒有這么大的,比如V5,V6,V7,K7,這些altera是遠遠沒有的。不過也帶來了隱患,比如說散熱。不過有一點xilinx好像沒有altera的做的好,那就是高速查分線,xilinx叫GTP,GTX,GTH,現在好像也區別不大了。Altera和Xilinx主要生產一般用途FPGA,其主要產品采用RAM工藝。Actel主要提供非易失性FPGA,產品主要基于反熔絲工藝和FLASH工藝。
講到FPGA語言就不得不講verilog和VHDL,本人大學學的是VHDL,工作就一直在用VHDL。veilog更接近底層,關鍵是更接近C,所以被FPGA工程師所喜歡。HDL特別是Verilog HDL得到在第一線工作的設計工程師的特別青睞,不僅因為HDL與C語言很相似,學習和掌握它并不困難,更重要的是它在復雜的SOC的設計上所顯示的非凡性能和可擴展能力。在學習HDL語言時,筆者認為先學習VerilogHDL比較好:一是容易入門;二是接受Verilog HDL代碼做后端芯片的集成電路廠家比較多,現成的硬核、固核和軟核比較多。而在實現上,veilog更容易實現。
比如說要例化多個模塊,我們就可以用for語句,并且這個是可綜合的。在申明總線時,由于比較繁瑣的語句的時候,稍不注意還會有書寫錯誤。也許在veilog里面,只需要一個for語句就能搞定。
begin : loop
integer i;
for(i = 0; i <= 7; i = i + 1)
begin
if(int_stat_clr[i] ==1)
int_stat[i] <= 0 ;
end
end // block: loop71
這就話的意思就是如果stat_clr寄存器某一位為1,那么相對應的stat下面的一位就為1,這樣寫是不是很簡單。
wire和reg的區別
reg相當于存儲單元,wire相當于物理連線,但是新學FPGA的會問,存儲單元是什么,其實說白了就是D觸發器。通俗的解釋就是,wire相當于物理連線,就當與銅絲,PCB板子的走線,reg相當于芯片。wire走線延時小,幾乎可以忽略不計。reg一個時鐘的延時,這樣就夠了。
賦值:
wire對應的是assign,always,reg對應的always或者initial。
例如:
assign a = b ;把b點和a點相連接
always @(b)
a=b ;
表示變化出發
always @(posedge clk)
a<=b ;
把b線經過一級D觸發器給a,可以看出這時:
1、wire型的變量綜合出來一般是一根導線;
2、reg變量在always塊中有兩種情況:
(1)、always后的敏感表中是b 形式的,也就是不帶時鐘邊沿的,綜合出來還是組合邏輯
(2)、always后的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)
FPGA用的所有的信號賦值都是wire和 reg ,學會了這兩個也就掌握了FPGA的基本。
眾所周知,FPGA一般作為主控芯片,I2C也一般是做主設備。一般情況下,I2C做從設備是不好做的,特別是做大容量的從設備。I2C看起來簡單,但是里面還有很多問題,如果我們只考慮簡單的7為device address,8 bit register address,數據讀寫位也是簡單的8bit的話,另外讀寫只是簡單的I2C interface的話,還簡單些。
如果要考慮大容量的,如16bit的設備地址,讀的情形考慮到簡單的接口外還要考慮有restart的情況,就不好做了,如果要考慮的再細一點,特別是做圖像處理的話,讀寫EDID的時候有個搜索device設備的過程,這種情形恐怕做好的就不容易了。
如果是大廠商,像一些AT的ROM,Flash等公司,做的也是巨爛,我們用他們的芯片,用ARM訪問也是會有一些問題,就是他們考慮的不太周全。像一些圖像驅動的廠商,做的I2C相對來說還好些;通信設備的I2C寫的也是很差,控制起來比較麻煩,像一些光纖收發器的廠商,也就是光模塊的廠商,有的時候你用ARM等標準設備訪問的時候,也會有一些問題。
所以如果要做個I2C的從設備的話,要考慮的周全一些,這樣我們的芯片健壯性就會比較高。
關于FPGA的延時以及時序等要求包括skew,width,period,hold&set time。
檢查時鐘和控制信號在指定事件之間的時間間隔,包括:skew、width、period和nochange。
skew:$skew(reference_event, data_event, limit, notifier); 限制最大偏斜$skew (posedge clk1, posedge clk2, 1, notifier); 當data_eventtime - reference_event > limit,則會報告skew timeviolations。$skew是基于事件(event-based)的,如果監測到一個reference_event,那么就開始評估脈寬,只要監測到一個data_event,就會生成相應的報告,直到監測到下一個reference_event,才重新開始新的監測。如果在監測到一個data_event之前,又監測到一個reference_event,那么就放棄本次評估,重新開始新的評估。
width:$width(controlled_reference_event, limit, threshold, notifier); 限制最小脈寬 $width (posedge in, 2, notifier); 這里data_event是隱含的,它等于reference_event的相反邊緣,當width < limit時,就會報告width time violations。
period:$period(controlled_reference_event, limit, notifier); 限制最小周期$period (negedge clk, 10, notifier); 這里data_event是隱含的,它等于reference_event的相同邊緣,當period < limit時,就會報告period time violations。
nochange:$nochange(reference_event,data_event, start_edge_offset, end_edge_offset, notifier);當eading reference event time - start_edge_offset < data_event
先描述下邏輯:FPGA實現一個邏輯,每按下一個按鈕(邏輯做了消抖),出現10個200ns的脈沖,然后通過示波器抓輸出波形,示波器出發條件,設置自動觸發(上升沿)或者條件觸發<1ms都試過。
問題出現:每次按下按鈕,不是每次都能在示波器看到脈沖波形,大概按下10次會有1-2次示波器抓不到波形!
首先懷疑是做的邏輯問題,這個樓主一貫的風格,先懷疑自己,驗證自己沒有問題了再懷疑相關,而不是想當然說自己這個沒問題那個沒問題,我覺得這點很重要,就是懷疑精神,我發現設計工程師都想把自己推的一干二凈,說自己的沒有問題,我覺得出現問題任何地方都是值得懷疑的,先去檢查自己,不是說自己沒問題就沒有問題的,如果后來證明是自己的問題,這不相當于自己打自己的臉嗎!
總結一點:要有懷疑精神,所有相關的都是值得懷疑的。
好了,回歸正題,然后我用chipesope抓到是輸出邏輯有波形,但是示波器上看不到,出現這種情況大家會怎么做?
輸出邏輯沒有問題后,初步判定是不是IO的驅動能力,因為外面直接用示波器測量的,是不是沒有負載,所有輸出不正常,基于這點將輸出的邏輯再接入到FPGA某一輸入管腳,然后又寫著一段程序,檢測輸入是不是有信號過來,然后做了計數之類,結果發現,當示波器沒有波形的時候,輸入的信號也有,計數也正常。出現這種情況大家會怎么做?
是不是同一芯片的問題,然后我把這個輸出的管腳飛線到另外一個芯片,當示波器沒有波形的時候,另外一個芯片輸入的信號也有!
基于以上測試,我大膽預測是示波器的問題,也不能說是示波器的問題吧,估計是沒有這種的應用場景。
然后有試了另外一家的芯片,寫上同樣的邏輯,測試結果一樣。
做了這么多試驗,也證明了,就是示波器沒有這樣的場景。用的示波器是泰克的2032等,試了他的兩款表,都是如此,不是黑他的表,據估計,所有的表也都如此。
-
FPGA
+關注
關注
1626文章
21667瀏覽量
601846 -
代碼
+關注
關注
30文章
4748瀏覽量
68355
原文標題:FPGA該如何學習?聽這位FPGAer如何渡劫
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論