Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

19
Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966

Transcript of Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Page 1: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Progetto Rete Sequenziale Sincrona

Torsello Marco Donato 0000587966

Page 2: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Testo Un autobus è composto a due sezioni, una anteriore e una posteriore, ognuna delle quali possiede una porta per la salita e una per la discesa.Per il corretto rispetto delle norme di sicurezza si deve tenere sotto controllo il numero di passeggeri ed impedire il superamento del limite imposto dalle norme vigenti(50).Si vuole realizzare una rete sequenziale sincrona che permetta di aprire le porte di salita solo se vi sono posti e solamente durante le soste stabilite dall'autista.In caso di un solo posto disponibile si da priorità alla porta nella parte anteriore.In particolare, gli ingressi della rete sono composti da:- 4 sensori situati sulle porte , SS1 (Sensore Salita 1), SS2, SD1 (Sensore Discesa 1), SD2.- FER(Fermata) che viene attivato dall'autista per segnalare la sosta del mezzo;Inoltre, le uscite sono AP1(Abilita Porta 1) e AP2, abilitati nel caso in cui i posti fossero disponibili.

Torsello Marco Donato 0000587966

Page 3: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Mux ad 8 bit

Torsello Marco Donato 0000587966

Page 4: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Rete «CalcoloVariazioni»SS1 SS2 SD1 SD2 Risultato(10)

0 0 0 0 0

0 0 0 1 -1

0 0 1 0 -1

0 0 1 1 -2

0 1 0 0 1

0 1 0 1 0

0 1 1 0 0

0 1 1 1 -1

1 0 0 0 1

1 0 0 1 0

1 0 1 0 0

1 0 1 1 -1

1 1 0 0 2

1 1 0 1 1

1 1 1 0 1

1 1 1 1 0

Torsello Marco Donato 0000587966

Questa rete combinatoria ha il compito di calcolare quante persone saliranno(un valore positivo) o scenderanno(un valore negativo) in base ai sensori.Il valore così ottenuto verrà poi sommato al numero delle persone presenti nell’autobus.

Page 5: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Torsello Marco Donato 0000587966

Page 6: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

library IEEE;use IEEE.STD_LOGIC_1164.ALL; entity CalcoloVariazioni is Port ( S1 : in STD_LOGIC; S2 : in STD_LOGIC; D1 : in STD_LOGIC; D2 : in STD_LOGIC; O : out STD_LOGIC_VECTOR (7 downto 0));end CalcoloVariazioni; architecture Behavioral of CalcoloVariazioni is beginO<= "00000010" when (S1='1' and S2='1' and D1='0' and D2='0') -- Con questa configurazione d'ingresso, saliranno 2 personeelse "11111110" when (S1='0' and S2='0' and D1='1' and D2='1') -- Con questa configurazione d'ingresso, scenderanno 2 personeelse "00000001" when (S1='1' and S2='0' and D1='0' and D2='0') or (S1='0' and S2='1' and D1='0' and D2='0') or (S1='1' and S2='1' and D1='1' and D2='0') or (S1='1' and S2='1' and D1='0' and D2='1') -- Con queste configurazione d'ingresso, salirà una personaelse "11111111" when (S1='0' and S2='0' and D1='1' and D2='0') or (S1='0' and S2='0' and D1='0' and D2='1') or (S1='1' and S2='0' and D1='1' and D2='1') or (S1='0' and S2='1' and D1='1' and D2='1') -- Con queste configurazione d'ingresso, scenderà una personaelse "00000000"; -- In tutti gli altri casi le variazioni saranno nulleend Behavioral;

Torsello Marco Donato 0000587966

Page 7: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Full-Adder ad 8 bitSchematico VHDL

library IEEE;use IEEE.STD_LOGIC_1164.ALL; entity FullAdder8 is Port ( A : in STD_LOGIC_VECTOR (7 downto 0); B : in STD_LOGIC_VECTOR (7 downto 0); S : out STD_LOGIC_VECTOR (7 downto 0));end FullAdder8; architecture Behavioral of FullAdder8 issignal CTMP : std_logic_vector (7 downto 1):="0000000";begin Inst_FullAdder_1: entity work.FullAdder PORT MAP( A => A(0), B => B(0), C => '0',--In questo primo FullAdder non bisogno di mettere nessun ingresso perchè non mi serve avere un carry in S => S(0), COUT => CTMP(1) ); Inst_FullAdder_2: entity work.FullAdder PORT MAP( A => A(1), B => B(1), C => CTMP(1), S => S(1), COUT => CTMP(2) ); Inst_FullAdder_3: entity work.FullAdder PORT MAP( A => A(2), B => B(2), C => CTMP(2), S => S(2), COUT => CTMP(3) ); Inst_FullAdder_4: entity work.FullAdder PORT MAP( A => A(3), B => B(3), C => CTMP(3), S => S(3), COUT => CTMP(4) ); Inst_FullAdder_5: entity work.FullAdder PORT MAP( A => A(4), B => B(4), C => CTMP(4), S => S(4), COUT => CTMP(5) ); Inst_FullAdder_6: entity work.FullAdder PORT MAP( A => A(5), B => B(5), C => CTMP(5), S => S(5), COUT => CTMP(6) ); Inst_FullAdder_7: entity work.FullAdder PORT MAP( A => A(6), B => B(6), C => CTMP(6), S => S(6), COUT => CTMP(7) ); Inst_FullAdder_8: entity work.FullAdder PORT MAP(--In questo FA non ho bisogno di un carry out perchè ai fini della mia rete non serve A => A(7), B => B(7), C => CTMP(7), S => S(7) );end Behavioral;

Torsello Marco Donato 0000587966

Page 8: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

FlipFlopD a 8 bitSchematico VHDL

Torsello Marco Donato 0000587966

library IEEE; use IEEE.STD_LOGIC_1164.ALL; Library UNISIM; use UNISIM.vcomponents.all; entity FlipFlop8 is Port ( I : in STD_LOGIC_VECTOR (7 downto 0); : out STD_LOGIC_VECTOR (7 downto 0);

C : in STD_LOGIC; R : in STD_LOGIC; CE : in STD_LOGIC);

end FlipFlop8; architecture Behavioral of FlipFlop8 is begin

FDRE_inst_1: FDRE generic map ( INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(0), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(0) -- Data input

); FDRE_inst_2: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(1), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(1) -- Data input

); FDRE_inst_3: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(2), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(2) -- Data input

); FDRE_inst_4: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(3), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(3) -- Data input

); FDRE_inst_5: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(4), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(4) -- Data input

); FDRE_inst_6: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(5), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(5) -- Data input

); FDRE_inst_7: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(6), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(6) -- Data input

); FDRE_inst_8: FDRE generic map (

INIT => '0') -- Initial value of register ('0' or '1') port map (

Q => O(7), -- Data output C => C, -- Clock input CE => CE, -- Clock enable input R => R, -- Synchronous reset input D => I(7) -- Data input

); end Behavioral;

Page 9: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Schematico Risolutivo

Torsello Marco Donato 0000587966

Page 10: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Torsello Marco Donato 0000587966

Questa sezione della rete si occupa di impedire di superare il limite imposto di 50 passeggeri, anche se da specifiche questa situazione non dovrebbe mai verificarsi.Con lo stesso sistema si potrebbe realizzare una rete che non permetta di scendere sotto zero.

Page 11: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

VHDL Risolutivo

Torsello Marco Donato 0000587966

library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity RSS_VHDL is Port ( SS1 : in STD_LOGIC; SS2 : in STD_LOGIC; SD1 : in STD_LOGIC; SD2 : in STD_LOGIC; FER : in STD_LOGIC; CK : in STD_LOGIC; R : in STD_LOGIC;--Segnale di reset Quanti : inout STD_LOGIC_VECTOR (7 downto 0);--Bus che indica il numero di persone attualmente sul bus AP1 : out STD_LOGIC; AP2 : out STD_LOGIC); end RSS_VHDL; architecture Behavioral of RSS_VHDL is signal var : STD_LOGIC_VECTOR (7 downto 0); --Bus che va da il calcola variazioni al FA signal add : STD_LOGIC_VECTOR (7 downto 0); --Bus che va dal Full-Adder al'ingresso del FFD signal fifty : STD_LOGIC; --Segnale che indica quando il numero di passeggeri è 50 signal fortynine : STD_LOGIC; --Segnale che indica quando il numero di passeggeri è 49 signal varPiu2 : STD_LOGIC ; --Segnale che indica quando stanno salendo 2 passeggeri signal varPiu1 : STD_LOGIC ; --Segnale che indica quando stanno salendo 2 passeggeri signal ceFFD : STD_LOGIC ; --Segnale che indica quando attivare il FFD

Page 12: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Torsello Marco Donato 0000587966

begin --Collego i sensori alla rete che mi restituirà il numero di persone che salirà o scenderà Inst_CalcoloVariazioni_1: entity work.CalcoloVariazioni PORT MAP( S1 => SS1, S2 => SS2, D1 => SD1, D2 => SD2, O => var ); --Sommo il valore attuale di passeggeri con la variazione Inst_FullAdder8_1: entity work.FullAdder8 PORT MAP( A => var, B => Quanti, S => add ); --Collego al flipflop ad 8 , il numero di persone che sarà sul mezzo al prossimo ciclo Inst_FlipFlop8_1: entity work.FlipFlop8 PORT MAP( I => add, O => Quanti, C => CK, R => R, CE =>ceFFD ); --Decodifico quando il sull'autobus sono presenti 50 e 49 passeggeri fifty<=(not Quanti(7)) and Quanti(5) and Quanti(4) and (not Quanti(3)) and (not Quanti(2)) and Quanti(1) and (not Quanti(0)) ; fortynine<=(not Quanti(7)) and Quanti(5) and Quanti(4) and (not Quanti(3)) and (not Quanti(2)) and (not Quanti(1)) and Quanti(0);

Page 13: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Torsello Marco Donato 0000587966

--Decodifico quando stanno per salire 2 persone sul mezzo varPiu2<= (not var(7)) and (not var(6)) and (not var(5)) and (not var(4)) and (not var(3)) and (not var(2)) and var(1) and (not var(0)); --Decodifico quando sta per salire 1 persona sul mezzo varPiu1<= (not var(7)) and (not var(6)) and (not var(5)) and (not var(4)) and (not var(3)) and (not var(2)) and var(0) and (not var(1)); --Permmetto di variare il numero di passeggeri quando il segnale di fermata è attivo -- e non si supererà il numero di passeggeri consentiti ceFFD<= FER and (not ((fifty and (varPiu1 or varPiu2)) or ( fortynine and varPiu2 ))); --La porta 1 viene abilitata quando il segnale di fermata è attivo --e non si è arrivati al numero massimo di capacità AP1<= (not fifty) and FER; --La porta 2 viene abilitata quando il segnale di fermata è attivo --e ci sono 2 posti disponibili AP2<=(not (fortynine or fifty)) and FER; end Behavioral;

Page 14: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Codice Simulazione

Torsello Marco Donato 0000587966

R<='1'; --Attivo il segnale di reset per andare in uno stato noto e quindi avere 0 passeggeri CK<='0'; SS1<='0';--Inizializzo le entrate a 0 SS2<='0'; SD1<='0'; SD2<='0'; FER<='0'; wait for 50 ns; R<='0'; --Disattivo il Reset SS1<='1';--Imposto gli ingressi per simulare la salita di due passeggeri alla volta SS2<='1'; FER<='1';--Attivo il segnale che indica fermata for I in 0 to 40 loop --Faccio salire 40 passeggeri CK<= not CK; wait for 50 ns; end loop; SS1<='0';--Imposto gli ingressi per simulare che non salga o scenda nessuno SS2<='0'; SD1<='0'; SD2<='0'; for I in 0 to 10 loop --Simulo 5 colpi di clock CK<= not CK; wait for 50 ns; end loop;

Page 15: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Torsello Marco Donato 0000587966

SS1<='0';--Imposto gli ingressi per simulare la discesa di due passeggeri alla volta SS2<='0'; SD1<='1'; SD2<='1'; for I in 0 to 10 loop --Faccio scendere 10 passeggeri CK<= not CK; wait for 50 ns; end loop; SS1<='1';--Imposto gli ingressi per simulare la salita di un passeggero alla volta SS2<='0'; SD1<='0'; SD2<='0'; for I in 0 to 44 loop --Faccio salire 22 passeggeri CK<= not CK; wait for 50 ns; end loop; SS1<='0';--Imposto gli ingressi per simulare che non salga o scenda nessuno SS2<='0'; SD1<='0'; SD2<='0'; for I in 0 to 10 loop --Simulo 5 colpi di clock CK<= not CK; wait for 50 ns; end loop; SS1<='0';--Imposto gli ingressi per simulare la discesa di un passeggero alla volta SS2<='0'; SD1<='0'; SD2<='1'; for I in 0 to 10 loop --Faccio scendere 5 passeggeri CK<= not CK; wait for 50 ns; end loop; FER<='0';

Page 16: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Simulazione Behavioral Schematico

Torsello Marco Donato 0000587966

Page 17: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Simulazione Post-Route Schematico

Torsello Marco Donato 0000587966

Page 18: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Simulazione Behavioral VHDL

Torsello Marco Donato 0000587966

Page 19: Progetto Rete Sequenziale Sincrona Torsello Marco Donato 0000587966.

Simulazione Post-Route VHDL

Torsello Marco Donato 0000587966