整理 :李肖遙
接收——RGMII協(xié)議和IDDR原語(yǔ)一、項(xiàng)目概況 1、項(xiàng)目流程圖 2、模塊說(shuō)明:
3、項(xiàng)目說(shuō)明: 電腦上位機(jī)將一幅 1024*768 圖片通過(guò)雙絞線(網(wǎng)線),發(fā)送給板卡網(wǎng)口(RJ45接口),RJ45接口將數(shù)據(jù)傳輸給網(wǎng)卡(PHY芯片),PHY 芯片將差分信號(hào)轉(zhuǎn)換成雙沿?cái)?shù)據(jù),IDDR將雙沿?cái)?shù)據(jù)轉(zhuǎn)換成單沿?cái)?shù)據(jù)傳輸給 FPGA,F(xiàn)PGA 處理完成后將圖像數(shù)據(jù)緩存到DDR3 中,DDR3 中的圖像數(shù)據(jù)使用 UDP 協(xié)議傳回 PC 機(jī),同時(shí)將 DDR3 中數(shù)據(jù)使用 HDMI 傳輸?shù)斤@示器上。
二、PHY芯片 詳情參考 VSC8601-DS-r41-VMDS-10210 文檔,該文檔可以在 Xilinx 官網(wǎng)中下載。 1、以太網(wǎng)和 RJ45 接口 以太網(wǎng)是一種產(chǎn)生較早,使用相當(dāng)廣泛的局域網(wǎng)。分類(lèi)標(biāo)準(zhǔn)有標(biāo)準(zhǔn)以太網(wǎng)(10Mbit/s),快速以太網(wǎng)(100Mbit/s)和千兆以太網(wǎng)(1000Mbit/s)。隨著以太網(wǎng)技術(shù)的飛速發(fā)展,市場(chǎng)上也出現(xiàn)了萬(wàn)兆以太網(wǎng)其技術(shù)支持10Gbit/s的傳輸速率。以太網(wǎng)連接端口:常見(jiàn)的以太網(wǎng)接口類(lèi)型有RJ45接口,RJ11接口。SC光纖接口等。其中RJ45接口是我們常見(jiàn)的網(wǎng)絡(luò)設(shè)備接口。 RJ45接口定義以及各引腳功能說(shuō)明如下圖所示,在以太網(wǎng)中只使用了1、2、3、6這四根線,其中1、2這組負(fù)責(zé)傳輸數(shù)據(jù)(TX+、TX-),而3、6這組負(fù)責(zé)接收數(shù)據(jù)(RX+、RX-),另外四根線是備用的。 總的來(lái)說(shuō),這一塊部分知道即刻,不需要我們自己設(shè)計(jì)代碼。
2、PHY 芯片介紹: 本項(xiàng)目使用 VITESSE VSC8601 網(wǎng)卡芯片,該芯片支持 10/100/1000 BASE-T,常用的網(wǎng)卡芯片有 VITESSE、高通等公司產(chǎn)品,該芯片通稱(chēng)為 PHY 芯片。該芯片與我們電腦、FPGA、MCU 等微處理器通信必須遵循 RGMII 協(xié)議。
3、PHY 芯片配置 ①SMI串行管理接口 VSC8601 設(shè)備包含一個(gè) IEEE 802.3 兼容的串行管理接口(SMI),其中 MDC 和 MDIO 可對(duì)該芯片進(jìn)行控制。SMI 提供了訪問(wèn)權(quán)限設(shè)備控制和狀態(tài)寄存器??刂?SMI 的寄存器集由 32 個(gè) 16 位寄存器組成,包括所有需要的 IEEE 指定寄存器。此外,通過(guò)設(shè)備寄存器 31 可以訪問(wèn)寄存器的附加寄存器。SMI 是一個(gè)同步串行接口,其配置方式和 IIC 類(lèi)似,MDIO 引腳具有有雙向數(shù)據(jù),在 MDC 信號(hào)的上升邊緣上采集。MDC 采集速度應(yīng)在 0 MHz 到 25mhz。數(shù)據(jù)通過(guò) SMI 使用具有可選和任意長(zhǎng)度前導(dǎo)的 32 位幀傳輸,下圖(文檔26頁(yè))顯示了用于讀操作和寫(xiě)操作的SMI框架格式。 由圖可以看到 PHY Address 有 A0 - A4 共 5 bit,故一個(gè)處理器最多可以掛載這樣的 PHY 芯片 2^5=32 個(gè)。用戶(hù)可通過(guò)配置 PHY Address 或 Resgister Address 將該芯片按需配置。 ②配置引腳和設(shè)備功能表(文檔64頁(yè)) ③相關(guān)引腳的功能,用于解釋上表(文檔65頁(yè)) ④電阻對(duì)應(yīng) Pin 值表(文檔66頁(yè)) ⑤PHY芯片配置 結(jié)合上面的表和 PHY 芯片的板卡原理圖,即可確定出 CMODE Pin 的具體值了。
三、PHY芯片的初始化和RGMII協(xié)議 1、PHY 芯片初始化 VSC8601 芯片上電后需要進(jìn)行復(fù)位配置,該芯片復(fù)位信號(hào)需要在上電保持一段時(shí)間后才能將復(fù)位信號(hào)置為高,否則 PHY 芯片不會(huì)工作,其配置過(guò)程如圖(文檔79頁(yè))所示。PHY 的復(fù)位信號(hào)引腳和 FPGA 相連,當(dāng)上電后至少經(jīng)過(guò) 4ms 以上才可以將 PHY 芯片復(fù)位引腳置高,這樣就完成 PHY 芯片初始化了,還是蠻簡(jiǎn)單的。
2、PHY芯片的RGMII協(xié)議 RGMII協(xié)議是PHY芯片和FPGA芯片之間的傳輸協(xié)議。RGMII 是 Reduced GMII(吉比特介質(zhì)獨(dú)立接口)。RGMII 均采用 4bit 數(shù)據(jù)接口,工作時(shí)鐘 125MHz,并且在上升沿和下降沿同時(shí)傳輸數(shù)據(jù),數(shù)據(jù)傳輸速率可以達(dá)到4*125*2=1000Mbps。同時(shí)兼容 MII 所規(guī)定的 10/100 Mbps 工作方式,支持傳輸速率:10M/100M/1000Mb/s ,其對(duì)應(yīng) clk 信號(hào)分別為:2.5MHz/25MHz/125MHz。RGMII 數(shù)據(jù)結(jié)構(gòu)符合 IEEE 以太網(wǎng)標(biāo)準(zhǔn),接口定義見(jiàn) IEEE 802.3-2000。 PHY 芯片與 FPGA 數(shù)據(jù)交互的端口有:發(fā)射端、接收端及HPY 的復(fù)位端口。發(fā)射端和接收端分別有 6 個(gè)引腳與 FPGA 相連,分別有一個(gè)時(shí)鐘引腳、一個(gè)數(shù)據(jù)控制使能引腳,四個(gè)數(shù)據(jù)引腳。而我們想要達(dá)到 1.0Gb/s 帶寬,HPY 對(duì)應(yīng)時(shí)鐘為 125MHZ,若為單沿采樣那么帶寬為 125M/s*4=500Mb/s,及達(dá)不到 1.0Gb/s,在原有的硬件基礎(chǔ)上想要使用 125M 時(shí)鐘產(chǎn)生帶寬為 1.0Gb/b,那么需要雙沿控制采樣數(shù)據(jù),及時(shí)鐘上升沿 4bit 下降沿 4bit,帶寬為125M/s*4*2=1000Mb/s=1.0 Gb/b。該協(xié)議為 RGMII(Reduced Gigabit Media Independent Interface)。RGMII 均采用 4 位數(shù)據(jù)接口,工作時(shí)鐘 125MHz,并且在上升沿和下降沿同時(shí)傳輸數(shù)據(jù),因此傳輸速率可達(dá) 1000Mbps。RGMII 無(wú)補(bǔ)償工作時(shí)序如圖(文檔81頁(yè))所示。 觀察圖中 RX_CLK(at Transmitter) 和 RX_CLK(at Receiver),RX_CLK(at Transmitter)為 HPY 時(shí)鐘,在上升沿時(shí)對(duì)應(yīng)輸出數(shù)據(jù)為 RXD[3:0] 和 RXDV,在下降沿時(shí)對(duì)應(yīng)出數(shù)據(jù)為 RXD[7:4] 和 RXERR,及一個(gè)時(shí)鐘周期對(duì)應(yīng) 8bit 數(shù)、一個(gè)有效使能和一個(gè)錯(cuò)誤信號(hào)。RX_CLK(at Receiver) 是在 RX_CLK(at Transmitter) 的基礎(chǔ)上相移 90°左右而得,這樣采集到的數(shù)據(jù)會(huì)更加穩(wěn)定。 四、IDDR原語(yǔ) PHY 傳輸?shù)臄?shù)據(jù)為雙沿?cái)?shù)據(jù),通常 FPGA 處理的為單沿?cái)?shù)據(jù),所以FPGA 接收到圖像信息包后首先需要使用 IDDR 原語(yǔ)將雙沿?cái)?shù)據(jù)轉(zhuǎn)換為單沿?cái)?shù)據(jù)。通常情況下 FPGA 處理數(shù)據(jù)使用的時(shí)鐘為晶振產(chǎn)生的時(shí)鐘(FPGA 時(shí)鐘),而 PHY 傳輸來(lái)的數(shù)據(jù)以及經(jīng)過(guò)IDDR 原語(yǔ)后轉(zhuǎn)換為單沿的數(shù)據(jù)都是和 PHY 的時(shí)鐘同步,所以我們?nèi)绻胧褂?FPGA 時(shí)鐘作為后續(xù)的圖像數(shù)據(jù)處理必須要進(jìn)行跨時(shí)鐘域,將 PHY 時(shí)鐘同步的數(shù)據(jù)轉(zhuǎn)換為 FPGA 時(shí)鐘同步的數(shù)據(jù)。此處雙沿轉(zhuǎn)單沿?cái)?shù)據(jù)采用 Input DDR 原語(yǔ),簡(jiǎn)稱(chēng) IDDR,將雙沿 4bit 數(shù)據(jù)轉(zhuǎn)換為單沿 8bit 數(shù)據(jù)。 IDDR原語(yǔ)參考 7 Series FPGAs SelectIO Resources 文檔和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。
1、IDDR原語(yǔ)獲取途徑
2、IDDR原語(yǔ)接口和屬性(文檔111頁(yè)) D 為數(shù)據(jù)輸入,CE 為 IDDR 工作使能,C 為時(shí)鐘,S 和 R 分別為置位和復(fù)位。
3、IDDR原語(yǔ)工作模式(文檔110頁(yè)) IDDR 有三種工作模式,模式配置如下圖所示,分別為:OPPOSITE_EDGE、SAME_EDGE 、SAME_EDGE_PIPELINED。 通過(guò)對(duì)比三圖差異,結(jié)合本項(xiàng)目平臺(tái)選擇模式:SAME_EDGE_PIPELINED。因?yàn)闀r(shí)鐘上升沿和下降沿各對(duì)應(yīng)一個(gè)數(shù)據(jù),那么千兆以太網(wǎng)數(shù)據(jù)傳輸:0bit 和 4bit 為一組,1bit 和 5bit 為一組,2bit 和 6bit 為一組,3bit 和 7bit 為一組。
4、IDDR雙沿?cái)?shù)據(jù)轉(zhuǎn)單沿?cái)?shù)據(jù)使用方式 根據(jù)硬件電路圖,PHY 傳輸給 FPGA 有一條時(shí)鐘線、一條使能線和四條數(shù)據(jù)線,其中使能線和數(shù)據(jù)線都為雙沿?cái)?shù)據(jù)。一條使能線包含了 DV 和 ERR,其中上升沿傳輸?shù)氖?DV 信號(hào)(即數(shù)據(jù)有效信號(hào)),下降沿傳輸?shù)臑?ERR 信號(hào)(即數(shù)據(jù)出錯(cuò)信號(hào),通常情況下不考慮 ERR,ERR 是由硬件引起,和軟件無(wú)關(guān));四條數(shù)據(jù)線包含了一個(gè)始終 8bit 數(shù)據(jù),其中上升沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[3:0],下降沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[7:4]。 我們采用 IDDR 原語(yǔ)將雙沿 4bit 數(shù)據(jù)轉(zhuǎn)換為 8bit 數(shù)據(jù),同時(shí)將 8bit 數(shù)據(jù)對(duì)應(yīng)有效 DV 信號(hào)提取。那么可以建立實(shí)現(xiàn)雙沿轉(zhuǎn)單沿功能的模塊:iddr_ctrl,其中輸入與輸出關(guān)系圖如下所示。PHY 芯片傳輸來(lái)的 phy_rxd 和 phy_rx_ctl 都和 PHY 的時(shí)鐘同步。圖中 phy_rx_clk_90 為輸入的時(shí)鐘信號(hào)是 PHY 時(shí)鐘相移90度后形成的,目的是采集 phy_rx_rxd 和 phy_rx_ctl 更穩(wěn)定,rx_data 和 rx_en 即為該模塊輸出的單沿 8bit 數(shù)據(jù)和對(duì)應(yīng)的數(shù)據(jù)有效使能。
千兆以太網(wǎng)數(shù)據(jù)傳輸經(jīng)過(guò) IDDR 后 8bit 數(shù)據(jù) rx_data 與使能 rx_en 對(duì)應(yīng)關(guān)系如下圖所示。 通過(guò)圖可以看出,IDDR 時(shí)鐘上升沿采集的 phy_rx_crl 信號(hào)為 EN(DV),代表數(shù)據(jù)有效,下降沿采集的為 ERR,代表數(shù)據(jù)錯(cuò)誤,本項(xiàng)目此處不考慮錯(cuò)誤信號(hào),最終從 IDDR 輸出的 rx_en 信號(hào)正好和拼接完成后的 rx_data 數(shù)據(jù)對(duì)應(yīng),即可作為 8bit 數(shù)據(jù)有效使能。 五、上板驗(yàn)證 代碼寫(xiě)好后注意一下,前面說(shuō)過(guò) PHY 芯片初始化必須滿(mǎn)足當(dāng)上電后至少經(jīng)過(guò) 4ms 以上才可以將 PHY 芯片復(fù)位引腳置高,因此頂層必須設(shè)置一下 PHY 芯片的復(fù)位引腳,該信號(hào)通過(guò)延時(shí) 4ms 即可產(chǎn)生,有了這個(gè)信號(hào),PHY 芯片才能工作起來(lái)。
這次實(shí)驗(yàn)較簡(jiǎn)單,看不到任何現(xiàn)象,可以先生成一個(gè) ila,將 rx_data 和 rx_en 放進(jìn)去以待觀察,最后不要忘記綁定引腳哦。生成bit文件后下載到板卡上,板卡上的網(wǎng)口和電腦網(wǎng)口連接,點(diǎn)擊電腦中的 以太網(wǎng)設(shè)置 --- 更改適配器選項(xiàng),即可看到網(wǎng)卡正常工作起來(lái)。
查看 ila,將 rx_en 的上升沿作為觸發(fā)信號(hào),得到如下波形: 如圖可以觀察到,千兆以太網(wǎng)數(shù)據(jù)以包為單位發(fā)送,每次發(fā)送有一定的數(shù)據(jù),并且在每次發(fā)送前都會(huì)先發(fā)送 7 個(gè) 0x55 和 1 個(gè) 0xd5 作為包的針頭,如果是這樣的波形,那么表明此次試驗(yàn)設(shè)計(jì)成功。 接收——包校驗(yàn)和數(shù)據(jù)篩選前面我們實(shí)現(xiàn)了FPGA板卡接收以太網(wǎng)的數(shù)據(jù),但是里面的數(shù)據(jù)比較亂,而且可能出現(xiàn)無(wú)效幀,即便是有效幀,也不是所有數(shù)據(jù)都是我們要的,必須對(duì)數(shù)據(jù)進(jìn)行篩選。本篇博客詳細(xì)記錄一下以太網(wǎng)數(shù)據(jù)的校驗(yàn)和篩選。 一、數(shù)據(jù)發(fā)送 我們用 Matlab 軟件實(shí)現(xiàn)電腦向以太網(wǎng)發(fā)送數(shù)據(jù),F(xiàn)PGA板卡接收數(shù)據(jù)。具體程序網(wǎng)上很多,就不貼了。
二、數(shù)據(jù)的校驗(yàn)和篩選 1、UDP以太網(wǎng)結(jié)構(gòu) 以太網(wǎng)的發(fā)送以包為單位,每個(gè)包的結(jié)構(gòu)如下圖所示。圖中有幀首部、MAC首部、IP首部、UDP首部、用戶(hù)數(shù)據(jù)、幀尾部等。后面我們將利用這些數(shù)據(jù)進(jìn)行校驗(yàn)和篩選出我們需要的值。 2、包有效校驗(yàn) 如上圖藍(lán)色部分即是我們的包有效校驗(yàn)區(qū),包發(fā)送數(shù)據(jù)過(guò)來(lái),而剛好藍(lán)色位置的 5byte(40bit)數(shù)據(jù)和標(biāo)準(zhǔn)值一樣,那么就可以認(rèn)定該包為有效包。
3、CRC校驗(yàn) CRC校驗(yàn)是為了證明一個(gè)數(shù)據(jù)包是否出錯(cuò),多數(shù)為 8 位或 32 位,本次采用 32 位的CRC校驗(yàn),但是記住,只能用于驗(yàn)證數(shù)據(jù)是否出錯(cuò),而不能對(duì)錯(cuò)誤進(jìn)行糾正。此外 CRC 校驗(yàn)是去掉了幀首部的 8 byte 數(shù)據(jù)后的校驗(yàn)。如下所示是32位的CRC校驗(yàn)?zāi)K,注意校驗(yàn)和解校驗(yàn)的電路默認(rèn)初始狀態(tài)都是 32‘hffffffff,即全1狀態(tài)。千兆以太網(wǎng)的解校驗(yàn)結(jié)果為 32’hc704dd7b??梢杂美姆绞綄?duì)該模塊進(jìn)行使用,而實(shí)際 CRC 校驗(yàn)的科學(xué)原理則略微高深,此處不做講解。
4、數(shù)據(jù)的篩選 由上圖可知,只有中間紅色部分的 “用戶(hù)數(shù)據(jù)”才是我們真正需要的,因此最終輸出結(jié)果還需要進(jìn)行一番篩選,去頭去尾即可,這也沒(méi)什么難的。
三、代碼設(shè)計(jì) 上面已經(jīng)貼了部分代碼了,難道這里我要全貼代碼嗎?不,貼代碼沒(méi)有意義,重要的是懂內(nèi)部的含義。我們以 rx_filter 來(lái)命名此模塊,rx_filter 的輸入是網(wǎng)口數(shù)據(jù)經(jīng)過(guò)前一講中轉(zhuǎn)換后的 8bit 數(shù)據(jù)值和對(duì)應(yīng)使能,輸出則是經(jīng)過(guò)校驗(yàn)和篩選后的數(shù)據(jù)和使能。 上面說(shuō)的 包有效校驗(yàn) 和 CRC校驗(yàn),代碼本身都不難,用個(gè)計(jì)數(shù)器數(shù)進(jìn)來(lái)的數(shù)據(jù)使能,然后對(duì)那些關(guān)鍵節(jié)點(diǎn)進(jìn)行比較即可。但是那頭數(shù)據(jù)邊來(lái)這頭又要邊校驗(yàn),很可能時(shí)序出錯(cuò),因此有必要建立一個(gè) data_fifo 先緩存住過(guò)來(lái)的數(shù)據(jù),然后進(jìn)行包有效校驗(yàn)和 CRC 校驗(yàn)。data_fifo 的深度可以深一點(diǎn),例如8192,這樣就能容納多幀了。校驗(yàn)完了后是需要判斷是否丟棄該包的,因此還需要另一個(gè) status_fifo 對(duì)校驗(yàn)信息進(jìn)行存儲(chǔ),同時(shí)只要 status_fifo 由空變成不空了,說(shuō)明該包校驗(yàn)信息寫(xiě)入了,即該包校驗(yàn)結(jié)束,那就直接設(shè)計(jì) status_fifo 的讀使能讓信息數(shù)據(jù)出來(lái),并用一個(gè)寄存器鎖存住后面用。status_fifo 的讀使能有了后,data_fifo 的讀使能也要立馬設(shè)計(jì)出來(lái),免得新來(lái)的各種包不斷進(jìn)入 data_fifo,那不得撐爆了。注意 data_fifo 的讀使能持續(xù)時(shí)間應(yīng)該和進(jìn)來(lái)時(shí)的數(shù)據(jù)使能一樣長(zhǎng),所以前面計(jì)數(shù)時(shí)不能光計(jì)數(shù)了,還得把一個(gè)完整包的長(zhǎng)度存起來(lái)。怎么存?直接將長(zhǎng)度寄存住后 和 包有效校驗(yàn)、CRC校驗(yàn)拼接一起寫(xiě)給 status_fifo 就行了,后面 status_fifo 讀出來(lái)這些數(shù)據(jù)就能為我們所用了?,F(xiàn)在 data_fifo 不斷的寫(xiě)數(shù)據(jù)讀數(shù)據(jù),status_fifo 也不斷的寫(xiě)信息數(shù)據(jù)讀信息數(shù)據(jù),下一步我們就能利用讀出來(lái)的信息數(shù)據(jù),判斷里面的的信息(即包有效校驗(yàn)和CRC校驗(yàn))是不是真的OK,如果是真的OK,那就將 data_fifo 的讀數(shù)據(jù)和讀使能進(jìn)行數(shù)據(jù)剔除,留下中間“用戶(hù)數(shù)據(jù)”部分再傳出去,如果不OK就不管了,讓那個(gè) data_fifo 的讀使能和讀數(shù)據(jù)繼續(xù)工作,但我們不使用它,相當(dāng)于丟棄了。示意圖如下所示: 波形圖如下所示,結(jié)合上面所說(shuō),理解了下面的波形圖那本模塊就沒(méi)問(wèn)題了。
四、波形 申請(qǐng)一個(gè) ila 觀察數(shù)據(jù),可以讓 Matab 發(fā)送一段 0-255 的數(shù)據(jù),查看我們的包有無(wú)問(wèn)題,波形圖如下所示:
五、以太網(wǎng) + DDR3 + HDMI 顯示 將千兆以太網(wǎng)的上一講和本講結(jié)合,替代掉之前 DDR3 工程中的串口發(fā)送模塊,即可實(shí)現(xiàn) 以太網(wǎng) + DDR3 + HDMI 顯示了,尤其注意輸出端口、時(shí)鐘連線和引腳約束。 OK,到此為止,本項(xiàng)目的一半已經(jīng)完成啦! 發(fā)送——組建以太網(wǎng)心跳包心跳包就是在客戶(hù)端和服務(wù)器間定時(shí)通知對(duì)方自己狀態(tài)的一個(gè)自己定義的命令字,按照一定的時(shí)間間隔發(fā)送,類(lèi)似于心跳,所以叫做心跳包。心跳包在GPRS通信和CDMA通信的應(yīng)用方面使用非常廣泛。數(shù)據(jù)網(wǎng)關(guān)會(huì)定時(shí)清理沒(méi)有數(shù)據(jù)的路由,心跳包通常設(shè)定在30-40秒之間。所謂的心跳包就是客戶(hù)端定時(shí)發(fā)送簡(jiǎn)單的信息給服務(wù)器端告訴它我還在而已。代碼就是每隔幾分鐘發(fā)送一個(gè)固定信息給服務(wù)端,服務(wù)端收到后回復(fù)一個(gè)固定信息如果服務(wù)端幾分鐘內(nèi)沒(méi)有收到客戶(hù)端信息則視客戶(hù)端斷開(kāi)。本次設(shè)計(jì)中,心跳包時(shí)間間隔為1秒。 一、心跳包觸發(fā)器 設(shè)計(jì)一個(gè) 1 秒定時(shí)器,每隔一秒就產(chǎn)生一個(gè)心跳包觸發(fā)脈沖,用于下一步心跳包的組建。 二、心跳包粗略框架 本次以太網(wǎng)的心跳包結(jié)構(gòu)如下所示: 本次發(fā)送 64 個(gè)全為0的數(shù)據(jù),當(dāng)然這個(gè)數(shù)據(jù)是自定義的,因此心跳包總長(zhǎng)度為118。此外目的/源 MAC 地址、目的/源 IP 地址、目的/源 port 等值可以用參數(shù)的方式先寫(xiě)好。利用剛剛設(shè)計(jì)的心跳包觸發(fā)脈沖,我們就能組建這個(gè)心跳包了。表中黃色部分為后面需要校驗(yàn)的值,可以先填0進(jìn)去,后面再覆蓋掉這三處即可。代碼也沒(méi)什么說(shuō)的,用參數(shù)和case語(yǔ)句即可。 點(diǎn)擊電腦 Win + R 鍵,輸入 cmd,再出入 ipconfig -all,按回車(chē)鍵,即可看到自己電腦的 MAC 地址等參數(shù)。
三、心跳包填充:IP校驗(yàn)和UDP校驗(yàn) 1、IP校驗(yàn)方法 IP 校驗(yàn)就是把 IP 首部 20byte 按 2byte(即 16bit)分開(kāi)后相加,結(jié)果如果大于 16’hffff,就將超出 16’hffff 的部分與相加結(jié)果的低 16 位相加,直到最終結(jié)果小于 16’hffff 為止。最后把小于 16’hffff 的結(jié)果取反作為 ip_checksum。高字節(jié)在前,低字節(jié)在后,替換掉前面在心跳包中填充的 0。 (1) 校驗(yàn)和字段清0 假設(shè)有一段以太網(wǎng)包前面沒(méi)有對(duì) IP 校驗(yàn)和字段清0,而是賦了別的值,例如 IP 首部為:45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d,b5 2e 字段即為 IP 校驗(yàn)和字段,清0后數(shù)據(jù)就變成了:45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d。 (2) 反碼求和 4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d = 34ace,將超過(guò) 16’hffff 的部分(即3)與低 16 位(即4ace)上,結(jié)果為:3+4ace=4ad1,因?yàn)?4ad1 小于 ffff,故作為 Ip_checksum 的反碼。 (3) 取反得最終結(jié)果 將 4ad1 取反得 b52e,這就是本包數(shù)據(jù)最終的 IP 校驗(yàn)和,再將 b52e 填充到對(duì)應(yīng)位置即可。 2、UDP校驗(yàn)方法 (1) 校驗(yàn)方法 UDP_checksum 計(jì)算稍微復(fù)雜一點(diǎn),需要加入 IP 偽頭部,將 IP 偽頭部、UDP 首部的 8 個(gè) bytes 和數(shù)據(jù)包部分按 2byte(即 16bit) 分開(kāi)后相加,結(jié)果如果大于16’hffff,就將超出 16’hffff 的部分與相加結(jié)果的低 16 位相加,直到最終結(jié)果小于 16’hffff 為止。最后把小于 16’hffff 的結(jié)果取反作為 UDP_checksum。高字節(jié)在前,低字節(jié)在后,替換掉前面在心跳包中填充的0。 (2) UDP結(jié)構(gòu) UDP_checksum 的組成如圖所示。 可以看到,IP 偽頭部包含了 IP 源地址,IP 目的地址,一個(gè)字節(jié)的 0,協(xié)議號(hào)和 UDP_len ,在前面做的千兆以太網(wǎng)圖像傳輸項(xiàng)目中 IP 源地址,IP 目的地址,協(xié)議號(hào)都是固定的,而通過(guò)上一篇博客設(shè)計(jì)的 UDP_len 為:UDP首部 8byte + 數(shù)據(jù)長(zhǎng)度 64byte = 8+64='h0048。在設(shè)計(jì)的時(shí)候可以先單獨(dú)將 IP 偽頭部計(jì)算出來(lái)。 3、計(jì)算的時(shí)序安排 ip_checksum 和 udp_checksum 計(jì)算完成,該數(shù)據(jù)填充的位置已經(jīng)經(jīng)過(guò),那么就沒(méi)辦法將數(shù)據(jù)填充到原來(lái)填充 0 的位置了,但我們想要將其組成完整的以太網(wǎng)包,這一步是不可避免的,那么我們?cè)撛趺唇鉀Q呢?我們可以考慮一下,建立一個(gè)足夠大的 RAM ,在計(jì)算 ip_checksum 和 udp_checksum 的同時(shí)將前面心跳包數(shù)據(jù)存儲(chǔ)到 RAM 中,當(dāng)這一包數(shù)據(jù)全部計(jì)算完再將 RAM 中的數(shù)據(jù)讀出。當(dāng)讀出到要填充 ip_checksum 和 udp_checksum 的位置時(shí),將計(jì)算出的兩個(gè)值取反后填充到對(duì)應(yīng)位置即可。 4、時(shí)序圖
四、心跳包填充:CRC校驗(yàn) 1、CRC校驗(yàn)范圍 CRC校驗(yàn)另起一段,是因?yàn)橐人阃昵懊娴?ip 校驗(yàn)值和 UDP 校驗(yàn)值才行。CRC校驗(yàn)時(shí)必須先去除幀頭(即前面的7個(gè)55和1個(gè)d5),還得去掉幀尾(即后面4個(gè)數(shù)據(jù),前面我們直接在這填了0)。當(dāng) CRC 校驗(yàn)值計(jì)算完成后,即可將其填充至數(shù)據(jù)的末尾 4 位即可。 2、CRC校驗(yàn)方法 (1)CRC校驗(yàn)初始值和空閑值都設(shè)置為 32‘hffffffff,即全 1 狀態(tài)。 (2)計(jì)算結(jié)果需高低位對(duì)調(diào),因?yàn)槲覀冇?jì)算時(shí)是先從高位輸入的,所以最后高低位需要對(duì)調(diào)。 (3)最后結(jié)果取反,高低位對(duì)調(diào)后的結(jié)果再取反,即可得到 CRC 的校驗(yàn)值。 3、CRC校驗(yàn)部分代碼
4、時(shí)序圖 由于這次 CRC 校驗(yàn)值是在末尾,因此不需要用到 RAM 也來(lái)得及填充。
至此,我們組建了以太網(wǎng)發(fā)送的心跳包,下一步就可以發(fā)送了。 發(fā)送——ODDR原語(yǔ)和Wireshark抓包工具一、ODDR原語(yǔ) FPGA 傳輸?shù)臄?shù)據(jù)為單沿?cái)?shù)據(jù),而 PHY 傳輸?shù)臄?shù)據(jù)為雙沿?cái)?shù)據(jù),所以FPGA 發(fā)送心跳包的最后需要使用 ODDR 原語(yǔ)將單沿?cái)?shù)據(jù)轉(zhuǎn)換為雙沿?cái)?shù)據(jù)。通常情況下 FPGA 處理數(shù)據(jù)使用的時(shí)鐘為晶振產(chǎn)生的時(shí)鐘(FPGA 時(shí)鐘),而 FPGA 傳輸來(lái)的數(shù)據(jù)經(jīng)過(guò)ODDR 原語(yǔ)后轉(zhuǎn)換為雙沿的數(shù)據(jù)都是和 PHY 的時(shí)鐘同步,所以我們?nèi)绻氚?FPGA 時(shí)鐘的數(shù)據(jù)傳給 PHY 芯片則需要進(jìn)行跨時(shí)鐘域,將 FPGA 時(shí)鐘同步的數(shù)據(jù)轉(zhuǎn)換為 PHY 時(shí)鐘同步的數(shù)據(jù)。此處單沿轉(zhuǎn)雙沿?cái)?shù)據(jù)采用 Output DDR 原語(yǔ),簡(jiǎn)稱(chēng) ODDR,將單沿 8bit 數(shù)據(jù)轉(zhuǎn)換為雙沿 4bit 數(shù)據(jù)。 ODDR原語(yǔ)參考 7 Series FPGAs SelectIO Resources 文檔和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。 1、ODDR原語(yǔ)獲取途徑
2、ODDR原語(yǔ)接口和屬性(文檔129頁(yè)) D1 和 D2 為數(shù)據(jù)輸入,CE 為 ODDR 工作使能,C 為時(shí)鐘,S 和 R 分別為置位和復(fù)位,Q為輸出。
3、ODDR原語(yǔ)工作模式(文檔126頁(yè)) ODDR 有兩種工作模式,模式配置如下圖所示,分別為:OPPOSITE_EDGE、SAME_EDGE。
OPPOSITE_EDGE 模式下,雙沿都用來(lái)捕捉數(shù)據(jù),其中上升沿捕捉低位數(shù)據(jù) D1,下降沿捕捉高位數(shù)據(jù)D2,輸出 Q 在上升沿傳輸 D1,下降沿傳輸D2。SAME_EDGE 模式下,只采用上升沿來(lái)捕捉低位數(shù)據(jù) D1 和高位數(shù)據(jù) D2,然后在輸出 Q 的下降傳輸 D1,上升沿傳輸 D2。此次傳輸我們采用 SAME_EDGE 模式。
4、ODDR雙沿?cái)?shù)據(jù)轉(zhuǎn)單沿?cái)?shù)據(jù)使用方式 根據(jù)硬件電路圖,PHY 傳輸給 FPGA 有一條時(shí)鐘線、一條使能線和四條數(shù)據(jù)線,其中使能線和數(shù)據(jù)線都為雙沿?cái)?shù)據(jù)。一條使能線包含了 DV 和 ERR,其中上升沿傳輸?shù)氖?DV 信號(hào)(即數(shù)據(jù)有效信號(hào)),下降沿傳輸?shù)臑?ERR 信號(hào)(即數(shù)據(jù)出錯(cuò)信號(hào),通常情況下不考慮 ERR,ERR 是由硬件引起,和軟件無(wú)關(guān));四條數(shù)據(jù)線包含了一個(gè)始終 8bit 數(shù)據(jù),其中上升沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[3:0],下降沿傳輸?shù)氖?8bit 數(shù)據(jù)中的[7:4]。 我們采用 ODDR 原語(yǔ)將單沿 8bit 數(shù)據(jù)轉(zhuǎn)換為雙沿 4bit 數(shù)據(jù),同時(shí)將 4bit 數(shù)據(jù)對(duì)應(yīng)有效 DV 信號(hào)提取。那么可以建立實(shí)現(xiàn)單沿轉(zhuǎn)雙沿功能的模塊:oddr_ctrl,其中輸入與輸出關(guān)系圖如下所示。最后 PHY 芯片傳輸出去的 phy_txd 和 phy_tx_ctl 都和 PHY 的時(shí)鐘 phy_tx_clk 同步。圖中 sclk_90 為輸入的時(shí)鐘信號(hào)是 FPGA 時(shí)鐘相移90度后形成的,目的是轉(zhuǎn)換 phy_tx_rxd 和 phy_tx_ctl 更穩(wěn)定,tx_dat 和 tx_en 為該模塊輸入的單沿 8bit 數(shù)據(jù)和對(duì)應(yīng)的數(shù)據(jù)有效使能。
二、以太網(wǎng)復(fù)位信號(hào) 前面博客《千兆以太網(wǎng)(1)》中說(shuō)過(guò) PHY 芯片初始化必須滿(mǎn)足當(dāng)上電后至少經(jīng)過(guò) 4ms 以上才可以將 PHY 芯片復(fù)位引腳置高,因此輸出端口不要忘記了 PHY 芯片的復(fù)位信號(hào) phy_rst_n,該信號(hào)通過(guò)延時(shí) 4ms 即可產(chǎn)生,有了這個(gè)信號(hào),PHY 芯片才能工作起來(lái)。
三、Wireshark 抓包 上板后打開(kāi)點(diǎn)擊電腦中的以太網(wǎng)設(shè)置 --- 更改適配器選項(xiàng),即可看到網(wǎng)卡正常工作起來(lái)。
打開(kāi) Wireshark 軟件,可以看到 以太網(wǎng) 的波形正在變化。
雙擊進(jìn)去,點(diǎn)擊 編輯 --- 首選項(xiàng),點(diǎn)擊 NTP 即可看到我們的端口編號(hào),本次設(shè)計(jì)的是 UDP,為什么看 NTP ?因?yàn)?NTP 其實(shí)包含了 UDP,可以看成是 UDP 的一種。
點(diǎn)擊 UDP 和 IPv4,將 UDP校驗(yàn)和 IP校驗(yàn) 打勾,待會(huì)就看得到是否校驗(yàn)成功了。
接著我們重新捕獲以太網(wǎng),可以看到很多藍(lán)色的部分表示我們傳輸?shù)男奶谏珓t的不是我們的,它的 Source 和 Destination 都和我們?cè)O(shè)置的不同,那就不管它了。點(diǎn)擊某個(gè)藍(lán)色條紋,下方就出現(xiàn)了相關(guān)信息,這些信息是去除了包頭(7個(gè)55、1個(gè)d5)后的,因此字節(jié)顯示 106 ,和我們?cè)O(shè)計(jì)相吻合。此外可以看到頭部校驗(yàn)分別顯示 [correct] 和 [Good],表明我們這次的校驗(yàn)也是正確的。
上面的現(xiàn)象表明我們此次的千兆以太網(wǎng)發(fā)送項(xiàng)目成功實(shí)現(xiàn)。 本文分享自微信公眾號(hào) - 數(shù)字ICer(Studying_Times)。 |
|
來(lái)自: 區(qū)區(qū)收藏 > 《待分類(lèi)》