Le choix des bibliothèques et des types

Cette question me semble d’une grande importance pour le débutant. Dans ce domaine, la facilité d’utilisation peut entraîner de grandes déconvenues.
Après consultation du site IEEE, je conseille les bibliothèques suivantes (voir cours VHDL pages 40 et suivantes):

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.NUMERIC_STD.ALL;

  • Au niveau des interfaces ENTITY, on n’utilise que des types std_ulogic , std_logic ou std_logic_vector. Ceci pour des raisons de compatibilité avec les différents aperçus du circuit.
  • Ces bibliothèques contrairement à d’autres ne permettent pas d’additionner, de soustraire ou de comparer des std_logic_vector entre eux. Ceci est heureux car il est souhaitable de savoir à priori si les nombres traités doivent être considérés comme signes ou non signès. En interne dans l’architecture on définira des signaux avec des types signed ou unsigned et toutes les opérations arithmétiques pourront alors se traiter correctement y compris avec des types différents ( signed et integer, unsigned et natural)
  • Le passage entre les signaux internes et les signaux visibles au niveau de l’entité se fera par un cast comme dans l’exemple suivant;

 SIGNAL   niveau_entity : std_logic_vector(31 DOWNTO 0);
     SIGNAL   niveau_architecture : signed(31 DOWNTO 0);

      BEGIN
             niveau_entity <= std_logic_vector( niveau_architecture – 212); –exemple de cast et d’opération mixte

  • Par défaut choisir std_ulogic plutôt que std_logic comme le font tous les outils. En effet std_logic est un std_ulogic avec fonction de résolution (donc qui permet de construire les bus). Les outils considèrent que « qui peut le plus peut le moins  » et proposent std_logic comme type par défaut. Cela ne fait pas l’affaire du débutant qui préférera être alerté suffisamment tôt lorsqu’il fera des bus sans le savoir.

EXEMPLE d’erreur souvent rencontrée:

un: Process
                WAIT until rising_edge(clk);
                IF condition1 THEN
                        s <=  une_certaine_equation; — premiere affectation de s
                END IF;
                END PROCESS;

deux: Process
                WAIT until rising_edge(clk);
                IF condition2 THEN
                        s <=  une_autre_equation; — deuxieme affectation de s
                END IF;
                END PROCESS;

observations:
Si le type de s est std_ulogic, une erreur va apparaître lors de la synthèse (compilation) du circuit. Si le type est std_logic, il n’y a pas d’erreur car on a décrit un bus (avec un seul fil)

  • Mais le concepteur a -t -il vraiment voulu réaliser un bus sur s ?  (connecter 2 sorties entre elles)
  • N’a t-il pas oublié qu’un mème signal doit être affecté dans un même PROCESS ?
  • Ne voulait-il pas écrire la chose suivante ? (ou quelque chose d’approchant)

correct: Process
                WAIT until rising_edge(clk);
                IF condition1 THEN
                        s <=  une_certaine_equation;
               ELSIF condition2 THEN
                        s <=  une_autre_equation;
                END IF;
                END PROCESS; 

    ==> Réserver le type std_logic exclusivement au bus, autrement utiliser std_ulogic

Leave a Reply

You must be logged in to post a comment.