Very High Speed Integrated Circuit Hardware Description Language/Exercices/Autres projets pour ATMEL ATMega8

Une page de Wikiversité.
Aller à : Navigation, rechercher
Autres projets pour ATMEL ATMega8
Image logo représentative de la faculté
Exercice no5
Leçon : Very High Speed Integrated Circuit Hardware Description Language


Icon falscher Titel.svg

En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Autres projets pour ATMEL ATMega8
Very High Speed Integrated Circuit Hardware Description Language/Exercices/Autres projets pour ATMEL ATMega8
 », n'a pu être restituée correctement ci-dessus.

Nous avons l'intention de mettre dans ce chapitre une série de projets permettant de faire évoluer et de mettre en œuvre le coreATMega8.

Sommaire

[modifier] Projet pour l'année universitaire 2011/2012

Étant satisfait avec le coreATMega8, nous avons décidé de poursuivre l'utilisation de ce système monopuce, et de l'utiliser pour réaliser un autre projet. La carte cible sera plus la même, elle sera réalisée autour d'un spartan3 200. Étant donné que les corrections du jeu de Pong ont été complètement publiées dans un autre chapitre, il nous faut changer de sujet. Il s'agit d'un jeu un peu similaire au jeu de Pong, à savoir un Casse-briques.

[modifier] Version de l'ATMega8

L'écriture du chapitre Programmer in Situ et déboguer nous a obligé à faire évoluer le cœur embarqué coreATMega8.


Remarque

La gestion d'interruptions et l'implantation de l'instruction SPM ne sont pas nécessaires pour le projet « casse briques » de cette année, mais le simple fait de vouloir utiliser data2mem (décrit lui aussi dans Programmer in Situ et déboguer) nous oblige à utiliser la dernière version de notre processeur ! Cette version n'est pas disponible chez Opencores pour le moment mais nous la mettons à disposition dans le répertoire /AVRComplet16_S4_S4/25MHzAVR/ de notre ATMega8_pong_VGA.zip. C'est la version la plus à jour, version dans laquelle nous avons vérifié les interruptions RS232 et l'instruction SPM.


[modifier] Cahier des charges

Une seule raquette est mobile verticalement. L'autre est présente mais son déplacement est lié à celui de la balle. Donc le rebond sur cette raquette se fait toujours.

Écran VGA définissant notre casse brique

Nous présentons ci-dessus l'écran VGA pour le casse-brique dans l'hypothèse où le déplacement de la raquette liée à la balle est fait par le processeur. Si l'on compare au jeu de Pong du chapitre sur l'ATMega8, il faut 8 bits supplémentaire pour gérer ce nouveau jeu.

[modifier] Travail à réaliser

Trois phases distinctes sont à réaliser, un projet tuteuré sur environ 12 heures qui se solde par un rapport, la réalisation de la partie matérielle à partir de l'existant (c'est-à-dire le projet de pong précédent), puis le développement de la partie logicielle.

[modifier] Projet tuteuré

Réaliser un schéma fonctionnel complet de la partie matérielle. Nous aimerions un schéma réalisé sous OpenOffice pour pouvoir le publier ici. Calculer le nombre de PORTs nécessaires pour interfacer votre écran VGA et votre processeur. A ce stade, il vous faut choisir si la liaison entre la balle et la raquette se fait à l'aide du matériel où à l'aide du logiciel.

Apprentissage du GNU C pour l'AVR. Pour cela vous partirez du répertoire /AVRComplet16_S4_S4 du fichier ATMega8_pong_VGA.zip qui contient une version améliorée du processeur, capable de gérer les interruptions et surtout capable d'exécuter une instruction qui écrit en programme mémoire. Cela permet de réaliser un bootloader ce qui facilite grandement le développement. Nous nous contenterons d'utiliser « data2mem » pour cette année car nous n'avons pas réussi jusqu'à présent à faire fonctionner notre bootloader.

La partie matérielle gère les quatre afficheurs sept segments et les LEDs à travers des PORTs :

  • PORTB pour l'affichage des 7 segments
  • PORTC pour les 8 LEDs
  • PORTD pour la sélection des digits d'affichages

Écrire des programmes C réalisant des chenillards un compteur sur deux digits.

[modifier] Corrections

Voici un programme C réalisant un chenillard :

#include "avr/io.h"
 
#undef F_CPU
#define F_CPU 25000000UL
#include "util/delay.h"
 
main(void) 
{ // La gestion de DDRB et DDRC est inutile pour ce cœur
// DDRB = 0xFF; // 8 sorties pour B retiré car non implanté (voir ci-dessus)
// DDRC = 0x00; // 8 entrees pour C retiré car non implanté
  uint8_t i=0;
  while(1) {
    i++;
    i &= 0x07; 
    PORTC = 1 << i; 
    _delay_ms(1000);
  }
}

[modifier] Partie matérielle

Le chapitre Interface VGA et PS/2 ou le répertoire /CorrProjet2010 du fichier ATMega8_pong_VGA.zip contiennent une correction de la partie VGA du jeu de Pong (fichier VGA_top.vhd et ses composants) Modifier ce fichier pour remplacer l'affichage du score inutile par deux rangées de 8 briques au milieu de l'écran. Il serait bon de changer la place de l'affichage des scores (plus au milieu). Pour mettre au point cette partie on travaillera sans processeur. Une fois que tout est au point on crée l'interface entre cette partie et le processeur.

Pour aider les étudiants, nous proposons les choix technologiques suivants reliant les PORTs aux signaux de commande VGA :

choix technologiques
E/S module VGA E/S AVR
x_rect<9:8> PORTD<1:0>
x_rect<7:0> DDRD<7:0>
y_rect<9:8> PORTB<1:0>
y_rect<7:0> DDRB<7:0>
y_raqG<7:0> PORTC<7:0>
y_raqD<7:0> DDRC<7:0>
ligne1<7:0> PORTA<7:0>
ligne2<7:0> DDRA<7:0>
scoreG<7:0> EEDR<7:0>

Le registre EEDR est normalement réservé aux données de l'EEPROM. Comme nous n'avons pas d'EEPROM dans notre cœur embarqué nous l'utilisons pour ajouter 8 bits de sorties supplémentaires. « ligne1 » et « ligne2 » gèrent le 1er mur1 et le 2eme mur de l'image ci-dessus.

C'est une caractéristique de ce cœur, cette facilité à transformer des registres en PORTs. Nous rappelons que ceci est fait avec le code VHDL :

   -- ceci est dans un fichier io2.vhd qui remplace io.vhd original
   -- IO write process
    --
    iowr: process(I_CLK)
    begin
        if (rising_edge(I_CLK)) then
            if (I_CLR = '1') then
                L_RX_INT_ENABLED  <= '0';
                L_TX_INT_ENABLED  <= '0';
            elsif (I_WE_IO = '1') then
                case I_ADR_IO is
                   when X"31" => Balle_xLow <= I_DIN; --DDRD
                   when X"32"  => Balle_xHigh <= I_DIN;  --PORTD
                   when X"37"  => Balle_yLow <= I_DIN;  --DDRB
                   when X"38" => Balle_yHigh <= I_DIN; --PORTB
                   when X"34" => raqD_y <= I_DIN; --DDRC
                   when X"35" => raqG_y <= I_DIN; --PORTC
                   when X"3B" => s_ligne1 <= I_DIN; -- PORTA
                   when X"3A" => s_ligne2 <= I_DIN; -- DDRA
                   when X"3D" => s_scoreg <= I_DIN; -- EEDR : EEPROM Data Register
                   when X"40"  =>  -- handled by uart
                   when X"41"  =>  -- handled by uart
                   when X"43"  => L_RX_INT_ENABLED <= I_DIN(0);
                                 L_TX_INT_ENABLED <= I_DIN(1);
                   when others =>
                end case;
            end if;
        end if;
    end process;

Et voici de manière schématique ce qu'il faut faire pour interfacer notre écran VGA au processeur :

Travail à réaliser pour une connexion


Début d'un principe

Conventions de la figure

Les signes + devant des entrées ou sorties veulent dire que l'on a ajouté ces entrées ou sorties dans les entités correspondantes. On a dessiné seulement trois composants dans cette figure, mais il en existe beaucoup d'autres.

Fin du principe


  • Le composant VGATop est inclu dans le fichier io.vhd qui est renommé io2.vhd pour l'occasion.
  • La connexion à l'intérieur de io2.vhd se fait avec le process vhdl qui est montré plus haut dans cette section.

[modifier] Solution

Exercice3 question 3 du chapitre Interfaces VGA et PS2 contient une correction de la partie gestion de l'écran VGA.


Remarque

Le répertoire /CorrProjet2011 du fichier ATMega8_pong_VGA.zip contient une correction complète du projet 2011/2012.


[modifier] Partie logicielle

Programmer l'ensemble avec plusieurs niveaux de jeu :

  • un premier niveau avec une rangée de briques pour lequel n'importe quel rebond sur une brique éteint cette brique
  • un deuxième niveau avec une rangée de brique avec une sur deux d'allumée pour lequel n'importe quel rebond sur une brique éteint cette brique
  • un troisième niveau semblable au premier niveau avec une rangée de briques mais pour lequel seule une balle provenant de votre raquette pourra éteindre une brique
  • un quatrième niveau semblable au deuxième niveau avec une rangée de briques une sur deux allumée mais pour lequel seule une balle provenant de votre raquette éteindra une brique
  • un cinquième de niveaux avec deux rangées de briques.

Les étudiants ont toute latitude pour accélérer les balles et trouver un algorithme de calcul des scores.

Le changement de pente pour la balle pourra se faire de manière aléatoire par la raquette qui suit la balle.

[modifier] Conclusion

Ce travail a été donné à deux étudiants pour 60 heures de projet. La partie matérielle a été réalisée en 30 heures, comme prévu à l'origine. Nous rappelons qu'il s'agissait de partir de la partie matérielle du jeu de Pong et de la modifier pour le casse briques.

La partie logicielle qu'ils ont développé gérait :

  • les rebonds sur les deux raquettes
  • les rebonds sur les deux murs quand la balle venait de la gauche ou de la droite avec destruction de la brique correspondante.

Aucun niveau n'était géré.

Les rebonds hauts et bas sur les briques n'ont pas été gérés.

Il manquait probablement une trentaine d'heures pour aboutir à la correction donnée dans ce chapitre, qui est celle de l'enseignant tuteur.

Du point de vue programmation, ce casse briques est devenu un peu complexe pour des étudiants de niveau L2.

[modifier] Projet casse-briques (suite) pour 2012/2013

Cette section utilise les RAM spécifiques des F.P.G.A. de chez Xilinx. Il est donc pas inutile d'en rappeler la terminologie (déjà évoquée dans le chapitre Interfaces VGA et PS/2).

Début d'une définition

Terminologie Xilinx

On appellera dans la suite :

  • RAMB4 un RAM/ROM de 4 kbits
  • RAMB16 un RAM/ROM de 16 kbits
  • RAMB16_S18 une RAMB16 avec 18 bits de données (2 ko) : 16 bits et deux bits de parité non utilisés pour nos besoins.
  • RAMB16_S18_S9 une RAMB16 avec deux PORTs indépendants 18 bit de données (16 kbits) pour la partie reliée au processeur et 9 bits pour la partie reliée au FPGA.
Fin de la définition

Nous allons améliorer la partie matérielle du projet précédent de trois manières :

  • affichage en mode texte dans la partie basse : score sur 4 digits et level sur deux digits.
  • interfaçage au cœur AVR pour pouvoir mettre à jour ce score et ce level.

Faute de temps, nous ne voulons pas laisser les étudiants réaliser une partie matérielle trop importante : sur les 60 heures de projet, nous ne voulons en aucun cas dépasser les 30 heures de conception matérielle. Nous allons ainsi leur donner la gestion VGA toute faite. Il faudra donc réaliser l'interface avec 4 PORTs de l'AVR pour pouvoir écrire dans la mémoire et pouvoir ainsi changer les valeurs numériques.

[modifier] Peut-on gagner de la mémoire RAM ?

Nous avons déjà eu l'occasion de présenter les diverses modifications que nous avons réalisé sur la mémoire programme pour pouvoir utiliser data2mem (voir le le chapitre correspondant). Cette année il nous faut réaliser un travail un peu identique sur la mémoire RAM.

La mémoire RAM de l'ATMega8 a une taille de 1 ko (celui qui est vendu par ATMEL). Dans le cœur original de chez OpenCore cette RAM est réalisée à l'aide de quatre RAMB4_S4_S4 (possédant deux PORTs de 4 bits soit 4ko en tout). En clair nous avons plus de mémoire RAM que prévu : c'est bien. Mais est-ce que le compilateur C est capable de l'utiliser ?

D'un autre côté quel gaspillage ! Le F.P.G.A. spartan 3 utilisé ne possède que des RAMB16 mais chaque bloc de RAMB4 prend en fait un bloc de RAMB16. En clair on gaspille 16 ko pour en faire 4 ko !!! Le problème c'est que la ROM programme plus la RAM ainsi réalisée utilisent toutes les RAMB16 du spartan3 !!! Or il nous faut réaliser une ROM de caractères pour afficher notre texte.

Si l'on prend en compte les programmes déjà réalisés, on peut s'apercevoir qu'ils ne sont pas très consommateurs de RAM : ainsi l'idée consistant à remplacer 4 RAMB4 par une RAMB16 de 2ko ne pénalisera certainement pas nos programmes. Cela libère ainsi 3 RAMB16 : une sera entièrement utilisée par notre ROM de caractères, une autre sera utilisée pour les briques et le texte à afficher. Il nous en reste une pour faire évoluer cet ensemble.

Cette modification a déjà été réalisée dans la correction du projet précédent (celui de 2011/2012 voir le répertoire /CorrProjet2011 du fichier ATMega8_pong_VGA.zip si vous utilisez le fichier vgaTopCassebrique2.vhd en lieu et place de vgaTopCassebrique.vhd)

[modifier] Travail à réaliser

Comme d'habitude ce travail se décompose en une partie matérielle et une partie logicielle.

[modifier] Partie matérielle

La connexion de PORTs pour l'ATMega8 a déjà été évoqué dans le projet précédent. On rappelle donc que le projet 2011 a réalisé la connexion du module VGA de la manière suivante :

Travail réalisé pour une connexion l'année précédente

Nous allons présenter maintenant ce qu'il va vous falloir réaliser.

Travail réalisé pour une connexion cette année

Comparez les deux figures avant de commencer quoi que ce soit. Comme d'habitude les (+) désignent des entrées ou sorties à ajouter et les (-) la même chose mais à retirer. Nous avons retirés tous les + de l'année dernière car tout est déjà prêt cette année.

choix technologiques
E/S module VGA E/S AVR
x_rect<9:8> PORTD<1:0>
x_rect<7:0> DDRD<7:0>
y_rect<9:8> PORTB<1:0>
y_rect<7:0> DDRB<7:0>
y_raqG<7:0> PORTC<7:0>
y_raqD<7:0> DDRC<7:0>
ligne1<7:0> PORTA<7:0>
ligne2<7:0> DDRA<7:0>
AddrL<7:0> TWAR<7:0>
AddrH<7:0> TWDR<7:0>
Data<7:0> ADCL<7:0>
CommandBus<7:0> ADCH<7:0>

Nous avons donc choisi les tout premiers registres non utilisés. Ceci est réalisé dans le fichier io2.vhd avec :

    -- IO write process
    --
    iowr: process(I_CLK)
    begin
        if (rising_edge(I_CLK)) then
            if (I_CLR = '1') then
                L_RX_INT_ENABLED  <= '0';
                L_TX_INT_ENABLED  <= '0';
            elsif (I_WE_IO = '1') then
                case I_ADR_IO is
         when X"22" => AddrL <= I_DIN; --TWAR
                  when X"23"  => AddrH <= I_DIN;  --TWDR
                  when X"24"  => Data <= I_DIN;  --ADCL
                  when X"25"  => CommandBus <= I_DIN;  --ADCH
                 when X"31" => Balle_xLow <= I_DIN; --DDRD
                 when X"32" => Balle_xHigh <= I_DIN; --PORTD
                  when X"37"  => Balle_yLow <= I_DIN;  --DDRB
                 when X"38" => Balle_yHigh <= I_DIN; --PORTB
                 when X"34" => raqD_y <= I_DIN; --DDRC
                 when X"35" => raqG_y <= I_DIN; --PORTC
                 when X"3B" => s_ligne1 <= I_DIN; -- PORTA
                 when X"3A" => s_ligne2 <= I_DIN; -- DDRA
--               when X"3D" => s_scoreg <= I_DIN; -- EEDR : EEPROM Data Register
                  when X"40"  =>  -- handled by uart
                  when X"41"  =>  -- handled by uart
                  when X"43"  => L_RX_INT_ENABLED <= I_DIN(0);
                                 L_TX_INT_ENABLED <= I_DIN(1);
                  when others =>
                end case;
            end if;
        end if;
    end process;

Voila en quatre points le travail à réaliser en VHDL :

  • Éventuellement, modifier le fichier vgaTopCasseBrique2.vhd pour ramener le contenu de la mémoire RAMB16_S9, qui contient le texte à afficher, en adresse 0.
  • Ajouter quatre PORTs de sortie au cœur ATMega8 dans le fichier io2.vhd. Trois PORTs peuvent suffire car nous n'aurons jamais à écrire au-delà de 256 octets (8 bits d'adresse).
  • Ajouter un PORT à la RAMB16_S9 en la transformant en RAMB16_S9_S9 dans le fichier vgaTopCasseBrique.vhd
  • Connecter les trois ou quatre PORTs de l'ATMega8 au PORT ajouté de la RAMB16_S9_S9.

[modifier] Partie logicielle

En commençant par réaliser une balle qui rebondit correctement sur les raquettes, vous pourrez améliorer votre programme petit à petit pour que votre balle soit capable de rebondir sur des briques en les détruisant. Affiner ensuite vos rebonds sur les briques en particulier avec les rebonds sur les faces horizontales des briques.... Gérer ensuite l'affichage du "level" et pour finir celui du "score" à votre convenance.

[modifier] Projet pacman pour 2012/2013

La partie gestion d'écran pour pacman est en cours de développement, mais nous n'avons pas encore décidé avec quel processeur nous allons la piloter. Pour le moment vous pouvez lire :

  • pacman dans wikipédia qui vous rappelle les règles et la terminologie associée.
  • qu'appelle-t-on un sprite dans un jeu vidéo ?
  • Construction de la gestion d'écran correspondant dans ce livre.
  • le site pacman chez opencores semble intéressant. Il s'agit d'un pacman complet, sans processeur et en verilog.
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Communiquer
Contribuer
Imprimer / exporter
Boîte à outils