Tutorial Overview

In this example, we will create a simple project using the Base System Builder that includes three peripherals: the RS232 UART and two GPIOs. One GPIO will be used for the DIP switches and the other for the LEDs. We will then use a C program to read data from the switches and write it to the LEDs. The result is that the LEDs will display the DIP switch settings.

This tutorial contains screenshots to guide you through the entire implementation process. You can click on the images to view a higher resolution when necessary.

Are you using EDK 10.1?

Try the updated version of this tutorial based on the Virtex-5 FPGA on the ML505 board: Create a Project Using the Base System Builder

Create the Basic Project

Follow these steps to create the basic project:

  1. Open XPS. From the dialog box, select “Base System Builder wizard” and OK.
  2. You will be asked to specify which folder to place the project. Click “Browse” and create a new folder for the project. In “Advanced Options” tick “Use repository paths” and select the “C:\XUPV2P\lib” folder using “Browse”. Click “OK”.
  3. We are given the choice to create a new project or to create one using the template of another project. Tick “I would like to create a new design” and click “Next”.
  4. On the “Select Board” page, select “Xilinx” as the board vendor. Select “XUP Virtex II Pro Development System” as the board name. Select “C” as the board revision. Click “Next”.
  5. On the “Select Processor” page, we have a choice between using the PowerPC “hard” processor, or the Microblaze “soft” processor. Tick “PowerPC” and click “Next”.
  6. On the “Configure PowerPC” page, select all clock frequencies to be 100MHz. We will use the RS232 port for debugging rather than the JTAG, so select “No debug”. Click “Next”.
  7. In selecting the Additional IO Interfaces, leave “RS232_Uart_1”, “LEDs_4Bit” and “DIPSWs_4Bit” ticked and un-tick everything else.

  8. On the “Add Internal Peripherals” page, select 64KB for the “plb_bram_if_cntlr_1” and click “Next”.
  9. On the “Software Setup” page, select “RS232_Uart_1” for both STDIN and STDOUT. The Base System Builder can produce sample software applications to run on the PowerPC and test the memory and peripherals. For this project we will not need them as we will create our own. Un-tick “Memory Test” and “Peripheral Test”. Click “Next”.
  10. Click “Generate”.
  11. Click “Finish”.
  12. Once the project is generated, a dialog box will appear to ask what we want to do next. Tick “Start using Platform Studio” and click “OK”.

Create a Simple Application

Now that the basic project is made, we can create a simple software application to run on the PowerPC to test the DIP switches and LEDs.

  1. Select the Applications tab. You will see a software application already there called “Default: ppc405_0_bootloop”. The purpose of this application is to occupy the PowerPC in the case that there is no other software application in the design. It simply keeps the PowerPC running in an endless loop.
  2. Double click “Add Software Application”.
  3. For the project name type “TestApp”. For the processor select “ppc405_0”. Click “OK”.
  4. From the Applications tab, right click on the software application “Default: ppc405_0_bootloop” and select “Mark to Initialize BRAMs”. The icon will now have a small red cross signifying that it will not run on the PowerPC.
  5. Right click on the software application we just created “Project: TestApp” and select “Mark to Initialize BRAMs”. The red cross on the icon of our software application should have been removed signifying that it will run on the PowerPC.
  6. From the menu select File->New and copy the following code into the new file. Save the file as “TestApp.c” in a folder called “TestApp” within the project folder.
#include "xparameters.h"
#include "xbasic_types.h"
#include "xgpio.h"
#include "xstatus.h"

XGpio GpioOutput;
XGpio GpioInput;

int main (void) {

  Xuint32 status;
  Xuint32 DataRead;
  Xuint32 OldData;

  // Clear the screen

  // Initialize the GPIO driver so that it's ready to use,
  status = XGpio_Initialize(&GpioOutput,
  if (status != XST_SUCCESS)
    return XST_FAILURE;
  // Set the direction for all signals to be outputs
  XGpio_SetDataDirection(&GpioOutput, 1, 0x0);

  // Initialize the GPIO driver so that it's ready to use,
  status = XGpio_Initialize(&GpioInput,
  if (status != XST_SUCCESS)
    return XST_FAILURE;
  // Set the direction for all signals to be inputs
  XGpio_SetDataDirection(&GpioInput, 1, 0xFFFFFFFF);

  OldData = 0xFFFFFFFF;
    // Read the state of the DIP switches
    DataRead = XGpio_DiscreteRead(&GpioInput, 1);

    // Send the data to the UART if the settings change
    if(DataRead != OldData){
      xil_printf("DIP Switch settings: 0x%X\r\n", DataRead);
      // Set the GPIO outputs to the DIP switch values
      XGpio_DiscreteWrite(&GpioOutput, 1, DataRead);
      // Record the DIP switch settings
      OldData = DataRead;
  return 0;
  1. In the “Project:TestApp” tree, right click on “Sources” and select “Add existing files”. Select the “TestApp.c” file that we just created and click “OK”.
  2. Right click on the “Project: TestApp” application and select “Generate Linker Script” and click “Generate”.
  3. Select “Software->Generate Libraries and BSPs” from the menu.

Download and Test the Project

  1. Open a Hyperterminal window with the required settings. For the correct settings, see Hyperterminal Settings.
  2. Turn on the XUPV2P board.
  3. We can now download our hardware description and software application to the FPGA. From the XPS software, select “Device Configuration->Download Bitstream”.

The simple C program that we added to this project simply reads the DIP switch settings and sends a message with that data to the UART. It also writes the same values to the LEDs. When the application is running and Hyperterminal is open, the DIP switch settings should be seen on the LEDs and on the Hyperterminal screen. Change the DIP switches to see the message change.

After a few changes in the DIP switches, the Hyperterminal output should look similar to the screen shot below:

The project folder for this tutorial can be downloaded in a compressed ZIP file LEDProject.zip
. Right-click on the link and select “Save Link As”.

In the next tutorial, Manually Add a Peripheral to a Project, we show how to manually add peripherals to a design, instead of letting the BSB do all the work.

Jeff is passionate about FPGAs, SoCs and high-performance computing, and has been writing the FPGA Developer blog since 2008. As the owner of Opsero, he leads a small team of FPGA all-stars providing start-ups and tech companies with FPGA design capability that they can call on when needed.

Facebook Twitter LinkedIn