Vous êtes sur la page 1sur 2

Masters Mécatronique & Microsystèmes 1 / PICS1 Mardi 5 janvier 2010

FPGA/CPLD – VHDL 15h-16h30

Documents/calculatrices interdits

1) Que signifient les sigles CPLD, FPGA et VHDL ?

2) Quel est le principe (très rapidement) d’une cellule SRAM ? Donnez ses avantages et ses
inconvénients.

3) Mêmes questions pour une cellule anti-fusible.

4) Quelle est la différence entre un signal et une variable? Dans quelles parties du programme
sont-ils respectivement déclarés?

5) Quelle est la différence entre les instructions dans un process et celles hors d’un process ?

6) Quelle technique peut-on utiliser en graphique pour stabiliser des signaux de sortie (pour
éviter les "glitchs")? Même question en VHDL.

7) Pourquoi vaut-il mieux utiliser l'entrée enable d'un compteur plutôt que l'entrée horloge
pour une horloge secondaire?

8) Quelle est la différence entre (faire des chronogrammes):


PROCESS PROCESS
BEGIN BEGIN
WAIT UNTIL h='1'; WAIT UNTIL h='1';
b <= a; b <= a;
s <= b; END PROCESS;
END PROCESS; s <= b;

9) Le programme suivant va provoquer une erreur lors de la compilation. Pourquoi?


Modifiez le programme pour rajouter une remise à zéro asynchrone.

LIBRARY ieee; ARCHITECTURE archi OF seq2 IS


USE ieee.std_logic_1164.all; SIGNAL test: STD_LOGIC ;
USE ieee.std_logic_arith.all; BEGIN
ENTITY seq2 IS PROCESS (h,d)
PORT ( BEGIN
d, h: IN STD_LOGIC; WAIT UNTIL h='1';
q: OUT STD_LOGIC test <= d;
); END PROCESS;
END seq2; q <= test;
END archi;

10) Comment réaliser les fonctions de décalage à gauche ou à droite (combinatoire) en VHDL
(sans utiliser de fonction) dans le cas de std_logic_vector? Dans le cas d'integer?
Idem en graphique pour les std_logic_vector.
11) Que fait globalement le programme suivant? (De quel type de machine s'agit-il? Tracez le
graphe d'état. Quel type de reset est utilisé?)
Qu'est-ce qui a été oublié pour une meilleure écriture de ce programme?

LIBRARY ieee; ELSE etat <= s1;


USE ieee.std_logic_1164.all; END IF;
USE ieee.std_logic_arith.all; WHEN s1 => IF y = '1' THEN etat <= s3;
ENTITY DS1 IS ELSE etat <= s2;
PORT ( END IF;
h, x, y, z, init : IN STD_LOGIC; WHEN s2 => IF z = '1' THEN etat <= s4;
a, b, c : OUT STD_LOGIC ELSE etat <= s2;
); END IF;
END DS1; WHEN s3 => IF z = '1' THEN etat <= s4;
ELSE etat <= s3;
ARCHITECTURE archi OF DS1 IS END IF;
TYPE STATE_TYPE IS (s0,s1,s2,s3,s4); WHEN s4 => etat <= s4;
SIGNAL etat : STATE_TYPE; END CASE;
BEGIN ELSE etat<=etat;
END IF;
PROCESS (h,init,x,y,z,etat) END PROCESS;
BEGIN a <= '1' WHEN etat = s2 ELSE '0';
IF init ='1' THEN etat<=S0; b <= '1' WHEN etat = s1 OR etat = s4 ELSE '0';
ELSIF h'EVENT AND h='1' THEN c <= '0' WHEN etat = s1 OR etat = s3 OR etat =
CASE etat IS s4 ELSE '1';
WHEN s0 => IF x = '0' THEN etat <= s0; END archi;

12) Que fait le programme suivant? (fonctionnement global, ne pas décrire ligne par ligne)
LIBRARY ieee; tmp <='1';
USE ieee.std_logic_1164.all; else compt <= compt +1;
USE ieee.numeric_std.all; tmp <= tmp;
ENTITY exam IS end if;
PORT ( END PROCESS;
h, sel, vali, prog: IN STD_LOGIC;
data : IN integer range 0 to 255; pc:process (sel, vali, prog, data,ta,tb)
sega, segb : OUT STD_LOGIC_VECTOR begin
(1 to 7); if vali ='1' and prog ='1' then
q: OUT STD_LOGIC); if sel ='0' then
END exam; ta <= data;
tb <= tb;
ARCHITECTURE archi OF exam IS else tb <= data;
component seven_seg is ta <= ta;
port ( end if;
entree : in std_logic_vector (3 downto 0); end if;
sortie : out std_logic_vector (1 to 7)); end process;
end component;
SIGNAL compt,ta,tb, aff: integer range 0 to 255; with selprog select
SIGNAL tmp : std_logic; aff <= ta when "00",
SIGNAL selprog: std_logic_vector (1 downto 0); tb when "10",
data when others;
BEGIN
ps:PROCESS afa: seven_seg PORT MAP
BEGIN (std_logic_vector(to_unsigned(aff,4)) ,sega);
WAIT UNTIL h='1'; afb: seven_seg PORT MAP
if (tmp ='1' and compt >=ta) then (std_logic_vector(to_unsigned(aff/16,4)) ,segb);
compt <= 0;
tmp <='0'; q <= tmp;
elsif (tmp ='0' and compt >= tb) then selprog <= sel & prog;
compt <= 0; END archi;