The acronym IP probably means a lot of things to a lot of different people. But to those of us in the world of FPGAs, it’s something special. IP stands for intellectual property. Intellectual property can be a lot of things, but when I say intellectual property I’m talking about the libraries of HDL (hardware design language) modules that are available for your use. Users and companies build IPs for use, so that designs are easier and faster to build.

It’s like painting vs. doing a puzzle. Rather than building every individual part of your design yourself, you can just take the pieces that you need and focus on the bigger picture. As long as you respect that it’s someone else’s intellectual property, of course. After all, you wouldn’t put together a puzzle and then say you painted it. For example, say you needed to use an Ethernet port but didn’t want to write an Ethernet controller yourself. You could find an existing Ethernet controller and use it in your design. Xilinx has a huge library of IPs to use with Digilent boards, as well as an IP library built into Vivado Design Suite.


Not only can you use IPs from the vast libraries available, but you can also create your own IP with the IP packager available from Xilinx Vivado. One benefit to creating an IP, rather than just using .v files and instantiating a top module as you normally would, is that with the Vivado Design tools you can design visually with a schematic. You can take each of your IPs and physically connect the pins, which can be much easier than typing in inputs and outputs for each module instantiation.
As an example I will use my PWM (pulse-width modulation) project from EE352. It generates a square wave with a varying duty cycle depending on the value of an up-down counter. The PWM signal is sent to an LED, which looks to us like it gets brighter and dimmer as the value of the counter changes.
Using IPs in Vivado allows you to connect signals between modules visually. To create a block diagram in this project, select Create Block Diagram in the Flow Navigator under IP Integrator.

When the block diagram opens, it is empty, so we need to create and add an IP! If you wanted to add an existing IP, you could just click the blue text that says Add IP. We are going to make our own.

To create an IP go to the Tools menu and select Create and Package IP.

The Create and Package IP wizard will open. Select Next.

The next window will prompt you to select what type of IP you need to add. I show how to Create a new AXI4 Peripheral in my Zybo Hands-on Embedded Linux Tutorial. Here I will just create an IP out of the project that is open, my PWM project. If you wanted to make an IP out of a different project you could pick Package a specified directory. Select the Package your current project radio button and click Next.

Because of the radio button we selected in the previous step, the PWM project is selected as the IP location. If you wanted a different project you could change that here. Click Next.

Next the wizard will tell us what information we will need to package the IP. Click Finish to finish creating the IP.

Vivado will notify you that you finished packaging your IP, even though you really didn’t. Select OK.

Notice that a new tab called Package IP, opened up. We will have to go through all the Packaging Steps. You can name the Vendor, Library and Name whatever you want. Mine were automatically filled in from my computer. Since I am just now creating this IP, the Version is 1.0. Add whatever display information you want and click on the next step, Compatibility.

Review the Compatibility Settings and click the next step, File Groups.

Review the File Groups and click the next step, Customization Parameters.

Review the Customization Parameters and click the next step, Ports and Interfaces.

Review the Ports and Interfaces and click the next step, Addressing and Memory.

Review the Addressing and Memory and click the next step, Customization GUI.

Review the Customization GUI and click the next step, Review and Package.

Review the information and click Package IP.

Now that we’ve created the PWM IP, we can add it to the blank block diagram. Click the blue text that says Add IP, or right click on the block diagram and click Add IP.

You can search through the catalog of IPs to find the created one by typing part of the name in the search bar. Once it is highlighted, click on it to add it to the block diagram.

You can see the IP added to the block diagram. Now you can go on and create your own IPs.

If you need more background on creating and writing FPGA projects in Vivado or ISE, visit Digilent’s Learn site, select browse by project and select the FPGA category.
I have a couple of questions.
When would you need to do something beyond just “reviewing” each of the sections?
Also, the Ports and Interfaces tab said it had an error; but was it not serious enough to be an actual problem?