© Mathias Spiessens en Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Faculteit Technologie, Innovatie & Samenleving groep E-EMSYS = minor Embedded Systems.
Bij dit practicum werk je in lokaal D1.052.
Deze opdracht is de inleidende opdracht voor alle drie de practica die in de minor embedded systems gegeven worden:
Bij deze opdracht maak je kennis met het DE2-70 ontwikkelbord van Altera. Op dit bord bevindt zich onder andere een Cyclone II Field Programmable Gate Array (FPGA). In deze inleidende opdracht zul je leren hoe je een softcore microprocessor (de NiosII) kunt configureren en op deze FPGA kunt plaatsen. Tevens leer je hoe je vervolgens software voor deze softcore kunt ontwikkelen.
Je zult de eerste week van de minor met deze opdracht bezig zijn. 6 uur op het begeleide practicum en nog ongeveer 6 uur thuis. Let op! In week 2 ga je bij elk practicum werken aan specifiek bij dat practicum behorende opdrachten.
We maken bij deze opdracht gebruik van software van Altera. In lokaal D1.052 is deze software al geïnstalleerd. Je kunt ook een gratis versie van deze software thuis gebruiken: http://www.altera.com/products/software/quartus-ii/web-edition/qts-we-index.html. Let op: wij gebruiken in lokaal D1.052 de betaalde versie http://www.altera.com/products/software/quartus-ii/subscription-edition/qts-se-index.html je kunt thuis een 30 dagen probeerversie gebruiken. Op dit moment is in lokaal D1.052 Quartus versie 11.1sp1 geïnstalleerd.
Bij het Altera bord wordt een CD geleverd met heel veel
informatie en voorbeelden. Deze CD kun je downloaden vanaf: http://www.terasic.com/downloads/cd-rom/de2_70/CD-ROM/DE2_70_SYSTEM_CD_v.1.4.0.rar.
De User Manual van het bord kun je vinden op: http://www.terasic.com.tw/attachment/archive/226/DE2_70_User_manual_v109.pdf
.
De bordjes zelf kun je vinden in de kluisjes EK1 t/m EK8. De sleutels van deze kluisjes zijn te vinden in lokaal D1.052. De DE2-70 borden worden gedeeld door meerdere practicumgroepen.
We beginnen met het bekijken van een on-line course van Altera, genaamd "Designing with the Nios II Processor and SOPC Builder", waarin een overzicht wordt gegeven van de Altera development tools voor embedded systems. Met deze tools kan zowel de hardware als de software ontworpen en geïmplementeerd worden.
Deze course is te uitgebreid om helemaal door te nemen dus volg onderstaande handleiding.
-- Implements a simple Nios II system for the DE2-70 board. -- Inputs: iSW7-0 are parallel port inputs to the Nios II system -- iCLK_50 is the system clock -- iKEY0 is the active-low system reset -- Outputs: oLEDG7-0 are parallel port outputs from the Nios II system LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY lights IS PORT ( iSW : IN STD_LOGIC_VECTOR(7 DOWNTO 0); iKEY : IN STD_LOGIC_VECTOR(0 DOWNTO 0); iCLK_50 : IN STD_LOGIC; oLEDR : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END lights; ARCHITECTURE Structure OF lights IS COMPONENT nios_system PORT ( clk_0 : IN STD_LOGIC; reset_n : IN STD_LOGIC; out_port_from_the_LEDs : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); in_port_to_the_Switches : IN STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT; BEGIN NIOS: nios_system PORT MAP ( clk_0 => iCLK_50, reset_n => iKEY(0), out_port_from_the_LEDs => oLEDR, in_port_to_the_Switches => iSW ); END Structure;
#include "altera_avalon_pio_regs.h"
#include "system.h"
int main() {
while(1) {
IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE, IORD_ALTERA_AVALON_PIO_DATA(SWITCHES_BASE));
}
return 0;
}
IOWR_ALTERA_AVALON_PIO_DATA
en
IORD_ALTERA_AVALON_PIO_DATA
zijn macro's waarmee de PIO
(Parallel I/O) aangestuurd en ingelezen kan worden. Ze zijn
gedefinieerd in de header file altera_avalon_pio_regs.h. Klik in de
Project Explorer het project lights_bsp open om te zien welke
include files in het BSP zijn geplaatst. Deze kun je vinden onder
drivers/inc. LEDS_BASE
is het basisadres van de PIO voor
de LEDs en SWITCHES_BASE
is het basisadres van de PIO voor
de switches. Deze constanten zijn gedefinieerd in system.h die je ook
in het BSP kunt vinden.
Breidt de hardware uit met een hardware driver voor het LCD display. Deze hardware driver kun je selecteren in SOPC Builder.
Natuurlijk moet je de VHDL code om de gegenereerde hardware met de pinnen van de Cyclone II te verbinden ook aanpassen. De namen van de pinnen kun je vinden in de DE2_70_pin_assignments.csv file. De pin oLCD_BLON hoef je niet aan te sluiten.
De namen van de poorten van de gegenereerde hardware kun je vinden in de
nios_system.vhd file die aangemaakt is door SOPC Builder. Zoek naar
entity nios_system
en neem de port definitie over.
De pin LCD_ON moet op 1 gezet worden om de LCD aan te zetten. Dit moet je in het top level design (lights) doen met een concurrent signal assignment in VHDL.
Als je de hardware gewijzigd is moet je de BSP ook opnieuw "refreshen". Klik rechts op het lights_bsp project en kies voor Nios II > Generate BSP...
Pas de software aan zodat een boodschap op het LCD display verschijnt. Let op! Het is niet nodig om zelf de LCD display low level aan te sturen want de SOPC Builder heeft hier een driver voor gegenereerd (als onderdeel van de BSP) die we "gewoon" via de stdio library kunnen gebruiken.
#include <stdio.h> #include "system.h" int main() { FILE *fp = fopen(LCD_0_NAME, "w"); if (fp) { fprintf(fp, "test"); fclose(fp); } return 0; }
Let op! Het gebruik van fprintf
kan ervoor zorgen dat het programma niet meer in het geheugen past. Dit kun je
het meest eenvoudig oplossen door fprintf
te varvangen door
fiprintf
. De functie fiprintf
is veel kleiner dan
fprintf
maar kan geen floating point getallen printen (de
i in de naam is een afkorting van integer) en is geen
onderdeel van de C standaard.
Een nog kleiner programma krijg je door in de BSP Editor aan te geven dat de
output naar stdout naar de lcd gestuurd moet worden. Je kunt dan de veel
kleinere functie iprintf
gebruiken. Deze oplossing heeft echter
als nadeel dat je alleen nog maar naar het LCD kunt schrijven en niet meer naar
het console.
Het testprogramma wordt dan als volgt:
#include <stdio.h> int main() { iprintf("test"); return 0; }
Breidt de hardware uit met een timer. Deze hardware timer kun je selecteren
in SOPC Builder. Schrijf nu een programma waarin je een led, button, timer en
LCD gebruikt om een reactietijdtester te maken. Het idee is als volgt: na het
starten van het programma wordt een willekeurige tijd (bijvoorbeeld tussen de 2
en de 20 seconden) gewacht en daarna wordt een LED aangezet. Vervolgens wordt
gemeten hoe lang het duurt voordat de gebruiker de switch overhaalt. Deze tijd
wordt in ms nauwkeurig op het LCD zichtbaar gemaakt. Het is in dit geval
misschien handiger om een push-button te gebruiken in plaats van een switch.
Bedenk dat je dit kunt doen door een simpele wijziging in de pin assignments.
Zie http://www.altera.com/literature/hb/nios2/n2sw_nii52004.pdf
voor een voorbeeld van het
gebruik van de Timestamp Driver.
Let op! Je moet de timer die je in de hardware hebt toegevoegd nog koppelen aan de timestamp_timer driver. Dat doe je in de BSP Editor.
Let nog steeds op! De timer die je in de hardware hebt toegevoegd moet niet aan de sys_clk_timer gekoppeld zijn. Dat check je in de BSP Editor.
Het Nios II Software Developers Handbook bevat veel nuttige informatie die
je bij de volgende opdrachten kunt gebruiken: http://www.altera.com/literature/hb/nios2/n2sw_nii5v2.pdf
. In Section II wordt de Hardware
Abstarction Layer (HAL) besproken die belangrijk is bij het programmeren van
hardware. In deze section wordt ook veel uitgelegd over het ontwikkelen van
drivers voor de I/O-devices. In Section III komen diverse advanced programming
topics zoals interrupt handling en het toepassen van het µC/OS-II RTOS aan de
orde.