February 6, 20085 minutes
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:
RS232_Uart_1, LEDs_4Bit and DIPSWs_4Bit ticked and un-tick everything else.
plb_bram_if_cntlr_1 and click “Next”.
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”.
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.
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.
ppc405_0. Click “OK”.
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.
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
xil_printf("%c[2J",27);
// Initialize the GPIO driver so that it's ready to use,
status = XGpio_Initialize(&GpioOutput,
XPAR_LEDS_4BIT_DEVICE_ID);
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,
XPAR_DIPSWS_4BIT_DEVICE_ID);
if (status != XST_SUCCESS)
return XST_FAILURE;
// Set the direction for all signals to be inputs
XGpio_SetDataDirection(&GpioInput, 1, 0xFFFFFFFF);
OldData = 0xFFFFFFFF;
while(1){
// 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;
}TestApp.c file that we just created and click “OK”.
Download and Test the Project
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.