Progetto Rete Sequenziale
Sincrona
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
Mux ad 8 bit
Torsello Marco Donato 0000587966
Rete «CalcoloVariazioni»
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.
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
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
begin
O<= "00000010" when (S1='1' and S2='1' and D1='0' and D2='0') -- Con questa
configurazione d'ingresso, saliranno 2 persone
else "11111110" when (S1='0' and S2='0' and D1='1' and D2='1') -- Con questa
configurazione d'ingresso, scenderanno 2 persone
else "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
persona
else "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
persona
else "00000000"; -- In tutti gli altri casi le variazioni saranno nulle
end Behavioral;
Torsello Marco Donato 0000587966
Full-Adder ad 8 bit
Schematico
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 is
signal 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
FlipFlopD a 8 bit
Schematico
VHDL
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'
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'
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'
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'
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'
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'
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'
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;
Torsello Marco Donato 0000587966
or '1')
or '1')
or '1')
or '1')
or '1')
or '1')
or '1')
Schematico Risolutivo
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.
Torsello Marco Donato 0000587966
VHDL Risolutivo
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);
variazioni al FA
signal add : STD_LOGIC_VECTOR (7 downto 0);
al'ingresso del FFD
signal fifty : STD_LOGIC;
quando il numero di passeggeri è 50
signal fortynine : STD_LOGIC;
numero di passeggeri è 49
signal varPiu2 : STD_LOGIC ;
stanno salendo 2 passeggeri
signal varPiu1 : STD_LOGIC ;
stanno salendo 2 passeggeri
signal ceFFD : STD_LOGIC ;
attivare il FFD
--Bus che va da il calcola
--Bus che va dal Full-Adder
--Segnale che indica
--Segnale che indica quando il
--Segnale che indica quando
--Segnale che indica quando
--Segnale che indica quando
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);
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;
Torsello Marco Donato 0000587966
Codice Simulazione
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;
Torsello Marco Donato 0000587966
SS1<='0';--Imposto gli
volta
SS2<='0';
SD1<='1';
SD2<='1';
for I in 0 to 10 loop
CK<= not CK;
wait for 50 ns;
end loop;
SS1<='1';--Imposto gli
volta
SS2<='0';
SD1<='0';
SD2<='0';
for I in 0 to 44 loop
CK<= not CK;
wait for 50 ns;
end loop;
SS1<='0';--Imposto gli
SS2<='0';
SD1<='0';
SD2<='0';
for I in 0 to 10 loop
CK<= not CK;
wait for 50 ns;
end loop;
SS1<='0';--Imposto gli
volta
SS2<='0';
SD1<='0';
SD2<='1';
for I in 0 to 10 loop
CK<= not CK;
wait for 50 ns;
end loop;
FER<='0';
ingressi per simulare la discesa di due passeggeri alla
--Faccio scendere 10 passeggeri
ingressi per simulare la salita di un passeggero alla
--Faccio salire 22 passeggeri
ingressi per simulare che non salga o scenda nessuno
--Simulo 5 colpi di clock
ingressi per simulare la discesa di un passeggero alla
--Faccio scendere 5 passeggeri
Torsello Marco Donato 0000587966
Simulazione Behavioral Schematico
Torsello Marco Donato 0000587966
Simulazione Post-Route Schematico
Torsello Marco Donato 0000587966
Simulazione Behavioral VHDL
Torsello Marco Donato 0000587966
Simulazione Post-Route VHDL
Torsello Marco Donato 0000587966
Scarica

Progetto Rete Sequenziale Sincrona