【博客導航】 【導航】FPGA相關html
下邊的內容,適合初次使用Lattice的、具有FPGA開發經驗的同窗。後端
一、初次使用,還真遇到很多的坑,Lattice的工具也有很多優缺點,經過總結,但願能縮短熟悉的時間。ide
二、具體問題,歡迎留言交流。工具
LEF5UM器件,應用DDR3控制器IP。主要分幾步:IP獲取,安裝,例化。post
一、先在impl1目錄下,右鍵,新建sbx文件,即Clarity Designer,經過該文件,進行IP的例化管理。測試
二、打開sbx,在選項卡「Lattice IP Server」裏點擊IP聯網獲取IP列表。優化
三、選擇「DDR3 SDRAM Controller」,目前(18年12月)最新版本3.1,下載(格式exe)後安裝到指定目錄(如:C:\LatticeCore\ddr3_sdram_common_v3.1),這樣能夠在選項卡「Lattice IP」中看到「ddr3 sdram controller 3.1」。編碼
四、打開ip,GUI界面以下,在本項目中,參考時鐘(RefClock)來自單板晶振產生的100M,ddr的工做頻率400M,雙沿也就800M。Memory Type選擇On-board Memroy,總線寬度16,配置x16,時鐘寬度1。Data_rdy to Write Data Delay選擇2,表示data_rdy有效以後必須在第2拍送數據。spa
注意:這裏涉及時序收斂上的編碼技巧。一般,用戶邏輯數據先存入fifo,再送給ddr3控制器,再加上控制器要求2拍給數據,這樣,fifo跟ddr3控制器之間時序就比較難收斂(若是很好收斂,那說明你在設計上已經關注到了這點),個人辦法很簡單,就是對fifo進行預讀操做,在讀使能送出以前,先預讀3拍出來,等ddr發出讀使能時,數據就不是從fifo到DDR3了,而是在這之間插入了幾拍的寄存器,從而緩解了時序壓力。翻譯
仿真腳本我會單獨介紹,其實IP工程給出了仿真腳本,借用過來修改修改就可使用。這裏只提一個致使仿真只運行60多us就提早終止的小問題。
解決辦法,請仔細閱讀仿真工具的告警,工具明確說了,是Memory overflow,建議增長MEM_BITS參數或者定義MAX_MEM。綠色文字也給出了文件路徑的指示,在ddr3_ddr3_x16.v中,include有參數文件
ddr3_parameters.vh,就是同一目錄下,打開vh文件,搜索MEM_BITS,默認爲10,修改成16便可。
小結:遇到問題先不慌張,認真閱讀工具給出的提示信息,一般會有解決思路。有同窗說英文很差咋辦,那就複製粘貼到網上的翻譯軟件唄,否則還能涼拌?
Lattice工具一個很差用的地方,就是mcs燒錄得講究順序,不然會報錯。燒錄mcs的步驟:
A、JTAG模式下,選擇Erase Only。
B、選擇SPI Flash,操做時能夠不用verify,以下。
FPGA廠家都會提供內嵌邏輯分析儀,Xilinx叫chipscope,Lattice的叫reveal,能夠單獨安裝reveal程序,也能夠在diamond工程中打開。在「File List」的「Debug Files」裏,右鍵,點擊Reveal Project Files,可新建*.rvl文件,相對Xilinx,這個rvl比較好用,複製veriog代碼信號名,只要沒被優化,就能夠很快找到。
添加信號時,除了在trace signal setup裏選擇時鐘和觀察信號以外,另外還須要在trigger signal裏設置,這點比Xilinx稍微麻煩點。
trigger設置也有套路。第一步,在trigger unit中拉入信號,能夠在一個條件裏,也能夠分開,operator能夠不用管,到時抓波形時能夠修改的。第二步,在trigger exprssion裏,直接把unit的name複製下來就好。
以上操做完畢,記得點擊design rule check(下圖靠上的圖標),檢查是否有錯,而後點擊insert debug,讓邏輯分析的時鐘自動添加到後端約束lpf文件裏(在約束的首行)。
不正確的約束,或者遺漏的約束,會致使跑的結果不符合預期。約束時,記得下邊幾個方面不要遺漏。
一、位置約束,這個和具體硬件相關,對照硬件PCB文件找到相應管腳便可,並添加IO的電平屬性,也可經過ALLPORTS設置默認的電平。
1 LOCATE COMP "DDR_CLK_I" SITE "AD1" ; 2 IOBUF ALLPORTS IO_TYPE=LVCMOS33 ; 3 IOBUF PORT "CLK_27M_I" IO_TYPE=LVCMOS33 ;
二、時鐘約束,在【tool--netlist view】下邊,點net圖標,點開clock可看到整個項目裏的時鐘信號,而後逐一確認時鐘頻率並添加約束。
1 FREQUENCY NET "ddr_arbiter_inst/ddr_core_inst/U1_clocking/clk_in_c" 100.0 MHz PAR_ADJ 5.0 ;
2 FREQUENCY NET "user_clk" 200.0 MHz PAR_ADJ 40.0 ;
3 FREQUENCY NET "*/U1_clocking/clkop" 400.0 MHz PAR_ADJ 80.0 ;
三、DDR約束,直接參考IP例子ddr3_x16_eval.lpf抄過來就好(最多確認下那些信號是否都有效),一般在下邊目錄:xxx\coregen_hwt_bit_v901_nocdr_noddr\ddr3_x16\ddr_p_eval\ddr3_x16\impl\lse
四、不須要時序分析的路徑。Xilinx的約束是TIG,Lattice就是BLOCK,省得後端工具把時間耗費在這些不須要時序分析的路徑上。
1 BLOCK PATH FROM CLKNET "clk_54m_pll" TO CLKNET "clk_148m5" ; 2 BLOCK NET "video_rddr_scaler_inst/fifo_rst" ;
五、接口信號的上下拉設置,一般設置爲NONE,對按鍵、IIC則設置爲上拉PULLMODE=UP。
後端跑完,關注的信息,包括:
先暫時列這些,想起了再補充。
=======================
by NicoWei
2019-3-8 23:00:48
=======================