DE0-Nano | NiosII untethered

I am heavily borrowing from the tutorials provided in the DE0-Nano user manual. Specifically chapter 7, Creating a Nios II Project.

So if you find my steps a bit too rushed and need more detail and screen shots have a look there. (There is a link at the bottom of this page)

Prerequisites for this tutorial (Other software versions will work just as well but the steps might be slightly different):

    • Altera Quartus II 11.0sp1

    • Altera Nios II EDS 11.0sp1

This is what we are going to build:

I am writing this because I am new to the whole FPGA world and got stuck several times doing this myself. All the necessary information needed to do this is out there on the web, mostly on the Altera homepage / forums but it is widespread and can be confusing at times.

Introduction

Here is a quick step-by-step tutorial for creating a NiosII soft processor on the

Altera DE0-Nano board and uploading it to the configuration device so it will run independently without a PC.

Hardware setup

Building the processor

  • start quartus11.0sp1

  • file>new project wizard

  • 1/5: create new folder NiosTut, select as project dir

  • name of project: mynios2

  • skip 2/5

  • 3/5: select Family: CycloneIV E

  • select device EP4CE22F17C6

    • click Finish

  • select Tools>SOPC Builder

  • Name system: DE0_NANO_SOPC

  • select verilog

  • rename clk_0 to clk_50

  • add NiosII processor (Procesors>Nios II Processor)

  • select NiosII/E variant and click Finish

  • rename cpu_0 to cpu

  • add a JTAG-UART (Interface Protocols>Serial>JTAG UART)

  • all defaults, click Finish

  • rename jtag_uart_0 to jtag_uart

  • add on-chip ram (Memories and Memory Controllers>On-Chip>On-Chip Memory RAM or ROM)

  • set total memory size to 26000

  • click Finish

  • rename onchip_memory2_0 to onchip_memory2

  • add EPCS Serial Flash Controller (Memories and Memory Controllers>External Memory Interfaces>Flash>EPCS Serial Flash Controller)

  • click Finish (defaults)

  • rename epcs_flash_controller_0 to epcs_flash_controller

  • right-click cpu and select edit...

  • set reset vector to epcs_flash_controller, offset 0x0

  • set exception vector to onchip_memory2, offset 0x20

  • click Finish

  • add an output port (Peripherals>Microcontroller Peripherals>PIO (Parallel IO) )

  • click Finish (Defaults)

  • rename pio_0 to pio_led

  • Select System > Assign Base Addresses

  • Select File>Refresh System

  • click Generate

  • and save the file as DE0_NANO_SOPC.sopc

  • >> Info: System generation was successful.

  • click Exit

Instanciating the hardware

    • File > New...

    • create a new Block Diagram/Schematic file (.bdf)

    • in the schematic view right click > Insert > Insert Symbol

    • under Project select the DE0_NANO_SOPC component

    • click Ok and place the Nios symbol on the schematic

    • right click the newly created DE0_NANO_SOPC symbol and select > Generate Pins For Symbol Ports

    • save the file as mynios2.bdf

    • it will show up in the project navigator under Files

    • select Processing > Start Compilation

    • wait........

    • >> Full compilation was successful (78 warnings)

    • select Assignments > Pin Planner

    • and connect the following signals to these pins

    • recompile (Processing > Start Compilation)

    • >>Successful (77 wanrings)

    • If after this compilation you get errors like this:

      • Error: Can't place multiple pins assigned to pin location Pin_C1 (IOPAD_X0_Y27_N7)

      • ....

    • go to the menu Assignments->Device...

    • click on "Device and Pin Options..."

    • and under Dual Purpose Pins switch the pins DCLK, Data[0], Data[1] and FLASH_nCE to "Use as regular IOs"

    • While you are in the Assignments->Device dialog you can use the opportunity to switch the pin voltage standard to 3,3LVTTL

    • This can be found under Device and Pin options > Voltage > Default I/O standard

    • recompile

    • This creates a new file called mynios2.sof in the project folder.

Initial upload

    • Now, the next steps depend on tools that talk to a Nios core over the JTAG cable. For this reason we need to upload our core to the board at least once (even though it won't do much without a program).

    • If for some reason you already got a Nios running on it you can skip right to Software setup.

    • select from the menu Tools>Programmer

    • If there are already files loaded from a previous session, remove them by selecting File>New

    • Add the mynios2.sof file you just built.

    • Press Start to upload it. (If the Start button is greyed out you might have to select the USB-Blaster cable in the Hardware Setup Dialog)

Software setup

Hello World (Blinking Led)

    • Open NiosII EDS 11.0sp1 Software Build Tools For Eclipse

    • choose your project folder as the workspace

    • when Eclipse opens up the workspace should be empty

    • File > New > Nios II Application and Bsp From Template

    • SOPC Information File ... browse to your project folder and select the file DE0_NANO_SOPC.sopcinfo

    • the cpu name should be auto selected for you

    • Select the Hello World template

    • call the Project "hello_world"

    • click Finish

    • 2 new projects are created, the hello_world project containing your code and the hello_world_BSP, a support library for your custom hardware

    • before hitting compile, right click the hello_world_BSP project and select NiosII > BSP Editor

    • on the Main tab under hal check enable_small_c_library (otherwise our little program won't fit into our even smaller ram)

    • hit Generate and then Exit

    • Right click the hello_world project and select Build Project

    • Right click the hello_world project and select Run as Hardware

    • It will upload the program and print "Hello From Nios II!"

  • Note, if at this point the Run Configurations window pops up, you either don't have a nios core currently running on the board or something is wrong with it. Go back to the Hardware setup section above that describes how to initially upload the nios core using the Quartus II programmer.

    • Now this following part is optional but we are going to blink an LED on the board. To truely prove that our board runs standalone (not connected to a computer) it would be great to just connect a battery to it. Without a JTag debug console, the easiest way to see if the program is running is to successfully blink an LED. If you don't care skip to Making it stick.

    • add the following lines to the generated file hello_world.c.

#include <stdio.h>

#include "system.h"

#include "altera_avalon_pio_regs.h"

int main()

{


printf("Hello from Nios II!\n");

int count = 0;

int delay;

while(1) {

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, count & 0x01);

delay = 0;

while(delay < 200000)

delay++;

count++;

}

return 0;

}

    • save the file and rebuild the project. Then run it again as hardware. LED0 on the board should now blink.

Making it stick!

    • If this all works it's time to push the whole thing into the flash to make it independent from the PC.

    • From the Eclipse menu select NiosII > Flash Programmer

    • Select File > New

    • Use the default: Get flash programmer system details from BSP Settings file

    • Browse to the settings.bsp file (it's in the hello_world_bsp folder)

    • everything else will be auto-detected for you.

    • click OK

    • You'll get an error message in the Problems tab

    • click on Connections

    • tick Ignore mismatched system ID

    • tick Ignore mismatched system timestamp

    • (if you have some patience left later you should add a SystemID ip core to the nios!)

    • click Close

    • click add File, browse to your NiosTut hardware folder and select the file myfirst_niosii.sof

    • click add again and select the file hello_world.elf in your hello_world folder

    • click Start

    • If everything is okay the Nios system and your program will be uploaded to the EPCS flash.

    • Once this is done, unplug and re-plug the board. The LED should start to blink.

    • The program will be uploaded and started on power up.

Please let me know if something in this tutorial is horribly wrong or I am missing something important.

Some of the steps above can be taken care of by the DE0-Nano project builder which comes with the board but I found it helpful to click around inside Quartus and navigate through the various dialogs to get a quicker understanding of it's inner workings.

Useful links regarding this tutorial

DE0-Nano User Manual:

www.terasic.com:

Pdf

CycloneIV E Pinout file:

www.altera.com:

Pdf

Embedded Peripherals IP User Guide:

www.altera.com:

Pdf

Disclaimer

Other projects you might like