IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

[FPGA] Programmer un contrôleur pour écran VGA avec une carte de développement FPGA [Tutoriel]


Sujet :

Embarqué

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 204
    Billets dans le blog
    48
    Par défaut [FPGA] Programmer un contrôleur pour écran VGA avec une carte de développement FPGA
    à tous,

    Pour cette rentrée, je vous propose ce tutoriel pour apprendre à configurer un contrôleur d’écran VGA sur une carte de développement FPGA :


    Objectif découvrir le protocole VGA et configurer la carte FPGA pour générer les signaux qui vont produire des images et autres animations vidéo à la résolution 640x480@60Hz.

    Bonne lecture, et bonne rentrée à tous

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    pour cet article.
    La conclusion qui décrit bien les difficultés que l'on peut rencontrer quand on souhaite débuter la programmation des FPGA. Il faut donc que j'apprenne à réfléchir autrement pour me lancer dans cette aventure.

    Citation Envoyé par f-leb
    il faudra se débarrasser de certains réflexes de programmeurs, s’approprier une nouvelle culture et comprendre que des notions de logique séquentielle et combinatoire sont indispensables pour comprendre ce qui se passe dans vos circuits

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 204
    Billets dans le blog
    48
    Par défaut
    Merci

    Le langage (Verilog ici) en lui-même n'est pas très compliqué : des affectations, des assignations de signaux, des if/else ou switch/case et on a l'essentiel

    Alors c'est vrai qu'il faut penser différemment, par exemple dans ce test (la coloration syntaxique Verilog n'est pas active sur le forum, donc copie d'écran) :
    Nom : Capture d’écran 2022-09-19 180201.jpg
Affichages : 1460
Taille : 33,4 Ko
    Le bloc always est évalué à chaque front montant de l'horloge (synchronisme).
    Le programmeur (non avisé) pourrait croire que si l'entrée in est à 1, la valeur out est d'abord mise à 1 (ligne 9), puis ensuite mise à 3 (ligne 10).
    Et donc si l'entrée in est maintenu à 1, la valeur out "clignote" en étant constamment rabaissée à 1 (ligne 9) avant de remonter à 3 (ligne 10).

    Que nenni, un FPGA n'est pas un CPU qui exécute séquentiellement l'instruction de la ligne 9, suivie de l'instruction de la ligne 10.

    L'ordre des lignes est important, mais seulement pour donner des priorités.
    Quand une variable est affectée plusieurs fois, c'est la dernière affectation qui est prioritaire.
    Ainsi, si in est à 1 :
    - la ligne 9 voudrait affecter 1 à out;
    - la ligne 10 voudrait affecter 3 à out;

    C'est donc la dernière affectation de la ligne 10 qui est prioritaire sur l'affectation de la ligne 9, et le circuit configuré fera en sorte que out prenne la valeur 3 si l'entrée in est à 1.

    Nom : Capture d’écran 2022-09-19 175609.jpg
Affichages : 1399
Taille : 41,1 Ko

    C'est un peu fatigant au début ces subtilités (et à la fin aussi d'ailleurs)


    Edit 20/09/22 :
    Je précise que le code précédent est rédigé pour illustrer un phénomène, mais du point de vue du style de codage, il est mauvais On écrira plutôt avec un else :

    Code verilog : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (in) out <= 3;
    else out <= 1;

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Et deux remarques :
    1- je vois que la déclaration de out est la suivante :
    et non (bah, oui programmeur avant tout )
    2- Ce qui me surprend c'est que tu puisses affecter 3 à une sortie. Dans mon esprit logique c'est 1 ou 0.
    ah non finalement.... out est un registre 2 bits donc 3 ça passe

    Et l'affectation est le symbole "<=" ce qui est assez perturbant pour moi qui suis habitué au "="

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 204
    Billets dans le blog
    48
    Par défaut
    Un pt'it code pour illustrer :
    Code verilog : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    module test();
      reg [2:0] a;  // cas le + fréquent
      reg [0:2] b;  
    	
      initial begin
        a = 3'b100;
        b = 3'b100;
    		
        $display("%0b %0b %0b", a[2], a[1], a[0]);
        $display("%0b %0b %0b", b[2], b[1], b[0]); 
      end	
    endmodule

    Résultat :

    Citation Envoyé par Auteur Voir le message
    Et l'affectation est le symbole "<=" ce qui est assez perturbant pour moi qui suis habitué au "="
    Le plus perturbant, c'est que les deux symboles existent pour les affectations : <= ou =, affectation non-bloquante (non-blocking) vs affectation bloquante (blocking).

    Et il y a bien une différence de comportement entre les deux !! Euhh... je reviens plus tard pour expliquer

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Un pt'it code pour illustrer :
    Code verilog : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    module test();
      reg [2:0] a;  // cas le + fréquent
      reg [0:2] b;

    Résultat :
    ah... j'ai compris : little-endian et big-endian ?


    Citation Envoyé par f-leb Voir le message
    Le plus perturbant, c'est que les deux symboles existent pour les affectations : <= ou =, affectation non-bloquante (non-blocking) vs affectation bloquante (blocking).

    Et il y a bien une différence de comportement entre les deux !! Euhh... je reviens plus tard pour expliquer
    ah oui, mais non.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2020, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo