Quartus Qsys + Nios II + SDRAM 進階使用
環境設置
OS: Windows 10
Software: Intel Quartus Prime Lite 18.0
Platform: Cyclone V GT 5CGTFD9E5F35C7
基本上跟 Quartus Qsys + Nios II 入門使用 的步驟一樣
只有 Platform Designer 部分需要更改
==============================================
新增 DDR3 SDRAM Controller with UniPhy IP
==============================================
PHY Setting 頁面設定
Speed Grade: 7 (配合板子)
Memory clock frequency: 400 MHz
PLL reference clock frequency: 100 MHz
Memory Preset: MT41J64M16LA-15E
==============================================
Memory Parameter 頁面設定
Total Interface Width: 8
Memory Initialization Option > Memory CAS latency setting: 8
Output drive strength setting: RZQ/4
ODT Rtt nominal value: RZQ/4
Memory Write CAS latency setting: 6
Dynamic ODT(RTT/WR) value: RZQ/4
==============================================
Memory Timing 和 Board Setting 保持不動
==============================================
Controller Setting 頁面設定
打勾 Generate power-of-2 data bus widths for Qsys or SOPC Builder
Maximum Avalon-MM burst lenght: 16
取消打勾 Enable Avalon-MM byte-enable signals
Local-to-Memory Address Mapping: CHIP-ROW-BANK-COL
Command Queue Look-Ahead Depth: 4
(手冊範例是給6,但會出現 warning,所以改成4)
打勾 Enable Configuration and Status Register Interface
==============================================
Diagnostics 頁面設定保持不動
==============================================
點 Finish 完成設定,重新命名該 ip 為 uniphy_ddr3
==============================================
新增 On-Chip Memory (RAM or ROM) Intel FPGA IP
這裡總共需要新增兩個
==============================================
第一個
Slave S1 data width: 32
Total Memory Size: 65536
==============================================
==============================================
新增 JTAG UART IP
==============================================
Write FIFO > Buffer depth (bytes): 64
Write FIFO > IRQ threshold: 8
Read FIFO > Buffer depth (bytes): 64
Read FIFO > IRQ threshold: 8
打勾 Prepare Interactive windows > INTERACTIVE_INPUT_OUTPUT
點 Finish 完成設定
重新命名為 jtag_uart
==============================================
新增 PIO (Parallel I/O) Intel FPGA IP
==============================================
Width: 8
Direction: Output
點 Finish 完成設定
重新命名為 LED_pio
==============================================
新增 DMA Controller IP
==============================================
Advanced 頁面設定
取消打勾 byte, halfword, doubleword, quadword
點 Finish 完成設定
重新命名為 dma
==============================================
IP 元件新增到目前為止算是完成
接著就要進行一些設定和連線
==============================================
設定 Clock crossing adapter type
切換到 Interconnect Requirement
Clock crossing adapter type: Auto
==============================================
將 IP 連線
回到 System Content 頁面
照著連接
連接方式;在對應訊號線上點右鍵,游標移到第一個 Connection 上,即可展開所有可連線的列表,然後把該連起來的點下去,就會打勾並連起來了
bus 連接
*註: jtag_debug_module 對應到我的版本的名字是 debug_reset_request
*由於名字可能會隨著時間改變,所以如果找不到完全一樣的,記得其命名規則是 "元件.訊號線",所以先找到前面的元件是叫什麼名字,然後找到跟後面的訊號線最像的名字,或是上網找一下自己看到的訊號線名字是什麼名字,自行判斷應該是對應到範例上的哪條線
Reset 連接
基本上就是,clk 元件的 clk 要連接到 SDRAM Controller 所有的 Clock Input 的訊號上
除了 SDRAM Controller 元件的都是接 SDRAM Controller 的 afi_clk
和 clk 元件的 clk_rst 要連接到所有 Reset 的訊號上
==============================================
Overlapping 錯誤解決
照理來說下方會出現很多 Error
如果是有關於 overlapping address
就在 System 目錄底下點 Assign Base Address
如果是有關於 overlapping IRQ
就在 System 目錄底下點 Assign Interrupt Numbers
==============================================
Export 欄位命名
在對應訊號線的 Export 欄位點兩下
即會自動命名
以下訊號線須在 Export 欄位命名
================================================
Reset Vector Memory 和 Exception Vector Memory 設定
雙擊 Nios II Processor IP
打開 Nios II 的編輯頁面
切到 Vector 的頁面
Reset Vector Memory 和 Exception Vector Memory 都設為 on_chip_memory.s1
==============================================
做好了,就點 Generate
確定沒有 Error
==============================================
Nios II Software Build Tools for Eclipse
==============================================
設定編譯參數後
一樣先跑 Hello World 程式 (記得要先用 Programmer 將程式燒到板子上)
確定沒問題後
在進行 DDR3 Memory 讀寫測試
主要會用到 IOWR() 和 IORD() 這兩個函式
(還有其他函式可以自行 Google)
(記得要 #include "io.h")
UNIPHY_DDR3_BASE 指的是 SDRAM 所對應到的起始記憶體位置
紅色部分請注意
這部份是跟前面再 Platform Designer 將 SDRAM Controller 重新命名後
一樣的名字
所以如果是取不同名字的
請自己在變換
還有 LED_PIO_BASE 指的就是 LED 的所對應到的起始位置
也是同樣的道理
hello_world.c
#include <stdio.h>
#include "system.h"
#include "io.h"
#include "sys/alt_dma.h"
#include "sys/alt_cache.h"
#include "altera_avalon_dma_regs.h"
int main()
{
printf("Hello from Nios II!\n");
unsigned int i = 5;
unsigned int j = 0;
//Write Value into DDR3
IOWR(UNIPHY_DDR3_BASE,0,i);
//Read Value out from DDR3
j = IORD(UNIPHY_DDR3_BASE,0);
//Write to LED
IOWR(LED_PIO_BASE,0, j);
return 0;
}
================================================
問題解決
Connected system ID hash not found
在 Eclipse 介面中要 Run as > Nios II Hardware 的時候
跑出了介面
並且顯示
Connected system ID hash not found
這個是因為這次實驗我們沒有像上次加入 System ID 確認的 IP
所以如果偷懶不想加的話
就把下圖的這兩個選項打勾就好
Apply 然後 run 就可以執行了
================================================
小筆記區
Regenerate the BSP: In Eclipse, right-click the BSP project, pick Nios II > Generate BSP (NOT from the top menu’s Nios II, there is no such option there!).
SOPC file is generated by Platform Designer.
Rebuild: Project > Clean… and clean all, with the rebuild option set.
================================================
參考資料
ALTMEMPHY Design Tutorials, External Memory Interface Handbook
helloworld:基於Qsys的第一個Nios II系統設計
(原創) 如何在DE2用軟體存取SDRAM? (IC Design) (DE2) (Nios II)
留言
張貼留言