I.
Langage de description de matériel
VHDL (Very high speed Hardware Description Language). Un
programme vhdl contenant trois éléments indispensables :
1. Bibliothèque (Library),
2. Interface (Entity),
3. Architecture (Architecture).
1.1. Library
Les bibliothèques offrent des définitions des types de
données et des expressions de signaux de synchronisation. Par
exemple la bibliothèque IEEE contenant plusieurs sous-
bibliothèques.
ieee.std_logic_1164
ieee.math_complex
ieee.math_real
ieee.numeric_std
ieee.std_logic_arith
ieee.std_logic_signed
ieee.std_logic_unsigned
La programmation en vhdl est comme suite :
Library IEEE ;
Use ieee.std_logic_1164.all ;
1.2. ENTITY
C’est l'interface du circuit numérique. Les objets
manipulés dans cette section, ce sont les ports d’entrée/sortie
du circuit.
Entity Half_adder Is Port (
a, b : In Std_logic ;
s,c : Out Std_logic ); a in out s
End Half_adder; b in out c
Si a, b contenant plusieurs bits, on déclare comme vecteur.
a, b : In Std_logic_vector (3 downto 0) ;
1
1.3. ARCHITECTURE
C’est la description détaillée du circuit numérique. Les
objets manipulés en VHDL sont :
- les signaux (SIGNAL)
- les constantes (CONSTANT)
- les variables (VARIABLE)
- les paramètres (GENERIC)
Ces objets représentent une valeur, ils doivent être typés :
(Std_logic, Integer, Bit, Bit_vector, Boolean, Time, Array,
Enumération… etc).
a
Architecture RTL of Half_adder is s
Begin b
s <= ( a xor b) ;
c <= ( a and b) ;
End RTL ; c
Les valeurs d’un signal représenté par les états logique résumé
dans le tableau suivant :
symbole Interprétation symbole Interprétation
U Uninitialized Z High Impedance
X Forcing Unknown W Weak Unknown
0 Forcing 0 L Weak 0
1 Forcing 1 H Weak 1
- Don’t Care
2
II. Operateur VHDL
Le tableau ci-dessous résume les types arithmétiques
et logiques utilisé dans le langage de programmation vhdl.
Label désignation Label désignation
Opérateurs relationnels
= égale < inferieur
/= Non égale > supérieur
<= Inferieur ou égale >= supérieur ou égale
Opérateurs arithmétiques
+ addition * multiplication
- soustraction / division
III. L’affectation et les déclarations des types en
vhdl
3.1. Déclaration des types
Type A is array (0 to N-1) of std_logic ; -- vecteur de N
éléments de 1 bit
Type A is array (0 to N-1, 1 to M-1) of std_logic ; -- vecteur de (N x
M) éléments de 1 bit
3.2. Déclaration des constants
Constant A : integer := 16; -- A de type constante
Constant A : std_logic_vector(3 downto 0):= "1111";
3.3. Déclaration des signaux & variable
Signal A : std_logic_vector(3 downto 0; -- A de type sinal
variable A : std_logic_vector(3 downto 0; -- A de type variable
3.4. L’affectation des signaux
B <= '0' ; -- B signal de 1 bit
A <= "01001010" ; -- A bus de 8 bits
A <= X"4A" ; -- A bus de 8 bits, en Hexadécimal
A <= 74 ; -- A bus de 8 bits, en décimal
3.5. L’affectation des variables
A := "01001010" ; -- A variable de 8 bits
A := 74 ; -- A variable de 8 bits, en décimal
3.6. Concaténation des bits
3
A <= "100" ; -- A bus de 3 bits
S <= "10000" & A ; -- B bus de 8 bits
3.7. Décalage à droite et à gauche
S <= '0' & A(7 downto 0); -- décalage d’un bit à droite
S <= A(7 downto 0) & '0'; -- décalage d’un bit à gauche
3.8. Affectation conditionnelle
a) WHEN ... ELSE
S <= expression when condition
[else expression when condition]
[else expression];
b) WITH ... SELECT
with SELECTION select
S <= expression when valeur_de_selection ,
[expression when valeur_de_selection , ]
[expression when others ] ;
c) IF ... THEN
if condition then instructions
[elsif condition then instructions]
[else instructions]
end if ;
d) CASE ... IS
case slection is
when valeur_de_sélection => signal <= instructions ;
[when others <= instructions]
end case;
Exemple :
S <= A when (B = '0') else '1' ;
4
IV. Conversion entres les types vhdl
Le diagramme suivant présent le passage de conversion d’un
type a l’autre.
To_integer (v ) Std_logic_vector (v )
SIGNED
To_signed (v, length ) Signed( v )
INTEGER STD_LOGIC_VECTOR
To_unsigned (v, length ) Unsigned (v )
UNSIGNED
To_integer (v ) Std_logic_vector (v )
Figure 1 : Diagramme de conversion.
Exemple :
Conversion d’une valeur non signé ou non signé vers un type
entier.
TO_INTEGER( value [, Length] ) ;
TO_INTEGER('15.6789', True ) ; -- donne 15
TO_INTEGER('15.6789', False ) ; -- donne 16
TO_INTEGER(value, 5 ) ; -- donne value de 5 bits