本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com)
1.實驗簡介
實驗目的:
完成 DDR3 的讀寫測試。
實驗環境:
Window11 PDS2022.2-SP6.4
芯片型號:
PG2L50H-484
2.實驗原理
2.1.?開發板以太網接口簡介
? ? ? 開發板使用裕泰微的裕太微電子的 YT8521SH-CA 實現了一個 10/100/1000 以太網端口。使用時需要用到光電轉換模塊,通過網線連接電腦的網口和光電轉換模塊的電口即可完成通信。
2.2. 以太網協議簡介
2.2.1. 以太網幀格式
? ? ? ?前導碼(Preamble):8 字節,連續 7 個 8’h55 加 1 個 8’hd5,表示一個幀的開始,用于雙方;設備數據的同步。
? ? ? ?目的 MAC 地址:6 字節,存放目的設備的物理地址,即 MAC 地址;源 MAC 地址:6 字節,存放發送端設備的物理地址;
? ? ? ?類型:2 字節,用于指定協議類型,常用的有 0800 表示 IP 協議,0806 表示 ARP 協議,
? ? ? ?8035 表示 RARP 協議;
? ? ? ?數據:46 到 1500 字節,最少 46 字節,不足需要補全 46 字節,例如 IP 協議層就包含在數據部分,包括其 IP 頭及數據。
? ? ? ?FCS:幀尾,4 字節,稱為幀校驗序列,采用 32 位 CRC 校驗,對目的 MAC 地址字段到數據字段進行校驗。
? ? ? ?進一步擴展,以 UDP 協議為例,可以看到其結構如下,除了以太網首部的 14 字節,數據部分包含 IP 首部,UDP 首部,應用數據共 46~1500 字節。
2.2.2. ARP 數據報格式
? ? ? ?ARP 地址解析協議,即 ARP(Address Resolution Protocol),根據 IP 地址獲取物理地址。主機發送包含 目的 IP 地址的 ARP 請求廣播(MAC 地址為 48’hff_ff_ff_ff_ff_ff)到網絡上的主機,并接收返回消息,以此確 定目標的物理地址,收到返回消息后將 IP 地址和物理地址保存到緩存中,并保留一段時間,下次請求時直接查 詢 ARP 緩存以節約資源。下圖為 ARP 數據報格式。
? ? ? ?幀類型:ARP 幀類型為兩字節 0806;
? ? ? ?硬件類型:指鏈路層網絡類型,1 為以太網;
? ? ? ?協議類型:指要轉換的地址類型,采用 0x0800 IP 類型,之后的硬件地址長度和協議地址長度分別對應 6 和 4;
? ? ? ?OP 字段中 1 表示 ARP 請求,2 表示 ARP 應答
? ? ? ?例如:|ff ff ff ff ff ff|00 0a 35 01 fe c0|08 06|00 01|08 00|06|04|00 01|00 0a?
? ? ? ?35 01 fe c0|c0 a8 00 02| ff ff ff ff ff ff|c0 a8 00 03|
? ? ? ?表示向 192.168.0.3 地址發送 ARP 請求。
? ? ? ?|00 0a 35 01 fe c0 | 60 ab c1 a2 d5 15 |08 06|00 01|08 00|06|04|00 02| 60 ab c1 a2 d5 15|c0 a8 00 03|00 0a 35 01 fe c0|c0 a8 00 02|
? ? ? ?表示向 192.168.0.2 地址發送 ARP 應答。
2.2.3. IP 數據包格式
? ? ? ?因為 UDP 協議包只是 IP 包中的一種, 所以我們來介紹一下 IP 包的數據格式。下圖為 IP分組的報文頭格式,報文頭的前 20 個字節是固定的,后面的可變
? ? ? ?版本:占 4 位,指 IP 協議的版本目前的 IP 協議版本號為 4 (即 IPv4);
? ? ? ?首部長度:占 4 位,可表示的最大數值是 15 個單位(一個單位為 4 字節)因此 IP 的首部
? ? ? ?長度的最大值是 60 字節;
? ? ? ?區分服務:占 8 位,用來獲得更好的服務,在舊標準中叫做服務類型,但實際上一直未被使用過 1998 年這個字段改名為區分服務。只有在使用區分服務(DiffServ)時,這個字段才起作用。一般的情況下都不使用這個字段;
? ? ? ?總長度:占 16 位,指首部和數據之和的長度,單位為字節,因此數據報的最大長度為 65535
字節總長度必須不超過最大傳送單元 MTU
? ? ? ?標識:占 16 位,它是一個計數器,用來產生數據報的標識
? ? ? ?標志(flag):占 3 位,目前只有前兩位有意義
? ? ? ?MF 標志字段的最低位是 MF (More Fragment),MF=1 表示后面“還有分片”。MF=0 表示最后一個分片;
? ? ? ?DF 標志字段中間的一位是 DF (Don't Fragment),只有當 DF=0 時才允許分片。
? ? ? ?片偏移:占 12 位,指較長的分組在分片后某片在原分組中的相對位置.片偏移以 8 個字節為偏移單位;
? ? ? ?生存時間;占 8 位,記為 TTL (Time To Live) 數據報在網絡中可通過的路由器數的最大值,TTL 字段是由發送端初始設置一個 8 bit 字段.推薦的初始值由分配數字 RFC 指定,當前值為 64.發送 ICMP 回顯應答時經常把 TTL 設為最大值 255;
? ? ? ?協議;占 8 位,指出此數據報攜帶的數據使用何種協議以便目的主機的 IP 層將數據部分上交給哪個處理過程, 1 表示為 ICMP 協議, 2 表示為 IGMP 協議, 6 表示為 TCP 協議, 17 表示為 UDP 協議;
? ? ? ?首部檢驗和:占 16 位,只檢驗數據報的首部不檢驗數據部分,采用二進制反碼求和,即將16 位數據相加后,再將進位與低 16 位相加,直到進位為 0,最后將 16 位取反;
? ? ? ?源地址和目的地址:都各占 4 字節,分別記錄源地址和目的地址;
2.2.4. UDP 協議
? ? ? ?UDP 是 User Datagram Protocol(用戶數據報協議)的英文縮寫。UDP 只提供一種基本的、低延遲的被稱 為數據報的通訊。所謂數據報,就是一種自帶尋址信息,從發送端走到接收端的數據包。UDP 協議經常用于圖像 傳輸、網絡監控數據交換等數據傳輸速度要求比較高的場合。
? ? ? ?UDP 協議的報頭格式:
? ? ? ?UDP 報頭由 4 個域組成,其中每個域各占用 2 個字節,具體如下:
- UDP 源端口號
- 目標端口號
- 數據報長度
- 校驗和
? ? ? ?UDP 協議使用端口號為不同的應用保留其各自的數據傳輸通道。數據發送一方將 UDP 數據報通過源端口 發送出去,而數據接收一方則通過目標端口接收數據。
? ? ? ?數據報的長度是指包括報頭和數據部分在內的總字節數。因為報頭的長度是固定的,所以該域主要被用來計 算可變長度的數據部分(又稱為數據負載)。數據報的最大長度根據操作環境的不同而各異。從理論上說,包含報 頭在內的數據報的最大長度為 65535 字節。
? ? ? ?不過,一些實際應用往往會限制數據報的大小,有時會降低到 8192 字節。
? ? ? ?UDP 協議使用報頭中的校驗值來保證數據的安全。校驗值首先在數據發送方通過特殊的算法計算得出,在傳遞到接收方之后,還需要再重新計算。如果某個數據報在傳輸過程中被第三方篡改或者由于線路噪音等原因受 到損壞,發送和接收方的校驗計算值將不會相符,由此 UDP 協議可以檢測是否出錯。雖然 UDP 提供警告信息。
2.2.5. Ping功能
? ? ? ?UDP 協議使用報頭中的校驗值來保證數據的安全。校驗值首先在數據發送方通過特殊的算法計算得出,在 傳遞到接收方之后,還需要再重新計算。如果某個數據報在傳輸過程中被第三方篡改或者由于線路噪音等原因受 到損壞,發送和接收方的校驗計算值將不會相符,由此 UDP 協議可以檢測是否出錯。雖然 UDP 提供有錯誤檢測, 但檢測到錯誤時,錯誤校正,只是簡單地把損壞的消息段扔掉,或者給應用程序提供警告信息。
3.SMI(MDC/MDIO)總線接口
? ? ? ?串行管理接口( Serial Management Interface ),也被稱作 MII 管理接口( MII ManagementInterface), 包括 MDC 和 MDIO 兩條信號線。MDIO 是一個 PHY 的管理接口,用來讀/寫 PHY 的寄存器,以控制 PHY 的 行為或獲取 PHY 的狀態,MDC 為 MDIO 提供時鐘,由 MAC 端提供,在本實驗中也就是 FPGA 端。在 RTL8211EG 文檔里可以看到 MDC 的周期最小為 400ns,也就是最大時鐘為 2.5MHz。
3.1. SMI 幀格式
? ? ? ?如下圖,為 SMI 的讀寫幀格式:
3.2. 讀時序
? ? 可以看到在 Turn Around 狀態下,第一個周期 MDIO 為高阻態,第二個周期由 PHY 端拉低。
3.3. 寫時序
? ? ? ?為了保證能夠正確采集到數據,在 MDC 上升沿之前就把數據準備好,在本實驗中為下降沿發送數據,上升沿接收數據。
4.實驗設計
? ? ? ?本實驗以千兆以太網 RGMII 通信為例來設計 verilog 程序,會先發送預設的 UDP 數據到網絡,每秒鐘發 送一次.程序分為兩部分,分別為發送和接收,實現了 ARP,UDP 功能。? ?
4.1. 發送部分
4.1.1. MAC 層發送
? ? ? ?發送部分中,mac_tx.v 為 MAC 層發送模塊,首先在 SEND_START 狀態,等待 mac_tx_ready 信號,如果 有效,表明 IP 或 ARP 的數據已經準備好,可以開始發送。再進入發送前導碼狀態,結束時發送 mac_data_req, 請求 IP 或 ARP 的數據,之后進入發送數據狀態,最后進入發送 CRC 狀態。在發送數據過程中,需要同時進行 CRC 校驗。前導碼完成后就將上層協議數據發送出去, 這個時候同樣把這些上層數據放到 CRC32 模塊中做序列生成,上層協議會給一個數據輸出完成標志信號,這個 時候 mac_tx 知道數據發送完成了,需要結束 CRC32 的序列生成,這個時候就開始提取 FCS,銜接數據之后發 送出去。這樣就連接了前導碼---數據(Mac 幀)----FCS。之后跳轉到結束狀態,再回到 IDLE 狀態,等待下一次的發送請求。
4.1.2. MAC 發送模式
工程中的 mac_tx_mode.v 為發送模式選擇,根據發送模式是 IP 或 ARP 選擇相應的信號與數據。
4.1.3. ARP 發送
? ? ?發送部分中,arp_tx.v 為 ARP 發送模塊, 在 IDLE 狀態下,等待 ARP 發送請求或 ARP 應答請求信號, 之后進入請求或應答等待狀態,并通知 MAC 層,數據已經準備好,等待 mac_data_req 信號,之后進入請求或 應答數據發送狀態。由于數據不足 46 字節,需要補全 46 字節發送。
4.1.4. IP 層發送
? ? ? ?在發送部分,ip_tx.v 為 IP 層發送模塊,在 IDLE 狀態下,如果 ip_tx_req 有效,也就是 UDP 或 ICMP 發 送請求信號,進入等待發送數據長度狀態,之后進入產生校驗和狀態,校驗和是將 IP 首部所有數據以 16 位相 加,最后將進位再與低 16 位相加,直到進入為 0,再將低 16 位取反,得出校驗和結果。
? ? ? ?在生成校驗和之后,等待 MAC 層數據請求,開始發送數據,并在即將結束發送 IP 首部后請求 UDP 或 ICMP 數據。等發送完,進入 IDLE 狀態。
4.1.5. IP 發送模式
? ? ? ?工程中的 ip_tx_mode.v 為發送模式選擇,根據發送模式是 UDP 或 ICMP 選擇相應的信號與數據。
4.1.6. UDP 發送
? ? ?發送部分中,udp_tx.v 為 UDP 發送模塊。
4.2. 接收部分
4.2.1. MAC 層接收
? ? ? ?在接收部分,其中 mac_rx.v 為 mac 層接收文件,首先在 IDLE 狀態下當 rx_en 信號為高,進入 REC_PREAMBLE 前導碼狀態,接收前導碼。之后進入接收 MAC 頭部狀態,即目的 MAC 地址,源 MAC 地址, 類型,將它們緩存起來,并在此狀態判斷前導碼是否正確,錯誤則進入REC_ERROR 錯誤狀態,在 REC_IDENTIFY 狀態判斷類型是 IP(8’h0800)或 ARP(8’h0806)。然后進入接 收數據狀態,將數據傳送到 IP 或 ARP 模塊,等待 IP 或 ARP 數據接收完畢,再接收 CRC 數據。并在接收數 據的過程中對接收的數據進行 CRC 處理,將結果與接收到的 CRC 數據進行對比,判斷數據是否接收正確,正確 則結束,錯誤則進入 ERROR 狀態。
4.2.2. ARP 接收
? ? ? ?工程中的 arp_rx.v 為 ARP 接收模塊,實現 ARP 數據接收,在 IDLE 狀態下,接收到從 MAC 層發來的 arp_rx_req 信號,進入 ARP 接收狀態,在此狀態下,提取出目的 MAC 地址,源 MAC 地址,目的 IP 地址,源 IP 地址,并判斷操作碼 OP 是請求還是應答。如果是請求,則判斷接收到的目的 IP 地址是否為本機地址,如果是, 發送應答請求信號 arp_reply_req,如果不是,則忽略。如果 OP 是應答,則判斷接收到的目的 IP 地址及目的 MAC 地址是否與本機一致,如果是,則拉高 arp_found 信號,表明接收到了對方的地址。并將對方的 MAC 地 址及 IP 地址存入 ARP 緩存中。
4.2.3. IP 層接收模塊
? ? ? ?在工程中,ip_rx 為 IP 層接收模塊,實現 IP 層的數據接收,信息提取,并進行校驗和檢查。首先在 IDLE 狀 態下,判斷從 MAC 層發過來的 ip_rx_req 信號,進入接收 IP 首部狀態,先在 REC_HEADER0 提取出首部長 度及 IP 總長度,進入 REC_HEADER1 狀態,在此狀態提取出目的 IP 地址,源 IP 地址,協議類型,根據協議類 型發送 udp_rx_req 或 icmp_rx_req。在接收首部的同時進行校驗和的檢查,將首部接收的所有數據相加,存入 32 位寄存器,再將高 16 位與低 16 位相加,直到高 16 位為 0 ,再將低 16 位取反,判斷其是否為 0,如果是 0,則檢驗正確,否則 錯誤,進入 IDLE 狀態,丟棄此幀數據,等待下次接收。
4.2.4. UDP 接收
? ? ? ?在工程中,udp_rx.v 為 UDP 接收模塊,在此模塊首先接收 UDP 首部,再接收數據部分,在接收的同時進 行 UDP 校驗和檢查,如果 UDP 數據是奇數個字節,在計算校驗和時,在最后一個字節后加上 8’h00,并進行校 驗和計算。校驗方法與 IP 校驗和一樣,如果校驗正確,將拉高 udp_rec_data_valid 信號,表明接收的 UDP 數 據有效,否則無效,等待下次接收。
4.3. 其他部分
4.3.1. ICMP 應答
? ? ? ?在工程中,icmp_reply.v 實現 ping 功能,首先接收其他設備發過來的 icmp 數據,判斷類型是否是回送 請求(ECHO REQUEST),如果是,將數據存入 RAM,并計算校驗和,判斷校驗和是否正確,如果正確則進入發送 狀態,將數據發送出去。
4.3.2. ARP 緩存
? ? ? ?在工程中,arp_cache.v 為 arp 緩存模塊,將接收到的其他設備 IP 地址和 MAC 地址緩存,在發送數據之 前,查詢目的地址是否存在,如果不存在,則向目的地址發送 ARP 請求,等待應答。在設計文件中,只做了一個緩 存空間,如果有需要,可擴展。
4.3.3. CRC 校驗模塊(crc.v)
? ? ? ?CRC32 校驗是在目標 MAC 地址開始計算的,一直計算到一個包的最后一個數據為止。一些網站可以自動 生成 CRC 算法的 verilog 文件:https://bues.ch/cms/hacking/crcgen.html
5.實驗現象
? ? ? ?用光電轉換模塊插入 SFP 口,再用一根網線和 PC 端網口相連;
? ? ? ?設置接收端(PC 端)IP 地址為 192.168.0.3,開發板的 IP 地址為 192.168.0.2 如下圖
? ? ? ?通過命令提示符,輸入 arp -a,可以查到 IP:192.168.0.2 MAC:a0_b1_c2_d3_e1_e1;
? ? ? ?通過 Wireshark 軟件抓包驗證數據鏈路是否正常連接以及數據傳輸是否正常。資料包中 PC 端打開 Wireshark 軟件,燒錄重新后進行捕獲數據報可以看到如下所示的交互過程。
? ? ? ?成功建立連接后會持續發送數據報“www.meyesemi.com”。如下所示:
? ??Ping 功能測試,由上圖可知,ping 基本不丟包。