{"id":28557,"date":"2021-10-18T06:11:53","date_gmt":"2021-10-18T13:11:53","guid":{"rendered":"https:\/\/blog.digilentinc.com\/?p=28557"},"modified":"2021-10-14T11:23:45","modified_gmt":"2021-10-14T18:23:45","slug":"constraining-ports-manually-via-xdc-file-vs-board-files","status":"publish","type":"post","link":"https:\/\/digilent.com\/blog\/constraining-ports-manually-via-xdc-file-vs-board-files\/","title":{"rendered":"Constraining Ports Manually via XDC File vs. Board Files"},"content":{"rendered":"<h2>Constraining Ports in Block Designs<\/h2>\n<p><span data-contrast=\"auto\">In\u00a0Vivado\u00a0block designs, there are a couple of different ways to\u00a0manage the inputs and outputs of your design\u00a0and which FPGA pin locations they are connected to. Regardless of the method used,\u00a0<\/span><i><span data-contrast=\"auto\">location constraints<\/span><\/i><span data-contrast=\"auto\">, whether\u00a0written manually or automatically generated,\u00a0will always be used.\u00a0Manual constraints\u00a0are\u00a0typed up in\u00a0an XDC file\u00a0(or edited from a template)\u00a0using a text editor.\u00a0Board-file-based constraints\u00a0are created entirely within the IP integrator and generate\u00a0XDC\u00a0files\u00a0behind the scenes.\u00a0When choosing which you should use for the ports in your design, there are some tradeoffs.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Manual constraints can be easier to port from one board to another than automatic constraints. The former requires making some changes to a text file while the latter requires using automated flows to apply IP configuration settings that are required by the board. In the case of simple I\/Os, like LEDs, you just need to change the pin locations in your XDC, and in most cases can continue modifying your block design without worrying about them. Also, you can switch out which LEDs are used the same way \u2013 just changing a few lines of text changes which ports things are tied to \u2013 if for example you wanted to move some of those LEDs output signals into a Pmod connector.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">When using manual constraints, you aren\u2019t locked into using a whole interface. For example, if you don\u2019t care about the third LED on a four LED bank, you just don\u2019t have to wire it up, potentially saving some resources (admittedly in the case of these LEDs, you aren\u2019t saving more than a couple of logic cells). Another alternative is to include it in another interface somewhere \u2013 you could make your own UART indicator LED by tying a transmit line to a second LED output for example. On the other hand, board-file-based constraints are easier to initially set up &#8211; a couple of clicks instead of a decent chunk of time spent entering names and pin locations and cross-checking between several files \u2013 and can handle applying preset configurations for extremely complex IP for you. The Zynq PS is an example of this).<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">It&#8217;s recommended to mix-and-match these approaches, using some board file interfaces and some manually-constrained ports, applying using the technique that best supports your needs for a specific port.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Let\u2019s explore some of the\u00a0terms\u00a0that were introduced above.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2>Defining Some Related Terms<\/h2>\n<p><span data-contrast=\"auto\">So, what are the board files even doing anyway? They take a collection of\u00a0<\/span><i><span data-contrast=\"auto\">pin locations<\/span><\/i><span data-contrast=\"auto\">\u00a0(physical locations connecting the FPGA to the rest of the board) and associate them to a\u00a0<\/span><i><span data-contrast=\"auto\">component<\/span><\/i><span data-contrast=\"auto\">, an\u00a0<\/span><i><span data-contrast=\"auto\">interface<\/span><\/i><span data-contrast=\"auto\">, and one or more\u00a0<\/span><i><span data-contrast=\"auto\">presets<\/span><\/i><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">A component in this case means something like \u201ca part on the board\u201d \u2013 the FPGA has a component and a reset button, a DDR memory chip, or an HDMI connector would each have their own component.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">An interface is a set of names for signals that connect two components \u2013 a SPI interface has a clock, chip select, and a few data lines.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">An IP preset is a pre-defined configuration of an IP core, which sets it up to work for your component.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2>Overview of Location Constraints<\/h2>\n<p><span class=\"NormalTextRun BCX0 SCXW198210550\">What does \u201cconstraining a port\u201d mean<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">?\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">The location constraints in a\u00a0<\/span><span class=\"NormalTextRun SpellingErrorV2 BCX0 SCXW198210550\">Vivado<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0project are like a map of the\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">metaphorical\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">edge of the FPGA chip<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">. P<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">hysical locations on the chip,\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">denoted by\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">the pin names you would find in a schematic (E2, A14, VV12, or similar)<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">,<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0are\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">associated with\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">the top-level ports in your\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">hardware design<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">, named whatever you chose to name them in\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">the<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0design.\u00a0<\/span><span class=\"NormalTextRun CommentStart BCX0 SCXW198210550\">For a trivial example, you\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">have a<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">n LED<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0on your board<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">labeled\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u201c<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">LED4<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u201d<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0in the schematic<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">, physically connected to p<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">in<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">H5<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">, which you want to be driven by the port \u201c<\/span><span class=\"NormalTextRun SpellingErrorV2 BCX0 SCXW198210550\">status_indicator_led<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u201d in your design.<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">\u00a0The following line of an XDC\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">accomplishes\u00a0<\/span><span class=\"NormalTextRun BCX0 SCXW198210550\">this connection.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-28621\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/xdc-line.jpg\" alt=\"\" width=\"629\" height=\"49\" data-wp-pid=\"28621\" \/><\/p>\n<p><span class=\"TextRun SCXW260029321 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW260029321 BCX0\">Importantly,<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0the tools don\u2019t inherently know anything about your board,\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">and the constraint file may need to contain more information than just the location constraints. F<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">or\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">a few\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">example<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">s<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">,<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0the logic standard\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">of<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0the FPGA bank that the\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">pin is located\u00a0<\/span><span class=\"NormalTextRun ContextualSpellingAndGrammarErrorV2 SCXW260029321 BCX0\">within<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0or the period of an input clock<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0may be specified in an XDC<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">.<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">D<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">oes the FPGA bank operate on 3.3V or 1.2V or some other form of logic?<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">How fast does\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">all<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0the logic being run\u00a0<\/span><span class=\"NormalTextRun AdvancedProofingIssueV2 SCXW260029321 BCX0\">off of<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0this clock need to be able to run?\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">Y<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">ou should always first check\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">for<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">vendor-provided constraint<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0files<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0to see what the minimum necessary constraints to use a pin are.\u00a0<\/span><span class=\"NormalTextRun SpellingErrorV2 SCXW260029321 BCX0\">Digilent<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0provides these\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">files<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">for all our 7-series FPGA and SoC boards\u00a0<\/span><span class=\"NormalTextRun SCXW260029321 BCX0\">in the\u00a0<\/span><\/span><a class=\"Hyperlink SCXW260029321 BCX0\" href=\"https:\/\/github.com\/Digilent\/digilent-xdc\" target=\"_blank\" rel=\"noreferrer noopener\"><span class=\"TextRun Underlined SCXW260029321 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW260029321 BCX0\" data-ccp-charstyle=\"Hyperlink\">https:\/\/github.com\/Digilent\/digilent-xdc<\/span><\/span><\/a><span class=\"TextRun SCXW260029321 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW260029321 BCX0\">\u00a0repository.<\/span><\/span><span class=\"EOP SCXW260029321 BCX0\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-28622\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/led-pin-location.jpg\" alt=\"\" width=\"628\" height=\"440\" data-wp-pid=\"28622\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-28623\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/led-pin-location-2.jpg\" alt=\"\" width=\"633\" height=\"490\" data-wp-pid=\"28623\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-28624\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/schematic-label.jpg\" alt=\"\" width=\"600\" height=\"315\" data-wp-pid=\"28624\" \/><\/p>\n<h2>Board File Overview<\/h2>\n<p><span data-contrast=\"auto\">Board files, provided by FPGA board vendors (like us!)\u00a0let you abstract away\u00a0the details of\u00a0constraint file\u00a0when working within\u00a0Vivado\u00a0IP Integrator. These files provide additional information\u00a0beyond what XDCs\u00a0provide\u00a0to the tools about\u00a0the peripherals on the board. They do this by 1. providing\u00a0all\u00a0the constraints necessary for the tools to write a constraint file itself, and 2. providing preset IP configurations that you can start with\u00a0to\u00a0connect the entire\u00a0<\/span><i><span data-contrast=\"auto\">interface\u00a0<\/span><\/i><span data-contrast=\"auto\">a peripheral is connected to the FPGA through to a predetermined IP core\u00a0capable of controlling it, thus abstracting away much of the intricacies of the physical interface. As an example, if\u00a0a peripheral\u00a0uses\u00a0a\u00a0SPI\u00a0interface, the board files will typically provide the ability to add an already configured SPI controller to a design, which has the\u00a0settings required to make the controller use (a) correct SPI mode for that\u00a0peripheral. You typically still need to do a little bit of configuration to\u00a0be able to\u00a0wire up the\u00a0IP\u00a0to whatever you have controlling it, but\u00a0this is the nature of any kind of design\/integration.\u00a0The constraints are entirely abstracted away, and you largely don\u2019t need to worry about them at all (if nothing goes wrong).<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">When you are using\u00a0an\u00a0SoC board, it\u2019s highly recommended to use the board files at least for access to the Zynq preset. This\u00a0lets you use the Block Automation wizard to\u00a0preconfigure the\u00a0most complicated part of any Zynq design \u2013 the\u00a0Zynq Processing System. This\u00a0applies\u00a0all\u00a0the\u00a0settings required to use\u00a0relevant PS-connected peripherals\u00a0like UART, Ethernet, SPI Flash memory controllers, and\u00a0the\u00a0DDR memory\u00a0controller, all in only a few clicks.\u00a0The same goes for using DDR with\u00a0Microblaze\u00a0designs.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">You can find all board files for\u00a0Digilent\u00a0FPGA and SoC boards in the\u00a0<\/span><a href=\"https:\/\/github.com\/digilent\/vivado-boards\"><span data-contrast=\"none\">https:\/\/github.com\/digilent\/vivado-boards<\/span><\/a><span data-contrast=\"auto\">\u00a0repository.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">As an aside,\u00a0board files are only an option when you are\u00a0working with an IP Integrator design and aren\u2019t applicable when you are writing HDL from scratch.\u00a0The IP they provide configurations for are typically AXI IP, which\u00a0are intended to be used with processors.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<figure id=\"attachment_28625\" aria-describedby=\"caption-attachment-28625\" style=\"width: 653px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-28625 size-full\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/block-diagram.jpg\" alt=\"\" width=\"653\" height=\"371\" data-wp-pid=\"28625\" \/><figcaption id=\"caption-attachment-28625\" class=\"wp-caption-text\">Consider adding a diagram giving a mental map\/brain diagram of how these terms connect.<\/figcaption><\/figure>\n<h2>What Are Drawbacks and Workarounds of Working with Board Files?<\/h2>\n<p><span data-contrast=\"auto\">When you work with the board files, you are generally locked into using the interfaces and IP that the creator of the board files (again, like us!) decided to include.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">How do you work around this?\u00a0<\/span><span data-contrast=\"auto\">Another way to put this would be, &#8220;What&#8217;s the hard way?&#8221;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Easy mode, with the board files:\u00a0So, as an example,\u00a0let&#8217;s\u00a0say you have a set of LEDs you want to control from a processor, you would use the Board tab in the\u00a0Vivado\u00a0IP integrator to connect the LED interface to an AXI GPIO,\u00a0run connection automation, and things would magically just work.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">If you want to do this \u201cthe hard way\u201d, you\u00a0will\u00a0add an AXI GPIO to your block design, configure it to have the correct signal direction (output only for these LEDs)\u00a0and\u00a0the correct bus width\u00a0for your LED interface.\u00a0Fairly straightforward so far.\u00a0BUT, to avoid using the board files and the IP preset \u2013 which locks us into using the predefined LED interface \u2013\u00a0you\u00a0need to\u00a0make the AXI GPIO\u2019s \u201cGPIO\u201d interface external\u00a0(Make External creates an interface port for you) and constrain it \u2013 editing an imported XDC file to\u00a0associate the pin locations for your LEDs with\u00a0the names of the ports in your design\u2019s LED interface.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">This whole process,\u00a0in\u00a0both manual and automatic\u00a0form,\u00a0is\u00a0described\u00a0in excruciating step-by-step detail\u00a0in this page on the wiki (which needs an intro if we link directly to it):\u00a0<\/span><a href=\"https:\/\/reference.digilentinc.com\/programmable-logic\/guides\/vivado-add-gpio\"><span data-contrast=\"none\">https:\/\/reference.digilentinc.com\/programmable-logic\/guides\/vivado-add-gpio<\/span><\/a><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">There\u2019s a common snag you can run into, namely that the names of the ports\u00a0in an external interface are not obvious in the IP Integrator window. So where do you find them?\u00a0One quick way is to\u00a0generate an HDL wrapper \u2013 this is usually one of the last steps in the process prior to generating a bitstream and fully building\u00a0your project, but,\u00a0critically, it gives you a place to check that what you think you designed matches what\u00a0Vivado\u00a0thinks you designed. If you want to know what to constrain\u00a0in an XDC, this is the easiest place to check \u2013 each of the top-level ports in the design needs to be constrained to a pin location (though notably, if you are mixing both board file and manual constraints, you shouldn\u2019t\u00a0constrain the stuff your board files are handling for you).<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span class=\"TextRun SCXW219758722 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW219758722 BCX0\">B<\/span><\/span><span class=\"TextRun SCXW219758722 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW219758722 BCX0\">oth board files and manual constraints are perfectly valid ways of creating your designs, but they both have their own advantages and disadvantages. Learning how each of them work is a good idea, so that you\u00a0<\/span><span class=\"NormalTextRun SCXW219758722 BCX0\">can use the technique that best suits your needs.<\/span><\/span><span class=\"EOP SCXW219758722 BCX0\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<div class='watch-action'><div class='watch-position align-left'><div class='action-like'><a class='lbg-style6 like-28557 jlk' data-task='like' data-post_id='28557' data-nonce='1cb2a57891' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Like' \/><span class='lc-28557 lc'>+2<\/span><\/a><\/div><div class='action-unlike'><a class='unlbg-style6 unlike-28557 jlk' data-task='unlike' data-post_id='28557' data-nonce='1cb2a57891' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Unlike' \/><span class='unlc-28557 unlc'>0<\/span><\/a><\/div><\/div> <div class='status-28557 status align-left'><\/div><\/div><div class='wti-clear'><\/div>","protected":false},"excerpt":{"rendered":"<p>Constraining Ports in Block Designs In\u00a0Vivado\u00a0block designs, there are a couple of different ways to\u00a0manage the inputs and outputs of your design\u00a0and which FPGA pin locations they are connected to. &hellip; <\/p>\n","protected":false},"author":52,"featured_media":28627,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[35,1563],"tags":[1732],"ppma_author":[4462],"class_list":["post-28557","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fpga","category-guide","tag-fpga-design"],"jetpack_featured_media_url":"https:\/\/digilent.com\/blog\/wp-content\/uploads\/2021\/10\/title.jpg","authors":[{"term_id":4462,"user_id":52,"is_guest":0,"slug":"abrown","display_name":"Arthur Brown","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/60e7f8e1b3a55e2e20ee541df1f393c2acbcee9fd05fd3e38d07e25a2e6fd237?s=96&d=mm&r=g","1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":"","9":"","10":""}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/28557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/comments?post=28557"}],"version-history":[{"count":0,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/28557\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media\/28627"}],"wp:attachment":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media?parent=28557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/categories?post=28557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/tags?post=28557"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=28557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}