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
libraryIEEE;useIEEE.std_logic_1164.all;entitymultiplexeurisport(E0,E1,E2,E3:instd_logic_vector(7downto0);sel:instd_logic_vector(1downto0);S:outstd_logic_vector(7downto0));endmultiplexeur;architecturearch_multiplexeurofmultiplexeurisbeginS<=E3whensel="11"elseE2whensel="10"elseE1whensel="01"elseE0;-- cas par defaut obligatoireendarch_multiplexeur;
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
libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.numeric_std.all;-- types signed / unsigned (calcul)entityadd_subisport(A,B:instd_logic_vector(7downto0);add_sub:instd_logic;result:outstd_logic_vector(7downto0));endadd_sub;architecturearch_add_subofadd_subisbeginresult<=std_logic_vector(signed(A)+signed(B))whenadd_sub='1'elsestd_logic_vector(signed(A)-signed(B));endarch_add_sub;
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.
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.
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.
libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.numeric_std.all;entitycompteur_baseisport(clk,reset:instd_logic;count:outstd_logic_vector(3downto0));endcompteur_base;architecturearch_compteur_baseofcompteur_baseissignalcount_int:unsigned(3downto0);beginprocess(clk,reset)beginifreset='1'thencount_int<=(others=>'0');elsifrising_edge(clk)thenifcount_int="1111"thencount_int<=(others=>'0');-- fin de comptageelsecount_int<=count_int+1;-- "+"(unsigned,int)endif;endif;endprocess;count<=std_logic_vector(count_int);-- count copie de count_intendarch_compteur_base;
libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.numeric_std.all;entitycompteurisport(clk,reset,load,ce:instd_logic;E:instd_logic_vector(3downto0);count:outstd_logic_vector(3downto0));endcompteur;architecturearch_compteurofcompteurissignalcount_int:unsigned(3downto0);beginprocess(clk,reset)beginifreset='1'thencount_int<=(others=>'0');elsifrising_edge(clk)thenifload='1'thencount_int<=unsigned(E);elsifce='1'thenifcount_int="1111"thencount_int<=(others=>'0');-- fin de comptageelsecount_int<=count_int+1;-- "+"(unsigned,int)endif;endif;endif;endprocess;count<=std_logic_vector(count_int);-- count copie de count_intendarch_compteur;
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.
libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.numeric_std.all;entityme_chariotisport(clk,reset:instd_logic;A,B:instd_logic;G,Dr:outstd_logic);endme_chariot;architecturearch_me_chariotofme_chariotistypeetat_meis(GAUCHE,DROITE);signaletat_cr,etat_sv:etat_me;begin----------------------------------------------------------------------------------process(clk,reset)-- registre synchrone, maj etat_crbeginifreset='1'thenetat_cr<=GAUCHE;elsifrising_edge(clk)thenetat_cr<=etat_sv;endif;endprocess;---------------------------------------------------------------------------------- process(A,B,etat_cr)-- process combinatoirebeginG<='0';Dr<='0';etat_sv<=etat_cr;-- sorties par defautcaseetat_criswhenGAUCHE=>ifA='1'thenetat_sv<=DROITE;endif;-- maj etat_svG<='1';-- sorties a 1 dans cet etatwhenDROITE=>ifB='1'thenetat_sv<=GAUCHE;endif;Dr<='1';endcase;endprocess;----------------------------------------------------------------------------------endarch_me_chariot;