一、ODDR原語
FPGA 傳輸的數據為單沿數據,而 PHY 傳輸的數據為雙沿數據,所以FPGA 發送心跳包的最后需要使用 ODDR 原語將單沿數據轉換為雙沿數據。通常情況下 FPGA 處理數據使用的時鍾為晶振產生的時鍾(FPGA 時鍾),而 FPGA 傳輸來的數據經過ODDR 原語后轉換為雙沿的數據都是和 PHY 的時鍾同步,所以我們如果想把 FPGA 時鍾的數據傳給 PHY 芯片則需要進行跨時鍾域,將 FPGA 時鍾同步的數據轉換為 PHY 時鍾同步的數據。此處單沿轉雙沿數據采用 Output DDR 原語,簡稱 ODDR,將單沿 8bit 數據轉換為雙沿 4bit 數據。
ODDR原語參考 7 Series FPGAs SelectIO Resources 文檔和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。
1、ODDR原語獲取途徑
2、ODDR原語接口和屬性(文檔129頁)
D1 和 D2 為數據輸入,CE 為 ODDR 工作使能,C 為時鍾,S 和 R 分別為置位和復位,Q為輸出。



3、ODDR原語工作模式(文檔126頁)
ODDR 有兩種工作模式,模式配置如下圖所示,分別為:OPPOSITE_EDGE、SAME_EDGE。


OPPOSITE_EDGE 模式下,雙沿都用來捕捉數據,其中上升沿捕捉低位數據 D1,下降沿捕捉高位數據D2,輸出 Q 在上升沿傳輸 D1,下降沿傳輸D2。SAME_EDGE 模式下,只采用上升沿來捕捉低位數據 D1 和高位數據 D2,然后在輸出 Q 的下降傳輸 D1,上升沿傳輸 D2。此次傳輸我們采用 SAME_EDGE 模式。
4、ODDR雙沿數據轉單沿數據使用方式
根據硬件電路圖,PHY 傳輸給 FPGA 有一條時鍾線、一條使能線和四條數據線,其中使能線和數據線都為雙沿數據。一條使能線包含了 DV 和 ERR,其中上升沿傳輸的是 DV 信號(即數據有效信號),下降沿傳輸的為 ERR 信號(即數據出錯信號,通常情況下不考慮 ERR,ERR 是由硬件引起,和軟件無關);四條數據線包含了一個始終 8bit 數據,其中上升沿傳輸的是 8bit 數據中的[3:0],下降沿傳輸的是 8bit 數據中的[7:4]。 我們采用 ODDR 原語將單沿 8bit 數據轉換為雙沿 4bit 數據,同時將 4bit 數據對應有效 DV 信號提取。那么可以建立實現單沿轉雙沿功能的模塊:oddr_ctrl,其中輸入與輸出關系圖如下所示。 最后 PHY 芯片傳輸出去的 phy_txd 和 phy_tx_ctl 都和 PHY 的時鍾 phy_tx_clk 同步。圖中 sclk_90 為輸入的時鍾信號是 FPGA 時鍾相移90度后形成的,目的是轉換 phy_tx_rxd 和 phy_tx_ctl 更穩定,tx_dat 和 tx_en 為該模塊輸入的單沿 8bit 數據和對應的數據有效使能。

二、以太網復位信號
前面博客《千兆以太網(1)》中說過 PHY 芯片初始化必須滿足當上電后至少經過 4ms 以上才可以將 PHY 芯片復位引腳置高,因此輸出端口不要忘記了 PHY 芯片的復位信號 phy_rst_n,該信號通過延時 4ms 即可產生,有了這個信號,PHY 芯片才能工作起來。
//延時 4ms 后啟動 phy_rst_n always @(posedge clk50) 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];
三、Wireshark 抓包
上板后打開點擊電腦中的以太網設置 --- 更改適配器選項,即可看到網卡正常工作起來。

打開 Wireshark 軟件,可以看到 以太網 的波形正在變化。

雙擊進去,點擊 編輯 --- 首選項,點擊 NTP 即可看到我們的端口編號,本次設計的是 UDP,為什么看 NTP ?因為 NTP 其實包含了 UDP,可以看成是 UDP 的一種。

點擊 UDP 和 IPv4,將 UDP校驗和 IP校驗 打勾,待會就看得到是否校驗成功了。


接着我們重新捕獲以太網,可以看到很多藍色的部分表示我們傳輸的心跳包,黑色則的不是我們的,它的 Source 和 Destination 都和我們設置的不同,那就不管它了。點擊某個藍色條紋,下方就出現了相關信息,這些信息是去除了包頭(7個55、1個d5)后的,因此字節顯示 106 ,和我們設計相吻合。此外可以看到頭部校驗分別顯示 [correct] 和 [Good],表明我們這次的校驗也是正確的。

上面的現象表明我們此次的千兆以太網發送項目成功實現。
四、千兆網絡攝像頭
將攝像頭的數據組建成千兆網幀,即可實現基於 UDP 的千兆網絡攝像頭。由於攝像頭速率慢,千兆網速率快,中間不需要通過 SDRAM、DDR3 等緩存。只需要利用 FIFO,在數據段時發出讀數據請求即可。該FIFO還可以起到跨時鍾域的作用。可以在電腦端設置巨型幀,也可以每次發一行圖像數據。上位機編寫時為避免圖像錯位,可以設置圖像的行號或圖像的幀開始標志,FPGA發送時加上這個標志即可。如果上位機軟件來不及解析,可以每次發送一行或一幀時,延時若干時間,強行降低圖像幀率。這個工程的具體實現就不記錄了。
參考資料:威三學院FPGA教程