參考內容
https://github.com/Xilinx-Wiki-Projects/ZCU102-Ethernet
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/478937213/MPSoC+PS+and+PL+Ethernet+Example+Projects#Using-PS-GEM-through-EMIO
PL與PS架構

注意: Si570產生的時鍾通過USER_MGT_CLOCK輸入到系統中

如果使用默認的Si570的輸入, 會導致IP核並不運行, 具體表現為demo工程中的狀態指示燈不會點亮.
ZYNQMP核設置
創建工程時, 從ZCU111開發板創建, 包含了默認的ZYNQMP核的配置, 下面記錄了需要更改的配置
接口設置

- GPIO中使能EMIO
- 使用GEM0驅動器, 輸出到EMIO中
- 取消ZCU111工程默認使能的接口, 包括URAT1
時鍾設置
- Output clk → LPD clk → PL Fabric clk 設置向PL輸出時鍾為50MHz(這個時鍾為1G/2.5G Ethernet PCS/PMA or SGMII提供獨立時鍾, 如下圖不同的independent_clock_bufg對應IP工作在1G模式或者2.5G模式)

PS-PL交互設置

Hardware工程
主要參考下面這個工程
https://github.com/Xilinx-Wiki-Projects/ZCU102-Ethernet/tree/main/2019.1/ps_emio_eth_1g
Block Design
照抄demo工程即可, 因為IP生成需要根據rfsoc的型號, 所以並不可以直接改變demo工程的芯片型號.
約束
# sfp0 zcu111
set_property PACKAGE_PIN Y35 [get_ports sfp_txp]
set_property PACKAGE_PIN Y36 [get_ports sfp_txn]
set_property PACKAGE_PIN AA38 [get_ports sfp_rxp]
set_property PACKAGE_PIN AA39 [get_ports sfp_rxn]
set_property PACKAGE_PIN G12 [get_ports {sfp_tx_dis[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {sfp_tx_dis[0]}]
# gt clk
set_property PACKAGE_PIN V31 [get_ports gtrefclk_in_clk_p]
set_property PACKAGE_PIN V32 [get_ports gtrefclk_in_clk_n]
create_clock -name gt_ref_clk -period 6.4 [get_ports gtrefclk_in_clk_p]
set_property IOSTANDARD LVCMOS18 [get_ports *_led]
set_property PACKAGE_PIN AR13 [get_ports xcvr_rst_done_led]
set_property PACKAGE_PIN AP13 [get_ports {link_status_led[0]}]
set_property PACKAGE_PIN AR16 [get_ports {link_sync_led[0]}]
set_property PACKAGE_PIN AP16 [get_ports {pcs_clk_led[0]}]
set_property PACKAGE_PIN AN16 [get_ports {pl_reset_led[0]}]
set_property PACKAGE_PIN AN17 [get_ports {mdc_clk_led[0]}]
set_property PACKAGE_PIN AV15 [get_ports {gmii_rx_clk_led[0]}]
幾點說明:
gtrefclk_in需要配置到專用輸入上, 見第一章set_property IOSTANDARD LVCMOS18 [get_ports *_led]這是一個小技巧, 這樣就不用每一個led都寫電平約束了.- xdc文件不支持行尾注釋, 所有注釋必須獨占一行!!!
Petalinux工程
使用ZCU102工程默認的即可. 但是需要導入ZCU111的HDF,如果是自己創建的project,需要將demo工程的project-spec merge到新的工程里面!!
petalinux-config --get-hw-description <path-to-sdk>
petalinux-build
測試
debug leds

- 使用SFP-DAC線與主機SFP接口直連(不知道為什么1000Base-T的接口無法正常工作,請看 @SFP網口調試sgmii)
- 使用跳線帽短接
zSFP0_Disable - leds
| LED[n] | LED Name | Status |
|---|---|---|
| LED7 | gmii_rx_clk_led | 快速閃爍 |
| LED6 | mdc_clk_led | 慢速閃爍 |
| LED5 | pl_reset_led | 長滅 |
| LED4 | 長滅 | |
| LED3 | pcs_clk_led | 快速閃爍 |
| LED2 | link_sync_led | 常亮 |
| LED1 | link_status_led | 常亮 |
| LED0 | xcvr_rst_done_led | 常亮 |
啟動u-boot

內核啟動

其中的 unable to generate target frequency: 125 MHz 是由於ps輸入時鍾非125MHz的整數關系, 所以時鍾有誤差, 可以忽略.
互ping測試
與主機設置相同網段的IP即可測試網絡.
右側: 主機 192.168.30.2
左側: zynqmp 192.168.30.100

