Creating Custom Vivado IP

Introduction: Creating Custom Vivado IP

Sometimes it may be necessary to use custom HDL code with a MicroBlaze Design. For example, I have working HDL for controlling a stepper motor using the PmodSTEP and wanted to create a MicroBlaze design to control the motor.

Luckily Vivado has a utility that allows this functionality. I will be creating a IP for the PmodSTEP as an example but any Verilog or VHDL design can be made into IP with this method.

Required Materials:

  • Vivado
  • Verilog or VHDL project to be made into IP

Step 1: Open the IP Packager

With the Vivado project open, got to Tools->Create and Package IP.... This will open a dialog for preparing the project for IP packaging. I will step through and describe the options in the next few steps. Click Next on the first section for now.

Step 2: Choose the IP Type

This gives several options for the kind of IP peripheral to create. For this tutorial I will go through the first option for packaging the current project. This option will use the currently open project as the source for the IP.

The other options allow for packaging a block design, selecting a directory with the sources, and creating a new AXI4 peripheral.

Step 3: Finish With the Wizard

The next screen asks where you would like to keep the IP definition and any other files needed for saving options. Normally you would point this at a general location for all custom IP. For simplicity I'm going to leave it in the project directory. Select Include .xci Files and click Next. This is the end of the wizard so click Finish to save and exit.

Step 4: Review and Package IP

The IP packager allows for a lot of customization, but for this tutorial we won't do any customization so go to the Review and Package pane to check the settings before packaging the IP. Once you are satisfied with the settings click the button at the bottom of the pane to Package IP.

Step 5: Add the IP to a Block Design

Now that the IP block has been packaged open another project and add the Project Directory as an IP Repository for the project you want to add the block to. The block can now be added to the block design like any other IP.

Makerspace Contest

Participated in the
Makerspace Contest

Be the First to Share


    • Leather Challenge

      Leather Challenge
    • Remote Control Contest

      Remote Control Contest
    • Tinkercad to Fusion 360 Challenge

      Tinkercad to Fusion 360 Challenge



    9 months ago

    Is the source code for your custom IP pmod block available? I would like to see how the top level code relates to the block that Vivado creates.


    Question 1 year ago on Step 2

    how can i know the address register offset in the IP to use in make a driver using in python


    5 years ago

    Just a reminder: If you wanna use your custom IP with uB or Zynq, then you need to pack it with an AXI4 interface.