1
Exercices d lectronique num rique. VHDL.
1. Du code VHDL au circuit.
a Du combinatoire au s quentiel
-- comb_seq.vhd
entity comb_seq is
port (
e1, e2 : in bit ;
s_et, s_latch, s_edge : out bit
) ;
end comb_seq ;
architecture ww of comb_seq is
begin
et : process
begin
wait on e1, e2 ;
if( e1 = '1' ) then
s_et <= e2 ;
else
s_et <= '0' ;
end if ;
end process ;
latch : process
begin
wait on e1, e2 until e1 = '1' ;
s_latch <= e2 ;
end process ;
edge : process
begin
wait on e1 until e1 = '1' ;
s_edge <= e2 ;
end process ;
end ww ;
2
Montrer que les noms des processus correspondent aux op rateurs d crits.
Proposer une criture quivalente qui utilise des listes de sensibilit s sans
instructions wait .
Noter les libert s prises par certains petits compilateurs de synth se de circuits
programmables (discussion avec lenseignant).
b On consid re le programme ci-dessous ( crit en VHDL) :
entity transitm is
port ( hor, e : in bit ;
s : out bit );
end transitm ;
architecture quasi_struct of transitm is
signal qa, qb : bit ;
begin
s <= qa xor qb ;
schem : process
begin
wait until hor = '1' ;
qa <= e ;
qb <= qa ;
end process schem ;
end quasi_struct ;
D duire de ce programme, par une construction m thodique, un sch ma (bascules
et portes logiques).
Compl ter le chronogramme ci-dessous.
c On consid re le programme VHDL suivant qui d crit le fonctionnement dune
bascule :
entity basc is
port ( T,hor,raz : in bit;
s : out bit);
end basc;
architecture primitive of basc is
signal etat : bit;
begin
s <= etat ;
process
begin
wait until (hor = '1') ;
if(raz = '1') then
etat <= '0';
3
elsif(T = '1') then
etat <= not etat;
end if;
end process;
end primitive;
A quoi reconna t-on quil sagit dun circuit s quentiel synchrone ?
La commande raz est-elle synchrone ou asynchrone ?
Etablir le diagramme de transition de cette bascule.
D duire du diagramme pr c dent les quations logiques et le sch ma dune
r alisation avec une bascule D.
2. Variables et signaux.
a Operateur OU exlusif generalise
-- ouexpar.vhd
ENTITY ouex IS
generic(taille : integer := 8) ;
PORT ( a : IN BIT_VECTOR(0 TO taille - 1) ;
s : OUT BIT );
END ouex;
ARCHITECTURE parite of ouex is
BEGIN
Advertisement
process(a)
variable parite : bit ;
begin
parite := '0' ;
FOR i in a'range LOOP
if a(i) = '1' then
parite := not parite;
end if;
END LOOP;
s <= parite;
end process;
END parite;
ARCHITECTURE FAUSSE of ouex is
signal parite : bit ; -- MAUVAIS CHOIX
BEGIN
process(a)
begin
parite <= '0' ;
FOR i in a'range LOOP
if a(i) = '1' then
parite <= not parite;
end if;
END LOOP;
s <= parite;
end process;
END FAUSSE;
Analyser le fonctionnement de la premi re architecture propos e. Quelle est la
structure du sch ma sous-jacente ?
Pourquoi la deuxi me architecture est-elle fausse ?
Conclure quant aux comportements respectifs des variables et des signaux.
b De la lisibilit du code.
Le programme suivant propose trois versions dun diviseur de fr quence par 10 :
4
-- div_10.vhd
entity div_10 is
port(
hor : in bit ;
sort : buffer bit );
end div_10 ;
architecture piege of div_10 is
begin
diviseur : process
variable compte : integer range 0 to 5 := 0 ;
begin
wait until hor = '1' ;
compte := compte + 1 ;
if compte = 5 then
compte := 0 ;
sort <= not sort ;
end if ;
end process diviseur ;
end piege ;
architecture perverse of div_10 is
signal compte : integer range 0 to 4 := 0 ;
begin
diviseur : process
begin
wait until hor = '1' ;
compte <= compte + 1 ;
if compte = 4 then
compte <= 0 ;
sort <= not sort ;
end if ;
end process diviseur ;
end perverse ;
architecture correcte of div_10 is
signal compte : integer range 0 to 4 := 0 ;
begin
diviseur : process
begin
wait until hor = '1' ;
if compte = 4 then
compte <= 0 ;
sort <= not sort ;
else
compte <= compte + 1 ;
end if ;
end process diviseur ;
end correcte ;
5
Discuter les diff rentes versions. R alisent-elles toutes la fonction annonc e ?
Quel est le pi ge de la premi re version en synth se ?
3. Exercice de synth se
Dans les transmissions t l phoniques grande distance, les informations transitent sous
forme num rique, transmises en s rie (un bit la fois), au rythme dune horloge. Le code
binaire utilis est transform en un code 3 niveaux de tension sur la ligne (c ble coaxial,
par exemple) :
un ZERO logique correspond toujours une tension nulle,
horloge
(hor)
donn es
(din)
tension
Advertisement
0
les niveaux logiques UN
sont repr sent s par des
impulsions, qui durent
une p riode de lhorloge
de
transmission,
alternativement positives
et n gatives, do le nom
du code. On notera que le
syst me
se
souvenir de la polarit
de la derni re impulsion
pour
transmise
fonctionner correctement.
La cr ation des impulsions altern es passe
doit
par un changement de code : le codeur re oit lhorloge d mission, hor, et les donn es
transmettre, din. Il fournit en sortie deux signaux binaires que nous nommerons plus et
moins, g n r s suivant lalgorithme ci-dessous :
si din = 0 : plus = 0 , moins = 0 ;
si din = 1 : plus = 1 , moins = 0 ou plus = 0 , moins = 1, en alternance.
On se propose d tudier plusieurs solutions pour r aliser ce codeur.
etat0
din
plus=1
din
plus
etat1
din
din
etat3
codeur
moins
hor
din
din
etat2
moins=1
din
Lid e g n rale est de r aliser une
machine synchrone quatre tats,
conform ment la figure ci-
contre.
L bauche de diagramme de
transitions propos est
videmment incompl te.
le
Compl ter
diagramme
de
transitions propos , en
indiquant les conditions de transitions et de maintiens ventuels.
Quel est le nombre minimum de bascules n cessaires la r alisation du codeur ?
Proposer un codage des tats et une solution compl te du probl me qui utilise ce nombre
minimum de bascules. Proposer un programme VHDL qui r ponde au probl me.
On souhaite que les sorties du codeur soient issues directement de bascules du registre d tat.
Proposer une solution en pr cisant bien le nombre de bascules utilis es et un diagramme de
transitions complet.
Proposer un programme VHDL qui r alise cette nouvelle solution.
Quels sont les avantages et inconv nients respectifs des deux solutions tudi es ?
VHDL : l ments de correction
6
1. Du code VHDL au circuit.
a Du combinatoire au s quentiel
Le processus et est combinatoire : s_et prend une valeur d finie quelques
soient les valeurs de e1 et e2.
Pour le processus latch : si e1 = 1 tout changement est report en sortie, cest le
mode transparent. Si e1 = 0 la valeur de s_latch nest pas sp cifi e, elle ne
change pas, donc est m moris e.
Pour le processus edge : seuls des changements de e1, suivis par une valeur de
e1 gale 1 sont susceptibles de modifier la sortie. Cest une bascule sensible
aux fronts montants de e1.
architecture ww of comb_seq is
begin
et : process (e1,e2)
begin
if( e1 = '1' ) then
s_et <= e2 ;
else
s_et <= '0' ;
end if ;
end process ;
latch : process (e1,e2)
begin
Advertisement
if( e1 = '1' ) then
s_latch <= e2 ;
end if ;
end process ;
edge : process (e1)
begin
if( e1 = '1' ) then
s_edge <= e2 ;
end if ;
end process ;
end ww ;
Des bascules s res :
entity d_edge is
port ( d,hor : in bit ;
s : out bit) ;
end d_edge;
architecture d_wait of d_edge is
begin
process
begin
wait until hor = '1';
s <= d ;
end process ;
end d_wait ;
7
architecture d_liste of d_edge is
begin
process (hor)
begin
if hor = '1' and hor'event then
s <= d ;
end if ;
end process ;
end d_liste ;
-- commandes asynchrones
-- dedgeraz.vhd
entity d_edge_raz is
port ( d, hor, raz : in bit ;
q : out bit) ;
end d_edge_raz ;
architecture d_liste of d_edge_raz is
begin
process (hor,raz)
begin
if raz = '1' then
q <= '0' ;
elsif hor = '1' and hor'event then
q <= d ;
end if ;
end process ;
end d_liste ;
b Sch ma correspondant :
hor
e
ck
D
Chronogramme :
ck
D
qb
qa
s
c On consid re le programme VHDL suivant qui d crit le fonctionnement dune
bascule :
Toutes les affectations relatives au signal etat sont conditionn es par un front
montant du signal hor.
La commande raz est synchrone. Pour cr er une commande asynchrone, voir
question 1-a.
8
0
raz*T
raz+T
1
D = Q razT + Q razT = raz*(Q T)
2. Variables et signaux.
a Operateur OU exlusif generalise
'0'
a
La deuxi me architecture est fausse : le signal parite ne change pas de valeur
dans le corps de la boucle. Seul reste un sch ma pathologique :
s = (a_7 + a_6 + a_5 + a_4 + a_3 + a_2 + a_1 + a_0 )* /s
qui cr e un oscillateur si lune des entr es au moins est 1.
Laffectation une variable a un effet imm diat, comme dans un langage
classique, laffectation un signal ne prend effet que quand le processus se remet
en attente. Dit autrement, un signal ne change pas de valeur au cours de
lex cution dun processus.
b De la lisibilit du code.
Les trois versions r alisent le m me op rateur.
En synth se, la premi re version g n re un signal la place de la variable, si
loutil de synth se accepte cette construction, ce qui nest pas toujours le cas. Le
Advertisement
signal g n r compte de 0 4, ce qui est correct, pas de 0 5 comme la variable.
La deuxi me version provoque une erreur en simulation, compte + 1 d passe 4, il
y aurait donc d bordement sil ny avait pas linstruction if qui modifie la valeur
projet e de compte.
3. Exercice de synth se
etat0
din
plus=1
din
plus
etat1
din
din
etat3
codeur
moins
hor
din
din
etat2
moins=1
din
4 tats, donc 2 bascules au minimum.
Deuxi me solution plus simple et, surtout, beaucoup plus rapide, il ny a pas de couche de logique
combinatoire en sortie.
entity amicod is port(hor, din : in bit ;
plusout, moinsout : out bit ); end amicod ;
9
architecture sort_decode of amicod is
type ami is (mzero,pzero,moins,plus) ;
signal etat : ami ;
begin
plusout <= '1' when etat = plus else '0' ;
moinsout <= '1' when etat = moins else '0' ;
encode : process
begin
wait until hor = '1' ;
case etat is
when mzero => if din = '1' then etat <= plus ;
end if ;
when pzero => if din = '1' then etat <= moins ;
end if ;
when moins => if din = '1' then etat <= plus ;
else etat <= mzero ;
end if ;
when plus => if din = '1' then etat <= moins ;
else etat <= pzero ;
end if ;
when others => etat <= mzero ;
end case ;
end process encode ;
end sort_decode ;
sorties directes :
architecture sort_direct of amicod is
subtype ami is bit_vector(2 downto 0) ;
constant mzero : ami := "000" ;
constant pzero : ami := "001" ;
constant moins : ami := "010" ;
constant plus : ami := "100" ;
signal etat : ami ;
begin
plusout <= etat(2) ;
moinsout <= etat(1) ;
encode : process
begin
wait until hor = '1' ;
case etat is
when mzero => if din = '1' then etat <= plus ;
end if ;
when pzero => if din = '1' then etat <= moins ;
end if ;
when moins => if din = '1' then etat <= plus ;
else etat <= mzero ;
end if ;
when plus => if din = '1' then etat <= moins ;
else etat <= pzero ;
end if ;
when others => etat <= mzero ;
end case ;
end process encode ;
end sort_direct ;