P. 1
esercitazioni_sed

esercitazioni_sed

|Views: 184|Likes:
Published by gearsecond87

More info:

Published by: gearsecond87 on Sep 11, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/16/2014

pdf

text

original

Progettare un circuito che controlli i semafori ad un incrocio. Il circuito genera
le uscite G1,Y1,R1 e G2,Y2,R2. Queste uscite rappresentano gli stati di verde,
giallo e rosso per ogni strada. Una luce accesa corrisponde a un segnale di uscita
di valore 1. Le luci devono essere controllate nel modo seguente: quando G1
viene accesa deve rimanerlo per un periodo t1 e poi si spegne. Lo spegnimento di
G1 deve provocare l’accensione immediata di Y1 che dovrebbe rimanere accesa
per un tempo t2 e poi deve essere spenta. Quando o G1 o Y1 sono accese, R2
deve stare accesa e G2 e Y2 devono essere spente. Spegnendo Y1 si deve avere
l’immediata accensione di G2 per un tempo t1. Quando viene spenta G2, Y2 si
deve accendere per un periodo t2. Naturalmente, quando o G2 o Y2 sono accese,
R1 deve essere accesa e G1 eY1 spente.
(a) Progettare la ASM chart che descriva il controllore dei semafori. Supporre
che ci siano due down-counter, uno usato per misurare il ritardo t1e un altro per t2.
Ogni contatore ha un ingresso di controllo per il caricamento parallelo e l’enable.
Questi ingressi sono usati per caricare un appropriato valore che rappresenti il
ritardo t1o t2 e che poi permetta al contatore di arrivare fino a 0.
(b) Progettare la ASM chart per il circuito di controllo del controllore dei

semafori.

(c) Scrivere il codice VHDL completo per il controllore dei semafori, incluso
il circuito di controllo dalla parte (a) e i contatori per rappresentare t1e t2. Usare
una frequenza di clock opportuna e valori ragionevoli di conteggio per t1e t2.

Soluzione

(a) La ASM chart richiesta `e mostrata in figura 8.49.
(b) Ognuno dei due contatori, C1 e C2, richiede l’enable del clock e gli input
di carico parallelo. Assumendo che i segnali di enable del clock siano EC1 ed
EC2 e che gli input di carico parallelo siano LC1 e LC2, una tabella ASM per il
circuito `e la seguente mostrata in figura 8.50
(c) Il codice richiesto `e

LIBRARY ieee ;

298

Reset

2

C

t

2

C

2

2

C − 1, R1, Y2

C

2

t

2

1

C= 0?

− 1, R1, G2

C

1

1

C

1

t

C

1

− 1, Y1, R2

2

C

C

2

C

2= 0?

t

1

C

1

− 1, G1, R2

1

C

1

C

1

S3

S2

1t

1

C

= 0?

2

C

1

0

S5

1

0

S4

0

= 0?

1

C

1

0

S1

Figura 8.49:

USE ieee.std_logic_1164.all ;

USE ieee.std_logic_unsigned.all ;

ENTITY semaforo IS

PORT ( Clock, Resetn : IN STD_LOGIC ;

G1, Y1, R1 : OUT STD_LOGIC ;

G2, Y2, R2 : OUT STD_LOGIC ) ;

END semaforo ;

299

Reset

LC1

zC2

EC2, R1, Y2

LC2

zC1

EC1, R1, G2

LC1

zC2

EC2, Y1, R2

LC2

zC1

EC1, G1, R2

LC1

1

S3

S2

1

0

S5

1

0

S4

0

1

0

S1

Figura 8.50:

ARCHITECTURE Behavior OF semaforo IS

TYPE State_type IS ( S1, S2, S3, S4, S5 ) ;

SIGNAL y : State_type ;

300

SIGNAL zC1, zC2, EC1, LC1, EC2, LC2 : STD LOGIC ;

SIGNAL C1, C2, TICKS1, TICKS2 : STD LOGIC VECTOR(3 DOWNTO 0);

BEGIN

FSM_transition: PROCESS ( Clock, Resetn )

BEGIN

IF Resetn = ’ 0’ THEN

y <=S1;

ELSIF Clock’ EVENT AND Clock = ’ 1’ THEN

CASE y IS

WHEN S1 => y <=S2;

WHEN S2 => IF zC1 = ’ 0’ THEN y <= S2 ; ELSE y <= S3 ; END IF ;

WHEN S3 => IF zC2 = ’ 0’ THEN y <= S3 ; ELSE y <= S4 ; END IF ;

WHEN S4 => IF zC1 = ’ 0’ THEN y <= S4 ; ELSE y <= S5 ; END IF ;

WHEN S5 => IF zC2 = ’ 0’ THEN y <= S5 ; ELSE y <= S2 ; END IF ;

END CASE ;

END IF ;

END PROCESS ;

FSM_outputs: PROCESS ( y, zC1, zC2 )

BEGIN

G1 <= ’ 0’ ; Y1 <= ’ 0’ ; R1 <= ’ 0’ ;

G2 <= ’ 0’ ; Y2 <= ’ 0’ ; R2 <= ’ 0’ ;

LC1 <= ’ 0’ ; EC1 <=’ 0’ ; EC2 <= ’ 0’ ; LC2 <= ’ 0’ ;

CASE y IS

WHEN S1 =>

LC1 <= ’ 1’ ; EC1 <= ’ 1’ ;

WHEN S2 =>

EC1 <= ’ 1’ ; G1 <= ’ 1’ ; R2 <= ’ 1’ ;

IF zC1 = ’ 1’ THEN LC2 <= ’ 1’ ; EC2 <= ’ 1’ ;

ELSE LC2 <= ’ 0’ ; EC2 <= ’ 0’ ; END IF ;

WHEN S3 =>

EC2 <= ’ 1’ ; Y1 <= ’ 1’ ; R2 <= ’ 1’ ;

IF zC2 = ’ 1’ THEN LC1 <= ’ 1’ ; EC1 <= ’ 1’ ;

ELSE LC1 <= ’ 0’ ; EC1 <= ’ 0’ ; END IF ;

WHEN S4 =>

EC1 <= ’ 1’ ; R1 <=’ 1’ ;G2 <= ’ 1’ ;

IF zC1 = ’ 1’ THEN LC2 <= ’ 1’ ; EC2 <= ’ 1’ ;

ELSE LC2 <= ’ 0’ ; EC2 <= ’ 0’ ; END IF ;

WHEN S5 =>

EC2 <= ’ 1’ ; R1 <=’ 1’ ;Y2 <= ’ 1’ ;

301

IF zC2 = ’ 1’ THEN LC1 <= ’ 1’ ; EC1 <= ’ 1’ ;

ELSE LC1 <= ’ 0’ ; EC1 <= ’ 0’ ; END IF ;

END CASE ;

END PROCESS ;

-- Costanti di setup

TICKS1 <= "0011" ;

-- 4 TICKS for C1

TICKS2 <= "0001" ;

-- 2 TICKS for C2

-- Controllo per il conteggio degli zero

zC1 <= ’ 1’ WHEN C1 = 0 ELSE’ 0’ ;

zC2 <= ’ 1’ WHEN C2 = 0 ELSE’ 0’ ;

-- Si possono anche usare componenti down-counter

CNT C1: PROCESS

BEGIN

WAIT UNTIL Clock’ EVENT AND Clock = ’ 1’ ;

IF EC1 = ’ 1’ THEN

IF LC1 = ’ 1’ THEN C1 <= TICKS1 ; ELSE C1 <= C1 - 1 ; END IF ;

END IF ;

END PROCESS ;

CNT C2: PROCESS

BEGIN

WAIT UNTIL Clock’ EVENT AND Clock = ’ 1’ ;

IF EC2 = ’ 1’ THEN

IF LC2 = ’ 1’ THEN C2 <= TICKS2 ; ELSE C2 <= C2 - 1 ; END IF ;

END IF ;

END PROCESS ;

END Behavior ;

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->