Lab3-4-Building An Embedded Processor System On A Xilinx Zync FPGA (Profiling) - A Tutorial
Lab3-4-Building An Embedded Processor System On A Xilinx Zync FPGA (Profiling) - A Tutorial
Lab3-4-Building An Embedded Processor System On A Xilinx Zync FPGA (Profiling) - A Tutorial
VIVADO TUTORIAL 1
Table of Contents
Requirements .............................................................................................................3
Part 1: Building a Zynq-7000 Processor Hardware ........................................................4
Introduction ........................................................................................................................................................................ 4
Step 1: Start the Vivado IDE and Create a Project ........................................................................................... 4
Step 2: Create an IP Integrator Design .................................................................................................................. 6
Customize Instantiated IP ......................................................................................................................................10
Use Block Designer Assistance .............................................................................................................................11
Step 3: Generate HDL Design Files ....................................................................................................................... 15
Step 4: Implement Design and Generate Bitstream .................................................................................... 16
Step 5: Export Hardware to SDK ........................................................................................................................... 18
Export to SDK...............................................................................................................................................................18
Part 2: Build Zynq-7000 Processor Software .............................................................. 19
Step 1: Start SDK and Create a Software Application ................................................................................. 19
Step 2: Run the Software Application ................................................................................................................. 22
Add a Breakpoint .......................................................................................................................................................27
Step 3: Executing the Software............................................................................................................................... 28
Part 3: Profiling the Software .................................................................................... 29
Step 1: Start SDK and Create a Software Application ................................................................................. 29
Step 2: Profile the Software Application .......................................................................................................... 30
Producing the GMON Executable .......................................................................................................................31
Step 3: Generating statistics
2 VIVADO TUTORIAL
Introduction
This tutorial will guide you through the process of using Vivado and IP Integrator to
create a complete Zynq ARM Cortex-A9 based processor system targeting the
ZedBoard Zynq development board. You will use the Block Design feature of IP
Integrator to configure the Zynq PS and add IP to create the hardware system, and
SDK to create an application to verify the design functionality. It will also guide you
through the process of profiling an application and analyzing the output.
Objectives
After completing this tutorial, you will be able to:
• Create an embedded system design using Vivado and SDK flow
• Configure the Processing System (PS)
• Add Xilinx standard IP in the Programmable Logic (PL) section
• Use and route the GPIO signal of the PS into the PL using EMIO
• Use SDK to build a software project and verify the functionality in hardware.
• Set up the board support package (BSP) for profiling an application
• Set the necessary compiler directive on an application to enable profiling
• Setup the profiling parameters
Procedure
This lab is separated into steps that consist of general overview statements that
provide information on the detailed instructions that follow. Follow these detailed
instructions to progress through the tutorial.
This tutorial comprises three stages (each consisting of steps): You will create a
top-level project using Vivado, create the processor system using the IP Integrator,
add two instances of the GPIO IP, validate the design, generate the bitstream, export
to the SDK, create an application in the SDK, and, test the design in hardware. You
will then be able to profile the application and produce statistics that will help you
understand the main bottlenecks of your application.
Requirements
The following is needed in order to follow this tutorial:
• Vivado w/ Xilinx SDK (tested, version 2013.2/version 2014.4)
• Zedboard (tested, version D)
VIVADO TUTORIAL 3
Part 1: Building a Zynq-7000 Processor Hardware
Introduction
In this part of the tutorial you create a Zynq-7000 processor based design and
instantiate IP in the processing logic fabric (PL) to complete your design. Then you
take the design through implementation, generate a bitstream, and export the
hardware to SDK.
If you are not familiar with the Vivado Integrated Development Environment Vivado
(IDE), see the Vivado Design Suite User Guide: Using the Vivado IDE (UG893).
4 VIVADO TUTORIAL
2. From the Getting Started page, select Create New Project. The New Project
wizard opens (FIGURE 2).
3. Click Next
4. In the Project Name dialog box, type the project name and location. Ensure
that Create project subdirectory is checked, and then click Next.
5. In the Project Type dialog box, select RTL Project, then click Next.
6. In the Add Sources dialog box, ensure that the Target language is set to
VHDL, then click Next.
7. In the Add Existing IP dialog box, click Next.
8. In the Add Constraints dialog box, click Next.
9. In the Default Part dialog box select Boards and choose “ZedBoard Zynq
Evaluation and Development Kit”. Make sure that you have selected the
proper Board Version to match your hardware because multiple versions of
hardware are supported in the Vivado IDE. Click Next.
10. Review the project summary in the New Project Summary dialog box before
clicking Finish to create the project.
VIVADO TUTORIAL 5
Step 2: Create an IP Integrator Design
1. In the Flow Navigator, select Create Block Design.
2. In the Create Block Design popup menu, specify a name for your IP
subsystem design.
6 VIVADO TUTORIAL
3. Right-click in the Vivado IP integrator diagram window, and select Add IP.
4. Alternatively, you can click the Add IP link in the IP integrator diagram area.
5. In the search field, type zynq to find the ZYNQ7 Processing System IP, and
then press Enter on the keyboard.
Because you selected the ZedBoard when you created the project, the Vivado
IP integrator configures the design appropriately.
VIVADO TUTORIAL 7
In the Tcl Console, you see the following message:
The Run Block Automation dialog box opens, stating that the FIXED_IO and
DDR interfaces will be created for the Zynq core.
7. Click OK.
8 VIVADO TUTORIAL
After running block automation on the Zynq processor, the IP integrator
diagram should look as follows:
8. Now you can add peripherals to the processing logic (PL). To do this, right-
click in the IP integrator diagram, and select Add IP.
9. In the search field, type gpi to find the AXI GPIO IP, and then press Enter to
add the AXI GPIO IP to the design.
10. Repeat the action, typing axi bram to find and add AXI BRAM Controller,
and typing block to find and add Block Memory Generator.
The Block Design window matches FIGURE 11. The relative positions of the
IP will vary.
VIVADO TUTORIAL 9
Customize Instantiated IP
1. Double-click the Block Memory Generator IP, or right-click and select
Customize Block (FIGURE 12).
The AXI BRAM Controller provides an AXI memory map interface to the
Block Memory Generator.
10 VIVADO TUTORIAL
3. Connect the Block Memory Generator to the AXI4 BRAM Controller by
clicking the connection point and dragging a line between the IP.
Figure 14: Connected AXI BRAM Controller and Block Memory Generator
The AXI BRAM Controller provides an AXI memory map interface to the
Block Memory Generator.
The Run Connection Automation dialog box opens and states that it will
connect the master AXI interface to a slave interface.
VIVADO TUTORIAL 11
In this case, the master is the Zynq Processing System IP (FIGURE 16).
Click OK.
12 VIVADO TUTORIAL
4. Click OK. This step also configures the IP so that during netlist generation,
the IP creates the necessary Xilinx Design Constraints (XDC).
5. Click Run Connection Automation again, and select the remaining option
/axi_bram_ctrl_1/S_AXI (FIGURE 19).
This completes the connection between the Zynq7 Processing System and the
AXI BRAM Controller.
The IP integrator subsystem looks like FIGURE 20. Again, the relative
positions of the IP can differ slightly.
6. Click the Address Editor tab to show the memory map of all the IP in the
design.
In this case, there are two IP: the AXI GPIO and the AXI BRAM Controller. The
IP integrator assigns the memory maps for these IP automatically. You can
change them if necessary.
VIVADO TUTORIAL 13
7. Change the range of the AXI BRAM Controller to 64K, as shown in FIGURE 21.
8. Save your design by pressing Ctrl-S, or select File > Save Block Design.
9. Click the Address Editor tab to make sure that the memory mappings for the
GPIO and BRAM controller have been auto populated.
10. From the toolbar, run Design-Rules-Check (DRC) by clicking the Validate
Design button (FIGURE 22). Alternatively, you can do the same from the
menu by:
14 VIVADO TUTORIAL
Step 3: Generate HDL Design Files
You now generate the HDL files for the design.
1. In the Source window, right-click the top-level subsystem design and select
Generate Output Products (FIGURE 24). This generates the source files for
the IP used in the block diagram and the relevant constraints file.
3. In the Sources window, select the top-level subsystem source, and select
Create HDL Wrapper to create an example top-level HDL file (FIGURE 25).
VIVADO TUTORIAL 15
Step 4: Implement Design and Generate Bitstream
1. In Flow Navigator, click Generate Bitstream to implement the design and
generate a BIT file.
You might see a dialog box stating no implementation results are available.
2. Click Yes.
16 VIVADO TUTORIAL
3. After the design implementation, click Open Implemented Design, (FIGURE
28).
4. You might get a warning that the implementation is out of date. Click Yes.
VIVADO TUTORIAL 17
Step 5: Export Hardware to SDK
In this step, you export the hardware description to SDK. You use this in Part 2.
The IP integrator block diagram, and the Implemented design, must be open to
export the design to SDK.
IMPORTANT: For the Digilent driver to install, you must power on and connect the
board to the host PC before launching SDK.
Export to SDK
1. In the Flow Navigator, click Open Block to invoke the IP integrator design
(FIGURE 30).
2. From the main Vivado File menu, select Export Hardware for SDK (FIGURE
31).
The Export Hardware for SDK dialog box opens, ensure that Export
Hardware, Include Bitstream, and Launch SDK are checked (FIGURE 32).
18 VIVADO TUTORIAL
Part 2: Build Zynq-7000 Processor Software
In this portion of the tutorial you will build an embedded software project that
prints “Hello World” to the serial port.
2. You can do that by clicking on File > Switch Workspace > Other in SDK. In
the Workspace Launcher dialog box in the Workspace field, point to the
SDK_Export folder where you had exported your hardware from lab 1.
Usually, this is located at
..\project_name\project_name.sdk\SDK\SDK_Export.
VIVADO TUTORIAL 19
4. In the Project Name field, type Zync_Design, and click Next (FIGURE 34).
20 VIVADO TUTORIAL
5. From the Available Templates, select Hello World (FIGURE 35) and click
Finish.
When the program finish compiling, you will see the following (FIGURE 36).
VIVADO TUTORIAL 21
Step 2: Run the Software Application
Now, you must run the hello world application on the ZedBoard. To do so, you need
to configure the JTAG port. Make sure that your hardware is powered on and a
Digilent Cable is connected to the host PC. Also, ensure that you have a USB cable
connected to the UART port of the ZedBoard.
1. Click Xilinx Tools and select Configure JTAG Settings (FIGURE 37).
2. In the Configure JTAG Settings dialog box, select the Type as Auto Detect,
and click OK (FIGURE 38).
22 VIVADO TUTORIAL
3. Next, download the bitstream into the FPGA by selecting Xilinx Tools >
Program FPGA (FIGURE 39).
4. Ensure that the path to the bitstream that you created in Step 7 of Lab 1 is
correct and then click Program.
Note: The DONE LED on the board turns blue if the programming is
successful.
VIVADO TUTORIAL 23
Figure 40: Launch on Hardware
24 VIVADO TUTORIAL
Figure 41: Debug Configuration Dialog Box
VIVADO TUTORIAL 25
10. Set the terminal by selecting the Terminal 1 tab and clicking the Settings
button (FIGURE 44).
11. Use the following settings for the ZedBoard (FIGURE 45). Click OK.
12. Verify the Terminal connection by checking the status at the top of the tab
(FIGURE 46).
26 VIVADO TUTORIAL
13. In the Debug tab, expand the tree, and select the processor core on which the
program is to be run (FIGURE 47).
14. If it is not already open, select ../src/helloworld.c, line 41, and double
click that line to open the source file.
Add a Breakpoint
You add a breakpoint on line 43.
VIVADO TUTORIAL 27
2. In the Go To Line dialog box, type 43.
3. Double click on the left pane of line 43, which adds a breakpoint on that line
of source code (Figure 49).
3. You should see “Hello World” in the terminal if everything worked correctly
(FIGURE 50).
28 VIVADO TUTORIAL
Part 3: Profiling an Application
1-1-1. Export the hardware configuration by clicking File > Export > Export Hardware
1-1-3. Launch SDK by clicking File > Launch SDK and click OK
1-1-4. In SDK, select File > New > Board Support Package.
1-1-5. Notice Standalone_bsp_0 in the Project name field and click Finish with default
settings.
1-1-6. Select the Overview > standalone entry in the left pane, click on the drop-down arrow of
the enable_sw_intrusive_profiling Value field and select true.
1-1-7. Select the Overview > drivers > cpu_cortexa9 and add –pg in addition to the –g in the
extra_compiler_flags Value field.
VIVADO TUTORIAL 29
Figure 30 Adding profiling switch
2-1-2. Enter tutorial-profile as the project name, select the Use existing standalone_bsp_0
option, and click Next.
2-1-3. Select Hello World in the Available Templates pane and click Finish.
2-1-4. Replace the Hello World C program with the intended application you have.
30 VIVADO TUTORIAL
2-2-1. Save the program and it should compile successfully and generate the tutorial-profile.elf
file.
3-1-3. Select Xilinx Tools > Program FPGA and click on Program.
3-1-4. Right click on the lab6 directory, and select C/C++ Build Settings.
3-1-5. Under the ARM gcc compiler group, select the Profiling sub-group, then check the
Enable Profiling box, and click OK.
3-1-6. From the menu bar, Select Run > Run Configurations… and double click on Xilinx
C/C++ application to create a new configuration.
3-1-7. Click on the newly created tutorial-profile Debug configuration, and select the Profile
Options tab.
3-1-8. Click on the Enable Profiling check box, enter 100000 (100 kHz) in the Sampling
Frequency field, enter 0x10000000 in the scratch memory address field, and click Apply.
VIVADO TUTORIAL 31
Figure 32 Profiling options
3-1-9. Click the Run button to download the application and execute it.
The program will run, and when execution has completed, a message will be displayed
indicating that the profiling results are being saved in gmon.out file at the lab6\Debug
directory.
3-2-1. Expand the Debug folder under the project_profile project in the Project Explorer view,
and double click on the gmon.out entry.
3-2-2. The Gmon File Viewer dialog box will appear showing lab6.elf as the corresponding
binary file. Click OK.
32 VIVADO TUTORIAL
3-2-3. Click on the Sort samples per function button ( ).
3-2-4. Click in the %Time column to sort in the descending order (See Figure 11).
3-2-5. Go back to the Run Configuration, and change the sampling frequency to 1000000 (1
MHz) and profile the application again.
3-2-6. Invoke gprof, select the Sorts samples per function output, and sort the %Time
column.
Notice that the output has better resolution and reports more functions and more samples
per function calls.
3-2-7. Close the SDK and Vivado programs by selecting File > Exit in each program.
Conclusion
This Tutorial led you through enabling the software BSP and the application settings for the
profiling.
VIVADO TUTORIAL 33