{"id":585,"date":"2019-02-11T11:40:35","date_gmt":"2019-02-11T11:40:35","guid":{"rendered":"http:\/\/fpganow.com\/?p=585"},"modified":"2019-02-11T13:17:23","modified_gmt":"2019-02-11T13:17:23","slug":"milestone-reached-udp-end-to-end","status":"publish","type":"post","link":"https:\/\/fpganow.com\/index.php\/2019\/02\/11\/milestone-reached-udp-end-to-end\/","title":{"rendered":"Milestone Reached! UDP end to end"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">What I have working right now:<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>A UDP packet enters the FPGA via the 10 Gigabit PHY that is connected to the FPGA.<\/li><li>The 10 Gigabit Ethernet MAC running on the FPGA consumes the Ethernet Frame and passes it in to a c++ application running inside the MicroBlaze Processor.<\/li><li>The MicroBlaze Processor is running a version of the open-source TCP\/IP stack &#8220;lwip&#8221; which processes the UDP datagram, extracts the pertinent information and passes this information to a specific callback function that is implemented by the user.  In this case that would be me.<\/li><li>My implementation of this callback function sends a session identifier along with the payload out to the FPGA via an AXI FIFO.<\/li><li>The FPGA implementation then takes this packet and forwards it to the host by using a LabVIEW Target-to-Host DMA FIFO.<\/li><\/ol>\n\n\n\n<p>Okay.  So the end goal is to not send the UDP payload up to the host, but to send the UDP payload to another loop inside the FPGA.  This loop will do some sort of analysis or &#8220;trading&#8221; with it.  Additionally, instead of using UDP, I am currently working on the TCP version, I am just trying to figure out the lwip &#8220;RAW&#8221; TCP interface.<\/p>\n\n\n\n<p>All code has been merged to the master branch, see github:<br><br><a href=\"https:\/\/github.com\/fpganow\/MicroBlaze_lwIP\">https:\/\/github.com\/fpganow\/MicroBlaze_lwIP<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Here is a Crude Diagram<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"721\" src=\"http:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/UDP.Schematic-1024x721.png\" alt=\"\" class=\"wp-image-596\" srcset=\"https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/UDP.Schematic-1024x721.png 1024w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/UDP.Schematic-300x211.png 300w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/UDP.Schematic-768x541.png 768w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/UDP.Schematic.png 1214w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Here are a few pictures of my actual set up:<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"http:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/Linux.10.Gigabit-768x1024.png\" alt=\"\" class=\"wp-image-588\" srcset=\"https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/Linux.10.Gigabit.png 768w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/Linux.10.Gigabit-225x300.png 225w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>Linux machine that is connected to my regular network and directly to the FPGA board via a separate <strong>10 Gigabit Mellanox ConnectX-2<\/strong> nic. The blue cable is connected to my regular network.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"http:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/PXIe-6592-768x1024.png\" alt=\"\" class=\"wp-image-589\" srcset=\"https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/PXIe-6592.png 768w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/PXIe-6592-225x300.png 225w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>National Instruments PXI chassis with integration controller running Windows 7 which controls the PXIe-6592 board where a 10 Gigabit port is wired directly to the Linux machine pictured above.  The blue cable is connected to my regular network here as well.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"576\" src=\"http:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/End.to_.End_.png\" alt=\"\" class=\"wp-image-590\" srcset=\"https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/End.to_.End_.png 768w, https:\/\/fpganow.com\/wp-content\/uploads\/2019\/02\/End.to_.End_-300x225.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>Entire setup.  The 10 Gigabit card in the linux server on the left is connected directly to the first port of the PXI-6592 board inside the PXIe chassis on the right<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">What&#8217;s Next?<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Implement TCP server<\/li><li>Create a nice PowerPoint describing the architecture<\/li><li>Consume UDP and TCP data on the FPGA, and do something that is &#8216;low latency&#8217;<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>What I have working right now: A UDP packet enters the FPGA via the 10 Gigabit PHY that is connected to the FPGA. The 10 Gigabit Ethernet MAC running on the FPGA consumes the Ethernet Frame and passes it in to a c++ application running inside the MicroBlaze Processor. The MicroBlaze Processor is running a &#8230; <a title=\"Milestone Reached! UDP end to end\" class=\"read-more\" href=\"https:\/\/fpganow.com\/index.php\/2019\/02\/11\/milestone-reached-udp-end-to-end\/\" aria-label=\"Read more about Milestone Reached! UDP end to end\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-585","post","type-post","status-publish","format-standard","hentry","category-uncategorized","masonry-post","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-50"],"_links":{"self":[{"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/posts\/585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/comments?post=585"}],"version-history":[{"count":8,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/posts\/585\/revisions"}],"predecessor-version":[{"id":598,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/posts\/585\/revisions\/598"}],"wp:attachment":[{"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/media?parent=585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/categories?post=585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fpganow.com\/index.php\/wp-json\/wp\/v2\/tags?post=585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}