從零開始的 Xilinx SoC 開發(四)

Share on:

本文內容採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.

上幾篇文章中,我們把 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
  • Interconnect 2
    • Master
      • DMA 資料界面
    • Slave
      • PS DRAM 資料:從 0GB 位置 (0x0) 開始算起 2GB
      • PL DRAM 資料:從 4GB 位置 (0x1_0000_0000) 開始算起 4GB

這邊補充說明一下為什麼是這樣設定,參考 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 本教學的第一階段。