最近做的一個項目中,ZYNQ本來有兩個網口,eth0通過PS端的IO直接引出去,eth1通過PL的EMIO引出去,ARM端軟件實現網絡的收發。ARM端實現的功能較多,性能遇到瓶頸,此時還需要ARM軟件實現網絡發送100MBps/s的數據,單單網絡發送部分大概就占用了30%的CPU,最大是CPU占用率達到了90%左右,有點高到不能接受。
研究了開源的三速以太網Verilog實現后,發現MAC層的實現,除了在UDP封包后加入了前導碼和CRC校驗外,就是流量控制相關的內容,FPGA實現發送TS流不需要考慮流量控制(否則在FPGA內部實現也是溢出導致錯誤)。於是想到實現簡單MAC層的功能,即加入前導碼和CRC校驗。
ARM側MAC發過來的數據時序很有規則,即valid為高時為一個完整的包,valid不會出現一個包內中間變低的情況,因此很好區分包頭和包尾,於是做了下圖所示的仲裁邏輯,將ARM發送的包和FPGA內部產生的數據包通過分時復用的方式從eth1網口發送出去。
當然這種實現方式缺點也顯而易見,由於ARM和FPGA側的發送的緩沖區都不是很大,因此如果同時過來很多數據包可能導致緩沖區溢出。但是對於當前項目的引用ARM側是不會發送大量數據的,只有一些IGMP、ARP等報文信息,因此大部分數據都是FPGA側去發送的,不存在緩沖區溢出的現象,滿足功能需求,同時大大降低了ARM的系統負荷,降低CPU占用率大概30%左右。
系統框圖如下所示: