目標:將PL側的數據通過以太網接口傳給PC。
Zynq板卡選用的是ZC706,上面有板載的以太網PHY芯片,因此需要在Zynq上(至少)實現一個MAC層的功能。
最初的想法是直接用vivado的IP核(Tri mode Ethernet MAC)在PL側實現一個以太網的MAC層功能,這樣實時性比較高,如果使用千兆以太網協議的話,應該可以達到接近於1Gbps的傳輸速率。
但是后來發現我所使用的板卡ZC706應該是不支持PL側的以太網接口的。因為原理圖上可以看出,ZC706將PHY芯片的相關引腳直接連接到了PS側的MIO:
所以只能通過在PS側編寫程序來實現與PC機的以太網通信。
因此方案更改為:
將PL側的數據通過DMA傳輸到DDR中,然后PS側從DDR中讀取數據,再通過以太網協議傳輸到PC機,PC上通過網絡調試助手(因此這就需要在PS側形成完整的以太網幀)來接收數據。其中,為了防止DDR的讀寫沖突,在DDR中開辟一段雙緩沖存儲結構,DMA向其中一塊緩沖寫數據的同時,以太網應用程序從另一塊緩沖里讀數據。
本次設計主要來自於米聯客教學視頻。
PL側設計:
ctrl是數據產生模塊,將產生的數據寫入FIFO中,然后通過DMA寫入到DDR中,PS側可以通過GP接口控制GP通過GPIO開啟數據的產生。
PS側參照了SDK自帶的LWIP例程,對應PS側設計的思想應該是:
初始化DMA和LWIP,使能DMA中斷,開啟數據產生,開啟DMA傳輸。
在DMA傳輸完成中斷產生時,啟動以太網傳輸,然后再開啟另一段緩沖的DMA傳輸……
參考:
米聯客視頻教程及《Zynq SOC修煉秘籍》