千兆以太網(wǎng)(4):發(fā)送——ODDR原語和Wireshark抓包工具
掃描二維碼
隨時隨地手機(jī)看文章
一、ODDR原語
FPGA 傳輸?shù)臄?shù)據(jù)為單沿數(shù)據(jù),而 PHY 傳輸?shù)臄?shù)據(jù)為雙沿數(shù)據(jù),所以FPGA 發(fā)送心跳包的最后需要使用 ODDR 原語將單沿數(shù)據(jù)轉(zhuǎn)換為雙沿數(shù)據(jù)。通常情況下 FPGA 處理數(shù)據(jù)使用的時鐘為晶振產(chǎn)生的時鐘(FPGA 時鐘),而 FPGA 傳輸來的數(shù)據(jù)經(jīng)過ODDR 原語后轉(zhuǎn)換為雙沿的數(shù)據(jù)都是和 PHY 的時鐘同步,所以我們?nèi)绻氚?FPGA 時鐘的數(shù)據(jù)傳給 PHY 芯片則需要進(jìn)行跨時鐘域,將 FPGA 時鐘同步的數(shù)據(jù)轉(zhuǎn)換為 PHY 時鐘同步的數(shù)據(jù)。此處單沿轉(zhuǎn)雙沿數(shù)據(jù)采用 Output DDR 原語,簡稱 ODDR,將單沿 8bit 數(shù)據(jù)轉(zhuǎn)換為雙沿 4bit 數(shù)據(jù)。
ODDR原語參考 7 Series FPGAs SelectIO Resources 文檔和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。
1、ODDR原語獲取途徑
2、ODDR原語接口和屬性(文檔129頁)
D1 和 D2 為數(shù)據(jù)輸入,CE 為 ODDR 工作使能,C 為時鐘,S 和 R 分別為置位和復(fù)位,Q為輸出。
3、ODDR原語工作模式(文檔126頁)
ODDR 有兩種工作模式,模式配置如下圖所示,分別為:OPPOSITE_EDGE、SAME_EDGE。
OPPOSITE_EDGE 模式下,雙沿都用來捕捉數(shù)據(jù),其中上升沿捕捉低位數(shù)據(jù) D1,下降沿捕捉高位數(shù)據(jù)D2,輸出 Q 在上升沿傳輸 D1,下降沿傳輸D2。SAME_EDGE 模式下,只采用上升沿來捕捉低位數(shù)據(jù) D1 和高位數(shù)據(jù) D2,然后在輸出 Q 的下降傳輸 D1,上升沿傳輸 D2。此次傳輸我們采用 SAME_EDGE 模式。
4、ODDR雙沿數(shù)據(jù)轉(zhuǎn)單沿數(shù)據(jù)使用方式
根據(jù)硬件電路圖,PHY 傳輸給 FPGA 有一條時鐘線、一條使能線和四條數(shù)據(jù)線,其中使能線和數(shù)據(jù)線都為雙沿數(shù)據(jù)。一條使能線包含了 DV 和 ERR,其中上升沿傳輸?shù)氖?DV 信號(即數(shù)據(jù)有效信號),下降沿傳輸?shù)臑?ERR 信號(即數(shù)據(jù)出錯信號,通常情況下不考慮 ERR,ERR 是由硬件引起,和軟件無關(guān));四條數(shù)據(jù)線包含了一個始終 8bit 數(shù)據(jù),其中上升沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[3:0],下降沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[7:4]。 我們采用 ODDR 原語將單沿 8bit 數(shù)據(jù)轉(zhuǎn)換為雙沿 4bit 數(shù)據(jù),同時將 4bit 數(shù)據(jù)對應(yīng)有效 DV 信號提取。那么可以建立實(shí)現(xiàn)單沿轉(zhuǎn)雙沿功能的模塊:oddr_ctrl,其中輸入與輸出關(guān)系圖如下所示。最后 PHY 芯片傳輸出去的 phy_txd 和 phy_tx_ctl 都和 PHY 的時鐘 phy_tx_clk 同步。圖中 sclk_90 為輸入的時鐘信號是 FPGA 時鐘相移90度后形成的,目的是轉(zhuǎn)換 phy_tx_rxd 和 phy_tx_ctl 更穩(wěn)定,tx_dat 和 tx_en 為該模塊輸入的單沿 8bit 數(shù)據(jù)和對應(yīng)的數(shù)據(jù)有效使能。
二、以太網(wǎng)復(fù)位信號
前面博客《千兆以太網(wǎng)(1)》中說過 PHY 芯片初始化必須滿足當(dāng)上電后至少經(jīng)過 4ms 以上才可以將 PHY 芯片復(fù)位引腳置高,因此輸出端口不要忘記了 PHY 芯片的復(fù)位信號 phy_rst_n,該信號通過延時 4ms 即可產(chǎn)生,有了這個信號,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 抓包
上板后打開點(diǎn)擊電腦中的以太網(wǎng)設(shè)置 --- 更改適配器選項(xiàng),即可看到網(wǎng)卡正常工作起來。
打開 Wireshark 軟件,可以看到 以太網(wǎng) 的波形正在變化。
雙擊進(jìn)去,點(diǎn)擊 編輯 --- 首選項(xiàng),點(diǎn)擊 NTP 即可看到我們的端口編號,本次設(shè)計的是 UDP,為什么看 NTP ?因?yàn)?NTP 其實(shí)包含了 UDP,可以看成是 UDP 的一種。
點(diǎn)擊 UDP 和 IPv4,將 UDP校驗(yàn)和 IP校驗(yàn) 打勾,待會就看得到是否校驗(yàn)成功了。
接著我們重新捕獲以太網(wǎng),可以看到很多藍(lán)色的部分表示我們傳輸?shù)男奶?,黑色則的不是我們的,它的 Source 和 Destination 都和我們設(shè)置的不同,那就不管它了。點(diǎn)擊某個藍(lán)色條紋,下方就出現(xiàn)了相關(guān)信息,這些信息是去除了包頭(7個55、1個d5)后的,因此字節(jié)顯示 106 ,和我們設(shè)計相吻合。此外可以看到頭部校驗(yàn)分別顯示 [correct] 和 [Good],表明我們這次的校驗(yàn)也是正確的。