[AUDIO_VIDE] Bonjour. Nous allons continuer le cours sur les enseignes et afficheurs à LED. Aujourd'hui, nous allons aborder l'introduction au VHDL. Les méthodes de conception des circuits numériques ont beaucoup évolué ces dernières années. Des circuits logiques standards, on est passé aux circuits à fonctionnement programmable, les microprocesseurs, les microcontrôleurs, les VSP, les circuits intégrés spécifiques fabriqués en grande série. La complexité de plus en plus croissante des circuits numériques a motivé le développement de langage de description structurelle. Et aujourd'hui, nous avons des circuits de quelques centaines de portes logiques à des millions de portes logiques. Et les outils d'aide à la conception sont unifiés autour du langage VHDL. Nous allons voir dans cette leçon, l'introduction au VHDL à travers les concepts de base. Nous allons voir les unités de conception, les objets et les types de base, les opérateurs et les tableaux. Le sigle VHDL signifie VHSIC Hardware Description Langage, ou en français langage de description de matériel. Et le sigle VHSIC signifie Very High Speed Integrated Circuit, ou en français circuit intégré à très grande vitesse. Le VHDL peut être utilisé pour la modélisation, la synthèse, la simulation des circuits numériques. Le VHDL permet de faire la synthèse logique des circuits numériques, c'est-à -dire faire le passage de la description comportementale du circuit, ce que doit faire le circuit à la description structurelle. Comment doit être fait le circuit au niveau topographique. Le VHDL permet également de faire la synthèse physique des circuits numériques, c'est-à -dire faire le passage de la description structurelle à la vue physique. Et cette dernière synthèse aboutit à la liste des portes logiques nécessaires à la réalisation du circuit numérique, ainsi qu'à leur interconnexion. Dans les enseignes et afficheurs à LED d'une grande complexité, le contrôle de la matrice se fait souvent à partir de circuits numériques de type FPGA, qui sont des circuits à grande intensité d'intégrations pouvant encapsuler des milliers, voire des millions de portes logiques. Ces portes logiques sont implantées au niveau du circuit mais l'interconnexion est programmable. Cette programmation s'appuie souvent sur le langage VHDL. Deux unités de conception, dépendantes et obligatoires, sont nécessaires dans un programme VHDL. L'entité, l'architecture entité, Entity, représente la vue externe du composant, c'est-à -dire les différents ports du composant, que ce soient les entrées, les sorties, ou éventuellement des entrée/sortie. Un port est déclaré entrée, un port IN. Un port OUT est une sortie. Mais un port peut également être entrée/sortie. L'architecture décrit le fonctionnement interne du composant, que doit faire le composant, le fonctionnement du composant, quelle est la fonction à synthétiser au niveau du composant. L'architecture décrit les signaux internes, les composants, les constantes, les différents déclarations de sous programmes et à une entité peut correspondre plusieurs architectures. La structure générale d'un programme VHDL est constituée des deux parties, nous avons la partie entité et la partie architecture. L'entité utilise le mot-clé Entity associée à un nom, chaque entité est associée à un nom et le nom est quelconque, excepté quelques mots réservés. Et l'entité est fermée par un End, suivi du nom de l'entité de manière optionnelle. Et au niveau de l'architecture, nous avons une première zone dite déclarative, qui permet de déclarer les signaux internes, éventuellement. Et une deuxième zone, qui permet de décrire ce que fait l'architecture. Le VHDL considère deux domaines d'instruction, nous avons les instructions concurrentes et les instructions séquentielles. Les instructions séquentielles sont toujours à l'intérieur d'un process, c'est-à -dire c'est les instructions qui s'exécutent suivant l'ordre de leur inscription, de leur écriture. Tandis que les instructions concurrentes s'exécutent en parallèle. Donc, tout ce qui est en dehors d'un process s'exécute en parallèle. Y compris des process différents. Nous avons ici deux process, P1 et P2, qui doivent s'exécuter en parallèle, avec les instructions concurrentes. Je choisis ici de vous présenter un multiplexeur 2 vers 1. Donc, le schéma de ce multiplexeur, nous avons deux entrées, l'entrée du sélecteur et la sortie. La structure générale du programme de ce multiplexeur est constituée de trois parties. Nous avons une première partie librairie, une deuxième partie entité, une troisième partie architecture. Ces librairies ne font pas partie de la description du langage, elles sont donc différentes d'un constructeur à l'autre. Et l'entité ici est appelée mux2, et nous avons juste déclaré l'architecture qui est associée à l'entité. Règle élémentaire du langage, nous avons les ports qui sont déclarés entre parenthèses, donc parenthèse ouverte, parenthèse fermée. Et les noms des différents ports sont séparés de leur mode et de leur type par deux-points. Et les instructions se terminent toujours par point-virgule. Remarquez qu'un port en mode IN est par défaut, c'est-à -dire si un port est une entrée, on n'est pas obligé de le spécifier. Et pour le OUT, la sortie, c'est obligatoire. Si nous regardons maintenant notre architecture, mux2, qui commence ici par e1, nous avons utilisé l'instruction with select, que nous verrons un peu plus tard dans les instructions concurrentes. Notez simplement que l'entrée e1 est affectée à la sortie s, car sel, le sélecteur, vaut 1 et que l'entrée e2 est affectée à la sortie s dans tous les autres cas, même others. Le VHDL manipule quatre types d'objets. Nous avons les constantes, avec le mot-clé CONSTANT, qui représentent les objets dont la valeur ne change pas durant le programme. Nous avons les variables qui sont des objets dont la valeur peut changer par affectation. Notez simplement que les variables n'existent qu'à l'intérieur d'un process, donc les variables sont locales, toujours locales dans un processus, elles ne sortent pas du process. Contrairement aux signaux qui utilisent le mot-clé SIGNAL, qui désigne les signaux internes. Ces signaux sont déclarés en dehors des processus, à l'intérieur de l'architecture, mais ils peuvent être globaux à toute l'architecture, s'ils sont déclarés au début de l'architecture. Nous avons aussi les FILE qui permettent l'échange de données avec l'extérieur, qui sont des fichiers. Quelques exemples de déclarations de quelque type de base. Nous avons ici déclaré une constante cte, qui est de type INTEGER, donc un entier et qui est initialisée ici, notez les deux-points égale à 10. Nous avons ici une variable qui s'appelle vari, qui est de type BIT_VECTOR. Un BIT_VECTOR, c'est un ensemble de bits. Alors, la disposition des bits est très importante, ici, notée 3 DOWNTO 0. Donc, on peut disposer des bits de manière ascendante ou descendante, ici c'est la disposition descendante, c'est-à -dire de bits de poids fort ou bits de poids faible. On aurait pu faire aussi 0 TO 3, c'est-à -dire de manière ascendante. Et ici, les quatre bits sont initialisés à 0. Nous avons ici une variable n, qui est de type entier, qui varie entre 0 et 65 535. Nous avons ici un signal, sig, qui est de type std_logic, donc un signal de type logique. Il a un bit vector 3 DOWNTO 0 que nous venons d'expliquer. Et enfin, nous avons ici déclaré tout simplement un fichier qui est de type TEXT. 0. Un bit peut prendre les valeurs 0 ou 1. Un bit_vector, c'est un groupe de bits, tout simplement. Un booléen, tout le monde connaît, c'est True ou False. Un entier est codé sous 32 bits, et nous avons std_logic et std_ulogic, qui sont similaires au bit et au bit_vector, mais avec la seule différence qu'ils présentent neuf étapes possibles, contrairement au bit et au bit_vector. Le VHDL peut utiliser également le time, qui permet de faire le comptage du temps (la durée) sur 64 bits. Notez que time n'est pas synthétisable. Il faut aussi noter que toute description VHDL n'est pas forcément synthétisable. Le VHDL manipule six opérateurs hiérarchisés. Ces opérateurs sont définis ici par place, par groupe, nous en avons six ; et ils sont placés par ordre de priorité. Donc des opérateurs les plus prioritaires aux moins prioritaires. En résumé rapide de ces opérateurs, nous avons ici l'exponentiel, la valeur absolue, l'inversion, la multiplication, la division, le modulo, l'addition, la soustraction, la concaténation, l'égalité, la différence, le décalage vers la gauche, le décalage vers la droite, les rotations, et les opérateurs logiques. Les littéraux. Un littéral est un mot du langage attaché à des genres. Nous avons ici des caractères, des chaînes de caractères, des chaînes de bits, des décimaux, et des littéraux basés. Le souligné que vous remarquez ici, les Underscore au niveau des chiffres, servent simplement à aérer les chiffres, donc n'ont aucune influence sur les valeurs. Vous pouvez noter aussi ici le B, qui symbolise binaire, le X, qui symbolise hexadécimal, le O qui symbolise la base octale, et les littéraux basés, ici, qui utilisent les dièses, qui auraient pu être remplacés par deux points. Donc ce chiffre-là , c'est dans la base 2, ce chiffre-là , c'est dans la base 8, et ce chiffre-là c'est dans la base hexadécimale. Nous allons juste interpréter ce chiffre-là , qui vaut : C5 ; le e2 signifie que c'est 16, puisque c'est la base 16, exponentiel 2. 16 à la puissance 2. Donc le chiffre, c'est C5 multiplié par 16 à la puissance 2. Nous avons aussi des chaînes de bits qui peuvent être représentées par des std_logic : 7 downto 0, donc écrit ici de manière descendante, ou 0 to 7, écrit ici de manière ascendante. Les tableaux sont des collections de données de même type, rangées suivant une disposition utilisant un index. Nous avons ici quelques exemples de déclaration et de définition de tableaux. Nous avons déclaré ici un tableau de type bus, qui contient des bits et qui contient 32 lignes. Donc c'est un tableau à une seule colonne. Nous avons ici déclaré un tableau de couleurs, qui est énuméré, donc nous avons les différentes couleurs qui sont énumérées ici. Et nous avons ici déclaré un tableau mémoire, qui est sur 32 lignes et 8 colonnes. Les tableaux 1 et 2 sont aussi déclarés sur 32 lignes et 8 colonnes. Et là , nous créons un tableau Tab_Mem, qui est de type mémoire. Là nous créons deux tableaux S1 et S2, qui sont de type TABLEAU1 et TABLEAU2. Et là , nous modifions tout simplement quelques valeurs des tableaux. S1(0), on lui a affecté cette valeur, ça veut dire qu'on a modifié les bits de la première ligne. S1(31)(5), on lui a affecté le 1, ça veut dire qu'on a modifié la valeur qui se trouvait à la 32ème ligne et 6ème colonne. Et S2(4,7), est affecté à 0, on a modifié la valeur qui se trouvait à la 5ème ligne et 8ème colonne. Il faudra noter qu'il existe des environnements logiciels permettant de faire la simulation et la synthèse du programme que nous venons de faire. Et cette synthèse aboutit au circuit numérique utilisant éventuellement plusieurs portes logiques, permettant de réaliser notre multiplexeur. Nous venons de faire une introduction au langage VHDL. À travers les concepts de base du langage, nous avons mis l'accent sur les deux unités de conception obligatoires en programme VHDL, notamment l'entité et l'architecture. Nous avons parlé des objets et des types de base, des opérateurs et des tableaux. Nous allons par la suite aborder les instructions concurrentes, puis les instructions séquentielles. Ce langage pourra être utilisé dans le cadre des enseignes et afficheurs à LED, pour contrôler une matrice d'une certaine complexité.