Composants de Base
Composants Combinatoires
Porte 3 Etats
Pour un composant combinatoire, on utilise l’affectation conditionnelle
signal <= valeur when condition else autre_valeur
|
|
Multiplexeur
L’affectation conditionnelle peut être multiple, attention à bien respecter la syntaxe ci dessous :
signal <= valeur when condition
else autre_valeur when autre condition
…
else valeur_par_défaut
|
|
Additionneur / Soustracteur
Les opérations arithmétiques sont disponibles dans la bibliothèque numeric_std et supposent l’utilisation
des types signed ou unsigned ( de même nature que les std_logic_vector, à savoir des vecteurs de std_logic ).
un cast est alors nécessaire si les entrées sorties sont en std_logic_vector
|
|
Composants Synchrones
Registre
Reset Asynchrone
Pour un composant synchrone, on priorise l’utilisation d’un process.
La porte d’entrée du process est soit le reset ( prioritaire ) , soit un changement d’état de l’horloge.
Dans le process, les instructions s’exécutent dans l’odre d’écriture, d’où la présence d’ if then else.
La fonction rising_edge() permet de tester la nature du changement d’état de l’horloge.
|
|
Remise à Zéro Synchrone
Pour une remise à zéro synchrone, il faut attendre un front d’horloge ; ce dernier est donc prioritaire par rapport au signal raz, et donc le signal raz n’est plus une porte d’entrée du process.
|
|
Compteur
Compteur de Base
Le signal count étant une sortie (out), il n’est pas possible de lire ce signal
( sauf à le déclarer en inout, mais on reservera cette syntaxe pour les bus bidirectionnels ).
On utilise alors le signal interne count_int que l’on peut lire ou modifier.
Count étant une copie de count_int, il faut réaliser l’affectation de count en parallèle du process.
En effet, il faut se rappeler que l’affectation des signaux ne se fait qu’un fois, et que cette affectation est à considérer comme effective sur le end process.
Si l’affectation de count est réalisée dans le process, count recevra la valeur de count_int au moment de l’entrée dans le process, et non après incrémentation.
|
|
Compteur Préchargeable
|
|
Machine d’Etat (Séquenceur)
Le description VHDL d’une machine d’état reprend la structure de la machine de moore ou de mealy.
les 2 blocs combinatoires sont codés par un process combinatoire, le lien entre état courant et état suivant est réalisé par un registre.
|
|
|
|
cliquer sur la figure ci-dessous
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity me_chariot is
port( clk,reset : in std_logic;
A,B : in std_logic;
G, Dr : out std_logic);
end me_chariot;
architecture arch_me_chariot of me_chariot is
type etat_me is (GAUCHE, DROITE);
signal etat_cr, etat_sv : etat_me;
begin
----------------------------------------------------------------------------------
process(clk,reset) -- registre synchrone, maj etat_cr
begin
if reset='1' then etat_cr <= GAUCHE;
elsif rising_edge(clk) then etat_cr <= etat_sv;
end if;
end process;
----------------------------------------------------------------------------------
process(A,B,etat_cr) -- process combinatoire
begin
G <= '0'; Dr<= '0'; etat_sv <= etat_cr; -- sorties par defaut
case etat_cr is
when GAUCHE => if A='1' then etat_sv <= DROITE; end if; -- maj etat_sv
G <= '1'; -- sorties a 1 dans cet etat
when DROITE => if B='1' then etat_sv <= GAUCHE; end if;
Dr <= '1';
end case;
end process;
----------------------------------------------------------------------------------
end arch_me_chariot;