FPGA DDR3調試
Spartan6 FPGA芯片中集成了MCB硬核,它可以支持到DDR3。在Xilinx的開發工具Xilinx ISE中提供了MIG IP核,設計者可以用它來直接生成 DDR3 控制器設計模塊,並通過 MIG 的 GUI 圖形界面完成相關配置。
首先,建立ISE工程,並添加MIG IP核,
接下來進行MIG IP核配置,這里列出主要的部分,
這里選擇DDR的類型,並選擇使用Spartan6的哪一個bank,一般選擇左邊的bank,
這里設置DDR3的時鍾頻率以及DDR3的設備型號,Xilinx列舉了部分DDR3型號,如果沒有,則需要點擊“create custom part”自定義型號,這里注意在自定義型號的時候最好選擇一個模板與自己的DDR3型號數據位寬一樣的,因為自定義選項中無法修改數據位寬(當然也可以在生成的代碼中修改位寬),在自定義界面中,主要設置與DDR3有關的幾個時間參數以及地址線寬度,這些信息都可以在芯片的Datasheet上找到,
這里選擇不同的端口方式,可以選擇一個端口,也可以選擇不同位寬的多個端口,選擇多個端口時,可以對不同的端口進行讀寫控制,這在乒乓模式操作DDR3時有用(如利用P0端口對地址1進行寫操作,同時利用P1端口對地址2進行讀操作;完成一次讀寫時,P0端口對地址2進行寫操作,同時利用P1端口對地址1進行讀操作),以及地址映射關系(可以查看:Spartan-6 FPGA Memory Interface Solutions 和 Spartan-6 FPGA Memory Controller),
這里設置RZQ和ZIO的引腳,需要根據硬件電路來進行選擇,同時可以選擇是否使用chipscope調試,如果自己添加chipscope的話就不需要。
生成MIG IP核以后,可以新建工程,在user_design文件下拷貝以下文件(選中部分為自己添加),然后進行代碼修改。
首先,完成約束文件的修改,使之與自己的硬件設備一致,一般有以下幾點:
1、 VCCAUX 電壓修改
CONFIG VCCAUX=3.3; # Valid values are 2.5 and 3.3
2、 系統時鍾輸入的周期,需要跟PCB板上的晶振頻率一樣。
NET "memc3_infrastructure_inst/sys_clk_ibufg" TNM_NET = "SYS_CLK3";
TIMESPEC "TS_SYS_CLK3" = PERIOD "SYS_CLK3" 20 ns HIGH 50 %;
3、 修改部分管腳電壓和位置,如時鍾、復位管腳等
接下來完成頂層文件的設置,一般有以下幾點:
1、 復位極性與PCB板一致
2、 根據板子上的時鍾修改DDR3時鍾配置部分,我使用的時鍾輸入為50Mhz,由於在MIG中設置了 DDR3 的頻率為312.5MHz,且DDR3是上下沿采樣,所以FPGA內部 DDR3控制器的時鍾需要625MHz,所以這里先把時鍾頻率倍頻25, 再分頻2,得625Mh的CLKOUT0和CLKOUT1, 再分頻 8分別得到 user interface 的時鍾和 calibration 的時鍾 78.125Mhz。
3、 刪除mcb_traffic_gen相關例化代碼,編寫自己的DDR3測試代碼,並例化
4、 編寫DDR3測試代碼,需參考Spartan-6 FPGA Memory Controller中的讀寫時序,主要參考,主要包含命令、數據、地址,本測試中,由於采用了128bit的單端口,所以每寫一個數據,地址線需要加8,若涉及到突發讀寫,則地址線也要相應按8的倍數增加。
5、最后添加chipscope,完成測試