« Very High Speed Integrated Circuit Hardware Description Language/Le NIOS d'Altera » : différence entre les versions

Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-A partir +À partir)
m Robot : Remplacement de texte automatisé (-(<|</)source([ \t>]) +\1syntaxhighlight\2)
Ligne 90 :
==== Retour dans Quartus ====
Cherchez votre fichier .qip dans un sous-répertoire "synthesis" et importez-le dans votre projet. Une fois votre réalisation matérielle importée dans Quartus, vous devez trouver un fichier VHDL. En voici l'entité :
<sourcesyntaxhighlight lang=vhdl>
-- niosii.vhd
 
Ligne 105 :
);
end entity niosii;
</syntaxhighlight>
</source>
Vous retrouvez, conformément au cahier des charges, une entrée horloge et une sortie "s7seg_export". Il vous resta à ajouter les contraintes.
===== Fichier de contraintes =====
Ligne 126 :
=== Réalisation logicielle ===
Nous donnons d'abord le programme d'exemple que nous allons expliquer.
<sourcesyntaxhighlight lang=c>
/*
* demo1.c
Ligne 151 :
return 0;
}
</syntaxhighlight>
</source>
La compréhension des valeurs trouvées dans le tableau nécessite de connaître que l'organisation des segments est supposée être abcdefg, avec g poids faible. Il faut savoir aussi que pour allumer un segment sur notre carte, il faut un zéro logique.
 
Ligne 159 :
Il est possible d'utiliser les types qui sont redéfinis dans "alt_types.h" qui permettent de préciser la taille des variables. En voici un exemple :
 
<sourcesyntaxhighlight lang=c>
#include "alt_types.h"
int main (void)
{
alt_u32 time1;
</syntaxhighlight>
</source>
}}
 
Ligne 264 :
==== Registre de status ====
La partie du fichier d'entête '''altera_avalon_timer_regs.h''' correspondante est :
<sourcesyntaxhighlight lang=c>
/* STATUS register */
#define ALTERA_AVALON_TIMER_STATUS_REG 0
Ligne 277 :
#define ALTERA_AVALON_TIMER_STATUS_RUN_MSK (0x2)
#define ALTERA_AVALON_TIMER_STATUS_RUN_OFST (1)
</syntaxhighlight>
</source>
La deuxième ligne indique qu'il est en adresse 0 par rapport à la base.
 
Ligne 290 :
 
Réaliser un code qui ne modifie qu'un seul bit ne se fait qu'en trois étapes :
<sourcesyntaxhighlight lang=c>
// declarer la variable status comme : alt_u16 status;
status = IORD_ALTERA_AVALON_TIMER_STATUS(0);
Ligne 296 :
// met 0 dans TO sans changer les autres bits
IOWR_ALTERA_AVALON_TIMER_STATUS(0, status);
</syntaxhighlight>
</source>
Ici comme un seul bit est accessible en écriture on peut se contenter de :
<sourcesyntaxhighlight lang=c>
IOWR_ALTERA_AVALON_TIMER_STATUS(0, ~ALTERA_AVALON_TIMER_STATUS_TO_MSK);
</syntaxhighlight>
</source>
Le premier paramètre est ici à 0 car notre base est à 0.
}}
Ligne 306 :
==== Registre de contrôle ====
La partie du fichier d'entête '''altera_avalon_timer_regs.h''' correspondante est :
<sourcesyntaxhighlight lang=c>
/* CONTROL register */
#define ALTERA_AVALON_TIMER_CONTROL_REG 1
Ligne 323 :
#define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK (0x8)
#define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST (3)
</syntaxhighlight>
</source>
Il montre que ce registre contient 4 bits de contrôle (donnés ici du poids faible vers le poids fort) :
* '''ITO''' : Interrupt Timer Overflow est un bit d'autorisation d'interruption
Ligne 331 :
{{principe|contenu=
Le démarrage du timer en mode continu se fait avec l'instruction (avec fichier d'entête '''altera_avalon_timer_regs.h''') :
<sourcesyntaxhighlight lang=c>
IOWR_ALTERA_AVALON_TIMER_CONTROL(0 , ALTERA_AVALON_TIMER_CONTROL_START_MSK
| ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
| ALTERA_AVALON_TIMER_CONTROL_CONT_MSK);
</syntaxhighlight>
</source>
Encore une fois le premier paramètre est à 0 car notre base est à 0.
}}
Ligne 345 :
 
L'écriture d'une valeur particulière se fait donc par :
<sourcesyntaxhighlight lang=c>
IOWR_ALTERA_AVALON_TIMER_PERIODL(0,0xFFFF);
IOWR_ALTERA_AVALON_TIMER_PERIODH(0,0x00FF);
</syntaxhighlight>
</source>
qui met 0x00FFFFFF comme valeur à charger à chaque dépassement de capacité.
 
Ligne 372 :
 
Le code présenté ci-dessous fonctionne correctement. Il est possible de changer la rapidité de comptage en changeant le paramètre de l'instruction
<sourcesyntaxhighlight lang=c>
IOWR_ALTERA_AVALON_TIMER_PERIODH(0,0x00FF);
</syntaxhighlight>
</source>
Le débit des interruptions est donc maintenant réglable par une simple valeur dans un registre.
<sourcesyntaxhighlight lang=c>
#include "system.h"
#include "altera_avalon_pio_regs.h"
Ligne 414 :
return 0;
}
</syntaxhighlight>
</source>
Nous avons gardé l'attente passive dans le programme principal mais ce n'est plus elle qui rythme le comptage, c'est l'interruption. En effet l'instruction count++ est bien dans l'interruption. L'affichage par contre, est réalisé dans le programme principal.
 
Ligne 437 :
 
{{solution|titre=Fichier d'exemple d'utilisation de l'afficheur LCD complètement fonctionnel|contenu=
<sourcesyntaxhighlight lang=c>
/*
* "Hello World" example.
Ligne 538 :
}
}
</syntaxhighlight>
</source>
}}
 
Ligne 552 :
 
{{solution|titre=Autre exemple d'utilisation de l'afficheur LCD complètement fonctionnel|contenu=
<sourcesyntaxhighlight lang=c>
#include "system.h"
#include "altera_avalon_pio_regs.h"
Ligne 640 :
}
}
</syntaxhighlight>
</source>
}}
Notre façon de définir les constantes juste avant leurs utilisations n'est pas habituelle. Mais la partie de sous-programmes utiles est tellement petite que nous n'avons pas décidé de regrouper toutes les constantes en début de programme.
Ligne 647 :
==== Exercice ====
On vous demande de modifier les programmes d'exemple ci-dessus pour ajouter la primitive "createChar" à vos sous-programmes utiles. Voici son code source dans la librairie Arduino :
<sourcesyntaxhighlight lang=c>
// Allows us to fill the first 8 CGRAM locations
// with custom characters
Ligne 657 :
}
}
</syntaxhighlight>
</source>
On ne gardera pas la notion d'objet utilisée dans cette librairie Arduino.
{{solution|contenu=
<sourcesyntaxhighlight lang=c>
#include "system.h"
#include "altera_avalon_pio_regs.h"
Ligne 774 :
}
}
</syntaxhighlight>
</source>
}}