千兆以太網(2):接收——RGMII協議和IDDR原語


一、項目概況

1、項目流程圖

2、模塊說明:

PC:       個人電腦,有網線插槽的即可
RJ45接口:  板卡上的網線插槽
PHY芯片:   板卡上的以太網芯片,輸入4對差分信號,轉換為輸出雙沿4bit數據信號
FPGA:     現場可編程邏輯門陣列,主控制器
DDR3芯片:  第三代同步動態隨機存取內存芯片,之前學過了
HDMI接口:  高清多媒體接口,之前學過了

3、項目說明:

  電腦上位機將一幅 1024*768 圖片通過雙絞線(網線),發送給板卡網口(RJ45接口),RJ45接口將數據傳輸給網卡(PHY芯片),PHY 芯片將差分信號轉換成雙沿數據,IDDR將雙沿數據轉換成單沿數據傳輸給 FPGA,FPGA 處理完成后將圖像數據緩存到DDR3 中,DDR3 中的圖像數據使用 UDP 協議傳回 PC 機,同時將 DDR3 中數據使用 HDMI 傳輸到顯示器上。

 

二、PHY芯片

  詳情參考 VSC8601-DS-r41-VMDS-10210 文檔,該文檔可以在 Xilinx 官網中下載。

  本項目使用 VITESSE VSC8601 網卡芯片,該芯片支持 10/100/1000 BASE-T,常用的網卡芯片有 VITESSE、高通等公司產品,該芯片通稱為 PHY 芯片。該芯片與我們電腦、FPGA、MCU 等微處理器通信必須遵循 RGMII 協議。
1、SMI串行管理接口
  VSC8601 設備包含一個 IEEE 802.3 兼容的串行管理接口(SMI),其中 MDC 和 MDIO 可對該芯片進行控制。 SMI 提供了訪問權限設備控制和狀態寄存器。控制 SMI 的寄存器集由 32 個 16 位寄存器組成,包括所有需要的 IEEE 指定寄存器。此外,通過設備寄存器 31 可以訪問寄存器的附加寄存器。SMI 是一個同步串行接口,其配置方式和 IIC 類似,MDIO 引腳具有有雙向數據,在 MDC 信號的上升邊緣上采集。MDC 采集速度應在 0 MHz 到 25mhz。數據通過 SMI 使用具有可選和任意長度前導的 32 位幀傳輸,下圖(文檔26頁)顯示了用於讀操作和寫操作的SMI框架格式。
  由圖可以看到 PHY Address 有 A0 - A4 共 5 bit,故一個處理器最多可以掛載這樣的 PHY 芯片 2^5=32 個。用戶可通過配置 PHY Address 或 Resgister Address 將該芯片按需配置。
2、配置引腳和設備功能表(文檔64頁)
3、相關引腳的功能,用於解釋上表(文檔65頁)
4、電阻對應 Pin 值表(文檔66頁)
5、PHY芯片配置
  結合上面的表和 PHY 芯片的板卡原理圖,即可確定出 CMODE Pin 的具體值了。
 
 
、PHY芯片的初始化和RGMII協議
1 、PHY 芯片初始化
  VSC8601 芯片上電后需要進行復位配置,該芯片復位信號需要在上電保持一段時間后才能將復位信號置為高,否則 PHY 芯片不會工作,其配置過程如圖(文檔79頁)所示。PHY 的復位信號引腳和 FPGA 相連, 當上電后至少經過 4ms 以上才可以將 PHY 芯片復位引腳置高,這樣就完成 PHY 芯片初始化了,還是蠻簡單的。

2、PHY芯片的RGMII協議

  RGMII協議是PHY芯片和FPGA芯片之間的傳輸協議。RGMII 是 Reduced GMII(吉比特介質獨立接口)。RGMII 均采用 4bit 數據接口,工作時鍾 125MHz,並且在上升沿和下降沿同時傳輸數據,數據傳輸速率可以達到4*125*2=1000Mbps。同時兼容 MII 所規定的 10/100 Mbps 工作方式,支持傳輸速率:10M/100M/1000Mb/s ,其對應 clk 信號分別為:2.5MHz/25MHz/125MHz。RGMII 數據結構符合 IEEE 以太網標准,接口定義見 IEEE 802.3-2000。

  PHY 芯片與 FPGA 數據交互的端口有:發射端、接收端及HPY 的復位端口。發射端和接收端分別有 6 個引腳與 FPGA 相連,分別有一個時鍾引腳、一個數據控制使能引腳,四個數據引腳。而我們想要達到 1.0Gb/s 帶寬,HPY 對應時鍾為 125MHZ,若為單沿采樣那么帶寬為 125M/s*4=500Mb/s,及達不到 1.0Gb/s,在原有的硬件基礎上想要使用 125M 時鍾產生帶寬為 1.0Gb/b,那么需要雙沿控制采樣數據,及時鍾上升沿 4bit 下降沿 4bit,帶寬為125M/s*4*2=1000Mb/s=1.0 Gb/b。該協議為 RGMII(Reduced Gigabit Media Independent Interface)。RGMII 均采用 4 位數據接口,工作時鍾 125MHz,並且在上升沿和下降沿同時傳輸數據,因此傳輸速率可達 1000Mbps。RGMII 無補償工作時序如圖(文檔81頁)所示。

  觀察圖中 RX_CLK(at Transmitter) 和 RX_CLK(at Receiver),RX_CLK(at Transmitter)為 HPY 時鍾,在上升沿時對應輸出數據為 RXD[3:0] 和 RXDV,在下降沿時對應出數據為 RXD[7:4] 和 RXERR,及一個時鍾周期對應 8bit 數、一個有效使能和一個錯誤信號。RX_CLK(at Receiver) 是在 RX_CLK(at Transmitter) 的基礎上相移 90°左右而得,這樣采集到的數據會更加穩定。

四、IDDR原語
  PHY 傳輸的數據為雙沿數據,通常 FPGA 處理的為單沿數據,所以FPGA 接收到圖像信息包后首先需要使用 IDDR 原語將雙沿數據轉換為單沿數據。通常情況下 FPGA 處理數據使用的時鍾為晶振產生的時鍾(FPGA 時鍾),而 PHY 傳輸來的數據以及經過IDDR 原語后轉換為單沿的數據都是和 PHY 的時鍾同步,所以我們如果想使用 FPGA 時鍾作為后續的圖像數據處理必須要進行跨時鍾域,將 PHY 時鍾同步的數據轉換為 FPGA 時鍾同步的數據。此處雙沿轉單沿數據采用 Input DDR 原語,簡稱 IDDR,將雙沿 4bit 數據轉換為單沿 8bit 數據。
  IDDR原語參考 7 Series FPGAs SelectIO Resources 文檔和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。
1、IDDR原語獲取途徑
2、IDDR原語接口和屬性(文檔111頁)
  D 為數據輸入,CE 為 IDDR 工作使能,C 為時鍾,S 和 R 分別為置位和復位。
3、IDDR原語工作模式(文檔110頁)
  IDDR 有三種工作模式,模式配置如下圖所示,分別為:OPPOSITE_EDGE、SAME_EDGE 、SAME_EDGE_PIPELINED。
  通過對比三圖差異,結合本項目平台選擇模式:SAME_EDGE_PIPELINED。因為時鍾上升沿和下降沿各對應一個數據,假設需要傳輸數據D[7:0],輸入為 D0A = D[3:0],D1A = D[7:4],那么千兆以太網數據傳輸到 Q1 和 Q2 中的數據為: D0A 的 bit0 和 D1A 的 bit4 為一組對齊,D0A 的 bit1 和 D1A 的 bit5 為一組對齊,D0A 的 bit2 和 D1A 的 bit6 為一組對齊,D0A 的 bit3 和 D1A 的 bit7 為一組對齊。
4、IDDR雙沿數據轉單沿數據使用方式
  根據硬件電路圖,PHY 傳輸給 FPGA 有一條時鍾線、一條使能線和四條數據線,其中使能線和數據線都為雙沿數據。一條使能線包含了 DV 和 ERR,其中上升沿傳輸的是 DV 信號(即數據有效信號),下降沿傳輸的為 ERR 信號(即數據出錯信號,通常情況下不考慮 ERR,ERR 是由硬件引起,和軟件無關);四條數據線包含了一個始終 8bit 數據,其中上升沿傳輸的是 8bit 數據中的[3:0],下降沿傳輸的是 8bit 數據中的[7:4]。 我們采用 IDDR 原語將雙沿 4bit 數據轉換為 8bit 數據,同時將 8bit 數據對應有效 DV 信號提取。那么可以建立實現雙沿轉單沿功能的模塊:iddr_ctrl,其中輸入與輸出關系圖如下所示。 PHY 芯片傳輸來的 phy_rxd 和 phy_rx_ctl 都和 PHY 的時鍾同步。圖中 phy_rx_clk_90 為輸入的時鍾信號是 PHY 時鍾相移90度后形成的,目的是采集 phy_rx_rxd 和 phy_rx_ctl 更穩定,rx_data 和 rx_en 即為該模塊輸出的單沿 8bit 數據和對應的數據有效使能。
千兆以太網數據傳輸經過 IDDR 后 8bit 數據 rx_data 與使能 rx_en 對應關系如下圖所示。
  通過圖可以看出,IDDR 時鍾上升沿采集的 phy_rx_crl 信號為 EN(DV),代表數據有效,下降沿采集的為 ERR,代表數據錯誤,本項目此處不考慮錯誤信號,最終從 IDDR 輸出的 rx_en 信號正好和拼接完成后的 rx_data 數據對應,即可作為 8bit 數據有效使能。 
 

五、上板驗證

  代碼寫好后注意一下,前面說過 PHY 芯片初始化必須滿足當上電后至少經過 4ms 以上才可以將 PHY 芯片復位引腳置高,因此頂層必須設置一下 PHY 芯片的復位引腳,該信號通過延時 4ms 即可產生,有了這個信號,PHY 芯片才能工作起來。

//延時 4ms 后啟動 phy_rst_n
always @(posedge sclk) begin
    if(rst) begin
        phy_rst_cnt <= 'd0;
    end
    else if(phy_rst_cnt[18]==1'b0) begin
        phy_rst_cnt <= phy_rst_cnt + 1'b1;
    end
end

assign phy_rst_n = phy_rst_cnt[18];

  這次實驗較簡單,看不到任何現象,可以先生成一個 ila,將 rx_data 和 rx_en 放進去以待觀察,最后不要忘記綁定引腳哦。生成bit文件后下載到板卡上,板卡上的網口和電腦網口連接,點擊電腦中的 以太網設置 --- 更改適配器選項,即可看到網卡正常工作起來。

  查看 ila,將 rx_en 的上升沿作為觸發信號,得到如下波形:

  如圖可以觀察到,千兆以太網數據以包為單位發送,每次發送有一定的數據,並且在每次發送前都會先發送 7 個 0x55 和 1 個 0xd5 作為包的針頭,如果是這樣的波形,那么表明此次試驗設計成功。

 

參考資料:威三學院FPGA教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM