最近在調試LATTICE FPGA 做的視頻板子,頗不順利,所以記錄下來作為以后的參考:
1、FPGA的IO口不是所有的都是雙向的,有些有特殊作用的是單向的。
在查閱 LatticeECP3-17EAPinout.CSV 之后, 發現在LEF3-17EA-FN484C中,有以下幾個管腳是單向的:
C4 G7 G6 : jtag 管腳
C14 C15 B15 B16 :編程管腳
K1 L5 L1 K6 N17 M18 :PLL的反饋(fb)管腳
AB2 AB3 : RESERVE
N15 : XRES
其中最容易被用掉的是 PLL的反饋管腳,要格外注意。其他的型號和封裝可以參考相應的 .CSV 文件。
否則提示錯誤: ERROR : the output port XX is assigned to an input dedicated pins [M18] .
2、在將程序下載到外部spi flash時,設置完成之后提示錯誤:
其中有 Except Device ID 0x04002310 READ:0X0000000; 則是說沒有讀到芯片的地址,則有可能是連接flash的讀入線(相對FPGA)有問題。
尤其要檢查是不是輸入和輸出線連接反了。
3、在下載程序到FPGA內部時,瀏覽芯片出現錯誤,或下載的時候出現錯誤,提示也如同上面的錯誤,就是讀不到芯片的 ID, 那么可能是JTAG的四根連線出現問題,要詳細檢查。 例如我的是在TMS線上接了一個對地100nf的大電容,則把波形都濾掉了,所以出現錯誤而讀不到數據。
4、lattice Diamond 在下載的時候 加載bit文件的時候,由於這個軟件不會自動尋到正在編譯的工程目錄下,所以加載的bit文件可能是上個工程的路徑,這樣軟件就會報出一個錯誤:
這個原因是下載文件的路徑有問題,改為你當前工程的路徑即可。
5、關於lattice DDR3 IP 核的wl_err信號的調試:
lattice 的DDR3 IP核 在調試的時候要注意,硬件上電之后,DDR3 要復位 200us之上,如果時鍾是74.25M的輸入,則需要計數達到3000個clk,才可以開始初始化。如果是仿真,當然不需要那么久了,假設仿真時鍾是6666ps,就是核內部demo的仿真參數,則如下所示
`timescale 1 ps/ 1 ps parameter c = 6666; always #(c) clk = ~clk ;
那么 復位的時鍾個數計數只要達到100個就可以了(demo 是200個clk周期)。
那么正確的wl_err的 信號在初始化的時候的波形是這樣的:
就是在init_done 有效的時候,init_start被拉低,wl_err信號保持為低電平,表示核初始化寫調整沒有錯誤,可以正確的讀寫。
但是吧,有一天,我感覺 c = 6666; 這樣太長了,仿真太慢了,於是我又把C調整為 c = 666; 或者 c 更小 ,我想這樣是不是只要延時時間一樣長,
就可以完成初始化了???於是我就實驗,將c= 666,計數記到 100,甚至 16‘hffff,最后發現wl_err的波形在初始化完成時都是下圖這樣的:
在init_done有效的時候,wl_err被拉高,且一直保持,這就是說,核初始化過程中寫調整有錯誤,這樣的結果是——導致核的讀操作不能被有效的
響應,就是度有效之后,不能讀出數據 。當然這個核是沒法仿真的了。 猜測 可能是 時鍾的 頻率 太快了。
最后沒辦法,老老實實把 c改為6666 吧。