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

  1. #1
    Expert confirmé
    Réalisation d'une carte graphique mode texte pour Arduino ou autre µC
    Hello,

    Depuis quelques jours je réfléchi à un projet : une carte graphique en mode texte pour Arduino (ou autre µC).

    Il y a la solution de la facilité : faire ça sur FPGA, mais j'ai envie de faire ça avec des "composants basiques" (portes logiques et quelques CI plus évolués type FIFO ou ROM).
    Ça devrait me permettre d'apprendre un peu l'électronique et surement de repérer quelques trucs à faire (ou à ne pas faire) pour plus tard quand je bosserai sur FPGA.

    Je vais utiliser une sortie VGA avec une résolution de 640x480, en utilisant une police monospaced de taille 8x15. Ça me donne 32 lignes de 80 caractères, soit 2560 caractères à l'écran.
    J'utilise des couleurs 8 bits (R3 G3 B2).

    Chaque caractère fait donc 120 bits et est codé sur 7 bits (128 caractères différents possibles, code ASCII) -> avec 2Ko de ROM je peux stocker ma font.

    Le fonctionnement basique serait :
    10 IOs :
    * (sortie) sync_signal : indique qu'une frame commence au front montant : on peut commencer à envoyer les données de la frame suivante
    * (entrée) char_clk : indique que data_00 ~ data_07 sont valides lors d'un front montant
    * (entrée) data_00 : caractère ou couleur / lsb
    * ...
    * (entrée) data_07 : caractère ou couleur / msb (0 pour caractère)

    Niveau communication, je vois ça comme ça :


    7680 cycles d'horloge par frame, avec 60 frame/seconde ça donne 460.8kHz : c'est facilement atteignable avec un Arduino.

    Et niveau logique, quelque chose du genre (une bonne partie reste à faire, mais j'espère que l'idée principale est compréhensible).

    (les 3.125 MHz viennent du fait qu'on lit 8 octets tous les 8 cycles : 25 MHz / 8)

    Ça vous semble fonctionnel ?

    Vu le nombre de CI existants, il y a des références à préférer ? Certaines qui sont connues pour fonctionner à ces fréquences (jusqu'a 25 MHz) ?
    La série 74HC (7400HC ?) semble correspondre pour les portes logiques / compteurs / probablement mux aussi.
    Par contre niveau DCFIFO / ROM / bascules D (ou SRAM (dual ported), vu que 1920 bascules D ... ça prend trop de place ) je trouve pas dans la série 74HC, ça éxiste ? Une autre série à me conseiller ?
    (C'est trop tôt pour ça ?)

    Sinon, en attendant de finir la logique, je commence à simuler ça sur LTspice, et je commence par le commencement : générer une horloge.

    Je suis arrivé à 2 schémas qui semblent marcher (du moins en simulation), l'un des deux est-il préférable ? (La fréquence est pour l'instant assez aléatoire, je me bat pour faire osciller le truc, régler la fréquence viendra après).
    http://i.imgur.com/7krbzN4.png
    http://i.imgur.com/djPXmFa.png

  2. #2
    Modérateur

    Super intéressant comme projet par contre, je ne comprends pas encore bien le schéma de principe.
    Je vais essayer de digérer rapidement le VGA pour voir ça.

    A toute à l'heure.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Expert éminent sénior
    bonsoir,

    déjà pour avoir un signal carré pourquoi réaliser un astable avec 2 NPN ? Si les résistances ne sont pas parfaitement identiques tu as forcément des états haut et bas différents. Même chose pour tes transistors. Pour un astable, prends plutôt un NE555.

    Mais un quartz sera encore bien mieux.

    Pour le reste je ne me prononcerai pas.

  4. #4
    Expert confirmé
    Citation Envoyé par Auteur Voir le message
    déjà pour avoir un signal carré pourquoi réaliser un astable avec 2 NPN ? Si les résistances ne sont pas parfaitement identiques tu as forcément des états haut et bas différents. Même chose pour tes transistors. Pour un astable, prends plutôt un NE555.

    Mais un quartz sera encore bien mieux.
    J'y connais vraiment pas grand chose, avec 2 NPN et des résistances équivalentes j'avais un truc "à moitié carré".

    (signal vert, quasi identique avec des résistances identiques)

    Du coup j'ai rajouté un transistor de plus pour avoir un carré, mais c'était "déséquilibré" (état haut plus long que l'état bas), du coup j'ai ajusté les résistances au pifomètre jusqu’à ce que ce soit carré.

    A priori un NE555 ne dépasse pas ~5 MHz (?), et il est aussi difficile d'avoir un des cycles équilibrés (en théorie impossible d'avoir un duty cycle de 50 %, non ? Mais au final ça n'a peut être pas vraiment d'importance si j'utilise seulement le front montant).

    Je vais me renseigner sur les quartz, mais quel est le problème de ce montage ? C'est un signal carré (en tout cas suffisamment carré pour ce que je veux en faire).

  5. #5
    Modérateur

    Citation Envoyé par Auteur Voir le message
    Mais un quartz sera encore bien mieux.
    Je pense aussi d'autant plus qu'il me semble que le NE555 ne pourra pas aller jusque 25Mhz.

    La série HC est bien dans le sens où la plage d'alimentation est étendue 2V à 6V (Arduino est en 5V mais d'autres board sont en 3.3V) alors que si tu avais pris du HCT c'était entre 4.5 et 5.5V
    Voici la série HC :http://www.gotronic.fr/cat-circuits-...s-74hc-243.htm

    Pour les CI qui pédalent à 25MHz il faut faire attention, regarde cette doc 74HC74 (double bascule D, il ne te faut plus que 960 bascule, ce qui est mieux ) : http://www.nxp.com/documents/data_sh...74HC_HCT74.pdf
    Va à la page 7/20 du document (Tableau 8 Dynamic characteristics) ceux sont tous les timings de cette bascule
    - temps de propagation entre l'entrée et la sortie
    - temps de monté
    - etc...
    A la page 8/20, suite du tableau (attention car à la suite du tableau il y a la version HCT du composant, faut pas se planter de tableau), il y a l'info qui t'intéresse : fmax avec différente tension d'alimentation du CI et dans différente condition de température. On voit qu'a 25°C, si le composant est alimenté en 4.5V alors il peut aller jusque 69MHz mais il peut baisser à 24MHz en fonction de la température. On voit aussi que plus la tension d'alimentation est forte et plus le composant peut pédaler vite.

    Tu as aussi la série F (toujours avec l'exemple du 74F74) qui dans le pire des cas peut aller jusque 90MHz.

    Pour de telle fréquence, il va falloir regarder de prés les séries et il y en a beaucoup, je suis loin de toutes les connaitre mais une fois que tu as choppé la bonne alors ça roule et il y a plus qu'a tout designer avec celle ci.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #6
    Modérateur

    En ce qui concerne ton oscillateur, tourne toi plutôt vers Oscillateur Crystal CMOS (variante de l'oscillateur Pierse)

    Source : http://www.changpuak.ch/electronics/...ets/AN-340.pdf
    ps : Je n'arrive pas à le simuler avec ISIS (Proteus 8) ni avec LTSpice IV alors que ça provient d'une doc constructeur. En plus, je n'arrive pas bien a comprendre comment on configure un quartz avec LTSpice....

    ****************************************

    Ou alors, vu que tu utilises LTSpice IV regarde ceci :

    Source : http://www.changpuak.ch/electronics/...ets/an12fa.pdf
    ps : regarde dans le répertoire -> examples -> jigs -> 1016.asc

    Si tu comprends comment on configure le quartz et surtout a partir de quelles données ou quel calcul, je suis tout ouïe !


    Jette un oeil sur le simulateur Proteus 8 http://www.labcenter.com/products/vs...m_overview.cfm par contre c'est payant à moins que tu laisses ton PC allumé car sans licence tu ne peux pas sauvegarder tes schémas. Tu verras c'est un truc de fou pour faire de l'analogique et surtout du numérique, comme tu es entrain de faire.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #7
    Expert confirmé
    Citation Envoyé par Vincent PETIT Voir le message
    Ou alors, vu que tu utilises LTSpice IV regarde ceci :

    Source : http://www.changpuak.ch/electronics/...ets/an12fa.pdf
    ps : regarde dans le répertoire -> examples -> jigs -> 1016.asc

    Si tu comprends comment on configure le quartz et surtout a partir de quelles données ou quel calcul, je suis tout ouïe !
    C'est à partir du circuit équivalent :


    Dans l'exemple LTSpice :
    C0 = 18p
    C1 = .32p
    L1 = .78m
    R1 = 45

    Du coup :
    Ws (fréquence pulsation série) = sqrt(1 / (L1*R1)) = 63 296 210.4
    Wp (fréquence pulsation parallèle = 1 / sqrt(L1 * ((C0*C1) / (C0+C1))) = 63 856 364.8

    fs (fréquence série) = Ws / 2pi = 10.0739 MHz
    fp (fréquence parallèle = Wp / 2pi = 10.1630 MHz

    Par contre, le signal fait un peu la gueule:



    Citation Envoyé par Vincent PETIT Voir le message
    Jette un oeil sur le simulateur Proteus 8 http://www.labcenter.com/products/vs...m_overview.cfm par contre c'est payant à moins que tu laisses ton PC allumé car sans licence tu ne peux pas sauvegarder tes schémas. Tu verras c'est un truc de fou pour faire de l'analogique et surtout du numérique, comme tu es entrain de faire.
    Je vais y jeter un oeil.

  8. #8
    Modérateur

    Pour la réalisation de l'horloge, l'utilisation d'un cristal me semble aussi une bonne solution. J'ai réalisé à un circuit avec un cristal et des IC de la série CD400 pour obtenir un oscillateur de Pierce (voir https://gradot.wordpress.com/2015/12...rtes-logiques/) et obtenir une fréquence de 1 Hz. Dans mon article, tu trouveras pas mal de liens intéressants sur ce type d'oscillateur.

  9. #9
    Expert confirmé
    Mon premier post est confus (et contient des erreurs).

    Un peu plus de détails:

    Tout d’abord pour le VGA.

    Le fonctionnement est simple, il y a une image virtuelle (800x525 dans le cas du 640x480).
    Cette image virtuelle contient plusieurs partie :
    * la zone visible
    * une zone de front porching, à chaque ligne, après la zone visible
    * un horizontal sync pulse, à chaque ligne, après le front porching.
    * un back porching, à chaque ligne, après le sync pulse
    * la même chose verticalement

    Au final ça ressemble à ça :


    Il y a quelques contraintes :
    * les valeurs RGB doivent être à 0 en dehors de la zone visible.
    * h_sync / v_sync ont parfois une polarité inversée (ça dépend de la résolution).
    * h_sync / v_sync sont des signaux digitaux (5.0V normalement, mais compatible 3.3V)
    * R / G / B sont analogiques : noir = 0.0V; blanc = 0.7V.
    * une impédance de 75ohm.
    * les timings de porchings / sync pulse sont dépendants de la résolution

    Du coup, générer un signal VGA n'est pas très compliqué :


    Avec ça, j'ai normalement un signal VGA valide et les différents signaux restent synchro (et si jamais ya besoin, on peut rajouter des bascules D par-ci par-là pour "transformer" des gates delay en cycle delay qui sont bien plus simples à gérer).
    Les divisions de fréquences ça se fait bien avec des compteurs, les conditions sur les compteurs avec des portes AND.

    Il me reste à transformer des numéros de caractères et couleurs (envoyés par le µC) en séries de valeurs RGB (que je "donne" aux signaux "red", "green" et "blue" du schéma précédent).

    Pour ça j'utilise une police 8x15 pixels (1 bit par pixel, 120 bits par caractère), je stocke ça en ROM, et si je considère que la ROM est organisée en lignes / colonnes (comme de la DRAM) alors je peux récupérer facilement la ligne du caractère qui m'intéresse :


    En utilisant des adresses de la forme "aaa abbb bbbb"
    Avec aaaa: 4 bits pour la ligne et bbbbbbb: 7 bits pour le caractère.

    Les numéros de caractères sont fournis par le µC, les numéros de lignes sont calculés.
    Le µC doit fournir 2560 (=80*32) caractères et 5120 couleurs (couleur de police + couleur de fond) par frame. Soit un total de 7680 valeurs (de 8 bits) à transférer par frame, ou 460 800 valeurs par seconde.

    Les valeurs sont envoyées dans l'ordre : char_0, couleur_0, couleur_bg_0, char_1, couleur_1, ...
    Elles sont stockées dans 3 FIFOs (un mux et un compteur permettent de choisir dans quelle FIFO stocker la valeur).

    La "carte graphique" travaille par série de 15 lignes.
    Elle extrait une valeur de chaque FIFO tous les 120 cycles de "porched_pix_clk"; mais avec un rythme particulier : 1 valeur tous les 8 cycles pendant 640 cycles, puis aucune pendant 8960 cycles.

    Les valeurs extraites sont stockées (bascules D ou SRAM). A chaque cycle de "porched_pix_clk" 3 valeurs (num de caractère, couleur, couleur_bg) sont lues.
    Le numéro de ligne est calculé (un compteur qui reset à 15).
    Le numéro de colonne est calculé aussi (un compteur qui reset à 8).

    Avec le numéro de caractère et le numéro de ligne, je peux récup la ligne du caractère en ROM, et avec le numéro de colonne je sélectionne le pixel.
    Quelques AND pour donner la bonne couleur au pixel (couleur police ou couleur bg), et ... TADA !

    C'est plus clair ?

  10. #10
    Modérateur

    Citation Envoyé par Iradrille Voir le message
    C'est à partir du circuit équivalent :


    Dans l'exemple LTSpice :
    C0 = 18p
    C1 = .32p
    L1 = .78m
    R1 = 45

    Du coup :
    Ws (fréquence pulsation série) = sqrt(1 / (L1*R1)) = 63 296 210.4
    Wp (fréquence pulsation parallèle = 1 / sqrt(L1 * ((C0*C1) / (C0+C1))) = 63 856 364.8

    fs (fréquence série) = Ws / 2pi = 10.0739 MHz
    fp (fréquence parallèle = Wp / 2pi = 10.1630 MHz
    D'accord mais ce que je voulais dire c'est :
    Imagine que tu veuilles simuler un Quartz 25MHz, comment trouves tu les C0, C1, L1, R1 ?
    J'ai ouvert des datasheets de quartz et je trouve quelques info comme R1 mais jamais L1 n'est donné.


    Super ton site et il est très agréable à lire en plus.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

###raw>template_hook.ano_emploi###