① 基於FPGA的百兆乙太網RGMII介面設計(讀書筆記)
這篇文章的整體架構就是先介紹了百兆乙太網的背景,百兆乙太網又成為快速乙太網。再介紹了用FPGA來實現的優點。接著介紹整體的方法和實驗,具體介紹了各個模塊的作用,並用視頻傳輸作為測試工具,測試結果。
百兆乙太網應用場景廣,適用於突發通信和繼續傳送大型數據文件,互換操作性好,具有廣泛的軟硬體支持。
FPGA是使用邏輯處理專用硬體,無需操作系統,各條處理路徑均是並發平行的,因此不同的操作過程不會爭奪相同的處理資源,意味著處理速度非常快。FPGA的晶元是Altera的Cyclone IV,PHY晶元是88E1111。
介紹了FPGA晶元EP4CE115F29C7N的功能,並列舉了兩個方案一是單物理晶元,二是物理層加MAC層繼承與同一晶元。本文採用的是第一個方案,採用的晶元是88E1111,並採用的模式是RGMII模式。
系統的整體框架分為上行和下行兩個通道,數據通過PHY晶元進入 FPGA,在FPGA中進行數據處理,再送出到PHY晶元傳輸出去。
preamble_complete模塊對前導碼進行處理。
4bits_to_8bits將4bits的數據拼接為8bits。
data_processing進行IP和MAC地址替換等操作。
8bits_to_4bits模塊將數據拆分成4bits送到PHY晶元輸出。
要將88E1111設置為RGMII借口模式,從晶元手冊中看到,HWCFG_MODE[3:0]決定了MAC層的介面模式,而HWCFG_MODE[3:0]的值由CONFIG[6:0]來進行映射,因此需要CONFIG4=011,CONFIG5=XX1。並將HWCFG_MODE[3:0]設置為1011,如圖所示
說好了配置方法,然後再硬體電路實現
本文的時鍾由外部晶振輸入的50MHZ作為參考時鍾,系統需要的時鍾有
1、12.5MHZ以8bit為單位的數據的參考時鍾
2、25MHZ以4bit為單位的數據的參考時鍾
3、125MHZ時鍾來處理數據
4、90°相移之後的25MZH作為參考時鍾去產生輸出參考時鍾CTX_CLK。
這四個時鍾都由PLL產生
這是收發時序圖。
這個模塊主要解決的問題就是前導碼的問題,
接收端遇到的問題,首先由於前同步碼不是8的整數倍,在拼接成8位時,會產生錯位。
如過前導碼同步是5_55_55_55_55_55_55,接著是arp的目的地址為FF_FF_FF_FF_FF_FF。那麼組成8位就是55_55_55_55_55_55_55_FD,就定位不到5D。
還有一個問題就是在實際觀察中,前同步碼會有半個周期的0xF。
解決的方法就是使用狀態機
分為兩個作用,對兩組4bits的數據拼接成8bits。
對參考時鍾進行轉換,從25MHZ轉換為12.5MHZ。
拼接部分的RTL圖如圖
對時鍾進行轉換只需要通過非同步FIFO,以25MHZ寫入拼接後的數據,以12.5MHZ讀出拼接數據即可。
這模塊是核心模塊,實現PORT,IP和MAC地址的過濾。使用的時鍾是125MHZ,這樣的處理速度更快,遇到的問題就是如何將12.5MHZ的時鍾轉換為125MZH,再將處理完後的時鍾轉換為12.5MHZ輸出數據。
有三個難點:
1、數據長度的不確定性
2、相鄰兩個數據包間隔不確定性
3、如何保證轉換後數據網路的有效性,即使data信號和DV信號的時序關系
這里採用兩級FIFO解決,第一個FIFO用來存儲數據,同時記錄數據長度,將寫完後的數據長度寫入第二個FIFO,當第二個FIFO非空時,讀出數據的長度,這樣就做到了data和DV信號的同步。同理需要講125MHZ轉換為12.5MHZ時,再使用上述模塊。
需要將8bits拆分為4bits,輸出的參考時鍾為25MHZ再進行相移。採用DDIO IP核來實現。該IP核如圖
如圖輸入datain_h為1,輸入datain_l為0,輸出的信號就是參考時鍾相移了90°。