Interface LCD avec picoblaze

Présentation

La carte de développement Spartan 3e starter kit dispose d’un afficheur LCD 2 lignes de 16 caractères. On trouvera dans la documentation de la carte les chronogrammes des commandes d’envoi d’un caractère sur l’écran. Il suffit, en simplifiant, d’envoyer simultanément sur l’afficheur, la donnée, le signal de sélection et d’écriture, puis, en retard de 40 ns de fournir une impulsion de validation de largeur minimum 230 ns.  Ce coté de l’interface est simple, il implique une mémorisation des signaux de commandes et des temporisation.

Afin de tester notre interface, on fabrique un circuit ROM de messages qui devront être affichés sur l’écran, chaque message étant sélectionné par une combinaison de 4 interrupteurs disponibles sur la carte. Comme les  données sont de type ASCII, on commence par créer les définitions hexadécimales des caractères ASCII: c’est le fichier ascii_pack.vhd.  Les messages stockés dans la mémoire ROM sont des suites de caractères terminées par X »OO » . On pourra ainsi avoir des chaines de longueur différentes. Un exemple est fourni par le fichier de 128 octets rom128×8.vhd.

Entrées-sorties

Si l’on observe la  structure interne du picoblaze, on voie qu’il propose 8 entrées in_port et 8 sorties out_port possibles associées à un bus d’adresse port_id de 8 bits  ainsi que des signaux read_strobe pour l’acquisition et write_strobe pour la validation des sorties. Il serait donc possibles de gérer en théorie 256 entrées ET 256 sorties de 8 bits chacune, à condition de procéder à un décodage d’adresse rigoureux.

Dans notre cas, c’est l’extrême simplicité puisque nous n’avons que deux  entrées ( la ROM message et les interrupteurs) et qu’une sortie , l’afficheur  LCD.

Nous commençons par instancier le picoblaze:

 p1 : embedded_KCPSM3 PORT MAP (
    port_id       => port_id,
    write_strobe  => write_strobe,
    read_strobe   => read_strobe,
    out_port      => out_port,
    in_port       => in_port,
    interrupt     => interrupt,
    interrupt_ack => interrupt_ack,
    reset         => reset,
    clk           => clk);

puis nous instancions la ROM message. Par l’intermédiaire de port_id, chaque octet de la ROM va correspondre à une adresse picoblaze en lecture, soit une occupation de la moitié de l’espace mémoire, de 0×00 à 0x7F pour 128 octets.

   -- rom messages
  r1 : rom128x8 PORT MAP (
    adresse => port_id(6 DOWNTO 0),
    donnees => rom_data);

Nous n’avons qu’une sortie qui est le registre de commande de l’afficheur LCD.

  -- registre de sortie du lcd
  -- adresse A0
  regout: PROCESS
  BEGIN  -- PROCESS regin
    WAIT UNTIL rising_edge(clk);
    IF reset = '1'  THEN
      lcd_reg <= (OTHERS => '0');
    ELSIF write_strobe = '1' AND port_id = x"A0" THEN
      lcd_reg <= out_port;
    END IF;
  END PROCESS regout;

Remarque:  l’adresse « A0″ choisie pour le LCD est totalement arbitraire; présente, elle libère les autres adresses pour des extensions éventuelles. Ici, avec une seule sortie, on pourrait omettre le décodage d’une adresse particulière et au niveau du « soft » choisir une adresse quelconque laissant le registre occuper tout l’espace mémoire en sortie.

En dernier lieu, il faut assurer le multiplexage des entrées et décodage d’adresse correspondante.  La ROM message occupant les 128 adresses basses, on donnera aux interrupteurs, une quelconque des adresses hautes, soit 0xC0 par exemple (ou Ox80 ou …) .

  -- multiplexage des entrées
  -- rom adresse 00 - 7F
  -- switch adresse C0
  -- lcd_in adresse 80
  autres_entrees <= lcd_in WHEN port_id(6) = '0' ELSE "00000" & code_switch;
  in_port <= rom_data WHEN port_id(7)= '0' ELSE autres_entrees;

Le fichier topdesign2.vhd décrit cette partie purement matérielle.

Programme assembleur

Comme nous l’avons signalé dans la partie outil, c’est l’assembleur_simulateur de mediatronix que nous avons préféré pour travailler confortablement.

Pour bien comprendre la méthode de travail choisie, nous nous sommes imposé la contrainte sécuritaire suivante: Pour chaque version de programme, ne pas retoucher le fichier qui le référence, embedded_kcpm3.vhd. Ce fichier est la description complète du picoblaze en fonctionnement, soit procésseur  + Rom de programme. Celle-ci s’appellera toujours progr_rom et si l’on veux plusieurs versions , on les gérera à part.

 COMPONENT prog_rom
    PORT (      address : IN std_logic_vector(9 DOWNTO 0);
                instruction : OUT std_logic_vector(17 DOWNTO 0);
                clk : IN std_logic);
  END COMPONENT;

Ceci explique la première directive que l’on placera dans le fichier rom_lcd.psm

VHDL      "ROM_blank_new.vhd", "prog_rom.vhd", "prog_rom"

On demande par cette directive que le nom du fichier généré soit « prog_rom », le reste du programme est commenté.

Projet complet

L’archive zip lcd_picoblaze.zip contient l’ensemble des fichiers décrits précefdemment. Une autre méthode de création de la ROM est proposée ainsi que le matériel de simulation modelsim.

One Response to “Interface LCD avec picoblaze”

  1. Très bien

    http://www.sodimatel.fr

Leave a Reply

You must be logged in to post a comment.