{"id":10949,"date":"2025-12-22T21:44:31","date_gmt":"2025-12-22T13:44:31","guid":{"rendered":"http:\/\/www.hellofpga.com\/?p=10949"},"modified":"2026-03-11T22:21:37","modified_gmt":"2026-03-11T14:21:37","slug":"udp_net_test","status":"publish","type":"post","link":"http:\/\/www.hellofpga.com\/index.php\/2025\/12\/22\/udp_net_test\/","title":{"rendered":"\u57fa\u4e8eSmart Artix\u4e0eSmart Zynq \u7cfb\u5217\u4e3b\u677f \u7684FPGA\u5b9e\u9a8c\u5341\u4e03 \u57fa\u4e8eFPGA\u7684\u5343\u5146\u4ee5\u592a\u7f51UDP\u73af\u56de\u5b9e\u9a8c"},"content":{"rendered":"\n<p>\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u5b9e\u73b0\u4e0a\u4f4d\u673a\u4e0eFPGA\u4e4b\u95f4\u7684UDP\u6570\u636e\u73af\u56de\u3002\u4e0a\u4f4d\u673a\u901a\u8fc7\u7f51\u53e3\u8c03\u8bd5\u52a9\u624b\u53d1\u9001\u6570\u636e\uff0cFPGA\u901a\u8fc7\u4ee5\u592a\u7f51\u63a5\u53e3\u63a5\u6536\u6570\u636e\uff0c\u5e76\u5c06\u5176\u56de\u4f20\u7ed9\u4e0a\u4f4d\u673a\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6b64\u7ae0\u8282\u5185\u5bb9\u5c06\u9002\u7528\u4e8eSmart Artix \u7684\u4e3b\u677f <\/strong><\/li>\n\n\n\n<li><strong>\u6b64\u7ae0\u8282\u5185\u5bb9\u540c\u6837\u9002\u7528\u4e8e Smart ZYNQ \u7cfb\u5217\u4e3b\u677f<\/strong>\uff08\u5305\u62ecSP SP2 SL \u548c\u6807\u51c6\u7248\uff09<\/li>\n\n\n\n<li>\u56e0\u4e3aLemon Zynq \u7684\u7f51\u7edc\u662f\u8fde\u63a5\u5728PS\u7aef\u7684\uff0c\u6240\u4ee5\u672c\u6587\u5e76\u4e0d\u9002\u7528\u4e8eLemon ZYNQ\u4e3b\u677f<\/li>\n\n\n\n<li><strong>\u672c\u6587\u5728 vivado2018.3\u7248\u672c\u4e0a\u6f14\u793a<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-99e3706665f0ccbdfe6a2b64701384b9\"><strong>\u5907\u6ce8\uff1a\u672c\u6587\u4e2d\u7684\u90e8\u5206\u5185\u5bb9\u53ca\u4ee3\u7801\u4f7f\u7528\u548c\u53c2\u8003\u4e86\u6b63\u70b9\u539f\u5b50FPGA\u7684\u6559\u7a0b\uff0c\u4e5f\u5728\u6b64\u8bf4\u660e<\/strong><\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color wp-elements-4895872b0894a411886bec9312ddf2d1\"><strong>26\u5e743\u67082\u65e5\u5bf9\u5185\u5bb9\u518d\u6b21\u66f4\u65b0\uff1a\u5bf9RGMII\u90e8\u5206\u589e\u52a0IDELAY\u90e8\u5206\u4ee3\u7801\uff08\u56e0XILINX 7\u7cfb\u7684FPGA IO \u4f5c\u4e3aCLK\u8f93\u5165\u65f6\uff0cIOCLK\u4f1a\u6ede\u540e\u4e8eIODATA\uff08BUFIO \u67091.2ns\u7684\u5ef6\u8fdf\uff0c\u8fd9\u662f\u901a\u8def\u51b3\u5b9a\u7684\uff0c\u548c\u903b\u8f91\u65e0\u5173\uff09\uff0c\u6240\u4ee5\u8fd9\u91cc\u9700\u8981\u989d\u5916\u52a0IDELAY\uff0c\u5bf9\u6570\u636e\u7684\u5ef6\u65f6\u8fdb\u884c\u4fee\u6b63\uff09<\/strong>\u3002<\/p>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color wp-elements-5b71511e14497a36c8e5c204bb1bf190\"><strong>\u6709\u4eba\u4f1a\u95ee\uff0c\u539f\u672c\u786c\u4ef6PHY \u5df2\u7ecf\u5f00\u542f\u4e86\u786c\u4ef6\u76842ns delay\uff0c\u8fd9\u91cc\u4e3a\u4ec0\u4e48\u8fd8\u8981\u52a0IDELAY \uff1f\uff0c\u539f\u56e0\u662f\u539f\u672c\u7ecf\u8fc7phy\u786c\u4ef6delay 2ns\u540e\uff0c\u65f6\u949fRXC \u5df2\u7ecf\u843d\u5230\u6570\u636eRGMII DATA\u7684\u4e2d\u5fc3\u70b9\u4e86\uff0c\u4f46\u662fFPGA\u7684IO\u901a\u8def\u51b3\u5b9aIOCLK\u4f1a\u6bd4IODATA\u6ede\u540e1.2ns \uff08IOCLK \u6bd4IODATA\u901a\u8def\u4e0a\u591a\u4e86\u4e00\u4e2aBUFIO\uff09\uff0c\u5982\u679c\u4e0d\u4f5c\u4fee\u6b63\uff0c\u65f6\u949f\u91c7\u6837\u6cbf\u5c06\u4e0d\u518d\u5728\u6700\u4f73\u6570\u636e\u91c7\u6837\u70b9\u4e86\u3002<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e00\u3001\u5173\u4e8e\u4e3b\u677f\u7f51\u7edc\u90e8\u5206\u7684\u786c\u4ef6\u4ecb\u7ecd\uff1a<\/strong><\/h2>\n\n\n\n<p>\u6211\u4eec\u7684 Smart Artix \u548c \u6211\u4eec\u7684Smart ZYNQ \u5f00\u53d1\u677f\u4e0a\u710a\u4e86\u4e00\u9897RTL8211e \u5343\u5146\u7f51\u7edcPHY\u82af\u7247\uff0c\u5e76\u901a\u8fc7RGMII\u63a5\u53e3\u4e0eFPGA\u7684IO\u53e3\u76f8\u8fde\uff08Smart Artix \u4e3b\u677f\u63a5FPGA IO\uff0c Smart ZYNQ \u63a5\u5728PL\u7684IO \uff09\u53ef\u4e3aFPGA\u63d0\u4f9b\u7f51\u7edc\u8bbf\u95ee\u7684\u529f\u80fd\uff08\u5bf9\u4e8eZYNQ\u4e3b\u677f\u4e5f\u53ef\u4ee5\u901a\u8fc7EMIO\u65b9\u5f0f\u4f9bPS \u7535\u7528\uff09\u3002RTL8211E\u652f\u630110\/100\/1000 Mbps\u7f51\u7edc\u4f20\u8f93\u901f\u7387\u3002<\/p>\n\n\n\n<p>RTL8211E\u662fRealtek\u745e\u6631\u63a8\u51fa\u7684\u4e00\u6b3e\u9ad8\u96c6\u6210\u7684\u7f51\u7edc\u63a5\u6536PHY\u82af\u7247\uff0c\u5b83\u7b26\u540810Base-T\uff0c100Base-TX\u548c1000Base-T IEEE802.3\u6807\u51c6\uff0c\u8be5\u82af\u7247\u5728\u7f51\u7edc\u901a\u4fe1\u4e2d\u5c5e\u4e8e\u7269\u7406\u5c42\uff0c\u7528\u4e8eMAC\u4e0ePHY\u4e4b\u95f4\u7684\u6570\u636e\u901a\u4fe1\u3002  \u5f53\u7f51\u53e3LINK\u5230\u5343\u5146\u7f51\u65f6\u901a\u8fc7RGMII \u4e0eFPGA\u8fdb\u884c\u901a\u8baf\uff0c\u53e6\u5916FPGA\u53ef\u4ee5\u901a\u8fc7MDI\/MDIO\u7ba1\u7406\u63a5\u53e3\u6765\u914d\u7f6e\u6216\u8bfb\u53d6PHY\u82af\u7247\u5185\u90e8\u7684\u5bc4\u5b58\u5668\u3002<\/p>\n\n\n\n<p><strong>\u82af\u7247\u5de5\u4f5c\u6846\u56fe\u5982\u4e0b\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"557\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77-1024x557.png\" alt=\"\" class=\"wp-image-10952\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77-1024x557.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77-300x163.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77-768x418.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77-1536x836.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-77.png 1797w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"507\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78-1024x507.png\" alt=\"\" class=\"wp-image-10954\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78-1024x507.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78-300x149.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78-768x381.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78-1536x761.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-78.png 1901w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p><strong>\u5173\u4e8e\u786c\u4ef6\u90e8\u5206\u7684\u4e00\u4e9b\u91cd\u8981\u4fe1\u606f\uff1a\uff08\u5173\u4e8eTXDLY  \u548c RXDLY\uff09 <\/strong><\/p>\n\n\n\n<p>\u786c\u4ef6\u7535\u8def\u4e0a\u5df2\u7ecf\u4f7f\u80fd\u4e86PHY\u5185\u90e8\u7684 RXDLY \u548c TXDLY \u529f\u80fd <strong> (\u53ef\u4ee5\u8ba9\u65f6\u949f\u4e0e\u6570\u636e\u7684\u4e2d\u5fc3\u5bf9\u9f50\uff0c\u4ee5\u4fdd\u8bc1\u91c7\u6837\u5230\u7684\u6570\u636e\u662f\u6b63\u786e\u7684\uff0c\u5ef6\u65f6\u653e\u5728PHY\u7aef\u4e5f\u53ef\u4ee5\u51cf\u5c11\u8f6f\u4ef6\u5f00\u53d1\u7684\u96be\u5ea6)<\/strong>\uff0c\u6240\u4ee5\u5728FPGA \u7a0b\u5e8f\u4e0a\u4e0d\u80fd\u518d\u5f00\u542f\u8f6f\u4ef6DELAY\u529f\u80fd<strong>\u3002<\/strong>\uff0816\u53ca32\u5f15\u811a\u5747\u901a\u8fc7\u4e0a\u62c9\u7535\u963b\u62c9\u9ad8\uff0c\u5373PHY\u82af\u7247\u5df2\u5f00\u542f2ns \u7684delay\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"125\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-79-1024x125.png\" alt=\"\" class=\"wp-image-10955\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-79-1024x125.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-79-300x36.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-79-768x93.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-79.png 1299w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-f5f916c31445449b320eec2fe7536c8a\"><strong>\u5982\u679c\u4f60\u4e0d\u662f\u81ea\u5df1\u7f16\u5199verilog\u4ee3\u7801\u53bb\u9a71\u52a8 phy\uff0c\u800c\u662f\u4f7f\u7528vivado \u5b98\u65b9\u7684MAC IP \u5982tri_mode_ethernet_mac\u5219\u9700\u8981\u9009Include Shard Logic in example design\u5e76\u628agtx_clk90\u4fe1\u53f7 \u76f4\u63a5\u548crefclk \u76f4\u8fde\uff0c\u4e0d\u8981\u518d\u505a90\u5ea6\u76f8\u4f4d\u504f\u79fb\u4e86<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e8c\u3001\u5b9e\u9a8c\u5185\u5bb9\uff1a<\/strong><\/h2>\n\n\n\n<p>\u672c\u5b9e\u9a8c\u7684\u76ee\u6807\u662f\u5b9e\u73b0\u4e0a\u4f4d\u673a\u4e0eFPGA\u4e4b\u95f4\u7684UDP\u6570\u636e\u73af\u56de\u3002\u4e0a\u4f4d\u673a\u901a\u8fc7\u7f51\u53e3\u8c03\u8bd5\u52a9\u624b\u53d1\u9001\u6570\u636e\uff0cFPGA\u901a\u8fc7\u4ee5\u592a\u7f51\u63a5\u53e3\u63a5\u6536\u6570\u636e\uff0c\u5e76\u5c06\u5176\u56de\u4f20\u7ed9\u4e0a\u4f4d\u673a\u3002<\/p>\n\n\n\n<p>\u867d\u7136\u672c\u5b9e\u9a8c\u4ecb\u7ecd\u7684\u662fUDP\u901a\u4fe1\uff0c\u4f46\u4fdd\u7559\u4e86ARP\u529f\u80fd\uff0c\u56e0\u4e3a\u4e0a\u4f4d\u673a\u53ea\u77e5\u9053\u76ee\u6807IP\u5730\u5740\u548c\u7aef\u53e3\u53f7\uff0c\u65e0\u6cd5\u76f4\u63a5\u83b7\u53d6\u63a5\u6536\u7aef\u7684MAC\u5730\u5740\u3002\u901a\u8fc7ARP\u534f\u8bae\u53ef\u4ee5\u81ea\u52a8\u83b7\u53d6MAC\u5730\u5740\uff0c\u907f\u514d\u4e86\u624b\u52a8\u7ed1\u5b9aMAC\u5730\u5740\u7684\u7e41\u7410\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<p>\u5b9e\u9a8c\u4e2d\uff0c\u5b9e\u73b0\u4e86ARP\u548cUDP\u534f\u8bae\u7684\u529f\u80fd\u3002FPGA\u901a\u8fc7GMII\u63a5\u53e3\u63a5\u6536\u6570\u636e\uff0c\u5e76\u6839\u636e\u534f\u8bae\u7c7b\u578b\u9009\u62e9\u4e0d\u540c\u7684\u89e3\u6790\u6a21\u5757\u3002\u63a5\u6536\u7684GMII\u6570\u636e\u5f15\u811a\u540c\u65f6\u8fde\u63a5\u81f3ARP\u548cUDP\u6a21\u5757\uff0c\u4e24\u4e2a\u6a21\u5757\u5206\u522b\u89e3\u6790\u5bf9\u5e94\u7684\u534f\u8bae\u6570\u636e\u3002\u7531\u4e8eGMII\u53d1\u9001\u4fa7\u5f15\u811a\u53ea\u80fd\u8fde\u63a5\u4e00\u4e2a\u6a21\u5757\uff0c\u4ee5\u592a\u7f51\u63a7\u5236\u6a21\u5757\u4f1a\u6839\u636e\u63a5\u6536\u5230\u7684\u6570\u636e\u534f\u8bae\u7c7b\u578b\uff0c\u52a8\u6001\u5207\u6362GMII\u53d1\u9001\u4fa7\u7684\u8fde\u63a5\uff0c\u9009\u62e9\u4e0eARP\u6216UDP\u6a21\u5757\u8fde\u63a5\u3002\u540c\u65f6\uff0c\u63a7\u5236\u6a21\u5757\u8fd8\u8d1f\u8d23\u6839\u636eARP\u63a5\u6536\u5230\u7684\u8bf7\u6c42\u7c7b\u578b\uff0c\u63a7\u5236ARP\u6a21\u5757\u8fd4\u56de\u76f8\u5e94\u7684ARP\u5e94\u7b54\u4fe1\u53f7\u3002\u4e3a\u4e86\u5e94\u5bf9\u5927\u6d41\u91cf\u6570\u636e\u7684\u63a5\u6536\uff0c\u5b9e\u9a8c\u4e2d\u4f7f\u7528\u4e86\u540c\u6b65FIFO\u6a21\u5757\u8fdb\u884c\u6570\u636e\u7f13\u5b58\uff0c\u4e14\u7531\u4e8e\u63a5\u6536\u548c\u53d1\u9001\u4f7f\u7528\u7684\u662f\u76f8\u540c\u7684\u65f6\u949f\uff0c\u91c7\u7528\u540c\u6b65FIFO\u786e\u4fdd\u6570\u636e\u4f20\u8f93\u7684\u9ad8\u6548\u6027\u548c\u7a33\u5b9a\u6027\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e09\u3001RGMII \u63a5\u53e3\u4ecb\u7ecd<\/strong><\/h2>\n\n\n\n<p>RGMII\uff08Reduced Gigabit Media Independent Interface\uff09\u662f\u4e00\u79cd\u7528\u4e8e\u8fde\u63a5\u4ee5\u592a\u7f51\u7269\u7406\u5c42\u8bbe\u5907\uff08PHY\uff09\u548cFPGA\u6216\u5176\u4ed6\u5904\u7406\u5668\u7684\u63a5\u53e3\u6807\u51c6\u3002\u5b83\u662fGigabit Ethernet\uff08\u5343\u5146\u4ee5\u592a\u7f51\uff09\u7684\u4e00\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u65e8\u5728\u7b80\u5316\u4f20\u7edfGMII\uff08Gigabit Media Independent Interface\uff09\u7684\u8bbe\u8ba1\uff0c\u540c\u65f6\u964d\u4f4e\u4fe1\u53f7\u5f15\u811a\u7684\u6570\u91cf\u3002RGMII\u4f7f\u7528\u4e86\u4fe1\u53f7\u65f6\u5e8f\u548c\u6570\u636e\u7ebf\u7684\u4f18\u5316\u8bbe\u8ba1\uff0c\u51cf\u5c11\u4e86\u63a5\u53e3\u6240\u9700\u7684\u5f15\u811a\u6570\u91cf\uff0c\u4ece\u800c\u964d\u4f4e\u4e86\u786c\u4ef6\u6210\u672c\u548c\u590d\u6742\u5ea6\u3002<\/p>\n\n\n\n<p>RGMII  \u6570\u636e\u4f4d\u5bbd\u4e3a4 \u4f4d\uff0c\u57281000Mbps \u4f20\u8f93\u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a125Mhz\uff0c\u5728\u65f6\u949f\u7684\u4e0a\u4e0b\u6cbf\u540c\u65f6\u91c7\u6837\u6570\u636e\u3002\u5728100Mbps \u548c10Mbps \u901a\u4fe1\u901f\u7387\u4e0b\uff0c\u4e3a\u5355\u4e2a\u65f6\u949f\u6cbf\u91c7\u6837\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RGMII \u63a5\u53e3\u5b9a\u4e49\uff1a\n<ul class=\"wp-block-list\">\n<li>TXC \uff1a   MAC -&gt; PHY   \u53d1\u9001\u53c2\u8003\u65f6\u949f\uff0c\n<ul class=\"wp-block-list\">\n<li>1000Mbps \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a125MHz\uff0c\u53cc\u8fb9\u6cbf\u91c7\u6837<\/li>\n\n\n\n<li>100Mbps   \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a25MHz\uff0c  \u5355\u8fb9\u6cbf\u91c7\u6837<\/li>\n\n\n\n<li>10Mbps     \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a2.5MHz\uff0c \u5355\u8fb9\u6cbf\u91c7\u6837<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>TXD \uff1a   MAC -&gt; PHY   4\u4f4d\u53d1\u9001\u6570\u636e<\/li>\n\n\n\n<li>TXCTL\uff1aMAC -&gt; PHY   \u53d1\u9001\u4f7f\u80fd<\/li>\n\n\n\n<li>RXC \uff1a   MAC &lt;- PHY   \u63a5\u6536\u53c2\u8003\u65f6\u949f\uff0c\n<ul class=\"wp-block-list\">\n<li>1000Mbps \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a125MHz\uff0c\u53cc\u8fb9\u6cbf\u91c7\u6837<\/li>\n\n\n\n<li>100Mbps   \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a25MHz\uff0c  \u5355\u8fb9\u6cbf\u91c7\u6837<\/li>\n\n\n\n<li>10Mbps     \u901f\u7387\u4e0b\uff0c\u65f6\u949f\u9891\u7387\u4e3a2.5MHz\uff0c \u5355\u8fb9\u6cbf\u91c7\u6837<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>RXD \uff1a   MAC &lt;-  PHY   4\u4f4d\u63a5\u6536\u6570\u636e<\/li>\n\n\n\n<li>RXCTL\uff1aMAC &lt;-  PHY   \u63a5\u6536\u4f7f\u80fd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>\u4fe1\u53f7\u7684\u8be6\u7ec6\u89e3\u91ca\uff1a<\/strong><\/p>\n\n\n\n<p>RGMII\u63a5\u53e3\u76844\u4f4d\u6570\u636e\u4fe1\u53f7\u57281000Mbps\u901f\u7387\u4e0b\uff0cETH_TXC\u548cETH_RXC\u7684\u65f6\u949f\u9891\u7387\u4e3a125MHz\uff0c\u91c7\u7528\u53cc\u8fb9\u6cbf\u91c7\u6837\u65b9\u5f0f\uff0c\u5728\u4e0a\u5347\u6cbf\u4f20\u8f93\u6570\u636e\u7684\u4f4e4\u4f4d\uff0c\u5728\u4e0b\u964d\u6cbf\u4f20\u8f93\u6570\u636e\u7684\u9ad84\u4f4d\u3002 \u5728100Mbps\u901f\u7387\u4e0b\uff0cETH_TXC\u548cETH_RXC\u65f6\u949f\u9891\u7387\u964d\u4f4e\u4e3a25Mhz\uff0c\u5e76\u4e14\u6570\u636e\u91c7\u7528\u4e0a\u5347\u6cbf\u91c7\u6837\uff08SDR\uff09\uff0c\u5373\u6bcf\u4e2a\u5468\u671f\u4f20\u8f934\u4f4d\u6570\u636e\uff0c \u572810Mbps\u901f\u7387\u4e0b\uff0cETH_TXC\u548cETH_RXC\u7684\u65f6\u949f\u901f\u7387\u964d\u4f4e\u4e3a2.5Mhz\uff0c\u4e5f\u4e3a\u4e0a\u5347\u6cbf\u91c7\u6837\u3002<\/p>\n\n\n\n<p>ETH_TXCTL\u548cRX_CTL \u57281000Mbps\u548c100Mbps\u4e0b\u662f\u53cc\u8fb9\u6cbf\u91c7\u6837\u7684\uff0c\u4e0a\u5347\u6cbf\u7528\u4e8e\u4f20\u8f93\u6709\u6548\u4fe1\u53f7TX_EN\/RX_DV\uff09\uff0c\u4e0b\u964d\u6cbf\u4f20\u8f93\uff08TX_ERR xor TX_EN\u3001RX_ERR xor RX_DV\uff09\u3002\u5f53RX_DV\u4e3a\u9ad8\u7535\u5e73\uff08\u8868\u793a\u6570\u636e\u6709\u6548\uff09\u4e14RX_ERR\u4e3a\u4f4e\u7535\u5e73\uff08\u8868\u793a\u6ca1\u6709\u9519\u8bef\uff09\u65f6\uff0c\u5f02\u6216\u7684\u7ed3\u679c\u4e3a\u9ad8\u7535\u5e73\uff0c\u610f\u5473\u7740\u53ea\u6709\u5f53ETH_TXCTL\u548cETH_RXCTL\u7684\u4e0a\u4e0b\u6cbf\u540c\u65f6\u4e3a\u9ad8\u7535\u5e73\u65f6\uff0c\u6570\u636e\u624d\u662f\u6709\u6548\u4e14\u6b63\u786e\u7684\u3002  \u572810Mbs\u4e0bETH_TXCTL\u548cETH_RXCTL\u63a7\u5236\u4fe1\u53f7\u6539\u4e3a\u5355\u8fb9\u6cbf\u91c7\u6837\u3002<\/p>\n\n\n\n<p><strong>\u4e0b\u9762\u662fRGMII\u7684\u65f6\u5e8f\u56fe\uff1a<\/strong>\uff08\u65f6\u5e8f\u56fe\u4e2d\u7684TXC\u548cRXC\u5df2\u589e\u52a0 delay\u7684\u60c5\u51b5\uff09\uff0c\u5907\u6ce8\uff0c\u5f00\u542f\u5185\u90e8PHY DELAY\u7684\u60c5\u5f62\u4e0b\uff0c \u6211\u4eecFPGA\u8f93\u51fa\u7684TXC\u4e0d\u9700\u8981\u589e\u52a0\u5ef6\u65f6\uff0cPHY\u82af\u7247\u5185\u90e8\u4f1a\u589e\u52a0\u8fd9\u90e8\u5206\u529f\u80fd\uff0cRXC\u7684\u65f6\u5019,PHY\u82af\u7247\u8f93\u51fa\u7684RXC\u4e5f\u540c\u6837\u6ede\u540e\u4e862ns<strong>\uff08\u4f46\u662fFPGA\u7684\u4ee3\u7801\u4ecd\u7136\u9700\u8981\u589e\u52a0IDELAY\uff0c\u539f\u56e0\u5728\u6587\u7ae0\u5f00\u5934\u6709\u63d0\u5230\uff09<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"410\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-82-1024x410.png\" alt=\"\" class=\"wp-image-10971\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-82-1024x410.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-82-300x120.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-82-768x307.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-82.png 1140w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"389\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-83-1024x389.png\" alt=\"\" class=\"wp-image-10972\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-83-1024x389.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-83-300x114.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-83-768x291.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-83.png 1104w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u56db\u3001RGMII\u6a21\u5757\u8bbe\u8ba1<\/strong><\/h2>\n\n\n\n<p>\u56e0\u4e3a\u6211\u4eec\u8f93\u5165\u7684\u7f51\u7edc\u6570\u636e\u662fDDR\u53cc\u8fb9\u6cbf\u91c7\u6837\u7684\uff0c\u8fd9\u91cc\u6211\u4eec\u589e\u52a0\u4e00\u4e2argmii_to_gmii\u6a21\u5757\u6765\u5b9e\u73b0DDR\u53cc\u8fb9\u6cbf\u6570\u636e \u548c SDR \u5355\u8fb9\u6cbf\u6570\u636e\u7684\u8f6c\u6362\u3002<\/p>\n\n\n\n<p>\u56e0\u6587\u7ae0\u5f00\u59cb\u63d0\u5230\u7684\u539f\u56e0\uff0c7\u7cfbFPGA IOCLK \u4f1a\u5b58\u5728\u6ede\u540e\u60c5\u51b5\uff0c\u6240\u4ee5\u8fd9\u91cc\u9700\u8981\u989d\u5916\u589e\u52a0\u4e00\u4e2aIDELAY\u6a21\u5757\u6765\u5bf9rgmii\u7684\u6570\u636e\u5ef6\u65f6\u8fdb\u884c\u4fee\u6b63\uff08\u8ba9RXC\u91c7\u6837\u6cbf\u80fd\u843d\u5728\u6570\u636e\u7684\u4e2d\u5fc3\u4f4d\u7f6e\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">`timescale 1ns \/ 1ps<br>module rgmii_to_gmii(<br>    input        idelay_clk,<br>    \/\/rgmii<br>    input        rgmii_rxc,<br>    input        rgmii_rx_ctl,<br>    input [3:0]  rgmii_rxd,<br>    output       rgmii_txc,<br>    output       rgmii_tx_ctl,<br>    output [3:0] rgmii_txd,<br>    \/\/gmii<br>    output       gmii_rx_clk,<br>    output       gmii_rx_dv,<br>    output [7:0] gmii_rxd,<br>    output       gmii_tx_clk,<br>    input        gmii_tx_en,<br>    input [7:0]  gmii_txd<br>);<br><br>wire         rgmii_rxc_bufg;    <br>wire         rgmii_rxc_bufio;   <br>wire  [1:0]  gmii_rxdv_t;        <br><br>assign gmii_rx_clk  = rgmii_rxc_bufg;<br>assign gmii_tx_clk  = gmii_rx_clk;<br>assign rgmii_txc = gmii_tx_clk;<br><br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/RX Part\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>BUFG BUFG_inst (<br>  .I (rgmii_rxc),   <br>  .O (rgmii_rxc_bufg) <br>);<br>BUFIO BUFIO_inst (<br>  .I (rgmii_rxc),    <br>  .O (rgmii_rxc_bufio) <br>);<br><br>parameter IDELAY_VALUE = 9;<br><br>wire  [3:0]  rgmii_rxd_delay;   <br>wire         rgmii_rx_ctl_delay; <br><br>IDELAYCTRL  IDELAYCTRL_inst (<br>    .RDY(),                      <br>    .REFCLK(idelay_clk),        <br>    .RST(1'b0)                 <br>);<br><br>IDELAYE2 #(<br>  .IDELAY_TYPE     (\"FIXED\"),           <br>  .IDELAY_VALUE    (IDELAY_VALUE),      <br>  .REFCLK_FREQUENCY(200.0)             <br>)<br>u_delay_rx_ctrl (<br>  .CNTVALUEOUT     (),                  <br>  .DATAOUT         (rgmii_rx_ctl_delay),<br>  .C               (1'b0),             <br>  .CE              (1'b0),             <br>  .CINVCTRL        (1'b0),             <br>  .CNTVALUEIN      (5'b0),             <br>  .DATAIN          (1'b0),             <br>  .IDATAIN         (rgmii_rx_ctl),      <br>  .INC             (1'b0),             <br>  .LD              (1'b0),             <br>  .LDPIPEEN        (1'b0),              <br>  .REGRST          (1'b0)               <br>);<br><br>IDDR #(<br>    .DDR_CLK_EDGE(\"SAME_EDGE_PIPELINED\"),                      <br>    .INIT_Q1  (1'b0),                  <br>    .INIT_Q2  (1'b0),                 <br>    .SRTYPE   (\"SYNC\")                 <br>    ) <br>u_iddr_rx_ctl (<br>    .Q1 (gmii_rxdv_t[0]),         <br>    .Q2 (gmii_rxdv_t[1]),         <br>    .C  (rgmii_rxc_bufio),       <br>    .CE (1'b1),                 <br>    .D  (rgmii_rx_ctl_delay),     <br>    .R  (1'b0), <br>    .S  (1'b0)<br>);<br><br>assign gmii_rx_dv = gmii_rxdv_t[0] &amp; gmii_rxdv_t[1];<br><br>genvar i;<br>generate for (i=0; i&lt;4; i=i+1)begin      <br>    IDELAYE2 #(<br>      .IDELAY_TYPE     (\"FIXED\"),<br>      .IDELAY_VALUE    (IDELAY_VALUE),<br>      .REFCLK_FREQUENCY(200.0)<br>    )<br>    u_delay_rxd (<br>      .CNTVALUEOUT     (), <br>      .DATAOUT         (rgmii_rxd_delay[i]),<br>      .C               (1'b0),<br>      .CE              (1'b0),<br>      .CINVCTRL        (1'b0),<br>      .CNTVALUEIN      (5'b0),<br>      .DATAIN          (1'b0),<br>      .IDATAIN         (rgmii_rxd[i]),  <br>      .INC             (1'b0),<br>      .LD              (1'b0),<br>      .LDPIPEEN        (1'b0),<br>      .REGRST          (1'b0) <br>    );<br><br>    IDDR #(<br>        .DDR_CLK_EDGE(\"SAME_EDGE_PIPELINED\"),<br>        .INIT_Q1  (1'b0),<br>        .INIT_Q2  (1'b0), <br>        .SRTYPE   (\"SYNC\")  <br>    ) <br>    u_iddr_rxd (<br>        .Q1 (gmii_rxd[i]), <br>        .Q2 (gmii_rxd[4+i]),<br>        .C  (rgmii_rxc_bufio), <br>        .CE (1'b1),<br>        .D  (rgmii_rxd_delay[i]),<br>        .R  (1'b0), <br>        .S  (1'b0) <br>    );<br>end<br>endgenerate<br><br><br><br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/TX Part\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>ODDR #(<br>    .DDR_CLK_EDGE  (\"SAME_EDGE\"),  <br>    .INIT          (1'b0), <br>    .SRTYPE        (\"SYNC\")<br>)<br>ODDR_inst (<br>    .Q  (rgmii_tx_ctl), <br>    .C  (gmii_tx_clk), <br>    .CE (1'b1),<br>    .D1 (gmii_tx_en),<br>    .D2 (gmii_tx_en),<br>    .R  (1'b0),<br>    .S  (1'b0)<br>); <br><br>genvar j;<br>generate for (j=0; j&lt;4; j=j+1)begin<br>    ODDR #(<br>        .DDR_CLK_EDGE  (\"SAME_EDGE\"),<br>        .INIT   (1'b0), <br>        .SRTYPE (\"SYNC\") <br>    ) <br>    ODDR_inst (<br>        .Q  (rgmii_txd[j]), <br>        .C  (gmii_tx_clk),  <br>        .CE (1'b1), <br>        .D1 (gmii_txd[j]),<br>        .D2 (gmii_txd[4+j]),<br>        .R  (1'b0),<br>        .S  (1'b0) <br>    );        <br>end<br>endgenerate<br><br>endmodule<\/pre>\n\n\n\n<p>\u6a21\u5757\u4e3b\u8981\u5b9e\u73b0\u7684\u529f\u80fd<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rx\u90e8\u5206\uff0c\u901a\u8fc7IDDR\u539f\u8bed\uff0c\u5c06\u8f93\u5165\u7684\u53cc\u8fb9\u6cbf\u6570\u636e\uff08\u6bcf\u4e2a\u8fb9\u6cbf4bit)\u6574\u5408\u6210\u4e00\u4e2a8bit\u6570\u636e<\/li>\n\n\n\n<li>tx\u90e8\u5206\uff0c\u5c06\u8f93\u5165\u76848bit\u6570\u636e\u4ee5\u53ca\u4f7f\u80fd\u4fe1\u53f7\u901a\u8fc7ODDR\u539f\u8bed\u8f6c\u6362\u6210\u53cc\u8fb9\u6cbf\u8f93\u51fa\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u7279\u522b\u8981\u6ce8\u610f\u7684\u662f\uff0c\u8fd9\u91ccGMII \u7684TX \u548cRX \u65f6\u949f\uff0c\u4ee5\u53caRGMII\u7684TX\u65f6\u949f\u90fd\u4f7f\u7528\u4e86RGMII\u7684RX\u8f93\u5165\u65f6\u949f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e94\u3001\u4ee5\u592a\u7f51\u5e27\u683c\u5f0f\u4ecb\u7ecd\uff0c\u4ee5\u53caARP\u6a21\u5757\u8bbe\u8ba1<\/strong><\/h2>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-bd8ae579189a2f0b8c3994ca539f336e\"><strong>(\u90e8\u5206\u56fe\u7247\u5f15\u7528\u81ea\u6b63\u70b9\u539f\u5b50\u7684\u8d44\u6599)<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4ee5\u592a\u7f51\u7684\u5e27\u683c\u5f0f<\/strong>\uff1a<\/h3>\n\n\n\n<p>\u4ee5\u592a\u7f51\u5e27\u9075\u5faa\u4e0b\u5217\u56fe\u4e2d\u7684\u683c\u5f0f<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-1-1024x256.png\" alt=\"\" class=\"wp-image-10989\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-1-1024x256.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-1-300x75.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-1-768x192.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-1.png 1535w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u524d\u5bfc\u7801 (Preamble)<\/strong>: 7\u5b57\u8282\uff0c\u7528\u4e8e\u540c\u6b65\u3002 \uff08\u524d\u5bfc\u7801\u753156\u4e2a\u8fde\u7eed\u7684<code>1<\/code>\u548c<code>0<\/code>\u7ec4\u6210\uff0855-55-55-55-55-55-55\uff09\uff09\u3002\u5b83\u7684\u4f5c\u7528\u662f\u4e3a\u63a5\u6536\u65b9\u63d0\u4f9b\u4e00\u4e2a\u540c\u6b65\u4fe1\u53f7\uff0c\u5e2e\u52a9\u8bbe\u5907\u5728\u4f20\u8f93\u6570\u636e\u524d\u540c\u6b65\u65f6\u949f\uff09<\/li>\n\n\n\n<li><strong>\u8d77\u59cb\u5b9a\u754c\u7b26 (SFD)<\/strong>: 1\u5b57\u8282\uff0c\u6807\u5fd7\u5e27\u7684\u5f00\u59cb\u3002  \uff08\u7531<code>10101011<\/code>\uff080xd5\uff09\u7ec4\u6210\uff0c\u6807\u5fd7\u7740\u4ee5\u592a\u7f51\u5e27\u7684\u5f00\u59cb\uff09<\/li>\n\n\n\n<li><strong>\u76ee\u7684MAC\u5730\u5740<\/strong>: 6\u5b57\u8282\uff0c\u63a5\u6536\u7aef\u7684\u7269\u7406\u5730\u5740\u3002<\/li>\n\n\n\n<li><strong>\u6e90MAC\u5730\u5740<\/strong>: 6\u5b57\u8282\uff0c\u53d1\u9001\u7aef\u7684\u7269\u7406\u5730\u5740\u3002<\/li>\n\n\n\n<li><strong>\u957f\u5ea6\/\u7c7b\u578b<\/strong>: 2\u5b57\u8282\uff0c\u8868\u793a\u6570\u636e\u957f\u5ea6\u6216\u534f\u8bae\u7c7b\u578b\u3002\uff08\u5f53\u503c\u5c0f\u4e8e\u6216\u7b49\u4e8e 1500\uff080x05DC\uff09\u65f6\uff0c\u8868\u793a\u6570\u636e\u90e8\u5206\u7684\u957f\u5ea6\uff0846\u52301500\u5b57\u8282\uff09\uff1b\u5f53\u503c\u5927\u4e8e\u6216\u7b49\u4e8e 1536\uff080x0600\uff09\u65f6\uff0c\u8868\u793a\u6570\u636e\u90e8\u5206\u4f7f\u7528\u7684\u534f\u8bae\u7c7b\u578b\uff0c\u5982 <code>0x0800<\/code> \u4ee3\u8868IPv4\uff0c<code>0x0806<\/code> \u4ee3\u8868ARP\u3002\u8fd9\u4e00\u5b57\u6bb5\u5e2e\u52a9\u63a5\u6536\u65b9\u533a\u5206\u6570\u636e\u7684\u957f\u5ea6\u548c\u534f\u8bae\u7c7b\u578b)<\/li>\n\n\n\n<li><strong>\u6570\u636e\u6bb5<\/strong>: 46-1500\u5b57\u8282\uff0c\u6709\u6548\u6570\u636e\u90e8\u5206\u3002\n<ul class=\"wp-block-list\">\n<li><strong>\u586b\u5145<\/strong>: \u5982\u679c\u6570\u636e\u6bb5\u4e0d\u6ee1\u8db346\u4e2a\u5b57\u8282\uff0c\u5219\u8fd9\u91cc\u8fdb\u884c\u6570\u636e\u586b\u5145\u786e\u4fdd\u6570\u636e\u90e8\u5206\u957f\u5ea6\u6700\u5c0f\u4e3a46\u5b57\u8282\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>CRC<\/strong>: 4\u5b57\u8282\uff0c\u5faa\u73af\u5197\u4f59\u6821\u9a8c\uff0c\u786e\u4fdd\u6570\u636e\u6b63\u786e\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u592a\u7f51\u5730\u5740\u6709\u4e09\u79cd\u7c7b\u578b\uff1a<strong>\u5355\u64ad<\/strong>\uff08Unicast\uff09\u662f\u6307\u6570\u636e\u53d1\u9001\u7ed9\u4e00\u4e2a\u7279\u5b9a\u8bbe\u5907\uff0c\u76ee\u7684MAC\u5730\u5740\u552f\u4e00\uff1b<strong>\u7ec4\u64ad<\/strong>\uff08Multicast\uff09\u662f\u6570\u636e\u53d1\u9001\u7ed9\u4e00\u7ec4\u8bbe\u5907\uff0c\u76ee\u7684MAC\u5730\u5740\u4ee5<code>01<\/code>\u5f00\u5934\uff0c\u6620\u5c04\u5230IP\u7ec4\u64ad\u5730\u5740\uff1b<strong>\u5e7f\u64ad<\/strong>\uff08Broadcast\uff09\u662f\u6570\u636e\u53d1\u9001\u7ed9\u7f51\u7edc\u4e2d\u6240\u6709\u8bbe\u5907\uff0c\u76ee\u7684MAC\u5730\u5740\u4e3a<code>FF:FF:FF:FF:FF:FF<\/code>\u3002\u5355\u64ad\u7528\u4e8e\u70b9\u5bf9\u70b9\u901a\u4fe1\uff0c\u7ec4\u64ad\u7528\u4e8e\u7279\u5b9a\u7fa4\u4f53\uff0c\u5e7f\u64ad\u7528\u4e8e\u5168\u7f51\u901a\u4fe1\u3002<\/p>\n\n\n\n<p>\u5728\u901a\u8baf\u7684\u8fc7\u7a0b\u4e2d\uff0c\u8fd8\u6709\u4e00\u4e2a\u6982\u5ff5\u8981\u6ce8\u610f\uff0c\u90a3\u5c31\u662f\u4e24\u5e27\u4e4b\u95f4\u7684\u65f6\u95f4\u95f4\u9694\u5e27\u95f4\u9699\uff0c<strong>\u5e27\u95f4\u9699<\/strong>\uff08Inter-frame Gap, IFG\uff09\u662f\u6307\u4e24\u5e27\u6570\u636e\u4e4b\u95f4\u7684\u7a7a\u95f2\u65f6\u95f4\uff0c\u7528\u4e8e\u786e\u4fdd\u8bbe\u5907\u6709\u8db3\u591f\u7684\u65f6\u95f4\u5904\u7406\u5f53\u524d\u5e27\u5e76\u51c6\u5907\u63a5\u6536\u4e0b\u4e00\u5e27\uff0c\u907f\u514d\u53d1\u751f\u6570\u636e\u78b0\u649e\u6216\u5e72\u6270\u3002\u5e27\u95f4\u9699\u7684\u957f\u5ea6\u901a\u5e38\u4e3a 12 \u5b57\u8282\uff0896 \u4f4d\uff09\uff0c\u4f46\u968f\u7740\u7f51\u7edc\u901f\u7387\u7684\u63d0\u9ad8\uff0c\u7a7a\u95f2\u65f6\u95f4\u4f1a\u7f29\u77ed\uff1a\u5728 <strong>10Mbps<\/strong> \u7f51\u7edc\u4e2d\uff0c\u5e27\u95f4\u9699\u65f6\u95f4\u4e3a <strong>9600ns<\/strong>\uff1b\u5728 <strong>100Mbps<\/strong> \u7f51\u7edc\u4e2d\uff0c\u7a7a\u95f2\u65f6\u95f4\u4e3a <strong>960ns<\/strong>\uff1b\u800c\u5728 <strong>1000Mbps<\/strong>\uff081Gbps\uff09\u7f51\u7edc\u4e2d\uff0c\u7a7a\u95f2\u65f6\u95f4\u8fdb\u4e00\u6b65\u7f29\u77ed\u81f3 <strong>96ns<\/strong>\u3002\u5e27\u95f4\u9699\u6709\u52a9\u4e8e\u5728\u4e0d\u540c\u901f\u7387\u4e0b\u907f\u514d\u5e27\u4e4b\u95f4\u7684\u91cd\u53e0\uff0c\u4fdd\u8bc1\u6570\u636e\u4f20\u8f93\u7684\u987a\u7545\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>ARP \u534f\u8bae\uff1a<\/strong><\/h2>\n\n\n\n<p>ARP\uff08\u5730\u5740\u89e3\u6790\u534f\u8bae\uff09\u7684\u4f5c\u7528\u662f\u5c06\u7f51\u7edc\u5c42\u7684IP\u5730\u5740\u6620\u5c04\u5230\u6570\u636e\u94fe\u8def\u5c42\u7684MAC\u5730\u5740\u3002\u5f53\u8bbe\u5907\u9700\u8981\u4e0e\u7f51\u7edc\u4e2d\u7684\u5176\u4ed6\u8bbe\u5907\u901a\u4fe1\u65f6\uff0c\u5b83\u901a\u8fc7ARP\u534f\u8bae\u67e5\u8be2\u76ee\u6807IP\u5730\u5740\u5bf9\u5e94\u7684\u7269\u7406\u5730\u5740\uff08MAC\u5730\u5740\uff09\u3002\u5982\u679c\u6ca1\u6709\u627e\u5230\u5bf9\u5e94\u7684MAC\u5730\u5740\uff0c\u8bbe\u5907\u4f1a\u53d1\u9001ARP\u8bf7\u6c42\u8fdb\u884c\u5e7f\u64ad\uff0c\u76ee\u6807\u8bbe\u5907\u54cd\u5e94\u540e\uff0c\u6e90\u8bbe\u5907\u5c31\u80fd\u83b7\u53d6\u5e76\u7f13\u5b58\u8be5MAC\u5730\u5740\uff0c\u786e\u4fdd\u540e\u7eed\u901a\u4fe1\u80fd\u591f\u76f4\u63a5\u4f7f\u7528\u7269\u7406\u5730\u5740\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u3002<\/p>\n\n\n\n<p><strong>ARP\u7684\u5de5\u4f5c\u539f\u7406<\/strong>\uff1a<\/p>\n\n\n\n<p>ARP\u534f\u8bae\u5141\u8bb8\u8bbe\u5907\u6839\u636e\u5df2\u77e5\u7684IP\u5730\u5740\u6765\u67e5\u627e\u76ee\u6807\u8bbe\u5907\u7684\u7269\u7406\u5730\u5740\uff08MAC\u5730\u5740\uff09\u3002\u5176\u5de5\u4f5c\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>ARP\u8bf7\u6c42<\/strong>\uff1a\u5f53\u4e00\u4e2a\u8bbe\u5907\u9700\u8981\u901a\u8fc7IP\u5730\u5740\u4e0e\u7f51\u7edc\u4e2d\u7684\u53e6\u4e00\u8bbe\u5907\u901a\u4fe1\u65f6\uff0c\u9996\u5148\u5b83\u4f1a\u68c0\u67e5\u672c\u5730\u7684ARP\u7f13\u5b58\uff0c\u770b\u770b\u662f\u5426\u5df2\u7ecf\u5b58\u6709\u76ee\u6807IP\u5730\u5740\u5bf9\u5e94\u7684MAC\u5730\u5740\u3002\u5982\u679c\u6ca1\u6709\u627e\u5230\uff0c\u5b83\u5c31\u4f1a\u53d1\u51fa\u4e00\u4e2aARP\u8bf7\u6c42\uff0c\u8fd9\u4e2a\u8bf7\u6c42\u662f\u4e00\u4e2a\u5e7f\u64ad\u6d88\u606f\uff08MAC\u5730\u5740\u662f48\u2018hff_ff_ff_ff_ff_ff\uff09\uff0c\u53d1\u9001\u5230\u6574\u4e2a\u5c40\u57df\u7f51\u3002ARP\u8bf7\u6c42\u5305\u542b\u4e86\u76ee\u6807IP\u5730\u5740\u548c\u53d1\u9001\u8bbe\u5907\u7684IP\u53caMAC\u5730\u5740\u3002<\/li>\n\n\n\n<li><strong>ARP\u54cd\u5e94<\/strong>\uff1a\u5c40\u57df\u7f51\u4e2d\u6240\u6709\u7684\u8bbe\u5907\u90fd\u4f1a\u63a5\u6536\u5230\u8fd9\u4e2a\u8bf7\u6c42\uff0c\u4f46\u53ea\u6709\u76ee\u6807IP\u5730\u5740\u5339\u914d\u7684\u8bbe\u5907\u4f1a\u4f5c\u51fa\u54cd\u5e94\u3002\u54cd\u5e94\u5185\u5bb9\u5305\u62ec\u53d1\u9001\u8bbe\u5907\u7684MAC\u5730\u5740\uff0c\u8fd9\u6837\u6e90\u8bbe\u5907\u5c31\u80fd\u6839\u636e\u6536\u5230\u7684MAC\u5730\u5740\u4e0e\u76ee\u6807\u8bbe\u5907\u901a\u4fe1\u3002<\/li>\n\n\n\n<li><strong>\u7f13\u5b58<\/strong>\uff1a\u6536\u5230ARP\u54cd\u5e94\u540e\uff0c\u6e90\u8bbe\u5907\u4f1a\u5c06\u76ee\u6807IP\u5730\u5740\u4e0e\u5bf9\u5e94\u7684MAC\u5730\u5740\u5b58\u50a8\u5728\u672c\u5730ARP\u7f13\u5b58\u4e2d\uff0c\u4ee5\u4fbf\u4e0b\u6b21\u901a\u4fe1\u65f6\u65e0\u9700\u518d\u6b21\u8fdb\u884cARP\u8bf7\u6c42\u3002<\/li>\n\n\n\n<li><strong>\u8d85\u65f6\u673a\u5236<\/strong>\uff1aARP\u7f13\u5b58\u4e2d\u7684\u6761\u76ee\u4f1a\u6709\u4e00\u4e2a\u8fc7\u671f\u65f6\u95f4\uff0c\u901a\u5e38\u662f\u51e0\u5206\u949f\u3002\u5f53\u7f13\u5b58\u8fc7\u671f\u540e\uff0c\u6e90\u8bbe\u5907\u5fc5\u987b\u91cd\u65b0\u53d1\u8d77ARP\u8bf7\u6c42\u6765\u66f4\u65b0\u7f13\u5b58\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4e0b\u56fe\u4e3a\u4ee5\u592a\u7f51\u901a\u8fc7ARP \u4f20\u8f93\u5355\u5305\u7684\u6570\u636e\u5e27\u683c\u5f0f\uff0c\u4ee5\u592a\u7f51\u7684\u6570\u636e\u5305\u5c31\u662f\u5bf9\u534f\u8bae\u7684\u5c01\u88c5\u6765\u5b9e\u73b0\u6570\u636e\u7684\u4f20\u8f93\uff0c\u5373ARP \u6570\u636e\u4f4d\u4e8e\u4ee5\u592a\u7f51\u5e27\u683c\u5f0f\u7684\u6570\u636e\u6bb5\uff08\u56fe\u4e2d\u753b\u7ea2\u7ebf\u6846\u7684\u90e8\u5206\uff09\uff08ARP\u6570\u636e\u5305\u9700\u8981\u9075\u5faa\u4ee5\u592a\u7f51\u5e27\u683c\u5f0f\uff0c\u5e76\u4e14ARP\u6570\u636e\u662f28\u4e2a\u5b57\u8282\u7684\uff0c\u6570\u636e\u6bb5\u9700\u586b\u5145\u6ee1\u81f346\u4e2a\u5b57\u8282\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"293\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-3-1024x293.png\" alt=\"\" class=\"wp-image-11004\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-3-1024x293.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-3-300x86.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-3-768x220.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-3.png 1359w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>\u4e0b\u56fe\u662fARP\u6570\u636e\u5305\u683c\u5f0f\uff0c\u6570\u636e\u5305\u5b58\u5728\u4e8e\u4ee5\u592a\u7f51\u5e27\u7684\u6570\u636e\u6bb5\u90e8\u5206\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"304\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-2-1024x304.png\" alt=\"\" class=\"wp-image-11003\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-2-1024x304.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-2-300x89.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-2-768x228.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-2.png 1241w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">ARP\u6570\u636e\u5305\u7684\u5177\u4f53\u8bf4\u660e<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u786c\u4ef6\u7c7b\u578b\uff08Hardware Type\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u7528\u6765\u6807\u8bc6\u7269\u7406\u7f51\u7edc\u7c7b\u578b\u3002\u4ee5\u592a\u7f51\u7684\u786c\u4ef6\u7c7b\u578b\u4e3a <code>0x0001<\/code>\uff0c\u800c\u5bf9\u4e8e\u5176\u4ed6\u7f51\u7edc\u7c7b\u578b\u5982FDDI\u3001\u65e0\u7ebf\u7f51\u7edc\u7b49\uff0c\u786c\u4ef6\u7c7b\u578b\u4f1a\u4e0d\u540c\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u534f\u8bae\u7c7b\u578b\uff08Protocol Type\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u8868\u793a\u534f\u8bae\u7c7b\u578b\uff0c\u901a\u5e38\u662fIPv4 (<code>0x0800<\/code>)\u3002\u5982\u679c\u662fIPv6\uff0c\u5219\u662f <code>0x86DD<\/code>\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u786c\u4ef6\u5730\u5740\u957f\u5ea6\uff08Hardware Address Length\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u4e49\u786c\u4ef6\u5730\u5740\uff08MAC\u5730\u5740\uff09\u7684\u957f\u5ea6\u3002\u5728\u4ee5\u592a\u7f51\u4e2d\uff0cMAC\u5730\u5740\u7684\u957f\u5ea6\u662f6\u5b57\u8282\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u534f\u8bae\u5730\u5740\u957f\u5ea6\uff08Protocol Address Length\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u4e49\u534f\u8bae\u5730\u5740\uff08IP\u5730\u5740\uff09\u7684\u957f\u5ea6\u3002IPv4\u7684\u957f\u5ea6\u662f4\u5b57\u8282\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u64cd\u4f5c\u7801\uff08Operation\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>ARP\u8bf7\u6c42\uff080x0001\uff09<\/strong>\uff1a\u8868\u793a\u8bf7\u6c42\u76ee\u6807\u8bbe\u5907\u7684MAC\u5730\u5740\u3002<\/li>\n\n\n\n<li><strong>ARP\u54cd\u5e94\uff080x0002\uff09<\/strong>\uff1a\u8868\u793a\u56de\u590d\u76ee\u6807\u8bbe\u5907\u7684MAC\u5730\u5740\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u53d1\u9001\u65b9\u786c\u4ef6\u5730\u5740\uff08Sender Hardware Address\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u53d1\u9001\u65b9\u8bbe\u5907\u7684MAC\u5730\u5740\uff0c\u7528\u4e8e\u8bc6\u522b\u6e90\u8bbe\u5907\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u53d1\u9001\u65b9\u534f\u8bae\u5730\u5740\uff08Sender Protocol Address\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u53d1\u9001\u65b9\u8bbe\u5907\u7684IP\u5730\u5740\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u76ee\u6807\u786c\u4ef6\u5730\u5740\uff08Target Hardware Address\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u76ee\u6807\u8bbe\u5907\u7684MAC\u5730\u5740\u3002\u5728ARP\u8bf7\u6c42\u65f6\uff0c\u76ee\u6807\u786c\u4ef6\u5730\u5740\u901a\u5e38\u4e3a\u5168ff\uff0848\u2019hff_ff_ff_ff_ff_ff  \u5e7f\u64ad\u5730\u5740\uff09<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u76ee\u6807\u534f\u8bae\u5730\u5740\uff08Target Protocol Address\uff09<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u76ee\u6807\u8bbe\u5907\u7684IP\u5730\u5740\uff0c\u53d1\u9001\u65b9\u7528\u6765\u6307\u5b9a\u76ee\u6807\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">ARP\u8bf7\u6c42\u548c\u54cd\u5e94\u7684\u533a\u522b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ARP\u8bf7\u6c42<\/strong>\uff1a\u7528\u4e8e\u8bf7\u6c42\u67d0\u4e2aIP\u5730\u5740\u5bf9\u5e94\u7684MAC\u5730\u5740\u3002\u8bf7\u6c42\u6d88\u606f\u7684\u76ee\u6807\u786c\u4ef6\u5730\u5740\u5b57\u6bb5\u901a\u5e38\u8bbe\u7f6e\u4e3a\u51680\uff08\u56e0\u4e3a\u672a\u77e5\uff09\uff0c\u800c\u76ee\u6807\u534f\u8bae\u5730\u5740\u662f\u8bf7\u6c42\u7684IP\u5730\u5740\u3002<\/li>\n\n\n\n<li><strong>ARP\u54cd\u5e94<\/strong>\uff1a\u7528\u4e8e\u8fd4\u56deIP\u5730\u5740\u5bf9\u5e94\u7684MAC\u5730\u5740\u3002\u54cd\u5e94\u6d88\u606f\u4e2d\uff0c\u76ee\u6807\u786c\u4ef6\u5730\u5740\u586b\u5145\u4e3a\u53d1\u9001\u65b9\u7684MAC\u5730\u5740\uff0c\u800c\u53d1\u9001\u65b9\u786c\u4ef6\u5730\u5740\u5219\u662f\u63d0\u4f9bMAC\u5730\u5740\u7684\u8bbe\u5907\u7684\u5730\u5740\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>ARP\u7684\u4ee3\u7801\u6784\u6210\u5305\u62ec3\u4e2a\u90e8\u5206 arp arp_rx arp_tx\uff0c\u5177\u4f53\u5185\u5bb9\u5982\u4e0b\uff1a<\/strong><\/p>\n\n\n\n<p><strong>arp\u6a21\u5757\uff1a<\/strong>\u8d1f\u8d23\u4f8b\u5316 arp_tx  arp_rx  \u548ccrc\u6821\u9a8c\u4e09\u4e2a\u6a21\u5757<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/arp.v<br>module arp<br>#(<br>    parameter BOARD_MAC  = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP   = {8'd192,8'd168,8'd1,8'd10},    <br>    parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff,<br>    parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}<br>)<br>(<br>    input                rst_n      , \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>    \/\/GMII\u63a5\u53e3<br>    input                gmii_rx_clk, \/\/GMII\u63a5\u6536\u6570\u636e\u65f6\u949f<br>    input                gmii_rx_dv , \/\/GMII\u8f93\u5165\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    input        [7:0]   gmii_rxd   , \/\/GMII\u8f93\u5165\u6570\u636e<br>    input                gmii_tx_clk, \/\/GMII\u53d1\u9001\u6570\u636e\u65f6\u949f<br>    output               gmii_tx_en , \/\/GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    output       [7:0]   gmii_txd   , \/\/GMII\u8f93\u51fa\u6570\u636e          <br><br>    \/\/\u7528\u6237\u63a5\u53e3<br>    output               arp_rx_done, \/\/ARP\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>    output               arp_rx_type, \/\/ARP\u63a5\u6536\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    output       [47:0]  src_mac    , \/\/\u63a5\u6536\u5230\u76ee\u7684MAC\u5730\u5740<br>    output       [31:0]  src_ip     , \/\/\u63a5\u6536\u5230\u76ee\u7684IP\u5730\u5740    <br>    input                arp_tx_en  , \/\/ARP\u53d1\u9001\u4f7f\u80fd\u4fe1\u53f7<br>    input                arp_tx_type, \/\/ARP\u53d1\u9001\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    input        [47:0]  des_mac    , \/\/\u53d1\u9001\u7684\u76ee\u6807MAC\u5730\u5740<br>    input        [31:0]  des_ip     , \/\/\u53d1\u9001\u7684\u76ee\u6807IP\u5730\u5740<br>    output               tx_done      \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7    <br>    );<br><br>\/\/wire define<br>wire           crc_en  ; \/\/CRC\u5f00\u59cb\u6821\u9a8c\u4f7f\u80fd<br>wire           crc_clr ; \/\/CRC\u6570\u636e\u590d\u4f4d\u4fe1\u53f7 <br>wire   [7:0]   crc_d8  ; \/\/\u8f93\u5165\u5f85\u6821\u9a8c8\u4f4d\u6570\u636e<br>wire   [31:0]  crc_data; \/\/CRC\u6821\u9a8c\u6570\u636e<br>wire   [31:0]  crc_next; \/\/CRC\u4e0b\u6b21\u6821\u9a8c\u5b8c\u6210\u6570\u636e<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>assign  crc_d8 = gmii_txd;<br><br>\/\/ARP\u63a5\u6536\u6a21\u5757    <br>arp_rx <br>   #(<br>    .BOARD_MAC       (BOARD_MAC),         \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP        (BOARD_IP )<br>    )<br>   u_arp_rx(<br>    .clk             (gmii_rx_clk),<br>    .rst_n           (rst_n),<br><br>    .gmii_rx_dv      (gmii_rx_dv),<br>    .gmii_rxd        (gmii_rxd  ),<br>    .arp_rx_done     (arp_rx_done),<br>    .arp_rx_type     (arp_rx_type),<br>    .src_mac         (src_mac    ),<br>    .src_ip          (src_ip     )<br>    );                                           <br><br>\/\/ARP\u53d1\u9001\u6a21\u5757<br>arp_tx<br>   #(<br>    .BOARD_MAC       (BOARD_MAC),         \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP        (BOARD_IP ),<br>    .DES_MAC         (DES_MAC  ),<br>    .DES_IP          (DES_IP   )<br>    )<br>   u_arp_tx(<br>    .clk             (gmii_tx_clk),<br>    .rst_n           (rst_n),<br><br>    .arp_tx_en       (arp_tx_en ),<br>    .arp_tx_type     (arp_tx_type),<br>    .des_mac         (des_mac   ),<br>    .des_ip          (des_ip    ),<br>    .crc_data        (crc_data  ),<br>    .crc_next        (crc_next[31:24]),<br>    .tx_done         (tx_done   ),<br>    .gmii_tx_en      (gmii_tx_en),<br>    .gmii_txd        (gmii_txd  ),<br>    .crc_en          (crc_en    ),<br>    .crc_clr         (crc_clr   )<br>    );     <br><br>\/\/\u4ee5\u592a\u7f51\u53d1\u9001CRC\u6821\u9a8c\u6a21\u5757<br>crc32_d8   u_crc32_d8(<br>    .clk             (gmii_tx_clk),                      <br>    .rst_n           (rst_n      ),                          <br>    .data            (crc_d8     ),            <br>    .crc_en          (crc_en     ),                          <br>    .crc_clr         (crc_clr    ),                         <br>    .crc_data        (crc_data   ),                        <br>    .crc_next        (crc_next   )                         <br>    );<br><br>endmodule<br><\/pre>\n\n\n\n<p><strong>arp_rx.v\uff1a<\/strong><\/p>\n\n\n\n<p>arp_rx.v\u5b9e\u73b0\u4e86\u4e00\u4e2aARP\u63a5\u6536\u6a21\u5757\uff08<code>arp_rx<\/code>\uff09\uff0c\u5b83\u901a\u8fc7GMII\u63a5\u53e3\u63a5\u6536\u4ee5\u592a\u7f51\u6570\u636e\u5e27\uff0c\u5e76\u89e3\u6790\u5176\u4e2d\u7684ARP\u8bf7\u6c42\u548cARP\u5e94\u7b54\u6570\u636e\u3002\u6a21\u5757\u7684\u4e3b\u8981\u529f\u80fd\u662f\u6839\u636e\u4ee5\u592a\u7f51\u5e27\u7684\u683c\u5f0f\uff0c\u9010\u6b65\u63a5\u6536\u6570\u636e\u5e76\u89e3\u6790\u8bc6\u522b\u7f51\u7edc\u5e27\u662f\u5426\u662fARP\u534f\u8bae\uff0c\u5e76\u8fdb\u4e00\u6b65\u89e3\u6790ARP\u6570\u636e\u4e2d\u7684\u64cd\u4f5c\u7801\u3001\u6e90\u548c\u76ee\u6807MAC\u5730\u5740\u3001\u6e90\u548c\u76ee\u6807IP\u5730\u5740\u3002\u5982\u679c\u63a5\u6536\u5230\u7684ARP\u8bf7\u6c42\u6216\u5e94\u7b54\u4e2d\u7684\u76ee\u6807IP\u5730\u5740\u5339\u914d\u9884\u8bbe\u7684\u677f\u5361IP\u5730\u5740\uff0c\u5219\u6a21\u5757\u4f1a\u8f93\u51fa\u76f8\u5e94\u7684\u7ed3\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/arp_rx.v<br>module arp_rx<br>  #(<br>    parameter BOARD_MAC = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP = {8'd192,8'd168,8'd1,8'd10}      <br>    )<br>   (<br>    input                clk        , \/\/\u65f6\u949f\u4fe1\u53f7<br>    input                rst_n      , \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>                                    <br>    input                gmii_rx_dv , \/\/GMII\u8f93\u5165\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    input        [7:0]   gmii_rxd   , \/\/GMII\u8f93\u5165\u6570\u636e<br>    output  reg          arp_rx_done, \/\/ARP\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>    output  reg          arp_rx_type, \/\/ARP\u63a5\u6536\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    output  reg  [47:0]  src_mac    , \/\/\u63a5\u6536\u5230\u7684\u6e90MAC\u5730\u5740<br>    output  reg  [31:0]  src_ip       \/\/\u63a5\u6536\u5230\u7684\u6e90IP\u5730\u5740<br>    );<br><br>\/\/parameter define<br>localparam  st_idle     = 5'b0_0001; \/\/\u521d\u59cb\u72b6\u6001\uff0c\u7b49\u5f85\u63a5\u6536\u524d\u5bfc\u7801<br>localparam  st_preamble = 5'b0_0010; \/\/\u63a5\u6536\u524d\u5bfc\u7801\u72b6\u6001 <br>localparam  st_eth_head = 5'b0_0100; \/\/\u63a5\u6536\u4ee5\u592a\u7f51\u5e27\u5934<br>localparam  st_arp_data = 5'b0_1000; \/\/\u63a5\u6536ARP\u6570\u636e<br>localparam  st_rx_end   = 5'b1_0000; \/\/\u63a5\u6536\u7ed3\u675f<br><br>localparam  ETH_TPYE = 16'h0806;     \/\/\u4ee5\u592a\u7f51\u5e27\u7c7b\u578b ARP<br><br>\/\/reg define<br>reg    [4:0]   cur_state ;<br>reg    [4:0]   next_state;<br>                         <br>reg            skip_en   ; \/\/\u63a7\u5236\u72b6\u6001\u8df3\u8f6c\u4f7f\u80fd\u4fe1\u53f7<br>reg            error_en  ; \/\/\u89e3\u6790\u9519\u8bef\u4f7f\u80fd\u4fe1\u53f7<br>reg    [4:0]   cnt       ; \/\/\u89e3\u6790\u6570\u636e\u8ba1\u6570\u5668<br>reg    [47:0]  des_mac_t ; \/\/\u63a5\u6536\u5230\u7684\u76ee\u7684MAC\u5730\u5740<br>reg    [31:0]  des_ip_t  ; \/\/\u63a5\u6536\u5230\u7684\u76ee\u7684IP\u5730\u5740<br>reg    [47:0]  src_mac_t ; \/\/\u63a5\u6536\u5230\u7684\u6e90MAC\u5730\u5740<br>reg    [31:0]  src_ip_t  ; \/\/\u63a5\u6536\u5230\u7684\u6e90IP\u5730\u5740<br>reg    [15:0]  eth_type  ; \/\/\u4ee5\u592a\u7f51\u7c7b\u578b<br>reg    [15:0]  op_data   ; \/\/\u64cd\u4f5c\u7801<br>reg            rx_done_t ; \/\/ARP\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>\/\/(\u4e09\u6bb5\u5f0f\u72b6\u6001\u673a)\u540c\u6b65\u65f6\u5e8f\u63cf\u8ff0\u72b6\u6001\u8f6c\u79fb<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        cur_state &lt;= st_idle;  <br>    else<br>        cur_state &lt;= next_state;<br>end<br><br>\/\/\u7ec4\u5408\u903b\u8f91\u5224\u65ad\u72b6\u6001\u8f6c\u79fb\u6761\u4ef6<br>always @(*) begin<br>    next_state = st_idle;<br>    case(cur_state)<br>        st_idle : begin                     \/\/\u7b49\u5f85\u63a5\u6536\u524d\u5bfc\u7801<br>            if(skip_en) <br>                next_state = st_preamble;<br>            else<br>                next_state = st_idle;    <br>        end<br>        st_preamble : begin                 \/\/\u63a5\u6536\u524d\u5bfc\u7801<br>            if(skip_en) <br>                next_state = st_eth_head;<br>            else if(error_en) <br>                next_state = st_rx_end;    <br>            else<br>                next_state = st_preamble;   <br>        end<br>        st_eth_head : begin                 \/\/\u63a5\u6536\u4ee5\u592a\u7f51\u5e27\u5934<br>            if(skip_en) <br>                next_state = st_arp_data;<br>            else if(error_en) <br>                next_state = st_rx_end;<br>            else<br>                next_state = st_eth_head;   <br>        end  <br>        st_arp_data : begin                  \/\/\u63a5\u6536ARP\u6570\u636e<br>            if(skip_en)<br>                next_state = st_rx_end;<br>            else if(error_en)<br>                next_state = st_rx_end;<br>            else<br>                next_state = st_arp_data;   <br>        end                  <br>        st_rx_end : begin                   \/\/\u63a5\u6536\u7ed3\u675f<br>            if(skip_en)<br>                next_state = st_idle;<br>            else<br>                next_state = st_rx_end;          <br>        end<br>        default : next_state = st_idle;<br>    endcase                                          <br>end    <br><br>\/\/\u65f6\u5e8f\u7535\u8def\u63cf\u8ff0\u72b6\u6001\u8f93\u51fa,\u89e3\u6790\u4ee5\u592a\u7f51\u6570\u636e<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        skip_en &lt;= 1'b0;<br>        error_en &lt;= 1'b0;<br>        cnt &lt;= 5'd0;<br>        des_mac_t &lt;= 48'd0;<br>        des_ip_t &lt;= 32'd0;<br>        src_mac_t &lt;= 48'd0;<br>        src_ip_t &lt;= 32'd0;        <br>        eth_type &lt;= 16'd0;<br>        op_data &lt;= 16'd0;<br>        rx_done_t &lt;= 1'b0;<br>        arp_rx_type &lt;= 1'b0;<br>        src_mac &lt;= 48'd0;<br>        src_ip &lt;= 32'd0;<br>    end<br>    else begin<br>        skip_en &lt;= 1'b0;<br>        error_en &lt;= 1'b0;  <br>        rx_done_t &lt;= 1'b0;<br>        case(next_state)<br>            st_idle : begin                                  \/\/\u68c0\u6d4b\u5230\u7b2c\u4e00\u4e2a8'h55<br>                if((gmii_rx_dv == 1'b1) &amp;&amp; (gmii_rxd == 8'h55)) <br>                    skip_en &lt;= 1'b1;<br>            end<br>            st_preamble : begin<br>                if(gmii_rx_dv) begin                         \/\/\u89e3\u6790\u524d\u5bfc\u7801<br>                    cnt &lt;= cnt + 5'd1;<br>                    if((cnt &lt; 5'd6) &amp;&amp; (gmii_rxd != 8'h55))  \/\/7\u4e2a8'h55  <br>                        error_en &lt;= 1'b1;<br>                    else if(cnt==5'd6) begin<br>                        cnt &lt;= 5'd0;<br>                        if(gmii_rxd==8'hd5)                  \/\/1\u4e2a8'hd5<br>                            skip_en &lt;= 1'b1;<br>                        else<br>                            error_en &lt;= 1'b1;    <br>                    end  <br>                end  <br>            end<br>            st_eth_head : begin<br>                if(gmii_rx_dv) begin<br>                    cnt &lt;= cnt + 5'b1;<br>                    if(cnt &lt; 5'd6) <br>                        des_mac_t &lt;= {des_mac_t[39:0],gmii_rxd};<br>                    else if(cnt == 5'd6) begin<br>                        \/\/\u5224\u65adMAC\u5730\u5740\u662f\u5426\u4e3a\u5f00\u53d1\u677fMAC\u5730\u5740\u6216\u8005\u516c\u5171\u5730\u5740<br>                        if((des_mac_t != BOARD_MAC)<br>                            &amp;&amp; (des_mac_t != 48'hff_ff_ff_ff_ff_ff))           <br>                            error_en &lt;= 1'b1;<br>                    end<br>                    else if(cnt == 5'd12) <br>                        eth_type[15:8] &lt;= gmii_rxd;          \/\/\u4ee5\u592a\u7f51\u534f\u8bae\u7c7b\u578b<br>                    else if(cnt == 5'd13) begin<br>                        eth_type[7:0] &lt;= gmii_rxd;<br>                        cnt &lt;= 5'd0;<br>                        if(eth_type[15:8] == ETH_TPYE[15:8]  \/\/\u5224\u65ad\u662f\u5426\u4e3aARP\u534f\u8bae<br>                            &amp;&amp; gmii_rxd == ETH_TPYE[7:0])<br>                            skip_en &lt;= 1'b1; <br>                        else<br>                            error_en &lt;= 1'b1;                       <br>                    end        <br>                end  <br>            end<br>            st_arp_data : begin<br>                if(gmii_rx_dv) begin<br>                    cnt &lt;= cnt + 5'd1;<br>                    if(cnt == 5'd6) <br>                        op_data[15:8] &lt;= gmii_rxd;           \/\/\u64cd\u4f5c\u7801       <br>                    else if(cnt == 5'd7)<br>                        op_data[7:0] &lt;= gmii_rxd;<br>                    else if(cnt &gt;= 5'd8 &amp;&amp; cnt &lt; 5'd14)      \/\/\u6e90MAC\u5730\u5740<br>                        src_mac_t &lt;= {src_mac_t[39:0],gmii_rxd};<br>                    else if(cnt &gt;= 5'd14 &amp;&amp; cnt &lt; 5'd18)     \/\/\u6e90IP\u5730\u5740<br>                        src_ip_t&lt;= {src_ip_t[23:0],gmii_rxd};<br>                    else if(cnt &gt;= 5'd24 &amp;&amp; cnt &lt; 5'd28)     \/\/\u76ee\u6807IP\u5730\u5740<br>                        des_ip_t &lt;= {des_ip_t[23:0],gmii_rxd};<br>                    else if(cnt == 5'd28) begin<br>                        cnt &lt;= 5'd0;<br>                        if(des_ip_t == BOARD_IP) begin       \/\/\u5224\u65ad\u76ee\u7684IP\u5730\u5740\u548c\u64cd\u4f5c\u7801<br>                            if((op_data == 16'd1) || (op_data == 16'd2)) begin<br>                                skip_en &lt;= 1'b1;<br>                                rx_done_t &lt;= 1'b1;<br>                                src_mac &lt;= src_mac_t;<br>                                src_ip &lt;= src_ip_t;<br>                                src_mac_t &lt;= 48'd0;<br>                                src_ip_t &lt;= 32'd0;<br>                                des_mac_t &lt;= 48'd0;<br>                                des_ip_t &lt;= 32'd0;<br>                                if(op_data == 16'd1)         <br>                                    arp_rx_type &lt;= 1'b0;     \/\/ARP\u8bf7\u6c42<br>                                else<br>                                    arp_rx_type &lt;= 1'b1;     \/\/ARP\u5e94\u7b54<br>                            end<br>                            else<br>                                error_en &lt;= 1'b1;<br>                        end <br>                        else<br>                            error_en &lt;= 1'b1;<br>                    end<br>                end                                <br>            end<br>            st_rx_end : begin     <br>                cnt &lt;= 5'd0;<br>                \/\/\u5355\u5305\u6570\u636e\u63a5\u6536\u5b8c\u6210   <br>                if(gmii_rx_dv == 1'b0 &amp;&amp; skip_en == 1'b0)<br>                    skip_en &lt;= 1'b1; <br>            end    <br>            default : ;<br>        endcase                                                        <br>    end<br>end<br><br>\/\/\u8f93\u51faarp_rx_done\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        arp_rx_done &lt;= 1'b0;<br>    else<br>        arp_rx_done &lt;= rx_done_t;<br>end<br><br>endmodule<br><\/pre>\n\n\n\n<p><strong>arp_tx.v <\/strong>\uff1a<\/p>\n\n\n\n<p>\u8fd9\u6bb5\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2aARP\u5e27\u53d1\u9001\u529f\u80fd\uff0c\u8d1f\u8d23\u6784\u5efa\u548c\u53d1\u9001ARP\u8bf7\u6c42\u6216\u5e94\u7b54\u3002\u6a21\u5757\u901a\u8fc7\u72b6\u6001\u673a\u6765\u63a7\u5236\u53d1\u9001\u7684\u8fc7\u7a0b\uff0c\u4f9d\u6b21\u53d1\u9001\u524d\u5bfc\u7801\u3001\u4ee5\u592a\u7f51\u5e27\u5934\u3001ARP\u6570\u636e\u548cCRC\u6821\u9a8c\u5185\u5bb9\u3002<\/p>\n\n\n\n<p>\u6a21\u5757\u6839\u636e\u8f93\u5165\u7684\u4f7f\u80fd\u4fe1\u53f7 <code>arp_tx_en<\/code> \u542f\u52a8\u53d1\u9001\uff0c\u5e76\u901a\u8fc7\u72b6\u6001\u673a\u7ba1\u7406\u4e0d\u540c\u9636\u6bb5\u7684\u6570\u636e\u4f20\u8f93\u3002<\/p>\n\n\n\n<p>arp_tx_type\u4e3a\u9ad8\u7535\u5e73\uff0c\u8868\u793a\u53d1\u9001ARP\u5e94\u7b54\u6570\u636e\u5305\u3002ARP\u5e94\u7b54\u6570\u636e\u5305\u4e2d\u7684\u76ee\u7684MAC\u5730\u5740\u548c\u76ee\u7684IP\u5730\u5740\u4eceARP\u63a5\u6536\u6570\u636e\u5305\u4e2d\u83b7\u53d6\uff08\u53ef\u52a8\u6001\u66f4\u65b0\uff09<\/p>\n\n\n\n<p>\u53d1\u9001\u8fc7\u7a0b\u901a\u8fc7 <code>gmii_tx_en<\/code> \u548c <code>gmii_txd<\/code> \u63a7\u5236\uff0c\u6700\u540e\u901a\u8fc7 <code>tx_done<\/code> \u8f93\u51fa\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/arp_tx.v<br>module arp_tx<br>#(<br>    parameter BOARD_MAC  = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP   = {8'd192,8'd168,8'd1,8'd10},    <br>    parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff,<br>    parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}<br>)<br>( <br>    input                clk        , \/\/\u65f6\u949f\u4fe1\u53f7<br>    input                rst_n      , \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>    <br>    input                arp_tx_en  , \/\/ARP\u53d1\u9001\u4f7f\u80fd\u4fe1\u53f7<br>    input                arp_tx_type, \/\/ARP\u53d1\u9001\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    input        [47:0]  des_mac    , \/\/\u53d1\u9001\u7684\u76ee\u6807MAC\u5730\u5740<br>    input        [31:0]  des_ip     , \/\/\u53d1\u9001\u7684\u76ee\u6807IP\u5730\u5740<br>    input        [31:0]  crc_data   , \/\/CRC\u6821\u9a8c\u6570\u636e<br>    input         [7:0]  crc_next   , \/\/CRC\u4e0b\u6b21\u6821\u9a8c\u5b8c\u6210\u6570\u636e<br>    output  reg          tx_done    , \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>    output  reg          gmii_tx_en , \/\/GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    output  reg  [7:0]   gmii_txd   , \/\/GMII\u8f93\u51fa\u6570\u636e<br>    output  reg          crc_en     , \/\/CRC\u5f00\u59cb\u6821\u9a8c\u4f7f\u80fd<br>    output  reg          crc_clr      \/\/CRC\u6570\u636e\u590d\u4f4d\u4fe1\u53f7 <br>);<br><br>localparam  st_idle      = 5'b0_0001; \/\/\u521d\u59cb\u72b6\u6001\uff0c\u7b49\u5f85\u5f00\u59cb\u53d1\u9001\u4fe1\u53f7<br>localparam  st_preamble  = 5'b0_0010; \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>localparam  st_eth_head  = 5'b0_0100; \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u5e27\u5934<br>localparam  st_arp_data  = 5'b0_1000; \/\/<br>localparam  st_crc       = 5'b1_0000; \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br><br>localparam  ETH_TYPE     = 16'h0806 ; \/\/\u4ee5\u592a\u7f51\u5e27\u7c7b\u578b ARP\u534f\u8bae<br>localparam  HD_TYPE      = 16'h0001 ; \/\/\u786c\u4ef6\u7c7b\u578b \u4ee5\u592a\u7f51<br>localparam  PROTOCOL_TYPE= 16'h0800 ; \/\/\u4e0a\u5c42\u534f\u8bae\u4e3aIP\u534f\u8bae<br>\/\/\u4ee5\u592a\u7f51\u6570\u636e\u6700\u5c0f\u4e3a46\u4e2a\u5b57\u8282,\u4e0d\u8db3\u90e8\u5206\u586b\u5145\u6570\u636e<br>localparam  MIN_DATA_NUM = 16'd46   ;    <br><br>\/\/reg define<br>reg  [4:0]  cur_state     ;<br>reg  [4:0]  next_state    ;<br>                          <br>reg  [7:0]  preamble[7:0] ; \/\/\u524d\u5bfc\u7801+SFD<br>reg  [7:0]  eth_head[13:0]; \/\/\u4ee5\u592a\u7f51\u9996\u90e8<br>reg  [7:0]  arp_data[27:0]; \/\/ARP\u6570\u636e<br>                            <br>reg         tx_en_d0      ; \/\/arp_tx_en\u4fe1\u53f7\u5ef6\u65f6<br>reg         tx_en_d1      ; <br>reg         skip_en       ; \/\/\u63a7\u5236\u72b6\u6001\u8df3\u8f6c\u4f7f\u80fd\u4fe1\u53f7<br>reg  [5:0]  cnt           ; <br>reg  [4:0]  data_cnt      ; \/\/\u53d1\u9001\u6570\u636e\u4e2a\u6570\u8ba1\u6570\u5668<br>reg         tx_done_t     ; <br>                                <br>\/\/wire define                   <br>wire        pos_tx_en     ; \/\/arp_tx_en\u4fe1\u53f7\u4e0a\u5347\u6cbf<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>assign  pos_tx_en = (~tx_en_d1) &amp; tx_en_d0;<br>                           <br>\/\/\u5bf9arp_tx_en\u4fe1\u53f7\u5ef6\u65f6\u6253\u62cd\u4e24\u6b21,\u7528\u4e8e\u91c7arp_tx_en\u7684\u4e0a\u5347\u6cbf<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        tx_en_d0 &lt;= 1'b0;<br>        tx_en_d1 &lt;= 1'b0;<br>    end    <br>    else begin<br>        tx_en_d0 &lt;= arp_tx_en;<br>        tx_en_d1 &lt;= tx_en_d0;<br>    end<br>end <br><br>\/\/(\u4e09\u6bb5\u5f0f\u72b6\u6001\u673a)\u540c\u6b65\u65f6\u5e8f\u63cf\u8ff0\u72b6\u6001\u8f6c\u79fb<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        cur_state &lt;= st_idle;  <br>    else<br>        cur_state &lt;= next_state;<br>end<br><br>\/\/\u7ec4\u5408\u903b\u8f91\u5224\u65ad\u72b6\u6001\u8f6c\u79fb\u6761\u4ef6<br>always @(*) begin<br>    next_state = st_idle;<br>    case(cur_state)<br>        st_idle : begin                     \/\/\u7a7a\u95f2\u72b6\u6001<br>            if(skip_en)                <br>                next_state = st_preamble;<br>            else<br>                next_state = st_idle;<br>        end                          <br>        st_preamble : begin                 \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>            if(skip_en)<br>                next_state = st_eth_head;<br>            else<br>                next_state = st_preamble;      <br>        end<br>        st_eth_head : begin                 \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u9996\u90e8<br>            if(skip_en)<br>                next_state = st_arp_data;<br>            else<br>                next_state = st_eth_head;      <br>        end              <br>        st_arp_data : begin                 \/\/\u53d1\u9001ARP\u6570\u636e                      <br>            if(skip_en)<br>                next_state = st_crc;<br>            else<br>                next_state = st_arp_data;      <br>        end<br>        st_crc: begin                       \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br>            if(skip_en)<br>                next_state = st_idle;<br>            else<br>                next_state = st_crc;      <br>        end<br>        default : next_state = st_idle;   <br>    endcase<br>end                      <br><br>\/\/\u65f6\u5e8f\u7535\u8def\u63cf\u8ff0\u72b6\u6001\u8f93\u51fa\uff0c\u53d1\u9001\u4ee5\u592a\u7f51\u6570\u636e<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        skip_en &lt;= 1'b0; <br>        cnt &lt;= 6'd0;<br>        data_cnt &lt;= 5'd0;<br>        crc_en &lt;= 1'b0;<br>        gmii_tx_en &lt;= 1'b0;<br>        gmii_txd &lt;= 8'd0;<br>        tx_done_t &lt;= 1'b0; <br>        <br>        \/\/\u521d\u59cb\u5316\u6570\u7ec4    <br>        \/\/\u524d\u5bfc\u7801 7\u4e2a8'h55 + 1\u4e2a8'hd5 <br>        preamble[0] &lt;= 8'h55;                <br>        preamble[1] &lt;= 8'h55;<br>        preamble[2] &lt;= 8'h55;<br>        preamble[3] &lt;= 8'h55;<br>        preamble[4] &lt;= 8'h55;<br>        preamble[5] &lt;= 8'h55;<br>        preamble[6] &lt;= 8'h55;<br>        preamble[7] &lt;= 8'hd5;<br>        \/\/\u4ee5\u592a\u7f51\u5e27\u5934 <br>        eth_head[0] &lt;= DES_MAC[47:40];      \/\/\u76ee\u7684MAC\u5730\u5740<br>        eth_head[1] &lt;= DES_MAC[39:32];<br>        eth_head[2] &lt;= DES_MAC[31:24];<br>        eth_head[3] &lt;= DES_MAC[23:16];<br>        eth_head[4] &lt;= DES_MAC[15:8];<br>        eth_head[5] &lt;= DES_MAC[7:0];        <br>        eth_head[6] &lt;= BOARD_MAC[47:40];    \/\/\u6e90MAC\u5730\u5740<br>        eth_head[7] &lt;= BOARD_MAC[39:32];    <br>        eth_head[8] &lt;= BOARD_MAC[31:24];    <br>        eth_head[9] &lt;= BOARD_MAC[23:16];    <br>        eth_head[10] &lt;= BOARD_MAC[15:8];    <br>        eth_head[11] &lt;= BOARD_MAC[7:0];     <br>        eth_head[12] &lt;= ETH_TYPE[15:8];     \/\/\u4ee5\u592a\u7f51\u5e27\u7c7b\u578b<br>        eth_head[13] &lt;= ETH_TYPE[7:0];      <br>        \/\/ARP\u6570\u636e                           <br>        arp_data[0] &lt;= HD_TYPE[15:8];       \/\/\u786c\u4ef6\u7c7b\u578b<br>        arp_data[1] &lt;= HD_TYPE[7:0];<br>        arp_data[2] &lt;= PROTOCOL_TYPE[15:8]; \/\/\u4e0a\u5c42\u534f\u8bae\u7c7b\u578b<br>        arp_data[3] &lt;= PROTOCOL_TYPE[7:0];<br>        arp_data[4] &lt;= 8'h06;               \/\/\u786c\u4ef6\u5730\u5740\u957f\u5ea6,6<br>        arp_data[5] &lt;= 8'h04;               \/\/\u534f\u8bae\u5730\u5740\u957f\u5ea6,4<br>        arp_data[6] &lt;= 8'h00;               \/\/OP,\u64cd\u4f5c\u7801 8'h01\uff1aARP\u8bf7\u6c42 8'h02:ARP\u5e94\u7b54<br>        arp_data[7] &lt;= 8'h01;<br>        arp_data[8] &lt;= BOARD_MAC[47:40];    \/\/\u53d1\u9001\u7aef(\u6e90)MAC\u5730\u5740<br>        arp_data[9] &lt;= BOARD_MAC[39:32];<br>        arp_data[10] &lt;= BOARD_MAC[31:24];<br>        arp_data[11] &lt;= BOARD_MAC[23:16];<br>        arp_data[12] &lt;= BOARD_MAC[15:8];<br>        arp_data[13] &lt;= BOARD_MAC[7:0];<br>        arp_data[14] &lt;= BOARD_IP[31:24];    \/\/\u53d1\u9001\u7aef(\u6e90)IP\u5730\u5740<br>        arp_data[15] &lt;= BOARD_IP[23:16];<br>        arp_data[16] &lt;= BOARD_IP[15:8];<br>        arp_data[17] &lt;= BOARD_IP[7:0];<br>        arp_data[18] &lt;= DES_MAC[47:40];     \/\/\u63a5\u6536\u7aef(\u76ee\u7684)MAC\u5730\u5740<br>        arp_data[19] &lt;= DES_MAC[39:32];<br>        arp_data[20] &lt;= DES_MAC[31:24];<br>        arp_data[21] &lt;= DES_MAC[23:16];<br>        arp_data[22] &lt;= DES_MAC[15:8];<br>        arp_data[23] &lt;= DES_MAC[7:0];  <br>        arp_data[24] &lt;= DES_IP[31:24];      \/\/\u63a5\u6536\u7aef(\u76ee\u7684)IP\u5730\u5740<br>        arp_data[25] &lt;= DES_IP[23:16];<br>        arp_data[26] &lt;= DES_IP[15:8];<br>        arp_data[27] &lt;= DES_IP[7:0];<br>    end<br>    else begin<br>        skip_en &lt;= 1'b0;<br>        crc_en &lt;= 1'b0;<br>        gmii_tx_en &lt;= 1'b0;<br>        tx_done_t &lt;= 1'b0;<br>        case(next_state)<br>            st_idle : begin<br>                if(pos_tx_en) begin<br>                    skip_en &lt;= 1'b1;  <br>                    \/\/\u5982\u679c\u76ee\u6807MAC\u5730\u5740\u548cIP\u5730\u5740\u5df2\u7ecf\u66f4\u65b0,\u5219\u53d1\u9001\u6b63\u786e\u7684\u5730\u5740<br>                    if((des_mac != 48'b0) || (des_ip != 32'd0)) begin<br>                        eth_head[0] &lt;= des_mac[47:40];<br>                        eth_head[1] &lt;= des_mac[39:32];<br>                        eth_head[2] &lt;= des_mac[31:24];<br>                        eth_head[3] &lt;= des_mac[23:16];<br>                        eth_head[4] &lt;= des_mac[15:8];<br>                        eth_head[5] &lt;= des_mac[7:0];  <br>                        arp_data[18] &lt;= des_mac[47:40];<br>                        arp_data[19] &lt;= des_mac[39:32];<br>                        arp_data[20] &lt;= des_mac[31:24];<br>                        arp_data[21] &lt;= des_mac[23:16];<br>                        arp_data[22] &lt;= des_mac[15:8];<br>                        arp_data[23] &lt;= des_mac[7:0];  <br>                        arp_data[24] &lt;= des_ip[31:24];<br>                        arp_data[25] &lt;= des_ip[23:16];<br>                        arp_data[26] &lt;= des_ip[15:8];<br>                        arp_data[27] &lt;= des_ip[7:0];<br>                    end<br>                    if(arp_tx_type == 1'b0)<br>                        arp_data[7] &lt;= 8'h01;            \/\/ARP\u8bf7\u6c42 <br>                    else <br>                        arp_data[7] &lt;= 8'h02;            \/\/ARP\u5e94\u7b54<br>                end    <br>            end                                                                   <br>            st_preamble : begin                          \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>                gmii_tx_en &lt;= 1'b1;<br>                gmii_txd &lt;= preamble[cnt];<br>                if(cnt == 6'd7) begin                        <br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 1'b0;    <br>                end<br>                else    <br>                    cnt &lt;= cnt + 1'b1;                     <br>            end<br>            st_eth_head : begin                          \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u9996\u90e8<br>                gmii_tx_en &lt;= 1'b1;<br>                crc_en &lt;= 1'b1;<br>                gmii_txd &lt;= eth_head[cnt];<br>                if (cnt == 6'd13) begin<br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 1'b0;<br>                end    <br>                else    <br>                    cnt &lt;= cnt + 1'b1;    <br>            end                    <br>            st_arp_data : begin                          \/\/\u53d1\u9001ARP\u6570\u636e  <br>                crc_en &lt;= 1'b1;<br>                gmii_tx_en &lt;= 1'b1;<br>                \/\/\u81f3\u5c11\u53d1\u900146\u4e2a\u5b57\u8282<br>                if (cnt == MIN_DATA_NUM - 1'b1) begin    <br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 1'b0;<br>                    data_cnt &lt;= 1'b0;<br>                end    <br>                else    <br>                    cnt &lt;= cnt + 1'b1;  <br>                if(data_cnt &lt;= 6'd27) begin<br>                    data_cnt &lt;= data_cnt + 1'b1;<br>                    gmii_txd &lt;= arp_data[data_cnt];<br>                end    <br>                else<br>                    gmii_txd &lt;= 8'd0;                    \/\/Padding,\u586b\u51450<br>            end<br>            st_crc      : begin                          \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br>                gmii_tx_en &lt;= 1'b1;<br>                cnt &lt;= cnt + 1'b1;<br>                if(cnt == 6'd0)<br>                    gmii_txd &lt;= {~crc_next[0], ~crc_next[1], ~crc_next[2],~crc_next[3],<br>                                 ~crc_next[4], ~crc_next[5], ~crc_next[6],~crc_next[7]};<br>                else if(cnt == 6'd1)<br>                    gmii_txd &lt;= {~crc_data[16], ~crc_data[17], ~crc_data[18],<br>                                 ~crc_data[19], ~crc_data[20], ~crc_data[21], <br>                                 ~crc_data[22],~crc_data[23]};<br>                else if(cnt == 6'd2) begin<br>                    gmii_txd &lt;= {~crc_data[8], ~crc_data[9], ~crc_data[10],<br>                                 ~crc_data[11],~crc_data[12], ~crc_data[13], <br>                                 ~crc_data[14],~crc_data[15]};                              <br>                end<br>                else if(cnt == 6'd3) begin<br>                    gmii_txd &lt;= {~crc_data[0], ~crc_data[1], ~crc_data[2],~crc_data[3],<br>                                 ~crc_data[4], ~crc_data[5], ~crc_data[6],~crc_data[7]};  <br>                    tx_done_t &lt;= 1'b1;<br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 1'b0;<br>                end                                                                                                                                            <br>            end                          <br>            default :;  <br>        endcase                                             <br>    end<br>end            <br><br>\/\/\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7\u53cacrc\u503c\u590d\u4f4d\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        tx_done &lt;= 1'b0;<br>        crc_clr &lt;= 1'b0;<br>    end<br>    else begin<br>        tx_done &lt;= tx_done_t;<br>        crc_clr &lt;= tx_done_t;<br>    end<br>end<br><br>endmodule<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001UDP\u6a21\u5757\u8bbe\u8ba1<\/strong><\/h2>\n\n\n\n<p>UDP\uff08\u7528\u6237\u6570\u636e\u62a5\u534f\u8bae\uff09\u662f\u4e00\u79cd\u65e0\u8fde\u63a5\u7684\u4f20\u8f93\u5c42\u534f\u8bae\uff0c\u4e3b\u8981\u7528\u4e8e\u9700\u8981\u9ad8\u901f\u4f20\u8f93\u4f46\u5bf9\u53ef\u9760\u6027\u8981\u6c42\u8f83\u4f4e\u7684\u573a\u666f\u3002\u4e0eTCP\u4e0d\u540c\uff0c<strong>UDP\u4e0d\u5efa\u7acb\u8fde\u63a5\u3001\u4e0d\u8fdb\u884c\u6570\u636e\u91cd\u4f20\u548c\u987a\u5e8f\u63a7\u5236<\/strong>\uff0c\u56e0\u6b64\u53ef\u4ee5\u51cf\u5c11\u5ef6\u8fdf\u548c\u63d0\u9ad8\u4f20\u8f93\u6548\u7387\u3002\u5b83\u5c06\u6570\u636e\u5206\u4e3a\u72ec\u7acb\u7684\u201c\u6570\u636e\u62a5\u201d\u8fdb\u884c\u53d1\u9001\uff0c\u6bcf\u4e2a\u6570\u636e\u62a5\u5305\u542b\u5b8c\u6574\u7684\u76ee\u6807\u4fe1\u606f\uff0c\u5305\u62ec\u76ee\u6807IP\u5730\u5740\u548c\u7aef\u53e3\u53f7\u3002\u7531\u4e8e\u5176\u7b80\u5355\u7684\u534f\u8bae\u7ed3\u6784\uff0cUDP\u9002\u7528\u4e8e\u5b9e\u65f6\u6027\u8981\u6c42\u8f83\u9ad8\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u89c6\u9891\u6d41\u3001\u8bed\u97f3\u901a\u4fe1\u3001\u5728\u7ebf\u6e38\u620f\u7b49\u3002<\/p>\n\n\n\n<p>UDP\u7684\u4e3b\u8981\u7279\u70b9\u662f\u6ca1\u6709\u63e1\u624b\u8fc7\u7a0b\uff0c\u6570\u636e\u4f20\u8f93\u4e0d\u4fdd\u8bc1\u53ef\u9760\u6027\u548c\u987a\u5e8f\uff0c\u4e14\u6ca1\u6709\u6d41\u91cf\u63a7\u5236\u6216\u62e5\u585e\u63a7\u5236\u3002\u867d\u7136\u8fd9\u79cd\u8bbe\u8ba1\u4f7f\u5f97UDP\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f20\u8f93\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u4e5f\u610f\u5473\u7740\u5982\u679c\u6570\u636e\u5728\u4f20\u8f93\u8fc7\u7a0b\u4e2d\u4e22\u5931\u6216\u51fa\u73b0\u9519\u8bef\uff0c\u63a5\u6536\u65b9\u4e0d\u4f1a\u6536\u5230\u4efb\u4f55\u901a\u77e5\u3002\u56e0\u6b64\uff0c\u5e94\u7528\u7a0b\u5e8f\u9700\u8981\u81ea\u884c\u5904\u7406\u4e22\u5305\u548c\u9519\u8bef\u6821\u9a8c\uff0c\u901a\u5e38\u9002\u7528\u4e8e\u5bf9\u4e22\u5931\u5c11\u91cf\u6570\u636e\u4e0d\u654f\u611f\u7684\u5e94\u7528\u3002<\/p>\n\n\n\n<p>\u4e0b\u56fe\u662fUDP \u7684\u6570\u636e\u4f20\u8f93\u5305\u683c\u5f0f\uff08\u56fe\u7247\u6765\u81ea\u6b63\u70b9\u539f\u5b50FPGA\u90e8\u5206\u8d44\u6599\uff09\uff0c\u4ece\u56fe\u4e2d\u53ef\u4ee5\u770b\u51fa UDP\u6570\u636e\u5305\u548c\u6211\u4eec\u4e4b\u524d\u7684ARP\u6570\u636e\u5305\u6709\u5f88\u591a\u76f8\u4f3c\u7684\u5730\u65b9\uff08\u90fd\u5305\u542b\u524d\u5bfc\u7801\uff0cFSD\uff0c\u4ee5\u592a\u7f51\u5e27\u5934\uff0c\u6570\u636e\u6bb5\u4ee5\u53caFCS\u6821\u9a8c\u90e8\u5206\uff09\u533a\u522b\u5728\u4e8e\u6570\u636e\u6bb5\u7684\u5185\u5bb9\u6709\u6240\u4e0d\u540c\u3002\u4ece\u56fe\u4e2d\u6211\u4eec\u8fd8\u80fd\u770b\u51fa\u4ece\u56fe\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c\u4ee5\u592a\u7f51\u7684\u6570\u636e\u5305\u5c31\u662f\u5bf9\u5404\u5c42\u534f\u8bae\u7684\u9010\u5c42\u5c01\u88c5\u6765\u5b9e\u73b0\u6570\u636e\u7684\u4f20\u8f93\u3002\u7528\u6237\u6570\u636e\u6253\u5305\u5728UDP\u534f\u8bae\u4e2d\uff0cUDP\u534f\u8bae\u53c8\u662f\u57fa\u4e8eIP\u534f\u8bae\u4e4b\u4e0a\u7684\uff0cIP\u534f\u8bae\u53c8\u662f\u8d70MAC\u5c42\u53d1\u9001\u7684\uff0c\u5373\u4ece\u5305\u542b\u5173\u7cfb\u6765\u8bf4\uff1aMAC\u5e27\u4e2d\u7684\u6570\u636e\u6bb5\u4e3aIP\u6570\u636e\u62a5\uff0cIP\u62a5\u6587\u4e2d\u7684\u6570\u636e\u6bb5\u4e3aUDP\u62a5\u6587\uff0cUDP\u62a5\u6587\u4e2d\u7684\u6570\u636e\u6bb5\u4e3a\u7528\u6237\u5e0c\u671b\u4f20\u8f93\u7684\u6570\u636e\u5185\u5bb9\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-4-1024x443.png\" alt=\"\" class=\"wp-image-11012\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-4-1024x443.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-4-300x130.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-4-768x332.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-4.png 1512w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>\u56e0\u4e3aUDP\u534f\u8bae\u5305\u5c5e\u4e8eIP\u534f\u8bae\u5305\u7684\u4e00\u79cd\uff0c\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u7b80\u5355\u4ecb\u7ecd\u4e0bIP\u534f\u8bae\u5305\u7684\u6570\u636e\u62a5\u90e8\u5206\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"420\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5-1024x420.png\" alt=\"\" class=\"wp-image-11015\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5-1024x420.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5-300x123.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5-768x315.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5-1536x630.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-5.png 1647w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>IP\u6570\u636e\u5305\u7684\u7ed3\u6784<\/strong><\/h3>\n\n\n\n<p>IP\u6570\u636e\u5305\u4e3b\u8981\u7531\u4e24\u4e2a\u90e8\u5206\u7ec4\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IP\u9996\u90e8\uff08IP Header\uff09<\/strong><\/li>\n\n\n\n<li><strong>\u6570\u636e\u90e8\u5206\uff08Payload\uff09<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>IP\u5934\u90e8\u7ed3\u6784<\/strong><\/h4>\n\n\n\n<p>IP\u5934\u90e8\u5305\u542b\u4e86\u8def\u7531\u3001\u76ee\u6807\u5730\u5740\u7b49\u4fe1\u606f\uff0c\u901a\u5e38\u5305\u62ec\u4ee5\u4e0b\u51e0\u4e2a\u5b57\u6bb5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u6bb5<\/th><th>\u957f\u5ea6<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td><strong>\u7248\u672c\uff08Version\uff09<\/strong><\/td><td>4 bits<\/td><td>IP\u534f\u8bae\u7684\u7248\u672c\uff0cIPv4\u4e3a4\uff0cIPv6\u4e3a6<\/td><\/tr><tr><td><strong>\u9996\u90e8\u957f\u5ea6\uff08IHL\uff09<\/strong><\/td><td>4 bits<\/td><td>IP\u9996\u90e8\u7684\u957f\u5ea6\uff0c\u5355\u4f4d\u662f32\u4f4d\uff084\u5b57\u8282\uff09\uff0c\u5373\u6709\u591a\u5c11\u4e2a32\u4f4d\uff0c\u56e0\u4e3a\u9996\u90e8\u957f\u5ea6\u662f4bits\u7684\u53730-15\uff0c\u6240\u4ee5\u9996\u90e8\u6700\u592716&#215;4=64\u5b57\u8282<\/td><\/tr><tr><td><strong>\u670d\u52a1\u7c7b\u578b\uff08Type of Service\uff09<\/strong><\/td><td>8 bits<\/td><td>\u63a7\u5236\u670d\u52a1\u8d28\u91cf\u7684\u5b57\u6bb5\uff0c\u5728\u65e7\u6807\u51c6\u4e2d\u53eb\u505a\u670d\u52a1\u7c7b\u578b<strong>\uff08\u73b0\u5728\u57fa\u672c\u4e0d\u9002\u7528\uff09<\/strong><\/td><\/tr><tr><td><strong>\u603b\u957f\u5ea6\uff08Total Length\uff09<\/strong><\/td><td>16 bits<\/td><td>\u5305\u62ec\u9996\u90e8\u548c\u6570\u636e\u7684\u603b\u957f\u5ea6\uff08\u5355\u4f4d\u662f\u5b57\u8282\uff09\u536016bits \u56e0\u6b64\u6570\u636e\u62a5\u7684\u6700\u5927\u957f\u5ea6\u4e3a 65535 \u5b57\u8282.\u603b\u957f\u5ea6\u5fc5\u987b\u4e0d\u8d85\u8fc7\u6700\u5927\u4f20\u9001\u5355\u5143 MTU<\/td><\/tr><tr><td><strong>\u6807\u8bc6\u7b26\uff08Identification\uff09<\/strong><\/td><td>16 bits<\/td><td>\u6570\u636e\u5305\u7684\u6807\u8bc6\u7b26\uff0c\u5b83\u662f\u4e00\u4e2a\u8ba1\u6570\u5668,\u7528\u6765\u4ea7\u751f\u6570\u636e\u62a5\u7684\u6807\u8bc6<\/td><\/tr><tr><td><strong>\u6807\u5fd7\uff08Flags\uff09<\/strong><\/td><td>3 bits<\/td><td>\u5206\u7247\u63a7\u5236\u6807\u5fd7\uff0c3\u4f4d\u6807\u5fd7\uff08Flags\uff09\u5b57\u6bb5\uff0c\u7b2c1\u4f4d\u4e3a\u4fdd\u7559\u4f4d\uff1b\u7b2c2\u4f4d\u8868\u793a\u7981\u6b62\u5206\u7247\uff081\u8868\u793a\u4e0d\u5206\u7247 0\uff1a\u5141\u8bb8\u5206\u7247\uff09\uff1b\u7b2c3\u4f4d\u6807\u8bc6\u66f4\u591a\u5206\u7247\uff08\u9664\u4e86\u6570\u636e\u62a5\u7684\u6700\u540e\u4e00\u4e2a\u5206\u7247\u5916\uff0c\u5176\u5b83\u5206\u7247\u90fd\u4e3a1\uff09<\/td><\/tr><tr><td><strong>\u7247\u504f\u79fb\uff08Fragment Offset\uff09<\/strong><\/td><td>13 bits<\/td><td>\u6570\u636e\u5305\u5206\u7247\u7684\u4f4d\u7f6e\u504f\u79fb\uff0c\u5728\u63a5\u6536\u65b9\u8fdb\u884c\u6570\u636e\u62a5\u91cd\u7ec4\u65f6\u7528\u6765\u6807\u8bc6\u5206\u7247\u7684\u987a\u5e8f<\/td><\/tr><tr><td><strong>\u751f\u5b58\u65f6\u95f4\uff08TTL\uff09<\/strong><\/td><td>8 bits<\/td><td>\u6570\u636e\u62a5\u5728\u7f51\u7edc\u4e2d\u53ef\u901a\u8fc7\u7684\u8def\u7531\u5668\u6570\u7684\u6700\u5927\u503c<\/td><\/tr><tr><td><strong>\u534f\u8bae\uff08Protocol\uff09<\/strong><\/td><td>8 bits<\/td><td>\u4e0a\u5c42\u534f\u8bae\uff081\u8868\u793a\u4e3a ICMP \u534f\u8bae, 2\u8868\u793a\u4e3a IGMP \u534f\u8bae, 6\u8868\u793a\u4e3a TCP \u534f\u8bae, 17\u8868\u793a\u4e3a UDP \u534f\u8bae\uff09<\/td><\/tr><tr><td><strong>\u5934\u90e8\u6821\u9a8c\u548c\uff08Header Checksum\uff09<\/strong><\/td><td>16 bits<\/td><td>\u6821\u9a8c\u548c\uff0c\u7528\u4e8e\u68c0\u67e5\u5934\u90e8\u9519\u8bef\uff08\u4e0d\u5305\u542b\u6570\u636e\u90e8\u5206\uff09<\/td><\/tr><tr><td><strong>\u6e90IP\u5730\u5740\uff08Source Address\uff09<\/strong><\/td><td>32 bits<\/td><td>\u53d1\u9001\u7aef\u7684IP\u5730\u5740<\/td><\/tr><tr><td><strong>\u76ee\u6807IP\u5730\u5740\uff08Destination Address\uff09<\/strong><\/td><td>32 bits<\/td><td>\u63a5\u6536\u7aef\u7684IP\u5730\u5740<\/td><\/tr><tr><td><strong>\u9009\u9879\uff08Options\uff09<\/strong><\/td><td>\u53ef\u53d8\u957f\u5ea6<\/td><td>\u53ef\u9009\u5b57\u6bb5\uff0c\u901a\u5e38\u4e0d\u5e38\u7528<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>IP\u6570\u636e\u5305\u7684\u6570\u636e\u90e8\u5206<\/strong>\uff08\u5373IP\u7684\u8d1f\u8f7d\uff09<\/p>\n\n\n\n<p>\u5728\u4e0d\u540c\u7684\u534f\u8bae\u60c5\u51b5\u4e0b\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u5bf9\u4e8eUDP\u7684\u60c5\u51b5\uff0c\u8fd9\u4e2a\u6570\u636e\u90e8\u5206\u786e\u5b9e\u662f<strong>UDP\u6570\u636e\u5305<\/strong>\u672c\u8eab\u3002UDP\u6570\u636e\u5305\u5305\u542b\u4e86\u5b83\u81ea\u5df1\u7684\u5934\u90e8\u548c\u6570\u636e\u90e8\u5206\u3002<\/p>\n\n\n\n<p><strong>\u6570\u636e\u90e8\u5206<\/strong>\u53ef\u4ee5\u662f\u4efb\u4f55\u9700\u8981\u901a\u8fc7\u7f51\u7edc\u4f20\u8f93\u7684\u6570\u636e\uff08\u8fd9\u5305\u62ec\u4f46\u4e0d\u9650\u4e8eUDP\u5305\u3001TCP\u5305\u3001ICMP\u5305\u7b49\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>UDP\u6570\u636e\u5305\u7684\u7ed3\u6784<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"323\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6-1024x323.png\" alt=\"\" class=\"wp-image-11026\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6-1024x323.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6-300x94.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6-768x242.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6-1536x484.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-6.png 1686w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>UDP\u6570\u636e\u5305\u76f8\u5bf9\u4e8eIP\u6570\u636e\u5305\u8f83\u4e3a\u7b80\u5355\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u90e8\u5206\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u6bb5<\/th><th>\u957f\u5ea6<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td><strong>\u6e90\u7aef\u53e3\uff08Source Port\uff09<\/strong><\/td><td>16 bits<\/td><td>\u6e90\u7aef\u53e3\u53f7<\/td><\/tr><tr><td><strong>\u76ee\u6807\u7aef\u53e3\uff08Destination Port\uff09<\/strong><\/td><td>16 bits<\/td><td>\u76ee\u6807\u7aef\u53e3\u53f7<\/td><\/tr><tr><td><strong>\u957f\u5ea6\uff08Length\uff09<\/strong><\/td><td>16 bits<\/td><td>UDP\u6570\u636e\u90e8\u5206\u7684\u957f\u5ea6\uff08\u5305\u542bUDP\u9996\u90e8\u957f\u5ea6+\u6570\u636e\u957f\u5ea6\uff0c\u5355\u4f4d\u662f\u5b57\u8282\uff08byte\uff09\uff09<\/td><\/tr><tr><td><strong>\u6821\u9a8c\u548c\uff08Checksum\uff09<\/strong><\/td><td>16 bits<\/td><td>\u6821\u9a8c\u548c\uff0c\u7528\u4e8e\u68c0\u6d4b\u6570\u636e\u662f\u5426\u6b63\u786e<\/td><\/tr><tr><td><strong>\u6570\u636e\uff08Data\uff09<\/strong><\/td><td>\u53ef\u53d8<\/td><td>\u5b9e\u9645\u4f20\u8f93\u7684\u5e94\u7528\u6570\u636e<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>UDP\u7684\u4ee3\u7801\u6784\u6210\u5305\u62ec3\u4e2a\u90e8\u5206 udp\u9876\u5c42\u6a21\u5757\uff0cudp_rx   udp_tx\uff0ccrc\u6821\u9a8c\u6a21\u5757\uff0c\u5177\u4f53\u5185\u5bb9\u5982\u4e0b\uff1a<\/strong><\/p>\n\n\n\n<p><strong>udp\u9876\u5c42\u6a21\u5757\uff1a<\/strong>\u8d1f\u8d23\u4f8b\u5316 udp_tx, udp_rx \u548ccrc\u6821\u9a8c\u4e09\u4e2a\u6a21\u5757<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">module udp<br>#(<br>    parameter BOARD_MAC  = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP   = {8'd192,8'd168,8'd1,8'd10},    <br>    parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff,<br>    parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}<br>)<br>(<br>    input                rst_n       , \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>    \/\/GMII\u63a5\u53e3<br>    input                gmii_rx_clk , \/\/GMII\u63a5\u6536\u6570\u636e\u65f6\u949f<br>    input                gmii_rx_dv  , \/\/GMII\u8f93\u5165\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    input        [7:0]   gmii_rxd    , \/\/GMII\u8f93\u5165\u6570\u636e<br>    input                gmii_tx_clk , \/\/GMII\u53d1\u9001\u6570\u636e\u65f6\u949f    <br>    output               gmii_tx_en  , \/\/GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    output       [7:0]   gmii_txd    , \/\/GMII\u8f93\u51fa\u6570\u636e <br>    \/\/\u7528\u6237\u63a5\u53e3<br>    output               rec_pkt_done, \/\/\u4ee5\u592a\u7f51\u5355\u5305\u6570\u636e\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>    output               rec_en      , \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6570\u636e\u4f7f\u80fd\u4fe1\u53f7<br>    output       [31:0]  rec_data    , \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6570\u636e<br>    output       [15:0]  rec_byte_num, \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6709\u6548\u5b57\u8282\u6570 \u5355\u4f4d:byte     <br>    input                tx_start_en , \/\/\u4ee5\u592a\u7f51\u5f00\u59cb\u53d1\u9001\u4fe1\u53f7<br>    input        [31:0]  tx_data     , \/\/\u4ee5\u592a\u7f51\u5f85\u53d1\u9001\u6570\u636e  <br>    input        [15:0]  tx_byte_num , \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u7684\u6709\u6548\u5b57\u8282\u6570 \u5355\u4f4d:byte  <br>    input        [47:0]  des_mac     , \/\/\u53d1\u9001\u7684\u76ee\u6807MAC\u5730\u5740<br>    input        [31:0]  des_ip      , \/\/\u53d1\u9001\u7684\u76ee\u6807IP\u5730\u5740    <br>    output               tx_done     , \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>    output               tx_req        \/\/\u8bfb\u6570\u636e\u8bf7\u6c42\u4fe1\u53f7    <br>    );<br><br>\/\/wire define<br>wire          crc_en  ; \/\/CRC\u5f00\u59cb\u6821\u9a8c\u4f7f\u80fd<br>wire          crc_clr ; \/\/CRC\u6570\u636e\u590d\u4f4d\u4fe1\u53f7 <br>wire  [7:0]   crc_d8  ; \/\/\u8f93\u5165\u5f85\u6821\u9a8c8\u4f4d\u6570\u636e<br><br>wire  [31:0]  crc_data; \/\/CRC\u6821\u9a8c\u6570\u636e<br>wire  [31:0]  crc_next; \/\/CRC\u4e0b\u6b21\u6821\u9a8c\u5b8c\u6210\u6570\u636e<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>assign  crc_d8 = gmii_txd;<br><br>\/\/\u4ee5\u592a\u7f51\u63a5\u6536\u6a21\u5757    <br>udp_rx <br>   #(<br>    .BOARD_MAC       (BOARD_MAC),         \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP        (BOARD_IP )<br>    )<br>   u_udp_rx(<br>    .clk             (gmii_rx_clk ),        <br>    .rst_n           (rst_n       ),             <br>    .gmii_rx_dv      (gmii_rx_dv  ),                                 <br>    .gmii_rxd        (gmii_rxd    ),       <br>    .rec_pkt_done    (rec_pkt_done),      <br>    .rec_en          (rec_en      ),            <br>    .rec_data        (rec_data    ),          <br>    .rec_byte_num    (rec_byte_num)       <br>    );                                    <br><br>\/\/\u4ee5\u592a\u7f51\u53d1\u9001\u6a21\u5757<br>udp_tx<br>   #(<br>    .BOARD_MAC       (BOARD_MAC),         \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP        (BOARD_IP ),<br>    .DES_MAC         (DES_MAC  ),<br>    .DES_IP          (DES_IP   )<br>    )<br>   u_udp_tx(<br>    .clk             (gmii_tx_clk),        <br>    .rst_n           (rst_n      ),             <br>    .tx_start_en     (tx_start_en),                   <br>    .tx_data         (tx_data    ),           <br>    .tx_byte_num     (tx_byte_num),    <br>    .des_mac         (des_mac    ),<br>    .des_ip          (des_ip     ),    <br>    .crc_data        (crc_data   ),          <br>    .crc_next        (crc_next[31:24]),<br>    .tx_done         (tx_done    ),           <br>    .tx_req          (tx_req     ),            <br>    .gmii_tx_en      (gmii_tx_en ),         <br>    .gmii_txd        (gmii_txd   ),       <br>    .crc_en          (crc_en     ),            <br>    .crc_clr         (crc_clr    )            <br>    );                                      <br><br>\/\/\u4ee5\u592a\u7f51\u53d1\u9001CRC\u6821\u9a8c\u6a21\u5757<br>crc32_d8   u_crc32_d8(<br>    .clk             (gmii_tx_clk),                      <br>    .rst_n           (rst_n      ),                          <br>    .data            (crc_d8     ),            <br>    .crc_en          (crc_en     ),                          <br>    .crc_clr         (crc_clr    ),                         <br>    .crc_data        (crc_data   ),                        <br>    .crc_next        (crc_next   )                         <br>    );<br><br>endmodule<\/pre>\n\n\n\n<p><strong>udp_rx<\/strong> \u6a21\u5757\uff1a<\/p>\n\n\n\n<p>\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8e <strong>GMII \u63a5\u53e3\u7684 UDP \u6570\u636e\u63a5\u6536\u4e0e\u89e3\u6790\u7535\u8def<\/strong>\u3002\u5b83\u91c7\u7528\u4e09\u6bb5\u5f0f\u6709\u9650\u72b6\u6001\u673a\uff0c\u4ece\u4ee5\u592a\u7f51\u524d\u5bfc\u7801\u5f00\u59cb\uff0c\u4f9d\u6b21\u89e3\u6790 <strong>\u4ee5\u592a\u7f51\u5e27\u5934\u3001IP \u9996\u90e8\u3001UDP \u9996\u90e8<\/strong>\uff0c\u5e76\u6821\u9a8c\u76ee\u7684 <strong>MAC \u5730\u5740\u3001IP \u5730\u5740\u4ee5\u53ca\u534f\u8bae\u7c7b\u578b<\/strong> \u662f\u5426\u4e0e\u672c\u673a\u53c2\u6570\u5339\u914d\uff1b\u82e5\u5339\u914d\u5219\u7ee7\u7eed\u63a5\u6536 UDP \u8d1f\u8f7d\u6570\u636e\uff0c\u5426\u5219\u4e22\u5f03\u8be5\u5e27\u3002\u63a5\u6536\u8fc7\u7a0b\u4e2d\u5c06 <strong>8 bit GMII \u6570\u636e\u62fc\u63a5\u6210 32 bit \u6570\u636e\u8f93\u51fa<\/strong>\uff0c\u901a\u8fc7 <code>rec_en<\/code> \u6307\u793a\u6570\u636e\u6709\u6548\uff0c\u901a\u8fc7 <code>rec_pkt_done<\/code> \u8868\u793a\u4e00\u5e27 UDP \u6570\u636e\u63a5\u6536\u5b8c\u6210\uff0c\u5e76\u5728 <code>rec_byte_num<\/code> \u4e2d\u7ed9\u51fa\u6709\u6548\u5b57\u8282\u6570\u3002<strong>\u5373\u5728\u786c\u4ef6\u4e2d\u4ece\u4ee5\u592a\u7f51\u6570\u636e\u6d41\u4e2d\u7b5b\u9009\u5e76\u63d0\u53d6\u53d1\u5f80\u672c\u673a\u7684 UDP \u6709\u6548\u6570\u636e<\/strong>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">module udp_rx<br>#(<br>    parameter BOARD_MAC = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP = {8'd192,8'd168,8'd1,8'd10}      <br>    )<br>(<br>    input                clk         ,    \/\/\u65f6\u949f\u4fe1\u53f7<br>    input                rst_n       ,    \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>    <br>    input                gmii_rx_dv  ,    \/\/GMII\u8f93\u5165\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    input        [7:0]   gmii_rxd    ,    \/\/GMII\u8f93\u5165\u6570\u636e<br>    output  reg          rec_pkt_done,    \/\/\u4ee5\u592a\u7f51\u5355\u5305\u6570\u636e\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>    output  reg          rec_en      ,    \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6570\u636e\u4f7f\u80fd\u4fe1\u53f7<br>    output  reg  [31:0]  rec_data    ,    \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6570\u636e<br>    output  reg  [15:0]  rec_byte_num     \/\/\u4ee5\u592a\u7f51\u63a5\u6536\u7684\u6709\u6548\u5b57\u8282\u6570 \u5355\u4f4d:byte     <br>);<br><br>localparam  st_idle     = 7'b000_0001; \/\/\u521d\u59cb\u72b6\u6001\uff0c\u7b49\u5f85\u63a5\u6536\u524d\u5bfc\u7801<br>localparam  st_preamble = 7'b000_0010; \/\/\u63a5\u6536\u524d\u5bfc\u7801\u72b6\u6001 <br>localparam  st_eth_head = 7'b000_0100; \/\/\u63a5\u6536\u4ee5\u592a\u7f51\u5e27\u5934<br>localparam  st_ip_head  = 7'b000_1000; \/\/\u63a5\u6536IP\u9996\u90e8<br>localparam  st_udp_head = 7'b001_0000; \/\/\u63a5\u6536UDP\u9996\u90e8<br>localparam  st_rx_data  = 7'b010_0000; \/\/\u63a5\u6536\u6709\u6548\u6570\u636e<br>localparam  st_rx_end   = 7'b100_0000; \/\/\u63a5\u6536\u7ed3\u675f<br><br>localparam  ETH_TYPE    = 16'h0800   ; \/\/\u4ee5\u592a\u7f51\u534f\u8bae\u7c7b\u578b IP\u534f\u8bae<br>localparam  UDP_TYPE    = 8'd17      ; \/\/UDP\u534f\u8bae\u7c7b\u578b<br><br>\/\/reg define<br>reg  [6:0]   cur_state       ;<br>reg  [6:0]   next_state      ;<br>                             <br>reg          skip_en         ; \/\/\u63a7\u5236\u72b6\u6001\u8df3\u8f6c\u4f7f\u80fd\u4fe1\u53f7<br>reg          error_en        ; \/\/\u89e3\u6790\u9519\u8bef\u4f7f\u80fd\u4fe1\u53f7<br>reg  [4:0]   cnt             ; \/\/\u89e3\u6790\u6570\u636e\u8ba1\u6570\u5668<br>reg  [47:0]  des_mac         ; \/\/\u76ee\u7684MAC\u5730\u5740<br>reg  [15:0]  eth_type        ; \/\/\u4ee5\u592a\u7f51\u7c7b\u578b<br>reg  [31:0]  des_ip          ; \/\/\u76ee\u7684IP\u5730\u5740<br>reg  [5:0]   ip_head_byte_num; \/\/IP\u9996\u90e8\u957f\u5ea6<br>reg  [15:0]  udp_byte_num    ; \/\/UDP\u957f\u5ea6<br>reg  [15:0]  data_byte_num   ; \/\/\u6570\u636e\u957f\u5ea6<br>reg  [15:0]  data_cnt        ; \/\/\u6709\u6548\u6570\u636e\u8ba1\u6570    <br>reg  [1:0]   rec_en_cnt      ; \/\/8bit\u8f6c32bit\u8ba1\u6570\u5668<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>\/\/(\u4e09\u6bb5\u5f0f\u72b6\u6001\u673a)\u540c\u6b65\u65f6\u5e8f\u63cf\u8ff0\u72b6\u6001\u8f6c\u79fb<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        cur_state &lt;= st_idle;  <br>    else<br>        cur_state &lt;= next_state;<br>end<br><br>\/\/\u7ec4\u5408\u903b\u8f91\u5224\u65ad\u72b6\u6001\u8f6c\u79fb\u6761\u4ef6<br>always @(*) begin<br>    next_state = st_idle;<br>    case(cur_state)<br>        st_idle : begin                                     \/\/\u7b49\u5f85\u63a5\u6536\u524d\u5bfc\u7801<br>            if(skip_en) <br>                next_state = st_preamble;<br>            else<br>                next_state = st_idle;    <br>        end<br>        st_preamble : begin                                 \/\/\u63a5\u6536\u524d\u5bfc\u7801<br>            if(skip_en) <br>                next_state = st_eth_head;<br>            else if(error_en) <br>                next_state = st_rx_end;    <br>            else<br>                next_state = st_preamble;    <br>        end<br>        st_eth_head : begin                                 \/\/\u63a5\u6536\u4ee5\u592a\u7f51\u5e27\u5934<br>            if(skip_en) <br>                next_state = st_ip_head;<br>            else if(error_en) <br>                next_state = st_rx_end;<br>            else<br>                next_state = st_eth_head;           <br>        end  <br>        st_ip_head : begin                                  \/\/\u63a5\u6536IP\u9996\u90e8<br>            if(skip_en)<br>                next_state = st_udp_head;<br>            else if(error_en)<br>                next_state = st_rx_end;<br>            else<br>                next_state = st_ip_head;       <br>        end <br>        st_udp_head : begin                                 \/\/\u63a5\u6536UDP\u9996\u90e8<br>            if(skip_en)<br>                next_state = st_rx_data;<br>            else<br>                next_state = st_udp_head;    <br>        end                <br>        st_rx_data : begin                                  \/\/\u63a5\u6536\u6709\u6548\u6570\u636e<br>            if(skip_en)<br>                next_state = st_rx_end;<br>            else<br>                next_state = st_rx_data;    <br>        end                           <br>        st_rx_end : begin                                   \/\/\u63a5\u6536\u7ed3\u675f<br>            if(skip_en)<br>                next_state = st_idle;<br>            else<br>                next_state = st_rx_end;          <br>        end<br>        default : next_state = st_idle;<br>    endcase                                          <br>end    <br><br>\/\/\u65f6\u5e8f\u7535\u8def\u63cf\u8ff0\u72b6\u6001\u8f93\u51fa,\u89e3\u6790\u4ee5\u592a\u7f51\u6570\u636e<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        skip_en &lt;= 1'b0;<br>        error_en &lt;= 1'b0;<br>        cnt &lt;= 5'd0;<br>        des_mac &lt;= 48'd0;<br>        eth_type &lt;= 16'd0;<br>        des_ip &lt;= 32'd0;<br>        ip_head_byte_num &lt;= 6'd0;<br>        udp_byte_num &lt;= 16'd0;<br>        data_byte_num &lt;= 16'd0;<br>        data_cnt &lt;= 16'd0;<br>        rec_en_cnt &lt;= 2'd0;<br>        rec_en &lt;= 1'b0;<br>        rec_data &lt;= 32'd0;<br>        rec_pkt_done &lt;= 1'b0;<br>        rec_byte_num &lt;= 16'd0;<br>    end<br>    else begin<br>        skip_en &lt;= 1'b0;<br>        error_en &lt;= 1'b0;  <br>        rec_en &lt;= 1'b0;<br>        rec_pkt_done &lt;= 1'b0;<br>        case(next_state)<br>            st_idle : begin<br>                if((gmii_rx_dv == 1'b1) &amp;&amp; (gmii_rxd == 8'h55)) <br>                    skip_en &lt;= 1'b1;<br>            end<br>            st_preamble : begin<br>                if(gmii_rx_dv) begin                         \/\/\u89e3\u6790\u524d\u5bfc\u7801<br>                    cnt &lt;= cnt + 5'd1;<br>                    if((cnt &lt; 5'd6) &amp;&amp; (gmii_rxd != 8'h55))  \/\/7\u4e2a8'h55  <br>                        error_en &lt;= 1'b1;<br>                    else if(cnt==5'd6) begin<br>                        cnt &lt;= 5'd0;<br>                        if(gmii_rxd==8'hd5)                  \/\/1\u4e2a8'hd5<br>                            skip_en &lt;= 1'b1;<br>                        else<br>                            error_en &lt;= 1'b1;    <br>                    end  <br>                end  <br>            end<br>            st_eth_head : begin<br>                if(gmii_rx_dv) begin<br>                    cnt &lt;= cnt + 5'b1;<br>                    if(cnt &lt; 5'd6) <br>                        des_mac &lt;= {des_mac[39:0],gmii_rxd}; \/\/\u76ee\u7684MAC\u5730\u5740<br>                    else if(cnt == 5'd12) <br>                        eth_type[15:8] &lt;= gmii_rxd;          \/\/\u4ee5\u592a\u7f51\u534f\u8bae\u7c7b\u578b<br>                    else if(cnt == 5'd13) begin<br>                        eth_type[7:0] &lt;= gmii_rxd;<br>                        cnt &lt;= 5'd0;<br>                        \/\/\u5224\u65adMAC\u5730\u5740\u662f\u5426\u4e3a\u5f00\u53d1\u677fMAC\u5730\u5740\u6216\u8005\u516c\u5171\u5730\u5740<br>                        if(((des_mac == BOARD_MAC) ||(des_mac == 48'hff_ff_ff_ff_ff_ff))<br>                       &amp;&amp; eth_type[15:8] == ETH_TYPE[15:8] &amp;&amp; gmii_rxd == ETH_TYPE[7:0])            <br>                            skip_en &lt;= 1'b1;<br>                        else<br>                            error_en &lt;= 1'b1;<br>                    end        <br>                end  <br>            end<br>            st_ip_head : begin<br>                if(gmii_rx_dv) begin<br>                    cnt &lt;= cnt + 5'd1;<br>                    if(cnt == 5'd0)<br>                        ip_head_byte_num &lt;= {gmii_rxd[3:0],2'd0};  \/\/\u5bc4\u5b58IP\u9996\u90e8\u957f\u5ea6<br>                    else if(cnt == 5'd9) begin<br>                        if(gmii_rxd != UDP_TYPE) begin<br>                            \/\/\u5982\u679c\u5f53\u524d\u63a5\u6536\u7684\u6570\u636e\u4e0d\u662fUDP\u534f\u8bae\uff0c\u505c\u6b62\u89e3\u6790\u6570\u636e                        <br>                            error_en &lt;= 1'b1;               <br>                            cnt &lt;= 5'd0;                        <br>                        end<br>                    end                    <br>                    else if((cnt &gt;= 5'd16) &amp;&amp; (cnt &lt;= 5'd18))<br>                        des_ip &lt;= {des_ip[23:0],gmii_rxd};         \/\/\u5bc4\u5b58\u76ee\u7684IP\u5730\u5740<br>                    else if(cnt == 5'd19) begin<br>                        des_ip &lt;= {des_ip[23:0],gmii_rxd}; <br>                        \/\/\u5224\u65adIP\u5730\u5740\u662f\u5426\u4e3a\u5f00\u53d1\u677fIP\u5730\u5740<br>                        if((des_ip[23:0] == BOARD_IP[31:8])<br>                            &amp;&amp; (gmii_rxd == BOARD_IP[7:0])) begin  <br>                            if(cnt == ip_head_byte_num - 1'b1) begin<br>                                skip_en &lt;=1'b1;                     <br>                                cnt &lt;= 5'd0;<br>                            end                             <br>                        end    <br>                        else begin            <br>                            \/\/IP\u9519\u8bef\uff0c\u505c\u6b62\u89e3\u6790\u6570\u636e                        <br>                            error_en &lt;= 1'b1;               <br>                            cnt &lt;= 5'd0;<br>                        end                                                  <br>                    end                          <br>                    else if(cnt == ip_head_byte_num - 1'b1) begin <br>                        skip_en &lt;=1'b1;                      \/\/IP\u9996\u90e8\u89e3\u6790\u5b8c\u6210<br>                        cnt &lt;= 5'd0;                    <br>                    end    <br>                end                                <br>            end <br>            st_udp_head : begin<br>                if(gmii_rx_dv) begin<br>                    cnt &lt;= cnt + 5'd1;<br>                    if(cnt == 5'd4)<br>                        udp_byte_num[15:8] &lt;= gmii_rxd;      \/\/\u89e3\u6790UDP\u5b57\u8282\u957f\u5ea6 <br>                    else if(cnt == 5'd5)<br>                        udp_byte_num[7:0] &lt;= gmii_rxd;<br>                    else if(cnt == 5'd7) begin<br>                        \/\/\u6709\u6548\u6570\u636e\u5b57\u8282\u957f\u5ea6\uff0c\uff08UDP\u9996\u90e88\u4e2a\u5b57\u8282\uff0c\u6240\u4ee5\u51cf\u53bb8\uff09<br>                        data_byte_num &lt;= udp_byte_num - 16'd8;    <br>                        skip_en &lt;= 1'b1;<br>                        cnt &lt;= 5'd0;<br>                    end  <br>                end                 <br>            end          <br>            st_rx_data : begin         <br>                \/\/\u63a5\u6536\u6570\u636e\uff0c\u8f6c\u6362\u621032bit            <br>                if(gmii_rx_dv) begin<br>                    data_cnt &lt;= data_cnt + 16'd1;<br>                    rec_en_cnt &lt;= rec_en_cnt + 2'd1;<br>                    if(data_cnt == data_byte_num - 16'd1) begin<br>                        skip_en &lt;= 1'b1;                    \/\/\u6709\u6548\u6570\u636e\u63a5\u6536\u5b8c\u6210<br>                        data_cnt &lt;= 16'd0;<br>                        rec_en_cnt &lt;= 2'd0;<br>                        rec_pkt_done &lt;= 1'b1;               <br>                        rec_en &lt;= 1'b1;                     <br>                        rec_byte_num &lt;= data_byte_num;<br>                    end    <br>                    \/\/\u5148\u6536\u5230\u7684\u6570\u636e\u653e\u5728\u4e86rec_data\u7684\u9ad8\u4f4d,\u6240\u4ee5\u5f53\u6570\u636e\u4e0d\u662f4\u7684\u500d\u6570\u65f6,<br>                    \/\/\u4f4e\u4f4d\u6570\u636e\u4e3a\u65e0\u6548\u6570\u636e\uff0c\u53ef\u6839\u636e\u6709\u6548\u5b57\u8282\u6570\u6765\u5224\u65ad(rec_byte_num)<br>                    if(rec_en_cnt == 2'd0)<br>                        rec_data[31:24] &lt;= gmii_rxd;<br>                    else if(rec_en_cnt == 2'd1)<br>                        rec_data[23:16] &lt;= gmii_rxd;<br>                    else if(rec_en_cnt == 2'd2) <br>                        rec_data[15:8] &lt;= gmii_rxd;        <br>                    else if(rec_en_cnt==2'd3) begin<br>                        rec_en &lt;= 1'b1;<br>                        rec_data[7:0] &lt;= gmii_rxd;<br>                    end    <br>                end  <br>            end    <br>            st_rx_end : begin                               \/\/\u5355\u5305\u6570\u636e\u63a5\u6536\u5b8c\u6210   <br>                if(gmii_rx_dv == 1'b0 &amp;&amp; skip_en == 1'b0)<br>                    skip_en &lt;= 1'b1; <br>            end    <br>            default : ;<br>        endcase                                                        <br>    end<br>end<br><br>endmodule<\/pre>\n\n\n\n<p><strong>udp_tx<\/strong> \u6a21\u5757\uff1a<\/p>\n\n\n\n<p>\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8e <strong>GMII \u63a5\u53e3\u7684 UDP \u6570\u636e\u53d1\u9001\u7535\u8def<\/strong>\uff1a\u5728\u68c0\u6d4b\u5230 <code>tx_start_en<\/code> \u4e0a\u5347\u6cbf\u540e\uff0c\u6a21\u5757\u81ea\u52a8\u5c01\u88c5 <strong>\u4ee5\u592a\u7f51\u5e27\u3001IP \u9996\u90e8\u548c UDP \u9996\u90e8<\/strong>\uff0c\u6839\u636e\u8f93\u5165\u7684\u6570\u636e\u957f\u5ea6\u8ba1\u7b97 IP\/UDP \u957f\u5ea6\u5e76\u751f\u6210 <strong>IP \u9996\u90e8\u6821\u9a8c\u548c<\/strong>\uff0c\u968f\u540e\u4f9d\u6b21\u53d1\u9001 <strong>\u524d\u5bfc\u7801\u3001\u4ee5\u592a\u7f51\u9996\u90e8\u3001IP+UDP \u9996\u90e8\u3001\u6709\u6548\u6570\u636e\u4ee5\u53ca CRC \u6821\u9a8c\u503c<\/strong>\u3002\u53d1\u9001\u8fc7\u7a0b\u4e2d\u5c06 32bit \u6570\u636e\u62c6\u5206\u4e3a 8bit \u901a\u8fc7 GMII \u8f93\u51fa\uff0c\u5e76\u5728\u6570\u636e\u4e0d\u8db3\u4ee5\u592a\u7f51\u6700\u5c0f\u5e27\u957f\u5ea6\u65f6\u81ea\u52a8\u8865\u9f50\uff1b\u901a\u8fc7 <code>tx_req<\/code> \u8bf7\u6c42\u4e0a\u5c42\u63d0\u4f9b\u6570\u636e\uff0c\u901a\u8fc7 <code>tx_done<\/code> \u6307\u793a\u6574\u5e27 UDP \u6570\u636e\u53d1\u9001\u5b8c\u6210\u3002\u6574\u4f53\u529f\u80fd\u5c31\u662f\uff1a<strong>\u5728\u786c\u4ef6\u4e2d\u5c06\u7528\u6237\u6570\u636e\u6253\u5305\u6210\u5b8c\u6574\u7684 UDP\/IP \u4ee5\u592a\u7f51\u5e27\u5e76\u53d1\u9001\u51fa\u53bb<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">module udp_tx<br>#(<br>    parameter BOARD_MAC  = 48'h00_11_22_33_44_55,  <br>    parameter BOARD_IP   = {8'd192,8'd168,8'd1,8'd10},    <br>    parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff,<br>    parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}<br>)<br>(    <br>    input                clk        , \/\/\u65f6\u949f\u4fe1\u53f7<br>    input                rst_n      , \/\/\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548<br>    <br>    input                tx_start_en, \/\/\u4ee5\u592a\u7f51\u5f00\u59cb\u53d1\u9001\u4fe1\u53f7<br>    input        [31:0]  tx_data    , \/\/\u4ee5\u592a\u7f51\u5f85\u53d1\u9001\u6570\u636e  <br>    input        [15:0]  tx_byte_num, \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u7684\u6709\u6548\u5b57\u8282\u6570<br>    input        [47:0]  des_mac    , \/\/\u53d1\u9001\u7684\u76ee\u6807MAC\u5730\u5740<br>    input        [31:0]  des_ip     , \/\/\u53d1\u9001\u7684\u76ee\u6807IP\u5730\u5740    <br>    input        [31:0]  crc_data   , \/\/CRC\u6821\u9a8c\u6570\u636e<br>    input         [7:0]  crc_next   , \/\/CRC\u4e0b\u6b21\u6821\u9a8c\u5b8c\u6210\u6570\u636e<br>    output  reg          tx_done    , \/\/\u4ee5\u592a\u7f51\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>    output  reg          tx_req     , \/\/\u8bfb\u6570\u636e\u8bf7\u6c42\u4fe1\u53f7<br>    output  reg          gmii_tx_en , \/\/GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>    output  reg  [7:0]   gmii_txd   , \/\/GMII\u8f93\u51fa\u6570\u636e<br>    output  reg          crc_en     , \/\/CRC\u5f00\u59cb\u6821\u9a8c\u4f7f\u80fd<br>    output  reg          crc_clr      \/\/CRC\u6570\u636e\u590d\u4f4d\u4fe1\u53f7 <br>    );<br><br>localparam  st_idle      = 7'b000_0001; \/\/\u521d\u59cb\u72b6\u6001\uff0c\u7b49\u5f85\u5f00\u59cb\u53d1\u9001\u4fe1\u53f7<br>localparam  st_check_sum = 7'b000_0010; \/\/IP\u9996\u90e8\u6821\u9a8c\u548c<br>localparam  st_preamble  = 7'b000_0100; \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>localparam  st_eth_head  = 7'b000_1000; \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u5e27\u5934<br>localparam  st_ip_head   = 7'b001_0000; \/\/\u53d1\u9001IP\u9996\u90e8+UDP\u9996\u90e8<br>localparam  st_tx_data   = 7'b010_0000; \/\/\u53d1\u9001\u6570\u636e<br>localparam  st_crc       = 7'b100_0000; \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br><br>localparam  ETH_TYPE     = 16'h0800   ; \/\/\u4ee5\u592a\u7f51\u534f\u8bae\u7c7b\u578b IP\u534f\u8bae<br>\/\/\u4ee5\u592a\u7f51\u6570\u636e\u6700\u5c0f46\u4e2a\u5b57\u8282\uff0cIP\u9996\u90e820\u4e2a\u5b57\u8282+UDP\u9996\u90e88\u4e2a\u5b57\u8282<br>\/\/\u6240\u4ee5\u6570\u636e\u81f3\u5c1146-20-8=18\u4e2a\u5b57\u8282<br>localparam  MIN_DATA_NUM = 16'd18     ;  <br>localparam  UDP_TYPE    = 8'd17       ; \/\/UDP\u534f\u8bae\u7c7b\u578b  <br><br>\/\/reg define<br>reg  [6:0]   cur_state      ;<br>reg  [6:0]   next_state     ;<br>                            <br>reg  [7:0]   preamble[7:0]  ; \/\/\u524d\u5bfc\u7801<br>reg  [7:0]   eth_head[13:0] ; \/\/\u4ee5\u592a\u7f51\u9996\u90e8<br>reg  [31:0]  ip_head[6:0]   ; \/\/IP\u9996\u90e8 + UDP\u9996\u90e8<br>                            <br>reg          start_en_d0    ;<br>reg          start_en_d1    ;<br>reg  [15:0]  tx_data_num    ; \/\/\u53d1\u9001\u7684\u6709\u6548\u6570\u636e\u5b57\u8282\u4e2a\u6570<br>reg  [15:0]  total_num      ; \/\/\u603b\u5b57\u8282\u6570<br>reg          trig_tx_en     ;<br>reg  [15:0]  udp_num        ; \/\/UDP\u5b57\u8282\u6570<br>reg          skip_en        ; \/\/\u63a7\u5236\u72b6\u6001\u8df3\u8f6c\u4f7f\u80fd\u4fe1\u53f7<br>reg  [4:0]   cnt            ;<br>reg  [31:0]  check_buffer   ; \/\/\u9996\u90e8\u6821\u9a8c\u548c<br>reg  [1:0]   tx_byte_sel    ; \/\/32\u4f4d\u6570\u636e\u8f6c8\u4f4d\u6570\u636e\u8ba1\u6570\u5668<br>reg  [15:0]  data_cnt       ; \/\/\u53d1\u9001\u6570\u636e\u4e2a\u6570\u8ba1\u6570\u5668<br>reg          tx_done_t      ;<br>reg  [4:0]   real_add_cnt   ; \/\/\u4ee5\u592a\u7f51\u6570\u636e\u5b9e\u9645\u591a\u53d1\u7684\u5b57\u8282\u6570<br>                                    <br>\/\/wire define                       <br>wire         pos_start_en    ;\/\/\u5f00\u59cb\u53d1\u9001\u6570\u636e\u4e0a\u5347\u6cbf<br>wire [15:0]  real_tx_data_num;\/\/\u5b9e\u9645\u53d1\u9001\u7684\u5b57\u8282\u6570(\u4ee5\u592a\u7f51\u6700\u5c11\u5b57\u8282\u8981\u6c42)<br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>assign  pos_start_en = (~start_en_d1) &amp; start_en_d0;<br>assign  real_tx_data_num = (tx_data_num &gt;= MIN_DATA_NUM) <br>                           ? tx_data_num : MIN_DATA_NUM; <br>                           <br>\/\/\u91c7tx_start_en\u7684\u4e0a\u5347\u6cbf<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        start_en_d0 &lt;= 1'b0;<br>        start_en_d1 &lt;= 1'b0;<br>    end    <br>    else begin<br>        start_en_d0 &lt;= tx_start_en;<br>        start_en_d1 &lt;= start_en_d0;<br>    end<br>end <br><br>\/\/\u5bc4\u5b58\u6570\u636e\u6709\u6548\u5b57\u8282<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        tx_data_num &lt;= 16'd0;<br>        total_num &lt;= 16'd0;<br>        udp_num &lt;= 16'd0;<br>    end<br>    else begin<br>        if(pos_start_en &amp;&amp; cur_state==st_idle) begin<br>            \/\/\u6570\u636e\u957f\u5ea6<br>            tx_data_num &lt;= tx_byte_num;     <br>            \/\/UDP\u957f\u5ea6\uff1aUDP\u9996\u90e8\u957f\u5ea6 + \u6709\u6548\u6570\u636e            <br>            udp_num &lt;= tx_byte_num + 16'd8;               <br>            \/\/IP\u957f\u5ea6\uff1aIP\u9996\u90e8\u957f\u5ea6 + UDP\u9996\u90e8 + \u6709\u6548\u6570\u636e             <br>            total_num &lt;= tx_byte_num + 16'd20 + 16'd8;  <br>        end    <br>    end<br>end<br><br>\/\/\u89e6\u53d1\u53d1\u9001\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) <br>        trig_tx_en &lt;= 1'b0;<br>    else<br>        trig_tx_en &lt;= pos_start_en;<br><br>end<br><br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        cur_state &lt;= st_idle;  <br>    else<br>        cur_state &lt;= next_state;<br>end<br><br>always @(*) begin<br>    next_state = st_idle;<br>    case(cur_state)<br>        st_idle     : begin                               \/\/\u7b49\u5f85\u53d1\u9001\u6570\u636e<br>            if(skip_en)                <br>                next_state = st_check_sum;<br>            else<br>                next_state = st_idle;<br>        end  <br>        st_check_sum: begin                               \/\/IP\u9996\u90e8\u6821\u9a8c<br>            if(skip_en)<br>                next_state = st_preamble;<br>            else<br>                next_state = st_check_sum;    <br>        end                             <br>        st_preamble : begin                               \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>            if(skip_en)<br>                next_state = st_eth_head;<br>            else<br>                next_state = st_preamble;      <br>        end<br>        st_eth_head : begin                               \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u9996\u90e8<br>            if(skip_en)<br>                next_state = st_ip_head;<br>            else<br>                next_state = st_eth_head;      <br>        end              <br>        st_ip_head : begin                                \/\/\u53d1\u9001IP\u9996\u90e8+UDP\u9996\u90e8               <br>            if(skip_en)<br>                next_state = st_tx_data;<br>            else<br>                next_state = st_ip_head;      <br>        end<br>        st_tx_data : begin                                \/\/\u53d1\u9001\u6570\u636e                  <br>            if(skip_en)<br>                next_state = st_crc;<br>            else<br>                next_state = st_tx_data;      <br>        end<br>        st_crc: begin                                     \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br>            if(skip_en)<br>                next_state = st_idle;<br>            else<br>                next_state = st_crc;      <br>        end<br>        default : next_state = st_idle;   <br>    endcase<br>end                      <br><br>\/\/\u53d1\u9001\u6570\u636e<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        skip_en &lt;= 1'b0; <br>        cnt &lt;= 5'd0;<br>        check_buffer &lt;= 32'd0;<br>        ip_head[1][31:16] &lt;= 16'd0;<br>        tx_byte_sel &lt;= 2'b0;<br>        crc_en &lt;= 1'b0;<br>        gmii_tx_en &lt;= 1'b0;<br>        gmii_txd &lt;= 8'd0;<br>        tx_req &lt;= 1'b0;<br>        tx_done_t &lt;= 1'b0; <br>        data_cnt &lt;= 16'd0;<br>        real_add_cnt &lt;= 5'd0;<br>        \/\/\u521d\u59cb\u5316\u6570\u7ec4    <br>        \/\/\u524d\u5bfc\u7801 7\u4e2a8'h55 + 1\u4e2a8'hd5<br>        preamble[0] &lt;= 8'h55;                 <br>        preamble[1] &lt;= 8'h55;<br>        preamble[2] &lt;= 8'h55;<br>        preamble[3] &lt;= 8'h55;<br>        preamble[4] &lt;= 8'h55;<br>        preamble[5] &lt;= 8'h55;<br>        preamble[6] &lt;= 8'h55;<br>        preamble[7] &lt;= 8'hd5;<br>        \/\/\u76ee\u7684MAC\u5730\u5740<br>        eth_head[0] &lt;= DES_MAC[47:40];<br>        eth_head[1] &lt;= DES_MAC[39:32];<br>        eth_head[2] &lt;= DES_MAC[31:24];<br>        eth_head[3] &lt;= DES_MAC[23:16];<br>        eth_head[4] &lt;= DES_MAC[15:8];<br>        eth_head[5] &lt;= DES_MAC[7:0];<br>        \/\/\u6e90MAC\u5730\u5740<br>        eth_head[6] &lt;= BOARD_MAC[47:40];<br>        eth_head[7] &lt;= BOARD_MAC[39:32];<br>        eth_head[8] &lt;= BOARD_MAC[31:24];<br>        eth_head[9] &lt;= BOARD_MAC[23:16];<br>        eth_head[10] &lt;= BOARD_MAC[15:8];<br>        eth_head[11] &lt;= BOARD_MAC[7:0];<br>        \/\/\u4ee5\u592a\u7f51\u7c7b\u578b<br>        eth_head[12] &lt;= ETH_TYPE[15:8];<br>        eth_head[13] &lt;= ETH_TYPE[7:0];        <br>    end<br>    else begin<br>        skip_en &lt;= 1'b0;<br>        tx_req &lt;= 1'b0;<br>        crc_en &lt;= 1'b0;<br>        gmii_tx_en &lt;= 1'b0;<br>        tx_done_t &lt;= 1'b0;<br>        case(next_state)<br>            st_idle     : begin<br>                if(trig_tx_en) begin<br>                    skip_en &lt;= 1'b1; <br>                    \/\/\u7248\u672c\u53f7\uff1a4 \u9996\u90e8\u957f\u5ea6\uff1a5(\u5355\u4f4d:32bit,20byte\/4=5)<br>                    ip_head[0] &lt;= {8'h45,8'h00,total_num};   <br>                    \/\/16\u4f4d\u6807\u8bc6\uff0c\u6bcf\u6b21\u53d1\u9001\u7d2f\u52a01      <br>                    ip_head[1][31:16] &lt;= ip_head[1][31:16] + 1'b1; <br>                    \/\/bit[15:13]: 010\u8868\u793a\u4e0d\u5206\u7247<br>                    ip_head[1][15:0] &lt;= 16'h4000;    <br>                    \/\/\u534f\u8bae\uff1a17(udp)                  <br>                    ip_head[2] &lt;= {8'h40,UDP_TYPE,16'h0};   <br>                    \/\/\u6e90IP\u5730\u5740               <br>                    ip_head[3] &lt;= BOARD_IP;<br>                    \/\/\u76ee\u7684IP\u5730\u5740    <br>                    if(des_ip != 32'd0)<br>                        ip_head[4] &lt;= des_ip;<br>                    else<br>                        ip_head[4] &lt;= DES_IP;       <br>                    \/\/16\u4f4d\u6e90\u7aef\u53e3\u53f7\uff1a1234  16\u4f4d\u76ee\u7684\u7aef\u53e3\u53f7\uff1a1234                      <br>                    ip_head[5] &lt;= {16'd1234,16'd1234};  <br>                    \/\/16\u4f4dudp\u957f\u5ea6\uff0c16\u4f4dudp\u6821\u9a8c\u548c              <br>                    ip_head[6] &lt;= {udp_num,16'h0000};  <br>                    \/\/\u66f4\u65b0MAC\u5730\u5740<br>                    if(des_mac != 48'b0) begin<br>                        \/\/\u76ee\u7684MAC\u5730\u5740<br>                        eth_head[0] &lt;= des_mac[47:40];<br>                        eth_head[1] &lt;= des_mac[39:32];<br>                        eth_head[2] &lt;= des_mac[31:24];<br>                        eth_head[3] &lt;= des_mac[23:16];<br>                        eth_head[4] &lt;= des_mac[15:8];<br>                        eth_head[5] &lt;= des_mac[7:0];<br>                    end<br>                end    <br>            end                                                       <br>            st_check_sum: begin                           \/\/IP\u9996\u90e8\u6821\u9a8c<br>                cnt &lt;= cnt + 5'd1;<br>                if(cnt == 5'd0) begin                   <br>                    check_buffer &lt;= ip_head[0][31:16] + ip_head[0][15:0]<br>                                    + ip_head[1][31:16] + ip_head[1][15:0]<br>                                    + ip_head[2][31:16] + ip_head[2][15:0]<br>                                    + ip_head[3][31:16] + ip_head[3][15:0]<br>                                    + ip_head[4][31:16] + ip_head[4][15:0];<br>                end<br>                else if(cnt == 5'd1)                      \/\/\u53ef\u80fd\u51fa\u73b0\u8fdb\u4f4d,\u7d2f\u52a0\u4e00\u6b21<br>                    check_buffer &lt;= check_buffer[31:16] + check_buffer[15:0];<br>                else if(cnt == 5'd2) begin                \/\/\u53ef\u80fd\u518d\u6b21\u51fa\u73b0\u8fdb\u4f4d,\u7d2f\u52a0\u4e00\u6b21<br>                    check_buffer &lt;= check_buffer[31:16] + check_buffer[15:0];<br>                end                             <br>                else if(cnt == 5'd3) begin                \/\/\u6309\u4f4d\u53d6\u53cd <br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 5'd0;            <br>                    ip_head[2][15:0] &lt;= ~check_buffer[15:0];<br>                end    <br>            end              <br>            st_preamble : begin                           \/\/\u53d1\u9001\u524d\u5bfc\u7801+\u5e27\u8d77\u59cb\u754c\u5b9a\u7b26<br>                gmii_tx_en &lt;= 1'b1;<br>                gmii_txd &lt;= preamble[cnt];<br>                if(cnt == 5'd7) begin                        <br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 5'd0;    <br>                end<br>                else    <br>                    cnt &lt;= cnt + 5'd1;                     <br>            end<br>            st_eth_head : begin                           \/\/\u53d1\u9001\u4ee5\u592a\u7f51\u9996\u90e8<br>                gmii_tx_en &lt;= 1'b1;<br>                crc_en &lt;= 1'b1;<br>                gmii_txd &lt;= eth_head[cnt];<br>                if (cnt == 5'd13) begin<br>                    skip_en &lt;= 1'b1;<br>                    cnt &lt;= 5'd0;<br>                end    <br>                else    <br>                    cnt &lt;= cnt + 5'd1;    <br>            end                    <br>            st_ip_head  : begin                           \/\/\u53d1\u9001IP\u9996\u90e8 + UDP\u9996\u90e8<br>                crc_en &lt;= 1'b1;<br>                gmii_tx_en &lt;= 1'b1;<br>                tx_byte_sel &lt;= tx_byte_sel + 2'd1;<br>                if(tx_byte_sel == 2'd0)<br>                    gmii_txd &lt;= ip_head[cnt][31:24];<br>                else if(tx_byte_sel == 2'd1)<br>                    gmii_txd &lt;= ip_head[cnt][23:16];<br>                else if(tx_byte_sel == 2'd2) begin<br>                    gmii_txd &lt;= ip_head[cnt][15:8];<br>                    if(cnt == 5'd6) begin<br>                        \/\/\u63d0\u524d\u8bfb\u8bf7\u6c42\u6570\u636e\uff0c\u7b49\u5f85\u6570\u636e\u6709\u6548\u65f6\u53d1\u9001<br>                        tx_req &lt;= 1'b1;                     <br>                    end<br>                end <br>                else if(tx_byte_sel == 2'd3) begin<br>                    gmii_txd &lt;= ip_head[cnt][7:0];  <br>                    if(cnt == 5'd6) begin<br>                        skip_en &lt;= 1'b1;   <br>                        cnt &lt;= 5'd0;<br>                    end    <br>                    else<br>                        cnt &lt;= cnt + 5'd1;  <br>                end        <br>            end<br>           st_tx_data  : begin                           \/\/\u53d1\u9001\u6570\u636e<br>                crc_en &lt;= 1'b1;<br>                gmii_tx_en &lt;= 1'b1;<br>                tx_byte_sel &lt;= tx_byte_sel + 2'd1;  <br>                if(tx_byte_sel == 1'b0)<br>                    gmii_txd &lt;= tx_data[31:24];<br>                else if(tx_byte_sel == 2'd1)<br>                    gmii_txd &lt;= tx_data[23:16];                   <br>                else if(tx_byte_sel == 2'd2) begin<br>                    gmii_txd &lt;= tx_data[15:8];   <br>                    if(data_cnt != tx_data_num - 16'd2)<br>                        tx_req &lt;= 1'b1;  <br>                end<br>                else if(tx_byte_sel == 2'd3)<br>                    gmii_txd &lt;= tx_data[7:0];    <br>                if(data_cnt &lt; tx_data_num - 16'd1)<br>                    data_cnt &lt;= data_cnt + 16'd1;                        <br>                else if(data_cnt == tx_data_num - 16'd1)begin<br>                    \/\/\u5982\u679c\u53d1\u9001\u7684\u6709\u6548\u6570\u636e\u5c11\u4e8e18\u4e2a\u5b57\u8282\uff0c\u5728\u540e\u9762\u586b\u8865\u5145\u4f4d<br>                    \/\/\u8865\u5145\u7684\u503c\u4e3a\u6700\u540e\u4e00\u6b21\u53d1\u9001\u7684\u6709\u6548\u6570\u636e<br>                    tx_req &lt;= 1'b0;<br>                    if(data_cnt + real_add_cnt &lt; real_tx_data_num - 16'd1)<br>                        real_add_cnt &lt;= real_add_cnt + 5'd1;  <br>                    else begin<br>                        skip_en &lt;= 1'b1;<br>                        data_cnt &lt;= 16'd0;<br>                        real_add_cnt &lt;= 5'd0;<br>                        tx_byte_sel &lt;= 2'd0;                        <br>                    end   <br>                    if(real_add_cnt &gt; 0) begin<br>                        gmii_txd &lt;= 8'd0;<br>                    end    <br>                end   <br>            end   <br>            st_crc      : begin                          \/\/\u53d1\u9001CRC\u6821\u9a8c\u503c<br>                gmii_tx_en &lt;= 1'b1;<br>                tx_byte_sel &lt;= tx_byte_sel + 2'd1;<br>                if(tx_byte_sel == 2'd0)<br>                    gmii_txd &lt;= {~crc_next[0], ~crc_next[1], ~crc_next[2],~crc_next[3],<br>                                 ~crc_next[4], ~crc_next[5], ~crc_next[6],~crc_next[7]};<br>                else if(tx_byte_sel == 2'd1)<br>                    gmii_txd &lt;= {~crc_data[16], ~crc_data[17], ~crc_data[18],~crc_data[19],<br>                                 ~crc_data[20], ~crc_data[21], ~crc_data[22],~crc_data[23]};<br>                else if(tx_byte_sel == 2'd2) begin<br>                    gmii_txd &lt;= {~crc_data[8], ~crc_data[9], ~crc_data[10],~crc_data[11],<br>                                 ~crc_data[12], ~crc_data[13], ~crc_data[14],~crc_data[15]};                              <br>                end<br>                else if(tx_byte_sel == 2'd3) begin<br>                    gmii_txd &lt;= {~crc_data[0], ~crc_data[1], ~crc_data[2],~crc_data[3],<br>                                 ~crc_data[4], ~crc_data[5], ~crc_data[6],~crc_data[7]};  <br>                    tx_done_t &lt;= 1'b1;<br>                    skip_en &lt;= 1'b1;<br>                end                                                                                                                                            <br>            end                          <br>            default :;  <br>        endcase                                             <br>    end<br>end            <br><br>\/\/\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7\u53cacrc\u503c\u590d\u4f4d\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        tx_done &lt;= 1'b0;<br>        crc_clr &lt;= 1'b0;<br>    end<br>    else begin<br>        tx_done &lt;= tx_done_t;<br>        crc_clr &lt;= tx_done_t;<br>    end<br>end<br><br>endmodule<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001\u7f51\u7edc\u8c03\u5ea6\u63a7\u5236\u6a21\u5757 eth_ctrl<\/strong><\/h2>\n\n\n\n<p>\u6700\u540e\u662f\u6700\u91cd\u8981\u7684\u4ee5\u592a\u7f51\u63a7\u5236\u6a21\u5757 <strong>eth_ctrl<\/strong> \u6a21\u5757<\/p>\n\n\n\n<p>\u6a21\u5757\u7528\u4e8e <strong>\u4ee5\u592a\u7f51 ARP \u4e0e UDP \u53d1\u9001\u901a\u9053\u7684\u7edf\u4e00\u8c03\u5ea6\u4e0e\u5207\u6362\u63a7\u5236<\/strong>\u3002\u5b83\u901a\u8fc7 <code>protocol_sw<\/code>\u4fe1\u53f7\u5728 ARP \u4e0e UDP \u4e24\u79cd\u534f\u8bae\u53d1\u9001\u6570\u636e\u4e4b\u95f4\u8fdb\u884c\u9009\u62e9\uff0c\u5c06\u5bf9\u5e94\u7684 GMII \u53d1\u9001\u4fe1\u53f7\u8f93\u51fa\u5230\u7269\u7406\u63a5\u53e3\uff1b\u5f53\u68c0\u6d4b\u5230 UDP \u53d1\u9001\u5f00\u59cb\u65f6\u4f18\u5148\u5207\u6362\u5230 UDP \u901a\u9053\uff0c\u5e76\u5728 UDP \u53d1\u9001\u5b8c\u6210\u524d\u4fdd\u6301\u5fd9\u72b6\u6001\uff1b\u5f53\u63a5\u6536\u5230 ARP \u8bf7\u6c42\u4e14\u5f53\u524d\u6ca1\u6709 UDP \u6b63\u5728\u53d1\u9001\u65f6\uff0c\u81ea\u52a8\u4f7f\u80fd ARP \u5e94\u7b54\u53d1\u9001\u3002\u6574\u4f53\u4f5c\u7528\u662f\uff1a<strong>\u534f\u8c03 ARP \u4e0e UDP \u7684\u53d1\u9001\u65f6\u5e8f\uff0c\u907f\u514d\u51b2\u7a81\uff0c\u5e76\u4fdd\u8bc1 UDP \u4f18\u5148\u3001ARP \u81ea\u52a8\u54cd\u5e94<\/strong>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">module eth_ctrl(<br>    input              clk       ,     \/\/\u7cfb\u7edf\u65f6\u949f<br>    input              rst_n     ,     \/\/\u7cfb\u7edf\u590d\u4f4d\u4fe1\u53f7\uff0c\u4f4e\u7535\u5e73\u6709\u6548 <br>    \/\/ARP\u76f8\u5173\u7aef\u53e3\u4fe1\u53f7                                   <br>    input              arp_rx_done,    \/\/ARP\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>    input              arp_rx_type,    \/\/ARP\u63a5\u6536\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    output  reg        arp_tx_en,      \/\/ARP\u53d1\u9001\u4f7f\u80fd\u4fe1\u53f7<br>    output             arp_tx_type,    \/\/ARP\u53d1\u9001\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>    input              arp_tx_done,    \/\/ARP\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>    input              arp_gmii_tx_en, \/\/ARP GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7 <br>    input     [7:0]    arp_gmii_txd,   \/\/ARP GMII\u8f93\u51fa\u6570\u636e<br>    \/\/UDP\u76f8\u5173\u7aef\u53e3\u4fe1\u53f7<br>    input              udp_tx_start_en,\/\/UDP\u5f00\u59cb\u53d1\u9001\u4fe1\u53f7<br>    input              udp_tx_done,    \/\/UDP\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>    input              udp_gmii_tx_en, \/\/UDP GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7  <br>    input     [7:0]    udp_gmii_txd,   \/\/UDP GMII\u8f93\u51fa\u6570\u636e   <br>    \/\/GMII\u53d1\u9001\u5f15\u811a                     <br>    output             gmii_tx_en,     \/\/GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7 <br>    output    [7:0]    gmii_txd        \/\/UDP GMII\u8f93\u51fa\u6570\u636e <br>    );<br><br>\/\/reg define<br>reg        protocol_sw; \/\/\u534f\u8bae\u5207\u6362\u4fe1\u53f7<br>reg        udp_tx_busy; \/\/UDP\u6b63\u5728\u53d1\u9001\u6570\u636e\u6807\u5fd7\u4fe1\u53f7<br>reg        arp_rx_flag; \/\/\u63a5\u6536\u5230ARP\u8bf7\u6c42\u4fe1\u53f7\u7684\u6807\u5fd7<br><br>\/\/*****************************************************<br>\/\/**                    main code<br>\/\/*****************************************************<br><br>assign arp_tx_type = 1'b1;   \/\/ARP\u53d1\u9001\u7c7b\u578b\u56fa\u5b9a\u4e3aARP\u5e94\u7b54                                   <br>assign gmii_tx_en = protocol_sw ? udp_gmii_tx_en : arp_gmii_tx_en;<br>assign gmii_txd = protocol_sw ? udp_gmii_txd : arp_gmii_txd;<br><br>\/\/\u63a7\u5236UDP\u53d1\u9001\u5fd9\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        udp_tx_busy &lt;= 1'b0;<br>    else if(udp_tx_start_en)   <br>        udp_tx_busy &lt;= 1'b1;<br>    else if(udp_tx_done)<br>        udp_tx_busy &lt;= 1'b0;<br>end<br><br>\/\/\u63a7\u5236\u63a5\u6536\u5230ARP\u8bf7\u6c42\u4fe1\u53f7\u7684\u6807\u5fd7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n)<br>        arp_rx_flag &lt;= 1'b0;<br>    else if(arp_rx_done &amp;&amp; (arp_rx_type == 1'b0))   <br>        arp_rx_flag &lt;= 1'b1;<br>    else if(protocol_sw == 1'b0)<br>        arp_rx_flag &lt;= 1'b0;<br>end<br><br>\/\/\u63a7\u5236protocol_sw\u548carp_tx_en\u4fe1\u53f7<br>always @(posedge clk or negedge rst_n) begin<br>    if(!rst_n) begin<br>        protocol_sw &lt;= 1'b0;<br>        arp_tx_en &lt;= 1'b0;<br>    end<br>    else begin<br>        arp_tx_en &lt;= 1'b0;<br>        if(udp_tx_start_en)<br>            protocol_sw &lt;= 1'b1;<br>        else if(arp_rx_flag &amp;&amp; (udp_tx_busy == 1'b0)) begin<br>            protocol_sw &lt;= 1'b0;<br>            arp_tx_en &lt;= 1'b1;<br>        end    <br>    end        <br>end<br><br><br>endmodule<br><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e03\u3001\u6dfb\u52a0\u4e00\u4e2a\u65f6\u949f\u6a21\u5757\u4e3aIDELAY\u63d0\u4f9b\u6240\u9700\u7684200M\u65f6\u949f<\/strong><\/h2>\n\n\n\n<p>1)\u70b9\u51fbIP Catalog \u6253\u5f00\u6a21\u5757\u9009\u62e9\u5668\uff0c \u5728\u91cc\u9762\u7684\u641c\u7d22\u680f\u8f93\u5165 CLOCKING \uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u8df3\u51fa\u7b26\u5408\u7684 Clocking Wizard\u9009\u9879\uff0c\u53cc\u51fb\u5b83<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"791\" height=\"354\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-3.png\" alt=\"\" class=\"wp-image-138\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-3.png 791w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-3-300x134.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-3-768x344.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>2\uff09\u5728\u5f39\u51fa\u7684\u7a97\u53e3\u4e2d\u6211\u4eec\u5c06input Frequence \u8f93\u5165\u9891\u7387\u4fee\u6539\u4e3a\u677f\u5b50\u4e0a\u710a\u63a5\u768450M\u65f6\u949f\uff0c \u53f3\u8fb9\u6539\u4e3a\u5355\u7aef\u8f93\u5165<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"660\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-11-1024x660.png\" alt=\"\" class=\"wp-image-139\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-11-1024x660.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-11-300x193.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-11-768x495.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2021\/07\/image-11.png 1342w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>3\uff09\u5728output Clocks\u9009\u9879\u4e2d \u5c06clk_out1\u6539\u6210200m<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"639\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-33.png\" alt=\"\" class=\"wp-image-10793\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-33.png 780w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-33-300x246.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-33-768x629.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>4\uff09\u5c06\u754c\u9762\u6258\u5230\u6700\u4e0b\u9762\uff0c\u56e0\u4e3a\u6211\u4eec\u8fd9\u91cc\u7684\u8981\u6c42\u5e76\u4e0d\u9ad8\uff0c\u6240\u4ee5\u628alocked\u9009\u9879\u53bb\u9664\uff0c\u8fd9\u91cc\u4fdd\u7559reset\u529f\u80fd\uff0c\u4f46\u662f\u5c06reset \u529f\u80fd\u6539\u6210\u4f4e\u7535\u5e73\u590d\u4f4d\uff08Active Low\uff09\u6700\u540e\u70b9\u51fbok\u751f\u6210\u6a21\u5757<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"171\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-38.png\" alt=\"\" class=\"wp-image-10806\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-38.png 924w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-38-300x56.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/11\/image-38-768x142.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516b\u3001\u9876\u5c42\u6a21\u5757<\/strong><\/h2>\n\n\n\n<p>\u8d1f\u8d23\u4f8b\u5316\u5404\u4e2a\u6a21\u5757<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">module NET_TEST(<br>    input              sys_clk,\/\/50m<br>    input              sys_rst_n , <br>    \/\/\u4ee5\u592a\u7f51RGMII\u63a5\u53e3   <br>    input              eth_rxc   , <br>    input              eth_rx_ctl, <br>    input       [3:0]  eth_rxd   , <br>    output             eth_txc   , <br>    output             eth_tx_ctl, <br>    output      [3:0]  eth_txd,    <br>    output             eth_rst_n   <br>    );<br>    <br>\/\/\u5f00\u53d1\u677fMAC\u5730\u5740 00-11-22-33-44-55<br>parameter  BOARD_MAC = 48'h00_11_22_33_44_55;     <br>\/\/\u5f00\u53d1\u677fIP\u5730\u5740 192.168.1.10<br>parameter  BOARD_IP  = {8'd192,8'd168,8'd1,8'd10};  <br>\/\/\u76ee\u7684MAC\u5730\u5740 ff_ff_ff_ff_ff_ff<br>parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff;    <br>\/\/\u76ee\u7684IP\u5730\u5740 192.168.1.102     <br>parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102};  <br><br>              <br>wire          gmii_rx_clk; \/\/GMII\u63a5\u6536\u65f6\u949f<br>wire          gmii_rx_dv ; \/\/GMII\u63a5\u6536\u6570\u636e\u6709\u6548\u4fe1\u53f7<br>wire  [7:0]   gmii_rxd   ; \/\/GMII\u63a5\u6536\u6570\u636e<br>wire          gmii_tx_clk; \/\/GMII\u53d1\u9001\u65f6\u949f<br>wire          gmii_tx_en ; \/\/GMII\u53d1\u9001\u6570\u636e\u4f7f\u80fd\u4fe1\u53f7<br>wire  [7:0]   gmii_txd   ; \/\/GMII\u53d1\u9001\u6570\u636e     <br><br>wire          arp_gmii_tx_en; \/\/ARP GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7 <br>wire  [7:0]   arp_gmii_txd  ; \/\/ARP GMII\u8f93\u51fa\u6570\u636e<br>wire          arp_rx_done   ; \/\/ARP\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>wire          arp_rx_type   ; \/\/ARP\u63a5\u6536\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>wire  [47:0]  src_mac       ; \/\/\u63a5\u6536\u5230\u76ee\u7684MAC\u5730\u5740<br>wire  [31:0]  src_ip        ; \/\/\u63a5\u6536\u5230\u76ee\u7684IP\u5730\u5740    <br>wire          arp_tx_en     ; \/\/ARP\u53d1\u9001\u4f7f\u80fd\u4fe1\u53f7<br>wire          arp_tx_type   ; \/\/ARP\u53d1\u9001\u7c7b\u578b 0:\u8bf7\u6c42  1:\u5e94\u7b54<br>wire  [47:0]  des_mac       ; \/\/\u53d1\u9001\u7684\u76ee\u6807MAC\u5730\u5740<br>wire  [31:0]  des_ip        ; \/\/\u53d1\u9001\u7684\u76ee\u6807IP\u5730\u5740   <br>wire          arp_tx_done   ; \/\/ARP\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br><br>wire          udp_gmii_tx_en; \/\/UDP GMII\u8f93\u51fa\u6570\u636e\u6709\u6548\u4fe1\u53f7 <br>wire  [7:0]   udp_gmii_txd  ; \/\/UDP GMII\u8f93\u51fa\u6570\u636e<br>wire          rec_pkt_done  ; \/\/UDP\u5355\u5305\u6570\u636e\u63a5\u6536\u5b8c\u6210\u4fe1\u53f7<br>wire          rec_en        ; \/\/UDP\u63a5\u6536\u7684\u6570\u636e\u4f7f\u80fd\u4fe1\u53f7<br>wire  [31:0]  rec_data      ; \/\/UDP\u63a5\u6536\u7684\u6570\u636e<br>wire  [15:0]  rec_byte_num  ; \/\/UDP\u63a5\u6536\u7684\u6709\u6548\u5b57\u8282\u6570 \u5355\u4f4d:byte <br>wire  [15:0]  tx_byte_num   ; \/\/UDP\u53d1\u9001\u7684\u6709\u6548\u5b57\u8282\u6570 \u5355\u4f4d:byte <br>wire          udp_tx_done   ; \/\/UDP\u53d1\u9001\u5b8c\u6210\u4fe1\u53f7<br>wire          tx_req        ; \/\/UDP\u8bfb\u6570\u636e\u8bf7\u6c42\u4fe1\u53f7<br>wire  [31:0]  tx_data       ; \/\/UDP\u5f85\u53d1\u9001\u6570\u636e<br><br><br>wire clk_200m;<br>clk_wiz_0 u_clock(<br>    .clk_in1(sys_clk),<br>    .clk_out1(clk_200m)<br>);<br><br>wire   tx_start_en = rec_pkt_done;<br>assign tx_byte_num = rec_byte_num;<br>assign des_mac = src_mac;<br>assign des_ip = src_ip;<br>assign eth_rst_n = sys_rst_n;<br><br><br>\/\/GMII\u63a5\u53e3\u8f6cRGMII\u63a5\u53e3<br>rgmii_to_gmii u_gmii_to_rgmii(<br>    .idelay_clk    (clk_200m),<br>    .gmii_rx_clk   (gmii_rx_clk ),<br>    .gmii_rx_dv    (gmii_rx_dv  ),<br>    .gmii_rxd      (gmii_rxd    ),<br>    .gmii_tx_clk   (gmii_tx_clk ),<br>    .gmii_tx_en    (gmii_tx_en  ),<br>    .gmii_txd      (gmii_txd    ),<br>    <br>    .rgmii_rxc     (eth_rxc     ),<br>    .rgmii_rx_ctl  (eth_rx_ctl  ),<br>    .rgmii_rxd     (eth_rxd     ),<br>    .rgmii_txc     (eth_txc     ),<br>    .rgmii_tx_ctl  (eth_tx_ctl  ),<br>    .rgmii_txd     (eth_txd     )<br> );<br><br>\/\/ARP\u901a\u4fe1<br>arp                                             <br>   #(<br>    .BOARD_MAC     (BOARD_MAC),      \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP      (BOARD_IP ),<br>    .DES_MAC       (DES_MAC  ),<br>    .DES_IP        (DES_IP   )<br>    )<br>   u_arp(<br>    .rst_n         (sys_rst_n  ),<br>                    <br>    .gmii_rx_clk   (gmii_rx_clk),<br>    .gmii_rx_dv    (gmii_rx_dv ),<br>    .gmii_rxd      (gmii_rxd   ),<br>    .gmii_tx_clk   (gmii_tx_clk),<br>    .gmii_tx_en    (arp_gmii_tx_en ),<br>    .gmii_txd      (arp_gmii_txd),<br>                    <br>    .arp_rx_done   (arp_rx_done),<br>    .arp_rx_type   (arp_rx_type),<br>    .src_mac       (src_mac    ),<br>    .src_ip        (src_ip     ),<br>    .arp_tx_en     (arp_tx_en  ),<br>    .arp_tx_type   (arp_tx_type),<br>    .des_mac       (des_mac    ),<br>    .des_ip        (des_ip     ),<br>    .tx_done       (arp_tx_done)<br>    );<br><br>\/\/UDP\u901a\u4fe1<br>udp                                             <br>   #(<br>    .BOARD_MAC     (BOARD_MAC),      \/\/\u53c2\u6570\u4f8b\u5316<br>    .BOARD_IP      (BOARD_IP ),<br>    .DES_MAC       (DES_MAC  ),<br>    .DES_IP        (DES_IP   )<br>    )<br>   u_udp(<br>    .rst_n         (sys_rst_n   ),  <br>    <br>    .gmii_rx_clk   (gmii_rx_clk ),           <br>    .gmii_rx_dv    (gmii_rx_dv  ),         <br>    .gmii_rxd      (gmii_rxd    ),                   <br>    .gmii_tx_clk   (gmii_tx_clk ), <br>    .gmii_tx_en    (udp_gmii_tx_en),         <br>    .gmii_txd      (udp_gmii_txd),  <br><br>    .rec_pkt_done  (rec_pkt_done),    <br>    .rec_en        (rec_en      ),     <br>    .rec_data      (rec_data    ),         <br>    .rec_byte_num  (rec_byte_num),      <br>    .tx_start_en   (tx_start_en ),        <br>    .tx_data       (tx_data     ),         <br>    .tx_byte_num   (tx_byte_num ),  <br>    .des_mac       (des_mac     ),<br>    .des_ip        (des_ip      ),    <br>    .tx_done       (udp_tx_done ),        <br>    .tx_req        (tx_req      )           <br>    ); <br><br>\/\/\u540c\u6b65FIFO<br>sync_fifo_2048x32b u_sync_fifo_2048x32b (<br>    .clk      (gmii_rx_clk),  \/\/ input wire clk<br>    .rst      (~sys_rst_n),  \/\/ input wire rst<br>    .din      (rec_data  ),  \/\/ input wire [31 : 0] din<br>    .wr_en    (rec_en    ),  \/\/ input wire wr_en<br>    .rd_en    (tx_req    ),  \/\/ input wire rd_en<br>    .dout     (tx_data   ),  \/\/ output wire [31 : 0] dout<br>    .full     (),            \/\/ output wire full<br>    .empty    ()             \/\/ output wire empty<br>    );    <br><br>\/\/\u4ee5\u592a\u7f51\u63a7\u5236\u6a21\u5757<br>eth_ctrl u_eth_ctrl(<br>    .clk            (gmii_rx_clk),<br>    .rst_n          (sys_rst_n),<br><br>    .arp_rx_done    (arp_rx_done   ),<br>    .arp_rx_type    (arp_rx_type   ),<br>    .arp_tx_en      (arp_tx_en     ),<br>    .arp_tx_type    (arp_tx_type   ),<br>    .arp_tx_done    (arp_tx_done   ),<br>    .arp_gmii_tx_en (arp_gmii_tx_en),<br>    .arp_gmii_txd   (arp_gmii_txd  ),<br>    <br>    .udp_tx_start_en(tx_start_en   ),<br>    .udp_tx_done    (udp_tx_done   ),    <br>    .udp_gmii_tx_en (udp_gmii_tx_en),<br>    .udp_gmii_txd   (udp_gmii_txd  ),<br>                     <br>    .gmii_tx_en     (gmii_tx_en    ),<br>    .gmii_txd       (gmii_txd      )<br>    );<br><br>endmodule<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5728\u9876\u5c42\u6a21\u5757\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4fee\u6539\u5de5\u7a0b\u7684\u5982\u4e0b\u4fe1\u606f\uff1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>BOARD_MAC\uff1a \u5f00\u53d1\u677f\u7684MAC \u5730\u5740<\/li>\n\n\n\n<li>BOARD_IP\uff1a\u5f00\u53d1\u677fIP\u5730\u5740<\/li>\n\n\n\n<li>DES_MAC\uff1a\u76ee\u7684MAC\u5730\u5740 \uff08\u4e00\u822c\u901a\u8fc7ARP \u83b7\u5f97 \u8fd9\u91cc\u4e0d\u9700\u8981\u4fee\u6539\uff09<\/li>\n\n\n\n<li>DES_IP\uff1a \u76ee\u7684IP\u5730\u5740<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u91cc\u9700\u8981\u8bf4\u660e\u4e00\u70b9 \uff0c\u6574\u4e2a\u5de5\u7a0b\u53ea\u9700\u8981\u4fee\u6539\u9876\u5c42\u6a21\u5757\u4e2d\u7684IP MAC \u7b49\u4fe1\u606f\uff0c  \u5bf9\u5e94ARP \u6216\u8005UDP \u5185\u7684\u9884\u8bbe IP \u548cMAC \u4e5f\u4f1a\u4e00\u540c\u88ab\u4fee\u6539\uff0c\u6240\u4ee5\u53ea\u9700\u8981\u4fee\u6539\u9876\u5c42\u6a21\u5757\u5bf9\u5e94\u7684\u5185\u5bb9\u5373\u53ef\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516b\u3001\u589e\u52a0\u7ba1\u811a\u7ea6\u675f\u6587\u4ef6<\/strong><\/h2>\n\n\n\n<p><strong>1 \uff09Smart Artix \u4e3b\u677f\u7ba1\u811a\u7ea6\u675f\u6587\u4ef6<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Smart Artix <br>create_clock -period 8.000 -name eth_rxc [get_ports eth_rxc]<br><br>set_property PACKAGE_PIN Y18 [get_ports sys_clk]<br>set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]<br><br>set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]<br><br>set_property -dict {PACKAGE_PIN V19 IOSTANDARD LVCMOS33} [get_ports eth_rst_n]<br>set_property -dict {PACKAGE_PIN W19 IOSTANDARD LVCMOS33} [get_ports eth_rxc]<br>set_property -dict {PACKAGE_PIN AA21 IOSTANDARD LVCMOS33} [get_ports eth_rx_ctl]<br>set_property -dict {PACKAGE_PIN AA20 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[0]}]<br>set_property -dict {PACKAGE_PIN W22 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[1]}]<br>set_property -dict {PACKAGE_PIN W21 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[2]}]<br>set_property -dict {PACKAGE_PIN W20 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[3]}]<br><br>set_property -dict {PACKAGE_PIN AB21 IOSTANDARD LVCMOS33} [get_ports eth_txc]<br>set_property -dict {PACKAGE_PIN AA18 IOSTANDARD LVCMOS33} [get_ports eth_tx_ctl]<br>set_property -dict {PACKAGE_PIN AB20 IOSTANDARD LVCMOS33} [get_ports {eth_txd[0]}]<br>set_property -dict {PACKAGE_PIN AA19 IOSTANDARD LVCMOS33} [get_ports {eth_txd[1]}]<br>set_property -dict {PACKAGE_PIN Y19 IOSTANDARD LVCMOS33} [get_ports {eth_txd[2]}]<br>set_property -dict {PACKAGE_PIN AB18 IOSTANDARD LVCMOS33} [get_ports {eth_txd[3]}]<br><br><br>set_property SLEW FAST [get_ports {eth_txd[0]}]<br>set_property SLEW FAST [get_ports eth_rst_n]<br>set_property SLEW FAST [get_ports eth_tx_ctl]<br>set_property SLEW FAST [get_ports {eth_txd[3]}]<br>set_property SLEW FAST [get_ports {eth_txd[2]}]<br>set_property SLEW FAST [get_ports {eth_txd[1]}]<br>set_property SLEW FAST [get_ports eth_txc]<br><\/pre>\n\n\n\n<p><strong>2 \uff09Smart ZYNQ SP\/SP2\/SL \u4e3b\u677f\u7ba1\u811a\u7ea6\u675f\u6587\u4ef6<\/strong> \uff08\u7528KEY1\u5145\u5f53\u590d\u4f4d\u6309\u952e\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">create_clock -period 8.000 -name eth_rxc [get_ports eth_rxc]<br><br>set_property -dict {PACKAGE_PIN K21 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]<br>set_property -dict {PACKAGE_PIN M19 IOSTANDARD LVCMOS33} [get_ports sys_clk]<br><br>set_property -dict {PACKAGE_PIN H17 IOSTANDARD LVCMOS33} [get_ports eth_rst_n]<br>set_property -dict {PACKAGE_PIN B19 IOSTANDARD LVCMOS33} [get_ports eth_rxc]<br>set_property -dict {PACKAGE_PIN A21 IOSTANDARD LVCMOS33} [get_ports eth_rx_ctl]<br>set_property -dict {PACKAGE_PIN A22 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[0]}]<br>set_property -dict {PACKAGE_PIN A18 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[1]}]<br>set_property -dict {PACKAGE_PIN A19 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[2]}]<br>set_property -dict {PACKAGE_PIN B20 IOSTANDARD LVCMOS33} [get_ports {eth_rxd[3]}]<br>set_property -dict {PACKAGE_PIN D21 IOSTANDARD LVCMOS33} [get_ports eth_txc]<br>set_property -dict {PACKAGE_PIN G22 IOSTANDARD LVCMOS33} [get_ports eth_tx_ctl]<br>set_property -dict {PACKAGE_PIN E21 IOSTANDARD LVCMOS33} [get_ports {eth_txd[0]}]<br>set_property -dict {PACKAGE_PIN F21 IOSTANDARD LVCMOS33} [get_ports {eth_txd[1]}]<br>set_property -dict {PACKAGE_PIN F22 IOSTANDARD LVCMOS33} [get_ports {eth_txd[2]}]<br>set_property -dict {PACKAGE_PIN G20 IOSTANDARD LVCMOS33} [get_ports {eth_txd[3]}]<br><br>set_property SLEW FAST [get_ports {eth_txd[0]}]<br>set_property SLEW FAST [get_ports eth_rst_n]<br>set_property SLEW FAST [get_ports eth_tx_ctl]<br>set_property SLEW FAST [get_ports {eth_txd[3]}]<br>set_property SLEW FAST [get_ports {eth_txd[2]}]<br>set_property SLEW FAST [get_ports {eth_txd[1]}]<br>set_property SLEW FAST [get_ports eth_txc]<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e5d\u3001\u4e0b\u8f7d\u548c\u6d4b\u8bd5<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e0b\u8f7d\u4ee3\u7801\u4ee5\u53caIP\u8bbe\u7f6e<\/strong><\/h2>\n\n\n\n<p>1.\u7f16\u8bd1\u548c\u7efc\u5408\u6211\u4eec\u7684\u5de5\u7a0b<\/p>\n\n\n\n<p>2.\u5c06\u7f51\u7ebf\u4e00\u7aef\u63a5\u5230\u6211\u4eec\u7684\u5f00\u53d1\u677f\uff08Smart ZYNQ \u6216\u8005Smart Artix \u4e3b\u677f\uff09\u7684RJ45\u7aef\uff0c\u53e6\u4e00\u7aef\u63a5\u7535\u8111\u7684\u7f51\u53e3\u3002\uff08\u8fd9\u91cc\u91c7\u7528\u76f4\u8fde\u65b9\u5f0f\uff09<\/p>\n\n\n\n<p>3.\u4e0b\u8f7d\u6211\u4eec\u521a\u521a\u7f16\u8bd1\u7efc\u5408\u5f97\u5230\u7684bit\u6587\u4ef6\u5230\u6211\u4eec\u7684FPGA\u4e3b\u677f<\/p>\n\n\n\n<p>4.\u5982\u679c\u524d\u9762\u64cd\u4f5c\u65e0\u8bef\u7684\u8bdd\uff0c\u7535\u8111\u7aef\u4f1a\u663e\u793a\u4ee5\u592a\u7f51\u6709\u7f51\u7edc\u8fde\u63a5\uff08\u672a\u8bc6\u522b\u7684\u7f51\u7edc\uff0c\u8fde\u63a5\u901f\u5ea61G\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"1024\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-7-950x1024.png\" alt=\"\" class=\"wp-image-11048\" style=\"aspect-ratio:0.927536231884058;width:538px;height:auto\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-7-950x1024.png 950w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-7-278x300.png 278w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-7-768x828.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-7.png 960w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>5. \u56e0\u4e3a\u6211\u4eec\u7684\u4e3b\u677f\u5728\u5de5\u7a0b\u4e0a\u8bbe\u7f6e\u7684IP\u662f\u9ed8\u8ba4\u56fa\u5b9a\u7684\uff08\u9759\u6001IP\uff09192.168.1.10\uff0c\u76ee\u7684\u5730\u7684IP\u5730\u5740\u662f192.168.1.102 \uff0c \u6240\u4ee5\u5728\u8bbe\u7f6e\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u624b\u52a8\u4e3a\u7535\u8111\u8bbe\u7f6eIP\u6bb5\uff08\u9ed8\u8ba4\u7f51\u5173 192.168.1.1\uff09\u548cIP\u5730\u5740\uff08192.168.1.102\uff09\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"542\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8-1024x542.png\" alt=\"\" class=\"wp-image-11050\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8-1024x542.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8-300x159.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8-768x407.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8-1536x813.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-8.png 1568w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong> \u901a\u8fc7\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b\u6765\u9a8c\u8bc1\u5f00\u53d1\u677f\u7684UDP\u6536\u53d1\u529f\u80fd<\/strong><\/h2>\n\n\n\n<p>\u6253\u5f00\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b\uff08\u767e\u5ea6\u53ef\u4ee5\u4e0b\u8f7d\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u672c\u7ad9\u8fde\u63a5\u4e0b\u8f7d\uff1a<strong><a href=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2023\/01\/%E7%BD%91%E7%BB%9C%E8%B0%83%E8%AF%95%E5%8A%A9%E6%89%8B-v4.3.29.zip\">\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b v4.3.29\u4e0b\u8f7d<\/a><\/strong>\uff09\uff0c\u534f\u8bae\u7c7b\u578b\u9009UDP\uff0c\u672c\u5730\u4e3b\u673a\u5730\u5740 192.168.1.102\uff0c\u7aef\u53e3\u53f7\u51991234\uff0c\u4e4b\u540e\u70b9\u9009&#8221;\u6253\u5f00&#8221;\u3002\u7136\u540e\u5728\u53f3\u4e0b\u811a\u7684\u8fdc\u7a0b\u4e3b\u673a\u586b\u4e0a\u5f00\u53d1\u677f\u7684IP\u5730\u5740 \u548c\u7aef\u53e3\u53f7\uff08192.168.1.10:1234\uff09\uff0c\u4e4b\u540e\u5728\u6570\u636e\u53d1\u9001\u533a\u53d1\u9001\u4efb\u4f55\u6570\u636e\uff0c\u90fd\u53ef\u4ee5\u5728\u8f6f\u4ef6\u4e2d\u63a5\u6536\u5230\u76f8\u540c\u7684\u6570\u636e\uff0c\u8bc1\u660e\u6570\u636e\u73af\u56de\u6210\u529f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"879\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-9.png\" alt=\"\" class=\"wp-image-11052\" style=\"aspect-ratio:1.1058244462674323;width:566px;height:auto\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-9.png 972w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-9-300x271.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-9-768x695.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u7528Wireshark \u8f6f\u4ef6\u6765\u6293\u901a\u8baf\u8fc7\u7a0b\u4e2d\u7684\u6570\u636e\u5305<\/strong><\/h2>\n\n\n\n<p><strong>1. \u7528Wireshark \u6293UDP\u6570\u636e\u5305<\/strong><\/p>\n\n\n\n<p> \u63a5\u4e0b\u6765\u6211\u4eec\u901a\u8fc7Wireshark\u8f6f\u4ef6\u6765\u6293\u901a\u8baf\u6570\u636e\uff0c\u6253\u5f00wireshark\u8f6f\u4ef6\uff0c\u53cc\u51fb\u4e0b\u56fe\u6240\u793a\u7684\u4ee5\u592a\u7f51\uff0c\u5373\u53ef\u5f00\u59cb\u6293\u53d6\u672c\u5730\u8fde\u63a5\u7684\u6570\u636e\u5305<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"378\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-10.png\" alt=\"\" class=\"wp-image-11054\" style=\"aspect-ratio:1.8810395953253096;width:606px;height:auto\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-10.png 711w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-10-300x159.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p>\u5728Wireshark\u4e2d\u53ef\u4ee5\u770b\u5230\uff0c\u6211\u4eec\u5df2\u7ecf\u6293\u53d6\u5230\u901a\u8fc7\u4ee5\u592a\u7f51\u7aef\u53e3\u8fdb\u51fa\u7684\u6570\u636e\u5305\uff08\u6b64\u65f6\u8fd9\u4e9b\u6570\u636e\u5305\u5f88\u591a\u90fd\u662f\u7531\u7cfb\u7edf\uff0c\u6216\u8005\u5176\u4ed6\u8f6f\u4ef6\u53d1\u9001\u7684\uff0c\u548c\u6211\u4eec\u672c\u6b21\u5b9e\u9a8c\u65e0\u5173\uff09\uff0c\u8fd9\u4e2a\u65f6\u5019\u6211\u4eec\u6309\u7167\u4e0a\u6587\u7684\u64cd\u4f5c\u91cd\u65b0\u5728\u7f51\u53e3\u8c03\u8bd5\u52a9\u624b\u4e2d\u70b9\u51fb\u201c\u53d1\u9001\u201d\u6309\u94ae\uff0c\u53ef\u4ee5\u770b\u5230Wireshark\u8f6f\u4ef6\u4e2d\u6293\u5230\u4e86\u6211\u4eec\u53d1\u9001\u7684\u6570\u636e\uff08\u53ef\u4ee5\u540c\u65f6\u770b\u5230\u6211\u4eec\u53d1\u9001\u7ed9\u5f00\u53d1\u677f\u7684\u6570\u636e\uff0c\u548c\u5f00\u53d1\u677f\u6536\u5230\u540e\u7acb\u523b\u56de\u4f20\u7684\u5e27\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"113\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-13-1024x113.png\" alt=\"\" class=\"wp-image-11059\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-13-1024x113.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-13-300x33.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-13-768x84.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-13.png 1227w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p>\u8be6\u7ec6\u67e5\u770b\u6bcf\u4e00\u4e2a\u6570\u636e\u5305\u7684\u5185\u5bb9\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5f97\u77e5\u6e90IP\u5730\u5740\uff08192.168.1.10\uff09\uff0c\u76ee\u7684IP\u5730\u5740\uff08192.168.1.102\uff09\uff0c\u6e90\u7aef\u53e3\u53f7\u548c\u76ee\u7684\u5730\u7aef\u53e3\u53f7\u3002\u4ee5\u53ca\u4f20\u8f93\u7684\u5185\u5bb9\uff08\u5305\u542b\u6211\u4eec\u53d1\u9001\u7684WWW.HELLOFPGA.COM\u7684\u5185\u5bb9\uff09\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"760\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12-1024x760.png\" alt=\"\" class=\"wp-image-11057\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12-1024x760.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12-300x223.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12-768x570.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12-1536x1141.png 1536w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-12.png 1713w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p><strong>2 \u7528Wireshark \u6293ARP\u8bf7\u6c42\u548c\u5e94\u7b54\u6570\u636e\u5305<\/strong><\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u5c1d\u8bd5\u5728Wireshark\u4e2d\u6293\u53d6ARP\u6570\u636e\u5305\u3002\u56e0\u4e3a\u5728\u4e4b\u524d\u7684\u5b9e\u9a8c\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u8bb0\u5f55\u4e86192.168.1.10\u5bf9\u5e94\u7684IP\u548cMAC\u5730\u5740\uff0c\u6240\u4ee5\u9996\u5148\u53ef\u4ee5\u901a\u8fc7<code>arp -d<\/code>\u547d\u4ee4\u6e05\u9664ARP\u8868\u3002<\/p>\n\n\n\n<p>\u64cd\u4f5c\u6b65\u9aa4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9996\u5148\uff0c\u901a\u8fc7<code>arp -a<\/code>\u547d\u4ee4\u67e5\u8be2ARP\u8868\u3002\u5728\u8fd9\u91cc\uff0c\u4f60\u4f1a\u770b\u5230192.168.1.10\u5bf9\u5e94\u7684MAC\u5730\u5740\uff08\u4f8b\u5982\uff1a00-11-22-33-44-55\uff09\u3002\u8fd9\u56e0\u4e3a\u5728\u4e4b\u524d\u7684\u5b9e\u9a8c\u4e2d\uff0c\u7cfb\u7edf\u5df2\u7ecf\u5b8c\u6210\u4e86ARP\u8bf7\u6c42\u6d41\u7a0b\uff0c\u6240\u4ee5\u4e0b\u9762\u7684ARP\u8868\u4e2d\u5df2\u7ecf\u6709\u4e86\u8fd9\u4e2aIP\u548cMAC\u7684\u6620\u5c04\u3002<\/li>\n\n\n\n<li>\u63a5\u7740\uff0c\u4f7f\u7528<code>arp -d<\/code>\u547d\u4ee4\u6e05\u7a7aARP\u8868\u3002\u6e05\u7a7a\u540e\uff0c\u518d\u6b21\u8f93\u5165<code>arp -a<\/code>\u547d\u4ee4\u67e5\u770b\uff0c\u4f60\u4f1a\u53d1\u73b0192.168.1.10\u7684\u6761\u76ee\u5df2\u7ecf\u6d88\u5931\u4e86\u3002\u5176\u4ed6IP\u5730\u5740\u7684\u4fe1\u606f\u4f1a\u662f\u521a\u521a\u901a\u8fc7ARP\u8bf7\u6c42\u83b7\u5f97\u7684\u65b0\u6761\u76ee\u3002<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"552\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/22a29b62db3000664eb9c7685794333e.png\" alt=\"\" class=\"wp-image-11065\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/22a29b62db3000664eb9c7685794333e.png 656w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/22a29b62db3000664eb9c7685794333e-300x252.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><\/figure>\n\n\n\n<p>\u4e4b\u540e\u518d\u901a\u8fc7\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b\u6216\u8005\u7528ping\u4e4b\u7c7b\u7684\u547d\u4ee4\u53bb\u8bbf\u95ee192.168.1.10\u5730\u5740\uff0c\u56e0\u4e3a\u4e4b\u524d\u7cfb\u7edf\u7684arp\u8868\u5df2\u7ecf\u88ab\u6211\u4eec\u6e05\u9664\u6ca1\u6709\u5bf9\u5e94\u7684\u4fe1\u606f\u4e86\uff0c\u6240\u4ee5\u7535\u8111\u4f1a\u4e3b\u52a8\u53d1\u9001arp\u8bf7\u6c42\u7684\u547d\u4ee4\uff0c\u5728Wireshark \u4e2d\u4e5f\u4f1a\u6293\u5230ARP\u5bf9\u5e94\u7684\u6570\u636e\u5305 \uff08who has 192.168.1.10\uff09\u4ee5\u53ca\u5f00\u53d1\u677f\u56de\u590d\u7684\u5e94\u7b54\u5305 (192.168.1.10 is at &#8230;..)(ARP\u6570\u636e\u5305\u4e00\u822c\u5728win \u7684arp \u8868\u4e2d\u8fd8\u6ca1\u6709\u8bb0\u5f55\u5bf9\u5e94IP\u4fe1\u606f\u7684\u65f6\u5019\u624d\u4f1a\u53d1\u51fa\uff0c\u4e5f\u53ef\u901a\u8fc7\u5728cmd\u4e2d\u8f93\u5165 arp -d \u6307\u4ee4\u6e05\u7a7aarp\u8868\uff0c\u518d\u8fdb\u884c\u6293\u5305)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"138\" src=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-14-1024x138.png\" alt=\"\" class=\"wp-image-11062\" srcset=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-14-1024x138.png 1024w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-14-300x41.png 300w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-14-768x104.png 768w, http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/image-14.png 1155w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u672c\u6b21\u5b9e\u9a8c\u7684\u8bf4\u660e\uff1a<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>PHY\u90e8\u5206\u7535\u8def\u8bbe\u7f6e\uff1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u672c\u6b21\u5b9e\u9a8c\u4e2d\uff0cPHY\u82af\u7247\u5185\u90e8\u7684Rx DLY\u548cTx DLY\u529f\u80fd\u5df2\u7ecf\u5728\u786c\u4ef6\u4e0a\u5f00\u542f\u3002<\/li>\n\n\n\n<li>\u56e0\u6b64\u5de5\u7a0b\u4e2dRGMII TXC\u8f93\u51fa\u4e0d\u9700\u8981\u589e\u52a090\u5ea6\u76f8\u4f4d\u5dee\u3002<\/li>\n\n\n\n<li>\u5bf9\u4e8e\uff0cRGMII\u63a5\u6536\u90e8\u5206\uff08RX\uff09\uff0c\u56e0\u4e3a7\u7cfbFPGA IOCLK \u4f1a\u5b58\u5728\u6ede\u540e\u60c5\u51b5\uff0c\u6240\u4ee5\u8fd9\u91cc\u5373\u4f7fPHY\u5f00\u542f\u4e86Rx DLY\u529f\u80fd\uff0cRXC\u90e8\u5206\u4ecd\u7136\u9700\u8981\u989d\u5916\u589e\u52a0\u4e00\u4e2aIDELAY\u6a21\u5757\u6765\u5bf9rgmii\u7684RX\u6570\u636e\u5ef6\u65f6\u8fdb\u884c\u4fee\u6b63\uff08\u8ba9RXC\u91c7\u6837\u6cbf\u80fd\u843d\u5728\u6570\u636e\u7684\u4e2d\u5fc3\u4f4d\u7f6e\uff09<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u590d\u4f4d\u4fe1\u53f7\u8bbe\u7f6e\uff1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>Smart Artix\u7684<code>sys_rst_n<\/code>\u5f15\u811a\u8fde\u63a5\u5230\u4e86\u5f00\u53d1\u677f\u5bf9\u5e94\u7684\u590d\u4f4d\u6309\u952e\u5f15\u811a\u3002<\/li>\n\n\n\n<li>Smart ZYNQ\u7531\u4e8e\u53ea\u6709POR\u590d\u4f4d\u811a\uff0c\u56e0\u6b64<code>sys_rst_n<\/code>\u53ef\u6682\u65f6\u8fde\u63a5\u5230\u677f\u5b50\u7684\u666e\u901a\u6309\u952e\u811a\u4e0a\u8fdb\u884c\u8c03\u8bd5,\u672c\u4f8b\u7528KEY1\u6765\u4f5c\u6f14\u793a\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ICMP\u90e8\u5206\u529f\u80fd\uff1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5de5\u7a0b\u4e2d\u6ca1\u6709\u5b9e\u73b0ICMP\u534f\u8bae\u529f\u80fd\uff0c\u5c3d\u7ba1\u53ef\u4ee5\u901a\u8fc7<code>ping<\/code>\u547d\u4ee4\u89e6\u53d1ARP\u8bf7\u6c42\u548c\u5e94\u7b54\uff0c\u4f46\u5f00\u53d1\u677f\u65e0\u6cd5\u54cd\u5e94<code>ping<\/code>\u8bf7\u6c42\uff0c\u5bfc\u81f4<code>ping<\/code>\u547d\u4ee4\u8d85\u65f6\u3002\u5982\u679c\u9700\u8981ICMP\u529f\u80fd\uff0c\u5927\u5bb6\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u884c\u79fb\u690d\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u8fde\u63a5\u901f\u5ea6\u8bbe\u7f6e\uff1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u672c\u5b9e\u9a8c\u4ec5\u9488\u5bf91G\u8fde\u63a5\u901f\u5ea6\u8fdb\u884c\u6d4b\u8bd5\uff0c\u5176\u4ed6\u8fde\u63a5\u901f\u5ea6\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u8fdb\u884c\u76f8\u5e94\u4fee\u6539\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u672c\u6587\u7684\u5b8c\u6574\u5de5\u7a0b\u4e0b\u8f7d: (\u8bf7\u6309\u4e3b\u677f\u7c7b\u578b\u8fdb\u884c\u4e0b\u8f7d)<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/17_NET_TEST_Smart_Artix.zip\">17_NET_TEST_Smart_Artix<\/a>\uff08\u9002\u914dSmart Artix 50T\uff09<\/strong> \u66f4\u65b0\u4e8e26\u5e743\u67082\u65e5 \u589e\u52a0IDELAY<\/li>\n\n\n\n<li><a href=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2025\/12\/17_PL_NET_TEST_Smart_ZYNQ_S.zip\"><strong>17_PL_NET_TEST_Smart_ZYNQ_S<\/strong><\/a><strong>\uff08<strong><strong>\u9002\u914d<\/strong><\/strong>Smart ZYNQ SP\/SP2\/SL\uff09<\/strong>Smart ZYNQ \u6807\u51c6\u7248\u9700\u81ea\u884c\u79fb\u690d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>VIVADO\u7684\u7248\u672c\uff1a2018.3<\/strong><\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u5de5\u5177\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b\uff1a<a href=\"http:\/\/www.hellofpga.com\/wp-content\/uploads\/2023\/01\/%E7%BD%91%E7%BB%9C%E8%B0%83%E8%AF%95%E5%8A%A9%E6%89%8B-v4.3.29.zip\">\u7f51\u7edc\u8c03\u8bd5\u52a9\u624b v4.3.29\u4e0b\u8f7d<\/a><\/strong><\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u5de5\u5177Wireshark\u5b98\u65b9\u4e0b\u8f7d\u5730\u5740\uff1a<a href=\"https:\/\/www.wireshark.org\/download.html\">https:\/\/www.wireshark.org\/download.html<\/a><\/strong><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u5b9e\u73b0\u4e0a\u4f4d\u673a\u4e0eFPGA\u4e4b\u95f4\u7684UDP\u6570\u636e\u73af\u56de\u3002\u4e0a\u4f4d\u673a\u901a\u8fc7\u7f51\u53e3\u8c03\u8bd5\u52a9\u624b\u53d1\u9001\u6570\u636e\uff0cFPGA\u901a\u8fc7\u4ee5\u592a\u7f51\u63a5\u53e3\u63a5\u6536\u6570\u636e\uff0c\u5e76\u5c06\u5176\u56de\u4f20\u7ed9\u4e0a\u4f4d\u673a\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-10949","post","type-post","status-publish","format-standard","hentry","category-smart-zynq-spsl"],"views":601,"_links":{"self":[{"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/posts\/10949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/comments?post=10949"}],"version-history":[{"count":139,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/posts\/10949\/revisions"}],"predecessor-version":[{"id":11157,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/posts\/10949\/revisions\/11157"}],"wp:attachment":[{"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/media?parent=10949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/categories?post=10949"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hellofpga.com\/index.php\/wp-json\/wp\/v2\/tags?post=10949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}