Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| vivado:getting_started_with_zynq:start [2017/09/21 23:36] – Arthur Brown | vivado:getting_started_with_zynq:start [2022/10/04 11:38] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| <WRAP round important 660px> | <WRAP round important 660px> | ||
| - | === Warning | + | === Important! |
| - | This page is a work in progress. | + | This guide is obsolete, the updated guide can be found [[: |
| </ | </ | ||
| + | |||
| + | {{: | ||
| ===== Prerequisites ===== | ===== Prerequisites ===== | ||
| - | * Vivado | + | * A Vivado |
| - | * Familiarity | + | * Basic familiarity |
| - | * Digilent Board Files | + | * Digilent Board Files installed to make selection of a target board and configuration of the Zynq IP block easier. See [[software: |
| + | * A Digilent Zynq Development Board to run the project on. | ||
| ===== Introduction ===== | ===== Introduction ===== | ||
| This guide will explain the use of most of the major features of the IP Integrator design flow for a Zynq board. At the end of the demo, a simple design that receives data from on-board switches and controls LEDs will have been created. | This guide will explain the use of most of the major features of the IP Integrator design flow for a Zynq board. At the end of the demo, a simple design that receives data from on-board switches and controls LEDs will have been created. | ||
| - | ==== Create a new IPI Project ==== | + | ==== 1. Create a New IPI Project ==== |
| - | 1) Click //Create Project// | + | <WRAP group> |
| - | 2) The first page of this wizard summarizes the steps involved in creating a project. Click //Next//. | + | <WRAP column half> |
| - | 3) Here we will select the type of project we will be creating, select //RTL Project// and check the //do not create | + | === 1.1 === |
| - | 4) This screen selects the part targeted by the project. If you haven' | + | With Vivado freshly opened, click // |
| - | 5) This screen summarizes selections chosen in the previous screens. Click //Next// to finish opening the new project. | + | </WRAP> |
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </WRAP> | ||
| + | </WRAP> | ||
| - | ==== The IP Integrator ==== | + | <WRAP group> |
| - | 1) A more complete run-down | + | <WRAP column half> |
| - | 2) FIXME // | + | === 1.2 === |
| - | 3) FIXME // | + | The first page of this wizard summarizes |
| - | 4) With a general understanding of the actions that can be taken in the IPI, a design can now be created. | + | </WRAP> |
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </WRAP> | ||
| + | </WRAP> | ||
| - | ==== 3. Add the Zynq Block ==== | + | <WRAP group> |
| - | 1) The core of most IPI designs for a Zynq board is the Zynq block. Select //Add IP//, then search for and double click on //Zynq//. This block represents the on-chip hard processor | + | <WRAP column half> |
| - | 2) Before doing anything else, select //Run Block Automation// | + | === 1.3 === |
| - | 3) Make sure that the FIXED_IO and DDR connections will be created by checking the associated boxes. FIXED_IO represents all of the on-chip peripherals that can be enabled | + | The first step is to set the name of the project. Vivado |
| - | 4) Make sure that the //Board Preset// will be applied by checking the associated box. This will take the configuration settings from the correct Digilent Board File and apply them to the Zynq block. Applying these settings manually is extremely tedious and easy to get wrong, which is why using Board Files is highly recommended for Zynq designs. | + | <WRAP center round important> |
| - | 5) Click //Finish// to have Vivado add these connections and apply the preset. When this process is complete, the FIXED_IO and DDR connections can be seen in the block design, represented as ports directly connected to the Zynq block. Several other changes to the set of ports to and from the Zynq block can be seen. | + | === Important === |
| + | Do NOT use spaces in the project name or location path. This will cause problems with Vivado. Instead use an underscore, a dash, or [[wp> | ||
| + | </ | ||
| + | Click //Next// to continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| - | ==== 4. Configure the Zynq Block ==== | + | <WRAP group> |
| - | 1) Additional changes can be made to the Zynq block' | + | <WRAP column half> |
| - | 2) FIXME //Overview Tabs// | + | === 1.4 === |
| - | 3-) FIXME //Expanded Overviews for tabs that require more than one image (interrupt, clocks, enable HP0/GP0, etc.)// | + | At the Select Project Type screen, choose |
| - | 4) Since the target design for this guide requires no major changes to the Zynq block' | + | |
| - | ==== 5. Add Peripherals ==== | + | Click //Next// to continue. |
| - | 1) In order to connect the Zynq processor to the board' | + | </WRAP> |
| - | 2) The first way to connect a peripheral to the processor is the easiest, open the //Board// tab to the left of the screen. Right click on //RGB LED// and select //make connection// | + | <WRAP column half> |
| - | 3) This launches a dialog that provides the different IP blocks that this port can be connected to. Select //AXI GPIO//. | + | {{ : |
| - | 4) This will place a general purpose input/output controller into the block design. Required configuration settings for the size of the GPIO channel will already be done, but additional options, like creating an interrupt port, or adding a second channel can be enabled by configuring the IP. | + | </WRAP> |
| - | 5) Since an AXI GPIO controller with a free channel - each block can control up to two different peripherals - already exists, when making a connection with the //User Buttons// port, the option of connecting the port to the second channel of axi_gpio_0 will be available. Select this option from the menu, then continue. | + | </WRAP> |
| - | FIXME tip: | + | <WRAP group> |
| + | <WRAP column half> | ||
| + | === 1.5 === | ||
| + | This screen selects the part targeted by the project. If you haven' | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ :vivado: | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 1.6 === | ||
| + | This screen summarizes selections chosen in the previous screens. Click //Next// to finish opening the new project. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 2. Open the IP Integrator ==== | ||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 2.1 === | ||
| + | A more complete run-down of the standard Vivado work-flow can be found in Digilent' | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 2.2 === | ||
| + | In the dialog box, give the block design a name. The directory location is where the block design will be stored, this can be changed, but it is recommended to leave it as //<Local to Project>// | ||
| + | <WRAP center round important> | ||
| + | === Important === | ||
| + | Do NOT use spaces in the block design name or directory path. This will cause problems with Vivado. Instead use an underscore, a dash, or [[wp> | ||
| + | </ | ||
| + | Click //OK// to create the block design and open IPI. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 3. IP Integrator Tools ==== | ||
| + | |||
| + | As a general overview, Zynq designs consist of two areas, the processor, and the FPGA. The processor has some additional hardware surrounding it, and connects to other peripherals on the board that are not part of the Zynq chip. The FPGA also connects to other on board hardware. The communications protocol used to move data between the FPGA and processor, as well as between pieces of the FPGA, is called AXI. | ||
| + | |||
| + | Each AXI peripheral programmed onto the FPGA will be assigned an area of the Zynq's memory space that will be used to address each of its control registers. Adding a simple AXI interface to a design will require the addition of two new blocks, the AXI Interconnect, | ||
| + | |||
| + | Much of basic Zynq design consists of connecting different AXI peripherals to the processor, clocking them appropriately, | ||
| + | |||
| + | With this context out of the way, many of the tools that can be used to create a design in Zynq will be described. | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.1 === | ||
| + | The //Sources// tab, highlighted in orange in the image to the right, contains several sub-tabs, of these, // | ||
| + | |||
| + | The // | ||
| + | |||
| + | The //IP Sources// sub-tab shows the files generated when a new IP core has been added to the block design. Some annoying errors can be solved by right clicking on the block design in this screen and selecting //Reset Output Products// followed by //Generate Output Products// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.2 === | ||
| + | When the //Design// tab is selected, a list of all input and output ports, IP core ports, and connections between IP cores is shown. Selecting an entry in this list will highlight that object in the block design diagram. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.3 === | ||
| + | The //Signals// tab allows the user to view lists of all clock and reset signals in the block design. As before, selecting an entry in either of these lists will highlight that signal in the block design diagram. This tool can be useful for figuring out where data crosses clock domains in a more complicated design. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.4 === | ||
| + | The //Board// tab displays all of the external connections that Digilent has provided as part of the board file selected as part of creating the project. This tool makes connecting these ports to a design extremely straightforward. The process of connecting one of these ports will be gone through later in this guide. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.5 === | ||
| + | The // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.6 === | ||
| + | Most of the upper right of the Vivado window is taken up by the //Diagram// pane. This pane displays a graphical rendition of the current block design. Many of the buttons in the toolbar to the left side of this pane will be described in Step 4 of this guide. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.7 === | ||
| + | The //Address Editor// tab, contained in the same pane as the Diagram, describes the memory addresses that the processor can find each installed AXI peripheral at. Changing values in this pane is not recommended, | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.8 === | ||
| + | The first tab of the pane at the bottom of the window is the //TCL Console//. This tool displays the scripted commands that Vivado is running whenever a change is made in the graphical interface. Scripts can be created to be run using this tool through the use of the ' | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.9 === | ||
| + | The // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.10 === | ||
| + | The //Reports// tab contains a list of different reports that Vivado generates as part of the process of generating a bitstream. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 3.11 === | ||
| + | By selecting //Tools -> Reports -> Report IP Status// in the toolbar at the top of the Vivado window, another tab will be added to the bottom-most pane - though this will not do anything until an IP is added to the design. This //IP Status// tab displays the versions and target devices of each IP core added to the project. If an IP is not // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === 3.12 === | ||
| + | The toolbar at the left of the //Diagram// pane has a large number of buttons that all do different things. | ||
| + | * //Block Design Options// ({{: | ||
| + | * //Zoom In// ({{: | ||
| + | * //Zoom Out// ({{: | ||
| + | * //Zoom Fit// ({{: | ||
| + | * //Select Area// ({{: | ||
| + | * //Fit Selection// ({{: | ||
| + | * //Search// ({{: | ||
| + | * //Add IP// ({{: | ||
| + | * //Make External// ({{: | ||
| + | * //Customize Block// ({{: | ||
| + | * //Validate Design// ({{: | ||
| + | * //IP Settings// ({{: | ||
| + | * // | ||
| + | * //Optimize Routing// ({{: | ||
| + | * //Show Interface Connections Only// ({{: | ||
| + | |||
| + | Additionally, | ||
| + | |||
| + | With a general understanding of the actions that can be taken in the IPI, a design can now be created. | ||
| + | |||
| + | ==== 4. Add the Zynq Block ==== | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 4.1 === | ||
| + | The core of most IPI designs for a Zynq board is the Zynq block. Click the //Add IP// ({{: | ||
| + | |||
| + | The block that is added represents the Zynq ARM processor and its available connections to other hardware on the Zynq chip, including the FPGA. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 4.2 === | ||
| + | Before doing anything else, select //Run Block Automation// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 4.3 === | ||
| + | The //Options// box shows what will be done when OK is clicked. FIXED_IO and DDR connections will be made external automatically. FIXED_IO represents all of the on-chip peripherals that can be enabled when configuring the Zynq block (more on this later), while the DDR connection represents the processor' | ||
| + | |||
| + | Make sure that //Apply Board Preset// is checked, so that various important settings like DDR timings will be imported from the selected target board file. Applying these settings manually is extremely tedious and easy to get wrong. | ||
| + | |||
| + | Cross Trigger In/Out are outside of the scope of this guide, so leave them // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 4.4 === | ||
| + | Click //OK// to have Vivado add these connections and apply the preset. When this process is complete, the FIXED_IO and DDR connections can be seen in the block design, represented as ports directly connected to the Zynq block. Several other changes to the set of ports to and from the Zynq block can be seen. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 5. Configure the Zynq Block ==== | ||
| + | |||
| + | === 5.1 === | ||
| + | Additional changes can be made to the Zynq block' | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.2 === | ||
| + | The page that is open when the Re-Customize dialog is launched for the Zynq block is called //Zynq Block Design//. This page displays the hardware used by the Zynq chip. Note the //I/O Peripherals// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.3 === | ||
| + | The //PS-PL Configuration// | ||
| + | * The UART baud rate settings found in the //General// drop-down are used to change the baud rate that the Zynq communicates with a computer serial port at. | ||
| + | * //GP/HP Slave AXI Interfaces// | ||
| + | |||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.4 === | ||
| + | The // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.5 === | ||
| + | The //MIO Configuration// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.6 === | ||
| + | The //Clock Configuration// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.7 === | ||
| + | The //DDR Configuration// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 5.8 === | ||
| + | The // | ||
| + | |||
| + | Additionally, | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Since the target design for this guide requires no major changes to the Zynq block' | ||
| + | |||
| + | ==== 6. Add Peripherals ==== | ||
| + | |||
| + | In order to use the Zynq processor to control the board' | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 6.1 === | ||
| + | In the //Board// tab to the left of the diagram pane, right click on //RGB LEDs// and select //Connect Board Component// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 6.2 === | ||
| + | This launches a dialog that provides the different IP blocks that this port can be connected to. Select //AXI GPIO//. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 6.3 === | ||
| + | This will place a general purpose input/ | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 6.4 === | ||
| + | Since an AXI GPIO controller with a free channel - each block can control up to two different peripherals - already exists, when making a connection with the //User Buttons// port, the option of connecting the port to the second channel of axi_gpio_0 will be available. Select this option from the menu, then continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round center tip> | ||
| + | === Tip === | ||
| A Xilinx Design Constraints file can be used to constrain additional inputs and outputs, or in ways that were not anticipated by the creators of Digilent' | A Xilinx Design Constraints file can be used to constrain additional inputs and outputs, or in ways that were not anticipated by the creators of Digilent' | ||
| - | end tip | + | </ |
| ==== 7. Connect the AXI Blocks to the Zynq Block ==== | ==== 7. Connect the AXI Blocks to the Zynq Block ==== | ||
| - | 1) At this point, the green bar at the top of the screen will have reappeared, this time saying //Run Connection Automation// | ||
| - | 2) Make sure that the axi_gpio_0 block is checked in the menu to the left. Several options are present here, including the clock that the AXI Interface will run off of. Click //Finish// to generate the AXI connection and its related blocks. | ||
| - | 3) AXI is the communications protocol that is used by the Zynq processor to communicate with each of the peripheral controllers in the design. Each peripheral will be assigned an area of the Zynq's memory space that will be used to address each of its controller' | ||
| - | ==== 9. Generate the Bitstream ==== | + | <WRAP group> |
| - | 1) At this point, | + | <WRAP column half> |
| - | 2) With a validated design, a bitstream can now be generated. The Getting Started with Vivado guide explains | + | === 7.1 === |
| - | 3) Vivado will ask whether to run Synthesis and Implementation first. Click //OK// to allow this, as these steps both need to be run before a bitstream can be generated. | + | At this point, the green bar at the top of the screen will have reappeared, this time saying |
| - | 4) Vivado will ask how many jobs should be created to go through this process. This dialog allows the user to change how much of the resources of the computer Vivado is running on will be used. This process can take some time for complex designs, so it is recommended to devote as many resources as are possible. | + | </ |
| - | 5) With the bitstream generated, Vivado will ask what to do next. None of the options available are required for this guide, so click //Cancel//. | + | <WRAP column half> |
| + | {{ : | ||
| + | </WRAP> | ||
| + | </WRAP> | ||
| - | ==== 10. Launch Vivado SDK ==== | + | <WRAP group> |
| - | 1) Before Vivado SDK can be launched, it needs to be provided with a hardware handoff file, containing the bitstream and various other information about the peripherals installed in the design. | + | <WRAP column half> |
| - | 2) In the //File// dropdown, select //Export// then //Export to SDK//. This will launch a dialog that will tell Vivado where to place the necessary files, as well as whether or not the bitstream should be included. | + | === 7.2 === |
| - | 3) Make sure that the //Include Bitstream// box is checked, and that the //Export Location// is //<Local To Project>//, | + | Make sure that the axi_gpio_0 block is checked in the menu to the left. Several options are present here, including the a drop-down |
| - | 4) Just below // | + | |
| - | 5) The dialog that pops up will tell Vivado where to find the exported files, as well as where to create | + | |
| - | 6) SDK will now launch, and will import the hardware definition, creating a workspace containing only a hardware_hw project. This project contains the files exported from Vivado. | + | |
| - | ==== 11. Create a New Project ==== | + | Click //Finish// to generate the AXI connection and its related blocks. |
| - | 1) With Vivado SDK open, a new Application | + | |
| + | At this point the block diagram may have become very messy, the // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 8. Generate the Bitstream ==== | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.1 === | ||
| + | At this point, a complete design has been created. Click the //Validate Design// button ({{: | ||
| + | |||
| + | Click //OK// to continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.2 === | ||
| + | The last thing that needs to be done before generating a bitstream is to create a top module file. This file will take the block design and interpret it into a hardware design language so that the synthesis and implementation tools can work properly. Right click on the block design in the //Sources// tab in the pane to the left of the //Block Design// pane - this pane likely has the //Board// tab currently selected. | ||
| + | |||
| + | In the right-click menu, select //Create HDL Wrapper//. In the confirmation dialog that pops up, make sure that //Let Vivado manage wrapper and auto-update// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.3 === | ||
| + | With a validated design and a top module, a bitstream can now be generated. The [[: | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.4 === | ||
| + | The Launch Runs dialog that pops up has several options to choose between. Select //Launch runs on local host// to actually generate the bitstream now. The other option is to //Generate scripts only//, which will not generate a bitstream, but rather the scripts required to generate the bitstream on a different machine. The //Number of jobs// field allows the user to change how much of the resources of the computer Vivado is running on will be used. This process can take some time for complex designs, so it is recommended to devote as much of the resources as possible (typically by selecting ' | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.5 === | ||
| + | In the next dialog, No Implementation Results Available, Vivado will ask whether to run Synthesis and Implementation. These steps are required to generate a bitstream, so click //Yes//. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 8.6 === | ||
| + | Once the bitstream is generated, which may take a little while, Vivado will ask what to do next. None of the available options are required for this guide, so click // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 9. Launch Vivado SDK ==== | ||
| + | |||
| + | Before Vivado SDK can be launched, it needs to be provided with a hardware handoff file, containing the bitstream and various other information about the peripherals installed in the design. | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 9.1 === | ||
| + | In the //File// drop-down, select //Export// then //Export to SDK//. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 9.2 === | ||
| + | Make sure that the //Include Bitstream// box is checked, so that the FPGA can be programmed from Vivado SDK. The //Export Location// is //<Local To Project>// | ||
| + | <WRAP center round important> | ||
| + | === Important === | ||
| + | Do NOT use spaces in the export location path. This will cause problems with Vivado. Instead use an underscore, a dash, or [[wp> | ||
| + | </ | ||
| + | Click //OK// to continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 9.3 === | ||
| + | Just below //Export// in the //File// drop-down, select //Launch SDK//. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 9.4 === | ||
| + | The dialog that pops up will tell Vivado where to find the exported files, as well as where to create the SDK workspace. Make sure to set //Exported Location// to the location chosen earlier. The // | ||
| + | <WRAP center round important> | ||
| + | === Important === | ||
| + | Do NOT use spaces in the workspace path. This will cause problems with Vivado. Instead use an underscore, a dash, or [[wp> | ||
| + | </ | ||
| + | Click //OK// to continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 10. Create a New C Project ==== | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.1 === | ||
| + | Vivado SDK will now launch, and will import the hardware definition, creating | ||
| + | * The //Project | ||
| + | * The //File View//, directly in the center of the window, displays currently opened files. Upon launch of SDK, an overview of the hardware platform exported from Vivado is displayed. Note the AXI GPIO cell contained in the Address Map, and the corresponding entry in the list of IP blocks. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.2 === | ||
| + | In order to create a project to store C source code, click //File// in the top toolbar, followed by //New > Application Project// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.3 === | ||
| + | In the New Project dialog, give the project a name, and make sure that //C// is selected as the // | ||
| + | <WRAP center round important> | ||
| + | === Important === | ||
| + | Do NOT use spaces in the project name. This will cause problems with Vivado. Instead use an underscore, a dash, or [[wp> | ||
| + | </ | ||
| + | Click //Next// to continue. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.4 === | ||
| + | From the list of Available Templates, select //Empty Application//, | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.5 === | ||
| + | Expand the newly created | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.6 === | ||
| + | Name the new source file ' | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 10.7 === | ||
| + | The new main file will now open in the file view pane. Copy-Paste the code to the right into this file, then hit //Ctrl-S// to save the file and build the project. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | <code c> | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | int main() { | ||
| + | XGpio gpio; | ||
| + | u32 button_data; | ||
| + | |||
| + | // look up the settings for the AXI GPIO IP core and initialize a driver for it | ||
| + | XGpio_Initialize(& | ||
| + | |||
| + | // set LED channel (1) tristates to all output | ||
| + | XGpio_SetDataDirection(& | ||
| + | //set Button channel (2) tristates to all input | ||
| + | XGpio_SetDataDirection(& | ||
| + | |||
| + | while (1) { | ||
| + | //capture button data | ||
| + | button_data = XGpio_DiscreteRead(& | ||
| + | |||
| + | //if any button is pressed, set all LED pins high, else turn LEDs off | ||
| + | if (button_data != 0) { | ||
| + | XGpio_DiscreteWrite(& | ||
| + | } | ||
| + | else { | ||
| + | XGpio_DiscreteWrite(& | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 11. Program and Run the Design ==== | ||
| + | |||
| + | The next step is to program the bit file onto the FPGA and run the C source on the processor. | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 11.1 === | ||
| + | From the top toolbar, select //Xilinx Tools//, then //Program FPGA//. | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 11.2 === | ||
| + | Leave all of the settings in the Program FPGA dialog as they are, then click // | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP column half> | ||
| + | === 11.3 === | ||
| + | Right click on the application project in the //Project Explorer//, then select //Run As > Launch on Hardware (System Debugger)// | ||
| + | </ | ||
| + | <WRAP column half> | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| - | ==== 12. Program and Run the Design | + | ==== Congratulations! |
| + | The project will now be running on the Zynq board, press the buttons to see the LEDs flip on and off. | ||
| / | / | ||

