Structure d'une Description VHDL

Structure d'une Description VHDL

Entité / Architecture

Cliquer sur la figure ci-dessous:

REMARQUE : Les signaux d’E/S peuvent être :

  • in
  • out
  • inout dans le cas d’un bus de données.

L’affectation de base est :
signal <= valeur when condition else autre_valeur

Un Langage Parallèle

L’ordre des instructions n’a aucune importance en VHDL.
En effet il s’agit de DECRIRE un circuit numérique, avec des composants fonctionnant tous simultanément.
On peut abusivement dire que “tout s’exécute en même temps”.

Ainsi Les deux syntaxes suivantes produiront le même composant :

library IEEE;
use IEEE.std_logic_1164.all;

entity comp_eq is 
port(	a,b,c 	: in 	std_logic;
	result 	: out 	std_logic);
end comp_eq;

architecture arch_comp_eq of comp_eq is
signal interne : std_logic;
begin
	interne <= a and b;
	result <= interne xor c;

end arch_comp_eq;
library IEEE;
use IEEE.std_logic_1164.all;

entity comp_eq is 
port(	a,b,c 	: in 	std_logic;
	result 	: out 	std_logic);
end comp_eq;

architecture arch_comp_eq of comp_eq is
signal interne : std_logic;
begin
	result <= interne xor c;
	interne <= a and b;

end arch_comp_eq;

REMARQUE : Le signal interne doit être déclaré avant le begin de l’architecture et n’est visible que dans l’architecture.

Notion de Process

Process Synchrone

Pour décrire un composant synchrone, il faut réagir sur un moment précis qui est un front.

En VHDL un process permet d’exécuter un bout de code sur un changement d’un signal.

process.svg

Caractéristiques d’un Process :

  • Les instructions sont séquentielles (s’exécutent les unes après les autres)
  • On retrouve la structure if then else (interdit en dehors d’un process)
  • L’affectation d’un signal ne se fait qu’une seule fois. Si un signal subit plusieurs affectations, celle-ci n’est effective que sur end process et seule la dernière affectation sera prise en compte.

Par conséquent il ne faut pas oublier qu’un signal correspondra physiquement à un fil. On ne peut pas utiliser un signal comme une variable dont l’affectation serait immédiate.

Process Combinatoire

On peut utiliser un process pour décrire un composant combinatoire, à condition de lister toutes les entrées du composant dans la liste de sensibilité du process.

Les Types

Types de Base (définis dans le paquetage std_logic_1164) :

  • std_logic –> 1 bit pouvant valoir ‘0’,‘1’,‘Z’(Haute impédance),‘U’(undifined),‘X’(conflit)
  • std_logic_vector(N-1 downto 0) –> Vecteur de N std_logic

Pour faire un calcul, on utilise des types définis dans le packetage numeric_std :

  • signed(N-1 downto 0)
  • unsigned(N-1 downto 0)

Il s’agit de sous-types de std_logic_vector pour lesquels les opérations arithmétiques ont été définies (+,-,*,…)

On peut écrire (si a est signed ou unsigned de 4 bits) :

a <= a + “0001”

a <= a + 1 –> ici 1 est de type integer, numeric_std définit “+"(unsigned,integer)

On ne peut pas écrire :

a <= a + ‘1’ –> ‘1’ est un std_logic, l’addition doit gérer des opérandes de même taille.

La conversion est implicite (cast) :

signal a : std_logic_vector(7 downto 0);

signal b : unsigned(7 downto 0);

Affectation :

a <= std_logic_vector(b);

b <= unsigned(a);

Toutes les descriptions des labos sont réalisables avec les paquetages std_logic_1164 et numeric_std et les types évoqués ci-dessus.
Les autres bibliothèques sont à proscrire (génération de conflits et pas forcément synthétisables)