從零開始的 Xilinx SoC 開發(四)
上幾篇文章中,我們把 FPGA 上所需要的元件都建立起來了,這篇將會把這些元件接起來,而在下一篇中,將會編譯出 bitstream,作為系列文前半部的收尾。
連接元件
在我們建立這些元件的時候,可以看到上面會跳出 Run Coonection Automation 這個功能(圖上綠色部份),這邊我們將會使用這功能來完成 SoC 的連線,避免 clock reset 等信號拉錯產生的 bug。
此外,其實這個功能也隱藏在右鍵選單中。
在此之前,我有先把兩個 AXI Interconnect 的元件命名成 axi_ic_control
以及 axi_data_control
,分別是 1 master + 1 slave 以及 1 master + 2 slave。
打開這個選單之後,我們先設定 CPU 的部份,也就是最下方的 slave 界面。因為連線時很多參數會相互影響,所以建議一次只連接少數的線。
首先因為這是 PL side 要跟 PS side 拿資料的界面,我們透過 axi_ic_data
把這個 slave 跟 CDMA 的 AXI 連起來。預設的 clock 都是 Auto,預設都會連接到 CPU 出來的 100MHz pl_clk
,不過為了保險起見,還是全部用手動設定的。
按下 OK 之後,重新回到這個界面。接著看到上方 DMA 跟 control 的部份,這兩個沒什麼可以設定的,所以就把全部的 clock 都手動設定成 pl_clk
。
再次按下 OK 之後,重新回到這個界面。現在 DRAM 已經沒什麼好設定的了,稍微瀏覽檢查一下之後,除了 sys_rst
全部打勾就好。
DRAM 的晶片因為不在 FPGA 上,所以這步設定 DRAM 的動作就是把 DDR 的信號線拉到 SoC 外側。此外,sys_rst
可以 tie-low 就好,所以這邊不做連線,等一下的步驟中才會設定。這些步驟做完之後,這個 SoC 應該會長這個樣子。
可以看到,在自動連接的過程中,Vivado 會自動幫我們加上 Processor System Reset 這個元件,他是是為了確保 reset 的順序正確。如果不是用自動的方式連線,就必須自己加上這個元件,相當麻煩。
設定 Slaves 的 Addresses
還記得前面我們建立了兩個 interconnect 嗎?這個步驟中,我們要把這兩個 interconnect 上的 slave 分別指定可以用來存取他們的 address。為此,我們切換到 Address Editor 頁面,把需要使用到的 slave 們右鍵 Assign 一個 addreess,沒有用到的用右鍵 Exclude 掉。
照上面圖片設定,我們的兩個 interconnect 的 slaves 的 address 設定是這樣:
- Interconnect 1
- Master
- PS CPU 控制界面
- Slave
- DMA 控制界面:從 2GB 位置 (
0x8000_0000
) 開始算起 64KB
- DMA 控制界面:從 2GB 位置 (
- Master
- Interconnect 2
- Master
- DMA 資料界面
- Slave
- PS DRAM 資料:從 0GB 位置 (
0x0
) 開始算起 2GB - PL DRAM 資料:從 4GB 位置 (
0x1_0000_0000
) 開始算起 4GB
- PS DRAM 資料:從 0GB 位置 (
- Master
這邊補充說明一下為什麼是這樣設定,參考 Zynq UltraScale+ Device Technical Reference Manual (UG#1085),可以看到從 PS side 開出去的第一個 master port (M_AXI_HPM0_LPD
),必定只能從 0x8000_0000
開始,這決定了 interconnect 1 的 DMA 控制界面的位置(因為也只有一個 slave,所以就從頭開始 assign)。
另外,起始 2GB 是 DDR Memory Controller,CPU 可以看到的記憶體中,也就是說實體 DRAM 的前 2GB 會放在這邊。要讓 PS side 的 DMA 存取這塊的話,在這個 SoC 上,規定 DMA 跟 CPU 必須使用一樣的 address,所以我們也就只能把 interconnect 2 的 0x0
開始算起 2 GB 畫給 PS DRAM。而因為剩下的 4GB PL side DRAM 空間,其開頭必須跟 4GB 對齊,所以就只能從 4GB 位置 (0x1_0000_0000
) 開始。
收尾
最後,我們要調整一下一些無法自動設定的部份,首先對左側對外拉出來的 DDR clock 信號線點兩下。
他的頻率是預設的 100MHz,這個這定是錯的,要把 DDR 的元件設定打開,把這邊的頻率手動抄上去。
另外,剛剛我們有提到 sys_rst
可以 tie-low 就好,因此我們要用內建的 Constant 元件把這條信號設定成 0。
點兩下,把信號設定成 1'b0
。
接著連接到 DDR 元件的 sys_rst
。
另外,根據 AXI protocol,AXI 會有對資料的保護機制、以及快取機制,這些對 DMA 要直接存取 PS side 的資料都是不方便的功能。這些功能是由 arprot
/awprot
/arcache
/awcache
控制的,所以我們要加入另外兩個 Constant 來關閉這個功能,具體可以看官方文件中的設定,要把兩個 prot
結尾的信號設定成 3'd2
,兩個 cache
結尾的信號設定成 4'd11
,設定完成之後會變成如下圖這樣。
最後,我們把 CDMA interrupt 的 interrupt 拉回 CPU 就完成了(圖中淺綠色的線)。
結論
我們終於把硬體的部份設定完成了,下一章中將編譯出 bitstream,完成 FPGA 本教學的第一階段。
系列文連結
-
從零開始的 Xilinx SoC 開發(一)
-
從零開始的 Xilinx SoC 開發(二)
-
從零開始的 Xilinx SoC 開發(三)
-
從零開始的 Xilinx SoC 開發(四)
-
從零開始的 Xilinx SoC 開發(五)
- 從零開始的 Xilinx SoC 開發(一)
- 從零開始的 Xilinx SoC 開發(二)
- 從零開始的 Xilinx SoC 開發(三)
- 從零開始的 Xilinx SoC 開發(四)
- 從零開始的 Xilinx SoC 開發(五)