Étape 4: Pilote vidéo
Cette partie du dessin ou modèle est chargée de l’élaboration de l’interface graphique et les signaux d’entrée. Formes d’onde du champ d’application, niveau de déclenchement et d’autres indicateurs changeants sont stockés dans une mémoire tampon de trame, avec chaque adresse mémoire maintenant valeur d’un pixel. Ce tampon de trame est un bloc de ram, qui le pilote VGA lit les valeurs de pour être envoyé sur le port VGA à afficher à l’écran.
A l’origine, l’écran était souhaitée à 640 x 480. Cependant, n’est pas possible de stocker toutes ces valeurs de pixel dans un bloc de RAM, comme la profondeur maximale d’un bloc de ram est 262144 (correspondant à une adresse avec des mèches de 18, 2 ^ 18 = 262144) et 640 x 480 = 307200 pixels. Un compromis a été effectué et l’écran se réduirait à 480 x 512, afin que la mémoire tampon d’écran entière pourrait être stockée dans la ram d’un pâté de maisons.
Afin de simplifier le codage plus tard, l’image d’arrière-plan (grille et contours de l’écran) ont été tirées sur l’ordinateur dans un éditeur d’image. Un script matlab a été écrit (inclus) pour convertir le BMP noir et blanc dans un fichier .coe, qui peut-être être préchargé dans une cellule de ram de bloc. Cela signifie que l’image est déjà stocké dans la mémoire et n’a pas à « tirer » dans le code ou le matériel. C’est un bloc séparé de ram que la mémoire tampon d’écran, donc les sorties du deux bloc béliers sont exécutés dans un bloc d’IP personnalisé (processeur couleur) afin de "décider" quelle couleur doit être affichée, avec des signaux de portée et indicateurs ayant plus couche prioritaire sur la grille.
-axi_gpio_0 : le canal 1 est sortie. Contrôle de l’adresse, les données et les signaux permettent d’écrire dans la mémoire tampon d’écran. Canal 2 est entré. Lit un peu accuser réception pour confirmer que l’opération d’écriture est terminée.
-bram_write_controller : une adresse, données, et le signal enable partir d’un module GPIO pour écrire dans un bélier de bloc. Les signaux de l’adresse et les données sont simplement acheminées sans changement. La complication est livré avec le signal EN. Je n’étais pas sûr de combien de temps une écriture « 1 » et « 0 » prendrait de la GPIO (en termes de cycles d’horloge), donc je voulais m’assurer que le bloc wram a été seulement écrit une seule fois. Ce contrôleur d’écriture s’exécute sur le front montant du signal fr de la GPIO afin de créer une impulsion d’activer largeur 1 horloge à l’activer l’écriture de la ram de bloc. Lorsqu’il a terminé cette impulsion, le signal de reconnaissance peut affirmer haut pour confirmer qu'il a été écrit.
-signals_buffer1 : il s’agit d’un bélier de large bloc de 3 bits utilisé pour stocker les valeurs variables de pixel sur l’écran, tels que la forme d’onde, déclencher de niveau ligne et indicateur de tension/division. Chaque adresse mémoire représente un pixel. Le système fonctionne pour que le dessus 9 bits sont la ligne de pixel, et le fond 9 bits sont la colonne du pixel.
-gui_buffer : il s’agit d’un bélier de large bloc de 1 bit utilisé pour stocker le GUI immuable (grille, contours etc.) lequel est chargé via .coe fichier généré à partir d’image. (le script matlab attaché)
-vga_driver_0 : génère des signaux de synchronisation horizontale et verticale pour le protocole VGA. Génère des valeurs de colonnes et des lignes qui représentent le pixel actuel affiché. Elles servent à lire dans le bloc béliers pour lire les valeurs stockées pour le pixel actuel
-color_processor_0 : ce IP décide quelle couleur s’affichera en fonction des valeurs de pixel stockée. J’ai mis mes priorités du plus élevé au plus bas comme (ligne de signal dans la ligne de niveau, jaune rouge déclencheur, GUI/grille blanche). Valeur de chaque pixel est stocké comme une valeur de 3 bits, chaque bit représentant une « couche ». Signaux de priorité plus élevés (comme la ligne de déclenchement) doivent apparaître sur le calque « top », alors que les signaux de priorité inférieures (comme la grille de fond) doivent être dans le calque « fond ».