Structure d'une Description VHDL

Structure d'une Description VHDL


Entité / Architecture

Cliquer sur la figure ci-dessous:

En VHDL, un signal ( E/S d’un composant ou signal interne ), permet de ‘véhiculer’ un état logique. Physiquement, cela correpond à un fil.
Les signaux d’E/S peuvent être :

  • in : un signal en entrée peut être uniquement lu.
  • out : un signal en sortie peut être uniquement affecté ( modifié ).
  • inout : un signal inout peut être lu et affecté ; on réservera cette configuration aux signaux des bus bidirectionnels.

Affectation de base d’un signal

Affectation directe

a <= '1'; -- Forçage à '1' du signal a
b <= c ;	 -- b et c sont reliés  
d <= e and f ; -- d contient le résultat d'une équation logique  	  

Affectation conditionnelle

signal <= valeur when condition else autre_valeur;

Ex : Multiplexeur

s <= e0 when sel='0' else e1;       

multiplexeur.svg

library IEEE;
use IEEE.std_logic_1164.all;

entity multiplexeur is
port( 	e0,e1		:		in 	std_logic;
		sel 		: 		in 	std_logic;
		s	 		: 		out std_logic;
end multiplexeur;

architecture arch_multiplexeur of multiplexeur is
begin
	s <= e0 when sel='0' else e1; 
end arch_multiplexeur;

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

Simple (’) / Double (") quote :

signal a : std_logic;
signal b : std_logic_vector(3 downto 0);
signal c : integer range 0 to 255;

a <= '1'; 		-- Simple quote 
b <= "0101"; 	-- Double quote
c <= 50;		-- Aucune quote  

Calcul Arithmétique

On utilise des types définis dans le paquetage 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 considère un signal a de type unsigned de 4 bits :

signal a : unsigned(3 downto 0);

On peut écrire :

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);
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)

Une bonne pratique consiste à utiliser les types std_logic_vector pour les entrées-sorties des composants, et de faire un transtypage en signed/unsigned quand un calcul arithmétique est nécessaire dans l’architecture du composant.


Un Langage Parallèle

L’ordre des instructions n’a aucune importance en VHDL ( contrairement aux langages machines séquentiels ).
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 :

parallele.svg

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

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

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

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 (interdite en dehors d’un process)
  • L’affectation d’un signal ne se fait qu’une seule fois. Si un signal subit plusieurs affectations, il faut considérer que celle-ci n’est effective que sur end process, et seule la dernière affectation sera prise en compte.

Il ne faut pas oublier qu’un signal correspond physiquement à un fil.
On ne peut pas utiliser un signal comme une variable dont l’affectation serait immédiate.

REMARQUE : if then else :

La séquence avec un elsif n’attend qu’un seul end if :

if ... ;then ... ; ( else  ...; ) 
end if;  

if ... ;then ... ; ( else  ...; ) 
elsif ... then ... ; ( else  ...; )
end if; 

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.

multiplexeur.svg

library IEEE;
use IEEE.std_logic_1164.all;

entity multiplexeur is
port( 	e0,e1		:		in 	std_logic;
		sel 		: 		in 	std_logic;
		s	 		: 		out std_logic;
end multiplexeur;

architecture arch_multiplexeur of multiplexeur is
begin

	process(e0, e1, sel)
	begin
		if ( sel = '0' ) 
		then s <= e0;
		else s <= e1;
		end if;	 
	end process;	
	
end arch_multiplexeur;