Exploring the HPS and FPGA onboard the Terasic DE10-Nano

Introduction:

Terasic DE10-Nano is a development kit that contains an Intel® Cyclone® device. The Intel® Cyclone® V device 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.

 

Prerequisites:

There are a wealth of datasheets, user guides, tools, and other information available for the Terasic DE10-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

02:  Install EDS with DS-5

03:  Install PuTTY* (Windows* Users)

04:  Install WinScp (Windows Users)

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

06:  Download DE10-Nano Resources

 

Method #1 - Command Line:

Out of the box, the DE10-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 DE10-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 file system 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));


           //Map LED_PIO Physical Address to Virtual Address Space
           led_pio = mmap( NULL, LED_PIO_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, (ALT_LWFPGASLVS_OFST + LED_PIO_BASE) );  

           //Toggle all LEDs every 500ms a few times
           for (i=0; i < 10; i++)
           {
                *led_pio ^= 0xFF; //Bit0=LED0 … Bit7=LED7
                usleep(1000*500);
           }

 
           //Unmap
           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@192.168.7.1

               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;

endmodule 

    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

                              pushButton->Location=PIN_AH17

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

 

Summary:

The DE10-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 DE10-Nano.

Terasic DE10-Nano Get Started

 

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.          

              

Notices:

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.            

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.