Exploring the HPS and FPGA onboard the Terasic DE10-Nano


Get access to the new Intel® IoT Developer Kit, a complete hardware and software solution that allows developers to create exciting new solutions with the Intel® Galileo and Intel® Edison boards. Visit the Intel® Developer Zone for IoT.


The Terasic DE-10 Nano is a development kit that contains a Cyclone* V device. The Cyclone V contains a Hard Processor System (HPS) and field-programmable gate array (FPGA) with a wealth of peripherals onboard for creating some interesting applications. One of the most basic things to accomplish with this system is to control the LEDs that are physically connected to the FPGA. This tutorial will discuss four different methods for controlling the LEDs using the command line, memory mapped IO, schematic, and Verilog HDL. Whether you are an application developer, firmware engineer, hardware engineer, or enthusiast, there is a method suited for you.


There are a wealth of datasheets, user guides, tools, and other information available for the DE-10 Nano. It is encouraged to review this documentation to get a deeper understanding of the system. For this tutorial, please download and install the following first:

01: Intel® Quartus® Prime Software Suite Lite Edition for Cyclone V – http://dl.altera.com/?edition=lite

02: Install EDS with DS-5 – http://dl.altera.com/soceds/

03: Install Putty (Windows* Users) – http://www.putty.org/

04: Install WinScp (Windows Users) – https://winscp.net/eng/download.php

05: Install the RNDIS Ethernet over USB driver (Windows Users) – See Terasic DE10 Nano Quick Start Guide Section 3

06: Download DE-10 Nano Resources – http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=1046&PartNo=4

Method #1 – Command Line

Out of the box, the DE-10 Nano HPS is pre-configured to boot a Linux* image and the FPGA is pre-configured with the Golden Hardware Reference Design (GHRD). This means you have a complete system and can get started exploring right away by simply applying power to the board. The most basic method to control an LED using the DE-10 Nano HPS is with the file system. This method lends itself well to the scripters out there that want to do something basic and work at the filesystem level. This can be easily illustrated using the serial terminal. To begin, perform the following:

01: Connect a Mini-B USB cable from the host to the DE10 Nano USB UART (Right Side of board)

02: Open a serial terminal program

03: Connect using a 115200 baud rate

04: Login as root, no password is needed

05: Turn on the LED

echo 1 > /sys/class/leds/fpga_led0/brightness

06: Turn off the LED

echo 0 > /sys/class/leds/fpga_led0/brightness

Method #2 – C Based Application

Another method to control the LEDs using the HPS, is to go lower level and develop a Linux application that accesses the memory mapped regions in SDRAM exposed by the FPGA that control the LEDs. The HPS can access this region using the Lightweight HPS2FPGA AXI Bridge (LWFPGASLAVES) that connects to the Parallel IO (LED_PIO) area. The C based application will map this region into the user application space, toggle all 8 LEDs every 500ms for a few times, unmap the region, and exit. We will develop the application using the Eclipse DS-5 IDE. To begin, perform the following:

01: Open Eclipse DS-5

02: Create a New Project

    02a: File->New->C Project->Hello World Project

    02b: Enter a project Name

    02c: Select GCC 4.x [arm-linux-gnueabihf) Toolchain

    02d: Click Finish

03: Delete the generated Hello World code

04: Add Preprocessor Includes & Defines

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

#define ALT_LWFPGASLVS_OFST 0xFF200000
#define LED_PIO_BASE 0x3000
#define LED_PIO_SPAN 0x10

05: Add main() function

int main(void)
{ unsigned long *led_pio; int fd; int i; fd = open("/dev/mem", (O_RDWR | O_SYNC)); led_pio = mmap( NULL, LED_PIO_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, (ALT_LWFPGASLVS_OFST + LED_PIO_BASE) ); for (i=0; i < 10; i++) { *led_pio ^= 0xFF; usleep(1000*500); } munmap(led_pio, LED_PIO_SPAN); close(fd); return(0);

06: Build the Project

    Project->Build Project

07: Test out the application

    06a: Connect a micro USB cable from the host to the DE10 Nano USB OTG Port

    06b: Use scp to transfer the application to the DE10 Nano at root@

    06c: Run the application from the serial terminal ./<applicationName>

Methods #3 & #4 – Schematic and Verilog HDL

So far we have been controlling the LEDs connected to the FPGA from the HPS using the command line and a C based application. Now let’s discuss controlling the LEDs directly using just the FPGA logic. In this design, we will turn on/off 2 LEDs when a pushbutton is pressed/released respectively. It should be noted that the pushbutton is pulled up and the LEDs are active high so an inverter is used to get the desired behavior when the button is pressed/released. We will use a schematic based approach to create the logic to control the first LED and a Verilog HDL approach to create the similar logic to control the second LED. We will create the design using the Intel® Quartus® Prime Software Suite Lite Edition software. To begin the project, perform the following:

01: Open Quartus Prime Lite

02: Create a New Project

    02a: File->New->New Quartus Prime Project->Next

    02b: Enter Project Name->Next->Empty Project

    02c: Click Next

    02c: Name Filter->5CSEBA6U23I7->Finish

03: Create a New Schematic File

    03a: File->New->Block Diagram/Schematic File

04: Add LED Output Pins

    04a: Right Click->Insert Symbol->primitives->pin->output

    04b: Right Click->Insert Symbol->primitives->pin->output

    04c: Right Click on output pin->Properties->Name=led_0

    04d: Right Click on output pin->Properties->Name=led_1

05: Add Push Button Input Pin

    05a: Right Click->Insert Symbol->primitives->pin->input

    05b: Right Click on input pin->Properties->Name=pushButton

06: Add Inverter

     06a: Right Click->Insert Symbol->primitives->logic->not

07: Connect Everything Up

    07a: Connect pushButton to Inverter Input

    07b: Connect Inverter Output to led_0

08: Create a New Verilog HDL File

    08a: File->New->Verilog HDL File

    08b: Enter Verilog Code

module inverter (

 input in,
 output out
 assign out = !in;


08c: Save File

    08d: Update Symbols

File->Create/Update->Create Symbols From Current File

    08e: Add Verilog Module to Top Level Schematic

Right Click->Insert Symbol->inverter->Click Ok

    08f: Connect pushButton Input to Inverter Input

    08g: Connect Inverter Output to led1 Output Pin

09: Assign Inputs and Outputs to Physical FPGA Pins

    09a: Processing->Start->Start Analysis & Elaboration

    09b: Assignments->Pin Planner

led0->Location=PIN_W15, I/O Standard=3.3-V LVTTL

led1->Location=PIN_AA24, I/O Standard=3.3-V LVTTL


10: Compile Project

    10a: Start->Start Compilation

11: Program the FPGA

    11a: Connect mini USB cable to JTAG USB Blaster port (near HDMI connector and Blue LED)

    11b: Click Tools->Programmer

    11c: Click Hardware Setup->Currently Selected Hardware->DE-SoC

    11d: Click AutoDetect->5CSEBA6

    11e: Click on 5CSEBA6U23 Chip Picture

    11f: Click Change File-><project directory>\output_files\yourFile.sof

    11g: Click Program/Configure checkbox

    11h: Click Start Button

12: Test out the design

    12a: Push and hold the right pushbutton and led0 and led1 will turn on

12b: Release the pushbutton and the LEDs will turn off


The DE-10 Nano has a lot to offer the engineer from its capabilities, variety of tools, programming methods, and documentation. This tutorial showed four different methods for controlling the LEDs that utilized the HPS and FPGA using the available tools. You can take all of these concepts to the next level when you begin your next project with the DE-10 Nano.

About the Author

Mike Rylee is a Software Engineer at Intel Corporation with a background in developing embedded systems and apps for Android*, Windows*, iOS*, and Mac*. He currently works on Internet of Things projects.


No license (express or implied, by estoppel or otherwise) to any intellectual property rights is granted by this document.

Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade.

This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice. Contact your Intel representative to obtain the latest forecast, schedule, specifications and roadmaps.

The products and services described may contain defects or errors known as errata which may cause deviations from published specifications. Current characterized errata are available on request.

Copies of documents which have an order number and are referenced in this document may be obtained by calling 1-800-548-4725 or by visiting www.intel.com/design/literature.htm.

Intel, the Intel logo, and Intel RealSense are trademarks of Intel Corporation in the U.S. and/or other countries.

*Other names and brands may be claimed as the property of others

**This sample source code is released under the Intel Sample Source Code License Agreement

© 2017 Intel Corporation.