Premiers pas avec la maquette DE1-Soc

L'objectif de ce TP est d'une part de vous familiariser avec le langage SystemVerilog et d'autre part de découvrir l'outil Quartus qui sera utilisé tout au long du module.  Vous allez donc devoir développer du code SystemVerilog puis mettre en oeuvre votre code sur les maquettes disponibles dans les salles de TP.

Les transparents (pour les profs)...

La maquette de TP que vous allez utiliser, est basée sur l'utilisation d'un circuit appelé FPGA (Field Programmable Gate Array). Il s'agit d'un circuit composé d'un grand nombre de blocs de traitement logiques (combinatoires ou séquentiels) , dont on peut reprogrammer la fonctionnalité à volonté. Ces blocs de traitement reliés entre eux par des connections dont la topologie est elle même reprogrammable.

La structure interne d'un FPGA

Le circuit FPGA se situe dans la zone centrale de votre maquette

Le FPGA dans la carte de TP DE1-Soc

Sur le coté gauche vous distinguez la prise d'alimentation de la maquette (vérifiez si elle est bien branchée à l'alimentation, ou si l'alimentation est  elle même bien branchée). L e bouton marche/arrêt (rouge) se situe juste à coté.

L'alimentation et l'interrupteur marche/arrêt

 

Dans la zone en bas à gauche, vous disposez de 10 interrupteurs. Ces interrupteurs permettent de forcer les entrées du FPGA nommée sw[9], sw[8]...sw[0] à 0 (position basse) ou à 1 (position haute).

Les interrupteurs

A droite des interrupteurs, vous trouverez 4 boutons poussoirs, connectés aux entrées key[3],  key[2],  key[1] et key[0] du FPGA. Attention, l'entrée key[i] vaut 1 lorsque le bouton correspondant est relaché, et 0 lorsrqu'il est appuyé.

Les boutons-poussoir

Au dessus des interrupteurs vos disposez de 10 LEDS connectées au sorties ledr[9], ledr[8], ...,ledr[0] du FPGA. Les LEDS sont allumées si la sortie ledr[i] correspondantes vaut 1.

Les LEDS rouges

Vous disposez (en bas à gauche) de 6 afficheurs "7-segment" connectés aux signaux hex5[6:0], hex4[6:0],...,hex0[6:0] du FPGA.

Attention, pour allumer le segment i de l'afficheur j, il faut que le signal hexj[i] soit à 0, pour l'éteindre il faut que ce signal soit à 1.

Les afficheurs 7 segments

Les autres connecteurs sont réservées à des interfaces spécialisées (audio, vidéo, ethernet,...) et ne seront pas utilisées dans ce TP.

Les autres interfaces

Enfin, sur la gauche, se trouve le connecteur USB esclave permettant de programmer le contenu du FPGA depuis votre PC. Vérifiez que ce cable est bien connecté (à la maquette et au PC)

Le connecteur USB pour le chargement du code du FPGA

II A vous de jouer : Un squelette de design pour découvrir les outils Quartus

  • Téléchargez l'archive de projet Quartus disponible ici.
  • Ouvrez une fenêtre de terminal et décomprimez l'archive dans le répertoire ou vous l'avez placée: tar xjvf bac_a_sable.tbz
  • Toujours dans ce terminal placez vous dans le répertoire "bac_a_sable/quartus"
  • Toujours dans ce terminal, lancez l'outil Quartus: quartus &

L'outil prend un peu de temps à ce charger. Cet outil va vous permettre de décrire des structures logiques en langage SystemVerilog, et de les transformer en un fichier de programmation pour le FPGA.

  • Utilisez le menu déroulant  "File->Open Project". Faites bien attention a ouvrir un "projet" et pas un simple fichier.
  • Et ouvrez le fichier fpga.qpf.

Ce fichier contient toutes les informations nécessaires à l'outil pour compiler le source SystemVerilog: Le type de FPGA, où sont ses entrées/sorties, quels sont les fichiers source nécessaires....

Vous disposez maintenant d'une fenêtre "Project Navigator":

  • Dans le menu déroulant sur sa droite, choisissez "Files" à la place de "Hierarchy"

  • Ouvrez le fichier fpga.sv (double-click...)

Sur la gauche apparaît un fichier source en langage SystemVerilog. Pour le moment, nous ne nous attarderons pas sur la syntaxe du langage. Sachez simplement, que ce fichier contient la définition d'un module entre les mots clefs module et endmodule ainsi que la définition des entrées sorties du module

  • Prenez la peine d'établir les correspondances entre les différents signaux déclarés est ceux décrits dans le chapitre précédent.

Nous allons simplement rajouter du code pour connecter l'ensemble des entrées d'interrupteurs sw aux leds rouges ledr.

  • Ajoutez la ligne suivante après le commentaire "// ajouter votre code..." et avant "endmodule"
always @(*) ledr = sw;

 

Nous allons maintenant compiler le fichier SystemVerilog. Pour cela:

  • Appuyez le ​ ​bouton   situé dans la barre supérieur de l'outil

Même pour un design simple comme celui-ci, la compilation peu prendre une minute ou deux. S'il n'y a pas de message d'erreur (voir la fenêtre Messages), l'outil a créé un fichier de programmation pour fpga.sof le FPGA. Nous allons programmer le FPGA, pour cela vérifiez que la carte  DES1-SoC est bien alimentée, et que le cable de transfert USB est bien connecté.

  • Appuyez le bouton  situé dans la barre supérieure de l'outil

La fenêtre suivante devrait s'ouvrir. 

  • Vérifiez que le fichier fpga.sof est bien sélectionner et que la case Program/Configure est bien cochée.
  • Appuyez sur le bouton Start

Le FPGA est maintenant programmé, si tel n'est pas le cas (messages d'erreur du programmeur, demandez à un encadrant de vous aider).

  • Vérifiez que les leds rouges s'éteignent ou s'allument lorsque vous modifiez la position des interrupteurs.

Votre environnement de TP est maintenant en place. Vous pouvez sauver votre projet en l'état.

Avant de continuer dans les exercices, prenez la peine de lire l'introduction au langage SystemVerilog qui suit.

III Exercices en logique combinatoire

Ces exercices on pour but de vous familiariser pas à pas aux méthodes de codage en SystemVerilog. Vous ne pourrez peut-re pas réaliser tous les exercices, ce n'est pas grave, mais tentez quand même d'en réaliser le maximum...

Exercice 1:

Il s'agit de visualiser un nombre de 4 bits  au format hexadécimal à l'aide des afficheurs de la maquette.

  1. Modifiez le code du module FPGA de façon à afficher la valeur représentée par les interrupteurs sw[3:0] sur l'afficheur hex0.
  2. Compilez et testez votre code sur la maquette.

Exercice 2:

Nous désirons afficher plusieurs valeurs sur les différents afficheurs (hex0, hex1,...). Nous ne voulons pas dupliquer le code (bonne pratique identique à celle du développement logiciel).

  1. Dans le répertoire src, qui contient déjà le fichier fpga.sv,  créez un nouveau fichier nommé decodeur7seg.sv qui contiendra la définition d'un module decodeur7seg  dont les entrées/sorties sont:
    • entrée : din, mot de 4bits représentant le code à afficher.
    • sortie : dout, mot de 7 bits représentant les bits de l'afficheur.
  2. Modifiez le code de fpga  de façon à instancier le module decodeur7seg en lieu et place du code précédent.
  3. Compilez et testez votre code sur la maquette.

Exercice 3:

Faisons un peu d'arithmétique, nous désirons additionner 2 mots de 4 bits (non signés) , afficher chacune des valeurs ainsi que le résultat.

  1. Nous supposons que sw[3:0] représente un nombre non signé de 4 bits.
  2. Nous supposons que sw[7:4] représente un nombre non signé de 4 bits.
  3. Modifiez fpga pour:
    • Afficher sw[3:0] sur hex0
    • Afficher sw[7:4] sur hex1
    • afficher la somme de sw[3:0] et de sw[7:4] sur hex3 et hex4. (Expliquez pourquoi nous devons utiliser 2 afficheurs)
  4. Compilez et testez sur votre maquette.

Exercice 4:

On suppose maintenant que les nombres sont signés, codés sur 4 bits en complément à 2.

  1. Transformez votre additionneur en conséquence
  2. Compilez et testez sur votre maquette.

Exercice 5:

  1. Transformez votre additionneur en additionneur/soustracteur. sw[9]  sera utilisé pour choisir addition ou soustraction.
  2. Compilez et testez sur votre maquette.

Exercice 6:

Lire en hexadécimal est un peu fatiguant, nous désirons afficher les nombres en décimal:

  • Chaque nombre servant à l'addition devra utiliser 2 afficheurs:
    • le premier afficheur affichera l'amplitude du nombre (de 0 à 8)
    • le second afficheur affichera le signe du nombre s'il est négatif.
  • Le resultat utilisera 2 afficheurs
    • Le couple d'afficheur devra afficher des nombres codés de (-16 a 16)
    • Le premier afficheur affichera les unités (0..9)
    • Le deuxième afficheur affichera les dizaines : -1, 0 ou 1
  1. Transformez votre additionneur/soustracteur en conséquence
  2. Compilez et testez sur votre maquette.

 

IV Exercices en logique synchrone

Squelette pour la maquette DE1-SoC:

  • ATTENTION: pour ces exercices vous utiliserez la nouvelle archive de projet proposée. 
  • Vous afficherez les résultats des différents compteurs en réemployant les décodeurs 7-segments que vous avez réalisé

A/ Compteurs

  • construire un système qui compte (+1) à chaque coup d'horloge (max 255 puis reboucle à 0)
  • ajouter la possibilité de le remettre à zéro de façon
    • asynchrone
    • synchrone
  • ajouter deux entrée permettant de le configurer :
    • en mode comptage (+1)
    • ou décomptage (-1)
    • ou stoppé.
    •  
  • ajouter au compteur un dipositif pour qu'il ne compte que jusqu'à 13
    • arrivé à 13, il se bloque
    • arrivé à 13, il repart à 0

B/ Réaliser un détecteur de front montant

Vous avez déjà réalisé cet exercice en TD. Il s'agit de détecter d'un cycle à l'autre de l'horloge, q'un signal  (qui n'est pas une horloge) est passé de l'état 0 à l'état 1 ?

  • vous pourrez utiliser les boutons poussoir de la maquette signal key[3] par exemple) pour générer le signal à détecter.
  • attention ces boutons poussoirs ont une polarité inversée: le signal passe à 0 si on appuie sur le bouton.

C/ Réaliser un diviseur d'horloge

Il s'agit de réaliser un dispositif qui génère un signal égal à un durant un cycle d'horloge tous les N cycles d'horloge. On traitera d'abord le cas ou N est une constante, puis le cas où N doit pouvoir être réglable.

  • Vous pouvez utiliser les commutateurs sw[3:0] pour définir le facteur de division.

D/ K2000

Réaliser un affichage à la "K2000" sur les LEDS de la maquette.

E/ Générateur PWM

Piloter l'éclairage d'une LED en la pilotant par un signal d'horloge d'une fréquence approximative de 100Hz dont on fait varier le rapport cyclique. La durée moyenne d'activation de la LED déterminera l'intensité perçue.

F/ Super K2000 et PWM

Réaliser une trainée lumineuse derrière les LEDS en utilisant des générateurs PWM...(extinction progressive des LEDS de la trainée)