Exploring the HPS and FPGA onboard the Terasic DE10-Nano

By Promotion | Updated Jul 28 2017
Exploring the HPS and FPGA onboard the Terasic DE10-Nano
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));
         //Map LED_PIO Physical Address to Virtual Address Space
          //Toggle all LEDs every 500ms a few times
          for (i=0; i < 10; i++)
               *led_pio ^= 0xFF; //Bit0=LED0 … Bit7=LED7
          munmap(led_pio, LED_PIO_SPAN);
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.

For more such intel IoT resources and tools from Intel, please visit the Intel® Developer Zone

Source: https://software.intel.com/en-us/articles/exploring-the-hps-and-fpga-onboard-the-terasic-de10-nano


JioPhone   Demo  Features  Digitin

Digit caters to the largest community of tech buyers, users and enthusiasts in India. The all new Digit in continues the legacy of Thinkdigit.com as one of the largest portals in India committed to technology users and buyers. Digit is also one of the most trusted names when it comes to technology reviews and buying advice and is home to the Digit Test Lab, India's most proficient center for testing and reviewing technology products.

We are about leadership-the 9.9 kind! Building a leading media company out of India.And,grooming new leaders for this promising industry.