0% ont trouvé ce document utile (0 vote)
103 vues6 pages

Correction TD VHDL et machines d'états

Transféré par

talebdjamilaa
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
103 vues6 pages

Correction TD VHDL et machines d'états

Transféré par

talebdjamilaa
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Correction TD

Exo1

Exo2
library ieee ;
use ieee.std_logic_1164.all;
entity dff is
port ( clock , D : in std_logic ; Q : out std_logic ) ;
end dff;

library ieee ;
use ieee.std_logic_1164.all;
entity reg8 is
port ( clock : in std_logic; IN : in std_logic_vector(7 downto 0) ; OUT : out
std_logic_vector(7 downto 0) ) ;
end reg8 ;

library ieee ;
use ieee.std_logic_1164.all;
entity ram10 is
port ( CS, OE,WE : in std_logic; Address : in std_logic_vector(9 downto 0) ; O : out
std_logic_vector(7 downto 0) ) ;
end ram10 ;

Exo 3

1- Le schéma correspondant
2- C’est une description comportementale,
puisqu’il n’y a aucune composante.
3- C’est un processus combinatoire car il
inclut toutes les entrées (signaux lus) dans
la liste de sensitivité. De plus, toutes les
valeurs possibles de sel sont traitées.
4 - C’est un plein additionneur avec
multiplexage des sorties somme et
retenue.

Exo 4
Ce programme permet de détecter un front montant sur un signal qui n’est pas l’horloge principale.
Ainsi, on peut faire exécuter un process quand ce front montant a été détecté. Par exemple le
process ci-dessous est :
process(clk)
begin
if clk’event and clk=’1’ then
if front = ‘1’ then
……………….
end if ;
end if ;
end process ;

Exo 5
Library ieee ;
Use ieee.std_logic_1164.all ;
Entity exercice4 is
port( A: in std_logic; B: in std_logic; SEL: in std_logic;CLK: in std_logic;O: out std_logic);
End exercice4;
Architecture behv of exercice4 is
Signal S1,S2,S3 std_logic;
begin
S1<= A xor B;S2<= A and B;
process(SEL)
begin
if SEL=’1’ then S3=S1;
else S3<=S2;
end if ;
end process;
process(CLK,S3)
begin
if (CLK'event and CLK=1 ) then
O<=S3;
end if;
end process;
end behv;

Exo 6
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity compteur is
port ( clk : in std_logic; e : in std_logic; s: out std_logic_vector(3 downto 0) );
end compteur;
architecture rtl of compteur is
signal s_s : std_logic_vector(3 downto 0);
begin
process (clk)
begin
if clk'event and clk = '1' then
if e='1' then
if s_s>= 15 then s_s <= "0000";
else
s_s<=s_s+1;
end if;
end if;
end if;
end process;
s <=s_s;
end;

Exo 7

Un compteur qui compte de 0 à 23 une seule fois et arrête immédiatement après. Ce


processus sera déclenche quand on reçoit ‘1’ à l’entrée pendant au moins 1 coup
d’horloge. Il faut premièrement comprendre que la situation sera un peu plus difficile.
L’idée est que l’entrée ne pourra pas servir directement pour nous dire s’il faut compter
ou pas. L’entrée génère un AUTRE signal élevé sur toute la durée du compte. C’est-à-
dire que, si on détectait ‘1’ a l’entrée, on devrait activer un signal. Ce signal devrait rester
à ‘1’ jusqu'à ce que le compte arrive à 23 et puis il tombera à 0. Ce nouveau signal servira
à activer le compteur.

Exo 8
On remarque que le signal d'autorisation d'horloge ENagit sur des multiplexeurs (le
symbole est un trapèze isocèle) qui place sur l'entrée D, soit la sortie de la bascule de
gauche (décalage), soit la sortie de la même bascule (inactivité apparente de l'horloge
qui re-mémorise l'état antérieur). Remarque: On aurait pu être tenté d'écrire
[OUT_SERIE,Q2..Q0].clk = H & EN; mais cette façon de faire conduisait à un
fonctionnement asynchrone en introduisant un opérateur ET (donc un retard) dans le
circuit d'horloge et la simplification apportée n'était qu'apparente. En effet le nombre de
cellule utilisé risque d'être plus important (une cellule supplémentaire pour générer H &
EN).

library ieee;
use ieee.std_logic_1164.all;
entity decal_de is
port (h,r,en,in_serie :in std_logic;
out_serie :out std_logic);
end decal_de;
architecture arch_decal_de of decal_de is
signal q :std_logic_vector(3 downto 0);
begin
process(h,r)
begin
if r='1' then q <= "0000";
elsif (h'event and h='1') then
if en = '1' then q <= q(2 downto 0) & in_serie;
else q <= q;
end if;
end if;
end process;
out_serie <= q(3);
end arch_decal_de;

Exo 9
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity decal_dg is
port (h,r,sens :in std_logic;
in_out,out_in :inout std_logic);
end decal_dg;
architecture arch_decal_dg of decal_dg is
signal q :std_logic_vector(3 downto 0);
begin
process(h,r)
begin
if r='1' then q <= "0000";
elsif (h'event and h='1') then
if sens = '1' then q <= q(2 downto 0) & in_out;
else q <= out_in & q(3 downto 1);
end if;
end if;
end process;
out_in <= q(3) when sens = '1' else 'z';
in_out <= q(0) when sens = '0' else 'z';
end arch_decal_dg;

Exo 10
library ieee;
use ieee.std_logic_1164.all;
entity machine1 is
port (raz, horl :in std_logic; -- ne pas oublier remise a 0 et horloge ! x, y :in std_logic;
s1, s2 :out std_logic);
end machine1;
architecture diagramme of machine1 is
type etat_4 is (m0, m1, m2, m3
signal etat,etat_suiv :etat_4 := m0;
begin
definir_etat:process( raz, horl)
begin
if raz = '1' then
etat <= m0;
elsif rising_edge(horl) then etat <= etat_suiv ;
end if;
end process definir_etat ;
sorties : process (etat, x, y)
begin
case etat is
when m0 => s1 <= '0'; s2<= '0';
if y='1' then etat_suiv <= m3;
elsif x='0' then etat_suiv <= m2;
else etat_suiv <= m1;
end if;
when m1 => s1 <= '1'; s2<= '0';etat_suiv <= m2;
when m2 => s1 <= '1'; s2<= '1';etat_suiv <= m3;
when m3 => s1 <= '0'; s2<= '1';etat_suiv <= m0;
end case;
end process sorties ;
end diagramme ;

Exo 11
library ieee;
use ieee.std_logic_1164.all;
entity moore_machine is port
(x, clk : in bit; s1,s2 : out bit);
end moore_machine;
architecture fsm of moore_machine is
type state_type is (etat0, etat1, etat2, etat3);
signal state : state_type := etat0;
signal s :bit_vector (1 downto 0);
begin
next_state: block (clk'event and clk='1')
begin
-- guarded conditional concurrent signal assignment statement
state <= guarded etat0 when (state=etat0 and x='0') else
etat1 when (state=etat0 and x='1') else
etat2 when (state=etat1 and x='1') else
etat3 when (state=etat2 and x='0') else
etat2 when (state=etat2 and x='1') else
etat0 when (state=etat3 and x='0') else
etat1 when (state=etat3 and x='1') else
etat3 when (state=etat1 and x='0') else
state;
end block next_state;
-- unguarded selected concurrent signal assignment statement
with state select
s <= "00" when etat0,
"10" when etat1,
"11" when etat2,
"01" when etat3,
"00" when others;
s1<=s(0); s2<=s(1);
end fsm;

Vous aimerez peut-être aussi