Exercices d’électronique numérique. VHDL.

Programming, Engineering, Electronics · lab

Voir tous les documents en électronique et automatique

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

Publicité

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

Publicité

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

Publicité

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

Publicité

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 ;