Académique Documents
Professionnel Documents
Culture Documents
Exemples : BEGIN
Noms valides : Instructions ;
decode4, just_a_test, What_4. END comportementale ;
Noms invalides :
4decode ( commence par un chiffre ) EXEMPLE
Decodeur 2 vers 4 sorties active-HIGH
in__time ( deux tirets consecutifs)
(decoder.vhd)
_What_4 ( commence par un tiret)
my design ( espace dans le nom ) LIBRARY ieee;
your_words? ( caractère spécial ? USE ieee.std_logic_1164.ALL;
non permis)
ENTITY decoder IS
PORT(
d : IN STD_LOGIC_VECTOR (1 downto 0);
1.2 Commentaires y : OUT STD_LOGIC_VECTOR (3 downto 0));
END decoder;
Un commentaire est un texte explicatif qui est ignoré par le ARCHITECTURE behavioral OF decoder IS
compilateur VHDL. Il est indiqué par deux traits d'union
consécutifs. BEGIN
Exemple : — — ceci est un commentaire. WITH d SELECT
y <= “0001” WHEN “00”,
“0010” WHEN “01”,
“0100” WHEN “10”,
“1000” WHEN “11”, END IF;
“0000” WHEN others; END PROCESS;
END behavioral; connect <= a and b; --assignement de signal
END comportementale;
1.4 Ports
Un port en VHDL est une connexion à partir d'une entité de 1.6 Type
conception VHDL vers le monde extérieur.
La direction ou les directions dans lesquelles un port peut Le type d'un port, signal, ou variable détermine les valeurs
fonctionner est appelé son mode. qu'il peut prendre.
Un port VHDL peut avoir l'un des quatre modes: Par exemple, un signal de type bit ne peut avoir que les valeurs
'0 ' ou '1'. Un signal de type INTEGER peut avoir n'importe
IN (entrée seulement), quelle valeur entière, dans les limites de la taille en bits du
OUT (sortie uniquement), système informatique particulier pour lequel le compilateur
INOUT (bidirectionnel) et BUFFER ( sortie, avec un VHDL est conçu.
feedback de la sortie vers l'entité de conception). Types courants :
Le mode d'un port est déclaré dans la déclaration du port Type Valeurs Ecriture
d'une déclaration d'entité ou d’une déclaration de BIT ‘0’, ‘1’ Simples cotes
composants.
‘U’, ‘X’, ‘0’, ‘1’,
STD_LOGIC
Exemples: ‘Z’, ‘W’, ‘L’, ‘H’, Simples cotes
‘-‘
ENTITY mux IS
PORT(
s1, s0 : IN STD_LOGIC; INTEGER Valeurs entières Sans cotes
y0, y1, y2, y3 : OUT STD_LOGIC);
END mux; Instances multiples Double cotes
BIT_VECTOR
de ‘0’ et de ‘1’ (ex : “00101”)
ENTITY srg8 IS
PORT(
clock, reset : IN STD_LOGIC; STD_LOGIC_VECT Instances multiples Double cotes
q : BUFFER STD_LOGIC_VECTOR (7 downto 0)); OR de ‘U’, ‘X’,… (ex :
END srg8; “11ZZ00”)
Page 2
2.3. Instruction d'assignation conditionnelle
La majorité des applications peuvent être traitées par les 2.4. Composants
valeurs 'X', '0 ', '1' et 'Z'. 2.4.1. Déclaration de composants
2.4.2. Instanciation de composants
Pour utiliser le type std_logic dans un fichier VHDL, vous 2.4.3. Clause « Generic »
devez inclure la référence suivante à la bibliothèque VHDL 2.5. Déclaration « Generate »
appelée IEEE et le package std_logic_1164 avant la
2.6. Déclaration de Process
déclaration d'entité.
Syntaxe:
LIBRARY nom_librairie ;
Une instruction d’affectation sélective de signal affecte à un
USE nom_librairie.Nom_package.ALL; port (ou à un signal) l'une parmi plusieurs valeurs alternatives,
sur la base de la valeur d'un signal de sélection.
Exemples Elle peut être utilisée pour l’implémentation d’une table de
vérité ou d'un circuit de sélection comme un multiplexeur.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL; --Definie le Syntaxe:
Type STD_LOGIC
USE ieee.std_logic_arith.ALL; -- Definie les label: WITH expression SELECT
Les fonctions signal <= expression_1 WHEN valeur_1,
arithmétiques expression_2 WHEN valeur_2,
expression_… WHEN valeur_…,
LIBRARY altera; -- Déclaration des expressionN WHEN valeur_N;
composantes primitives
MAX+PLUS II
USE altera.maxplus2.ALL; Exemples:
2. Structures Concurrentes
Décodeur implémenté comme une table de vérité
2.1. Instruction d'affectation concurrente de
(2 entrées, 4 sorties)
signal. Sel est défini comme STD_LOGIC_VECTOR (1 downto 0)
2.2. Instruction d'affectation sélective Y est définie comme STD_LOGIC_VECTOR (3 downto 0)
Page 3
component déclaration(s);
WITH Sel SELECT signal déclaration(s);
y <= “0001” WHEN “00”, BEGIN
“0010” WHEN “01”, Component instantiation(s);
“0100” WHEN “10”, Autres instruction(s) ;
“1000” WHEN “11”, END nom_archi;
“0000” WHEN others;
Signal d’entrée affecté à Y selon les valeurs Une déclaration de composant est de forme similaire à une
de S1 et S0 déclaration d'entité du fait qu’elle inclue les ports requis et les
M: WITH S SELECT paramètres du composant.
y <= d0 WHEN “00”,
La différence est qu'elle se réfère à une conception décrite
d1 WHEN “01”,
d2 WHEN “10”, dans un fichier VHDL séparé.
d3 WHEN “11”; Les ports et les paramètres dans la déclaration composant
peuvent être un sous-ensemble de ceux dans le fichier de
composant, mais ils doivent avoir les mêmes noms.
2.3. Instruction d'assignation conditionnelle.
Syntax:
Une instruction d’affectation conditionnelle affecte à un port
(ou à un signal) une valeur basée sur une série de conditions COMPONENT component_name
liées. GENERIC(
La structure de base attribue une valeur si la première parameter_name : string := default_value;
condition est vraie. parameter_name : integer := default _value);
Sinon, une autre valeur est attribuée si une deuxième PORT(
condition est vraie, et ainsi de suite, jusqu'à ce qu'une input name, input_name : IN STD_LOGIC;
condition par défaut est atteinte. bidir name, bidir_name : INOUT STD_LOGIC;
C’est une structure idéale pour un codeur de priorité. output name, output_name : OUT STD_LOGIC);
END COMPONENT;
Syntaxe:
signal <= expression WHEN boolean_expression_1 Exemple :
ELSE expression WHEN boolean_expression_2 ARCHITECTURE adder OF add4par IS
ELSE expression ; COMPONENT full_add
PORT(
Exemple: Codeur de priorité a, b, c_in : IN BIT;
q défini comme INTEGER RANGE 0 TO 7 c_out, sum : OUT BIT);
d défini comme STD_LOGIC_VECTOR (7 downto END COMPONENT;
0) SIGNAL c : BIT_VECTOR (3 downto 1);
BEGIN
q <= 7 WHEN d(7)=‘1’ ELSE Instructions
6 WHEN d(6)=‘1’ ELSE END adder;
5 WHEN d(5)=‘1’ ELSE
4 WHEN d(4)=‘1’ ELSE 2.4.2. Instanciation de composants
3 WHEN d(3)=‘1’ ELSE
2 WHEN d(2)=‘1’ ELSE
1 WHEN d(1)=‘1’ ELSE Chaque instance d'un composant nécessite une déclaration
0; d'instanciation du composant.
Les ports peuvent être assignés implicitement par l'insertion
du nom du port d'utilisateur dans la position du nom de port
correspondant dans la déclaration de composant ou
explicitement avec l'opérateur => ,.
2.4. Composants ( Components)
Syntax:
instance_name: component_name
Un fichier VHDL peut utiliser un autre fichier VHDL GENERIC MAP( parameter_name => parameter_value,
comme un composant. La forme générale d'une entité de parameter_name => parameter_value)
conception utilisant des composants est la suivante: PORT MAP ( component_port => connect_port,
component_port => connect_port);
ENTITY nom_entite IS
PORT ( definition des entrées sorties);
END nom_entite;
Page 4
Exemples : —— Four Component Instantiation __instance_name: __component_name
GENERIC MAP (__parameter_name =>
__parameter_value,
—— Affectation implicite des ports __parameter_name => __parameter_value)
PORT MAP (port instantiations);
adder1:full_add
PORT MAP(a(1),b(1),c0,c(1),sum(1)); Exemple : —— Component: description
adder2: full_add comportemental d’un registre à décalage avec
PORT MAP(a(2),b(2),c(1),c(2),sum(2)); une capacité par défaut de 4 bits.
adder3: full_add
PORT MAP(a(3),b(3),c(2),c(3),sum(3)); ENTITY srt_bhv IS
adder4: full_add GENERIC (width : POSITIVE := 4);
PORT MAP(a(4),b(4),c(3),c4,sum(4)); PORT(
serial_in, clk : IN STD_LOGIC;
q : BUFFER STD_LOGIC_VECTOR(width-1 downto 0));
—— Affectation explicite des ports END srt_bhv;
Page 5
2.6 Process Statement instructions;
END IF;
Un process est une instruction concurrente, mais les
instructions à l'intérieur du processus sont séquentielles. Exemple:
Par exemple, un process peut définir un flip-flop, un
composant séparé dont les ports sont affectés PROCESS (reset, load, clock)
simultanément, mais à l'intérieur la bascule fonctionne de
VARIABLE count INTEGER RANGE 0 TO 255;
manière séquentielle.
Le process exécute toutes ses instructions quand il y’a un BEGIN
changement d'un signal de sa liste de sensibilité. IF (reset = ‘0’) THEN
L'étiquette du process est optionnelle. q <= 0;
ELSIF (reset = ‘1’ and load = ‘0’) THEN
Syntax: q <= p;
-- process_label: ELSIF (clock’EVENT and clock = ‘1’) THEN
count := count + 1;
PROCESS ( liste de sensibilité ) q <= count;
déclarations de variables END IF;
BEGIN END PROCESS;
Syntaxe : STD_LOGIC
CASE s IS
IF expression1 THEN WHEN “00” => y <= “0001”; x <= “1110”;
instruction; WHEN “01” => y <= “0010”; x <= “1101”;
instruction; WHEN “10” => y <= “0100”; x <= “1011”;
ELSIF expression2 THEN WHEN “11” => y <= “1000”; x <= “0111”;
instructions; WHEN others => y <= “0000”; x <= “1111”;
ELSE END CASE;
Page 6