VHDL décrit les mêmes circuits que Verilog
VHDL (VHSIC Hardware Description Language) est le second grand langage de description de matériel, à côté de Verilog. Il décrit les mêmes circuits avec plus de mots et plus de règles, et un ingénieur doit savoir lire les deux.
Vous allez écrire en VHDL l’alarme de la boutique, puis la simuler avec GHDL et comparer les deux langages ligne à ligne.
À la fin de cette leçon
Remarque
Je peux écrire le même circuit en VHDL et dire en quoi les deux langages diffèrent.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Entité | la boîte du circuit : son nom, ses entrées et ses sorties | |
| Architecture | l’intérieur de la boîte : ce que le circuit calcule | |
| std_logic | le type VHDL d’un fil qui porte un bit | |
| Analyse | la lecture des fichiers par GHDL, qui vérifie la grammaire | ghdl -a |
| Élaboration | l’étape où GHDL assemble le banc de test en un programme | ghdl -e |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une entité est la boîte, l’architecture est l’intérieur
En VHDL, un circuit s’écrit en deux parties. L’entité donne le nom, les entrées et les sorties. L’architecture dit ce qui se passe à l’intérieur.
En Verilog, un seul bloc module fait les deux. En VHDL, chaque fil a un type : std_logic pour un bit. Un fil sans type ou avec un mauvais type est refusé.
L’alarme en VHDL
library ieee;
use ieee.std_logic_1164.all;
entity alarme is
port (porte, fenetre, armee : in std_logic;
sirene : out std_logic);
end entity;
architecture rtl of alarme is
begin
sirene <= armee and (porte or fenetre);
end architecture;
La même alarme en Verilog
module alarme(input porte, input fenetre, input armee,
output sirene);
assign sirene = armee & (porte | fenetre);
endmodule
GHDL travaille en trois étapes
Verilog se compile en un seul geste. GHDL en demande trois. ghdl -a analyse les fichiers et vérifie la grammaire. ghdl -e élabore le banc de test : il assemble les pièces en un programme. ghdl -r lance ce programme.
Ce banc de test fait varier les entrées avec des pauses de 10 ns. Le dernier Run lit les changements écrits dans le fichier VCD.
Aller dans le dossier de travail
cd ~/hdlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire alarme.vhd
printf "library ieee;\nuse ieee.std_logic_1164.all;\n\nentity alarme is\n port (porte, fenetre, armee : in std_logic; sirene : out std_logic);\nend entity;\n\narchitecture rtl of alarme is\nbegin\n sirene <= armee and (porte or fenetre);\nend architecture;\n" > alarme.vhdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire son banc de test
printf "library ieee;\nuse ieee.std_logic_1164.all;\n\nentity alarme_tb is\nend entity;\n\narchitecture sim of alarme_tb is\n signal porte, fenetre, armee, sirene : std_logic := '0';\nbegin\n dut: entity work.alarme port map (porte => porte, fenetre => fenetre, armee => armee, sirene => sirene);\n process\n begin\n armee <= '1';\n wait for 10 ns;\n porte <= '1';\n wait for 10 ns;\n porte <= '0'; fenetre <= '1';\n wait for 10 ns;\n armee <= '0';\n wait for 10 ns;\n wait;\n end process;\nend architecture;\n" > alarme_tb.vhdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Étape 1 : analyser les deux fichiers
ghdl -a alarme.vhd alarme_tb.vhdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Étape 2 : élaborer le banc de test
ghdl -e alarme_tbAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Étape 3 : lancer et écrire le fichier VCD
ghdl -r alarme_tb --vcd=out/alarme.vcdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le chronogramme, une colonne par 10 ns
vcd2txt out/alarme.vcd 10nsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : Verilog et VHDL côte à côte
| Idée | Verilog | VHDL |
|---|---|---|
| Un circuit | Un bloc module | Une entité et une architecture |
| Le ET, le OU | & et | | and et or |
| Donner sa valeur à un fil | assign s = ... | s <= ... |
| Le type d’un fil | wire, sans plus | std_logic, obligatoire |
| Les étapes de l’outil | Compiler, puis lancer | Analyser, élaborer, lancer |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Erreur fréquente
Attention
Beaucoup de gens pensent que VHDL est du Verilog avec d’autres mots. Les deux décrivent des circuits, mais VHDL est plus strict : chaque fil a un type, et chaque nom doit être déclaré. Une faute de frappe sur un nom est donc attrapée dès l’analyse.
Écrire une architecture avec un nom inconnu
printf "library ieee;\nuse ieee.std_logic_1164.all;\nentity oups2 is\n port (a : in std_logic; s : out std_logic);\nend entity;\narchitecture rtl of oups2 is\nbegin\n s <= a and b;\nend architecture;\n" > oups2.vhdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
L’analyser et lire le message
ghdl -a oups2.vhdAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans le labo, full_adder.vhd donne déjà son entité, et il reste à écrire l’architecture. Son banc de test, full_adder_tb.vhd, imprime les huit lignes.
Écrivez d’abord l’architecture en deux lignes sur papier, avec xor, and et or, puis simulez avec les trois étapes.