Rete RSS VHDL per l’orale di Reti Logiche Descrizione La Rete sincrona realizzata con sintesi diretta, compara 2 Byte seriali e restituisce un segnale binario. Ingressi: • Serial_Input: segnale seriale che trasmette il Byte attuale; • Start: segnale che va ad 1 all’inizio dell’inserimento dei dati; • Clock: segnale periodico; • Reset: riporta la rete allo stato iniziale azzerando il contatore ed i registri; Uscite: • A[7,0]: Byte appena inserito; • B[7,0]: Byte inserito precedentemente; • Counter: segnale che va ad 1 quando conte per 8; • Abilita: segnale che resta ad 1 quando è già stato inserito il primo Byte ed abilita z; • Uguali: Va e resta ad 1 per un solo clock quando i 2 Byte sono uguali; Codice VHDL (1) • • • • • • signal Reset_Counter: std_logic; signal Conteggio: std_logic_vector (3 downto 0):="0000"; signal Reset_RegA: std_logic; signal z: std_logic; signal Reset_Start: std_logic; signal Go: std_logic; • Begin -- Segnali interni -- Segnali interni -- Segnali interni -- Segnali interni -- Segnali interni -- Segnali interni • • • • Reset_Counter <= (Reset or Counter); Reset_RegA <= (Reset or Counter); Uguali <= (z and Counter and Abilita); Reset_Start <= (Reset or Counter); • • • • • • • • • • process_start: process(Start, Go, Reset_Start) -- FFD che salva il segnale Start e restituisce Go (Reset Asincrono) begin if (Reset_Start = '1') then Go <= '0'; else if (Start'event) and (Start='1') then Go <= '1'; end if; end if; end process; Codice VHDL (2) • process_counter: process(Clock, Go, Reset_Counter) • • • • • • • • • • • • • • • • • begin -- Contatore che conta per 8 if (Clock'event) and (Clock = '1') then if (Reset_Counter='1') then Conteggio <= "0000"; elsif (Go='1') then Conteggio <= Conteggio + "0001"; end if; end if; end process; process_decoder: process(Conteggio) --Decoder che rende 1 Counter begin case Conteggio(3 downto 0) is when "1000" => Counter <='1'; when others => Counter <='0'; end case; end process; Codice VHDL (3) • • • • • • • • • • • • • • • • • • • • • • • process_regA: process(Ser_Input, Go, Clock, Reset_RegA) --Registro A che memorizza il Segnale begin -- serializzato in Input e lo manda in B if (Clock'event) and (Clock = '1')then if (Reset_RegA ='1') then A <= "00000000"; elsif (Go = '1') then A <= Ser_Input & A(7 downto 1); end if; end if; end process; process_regB: process(Clock, Reset, Counter) --Registro B che memorizza il Byte precedente di A begin --mandandolo poi nel comparatore if (Clock'event) and (Clock = '1') then if (Reset ='1') then B <= "00000000"; elsif (Counter ='1') then B<=A; end if; end if; end process; Codice VHDL (4) • • • • • • • • • • • • • • • • • • • • • process_abilita: process(Clock, Reset) -- rete che blocca z il primo "giro" (Reset Asincrono) begin if (Reset = '1') then Abilita <= '0'; else if (Clock'event) and (Clock='1') and (Abilita = '0') then Abilita <= Counter; end if; end if; end process; process_comparator: process(A, B) begin if (A=B) then z <= '1'; else z <= '0'; end if; end process; end Behavioral; --Compara i 2 Byte e restituisce '1' se sono uguali Test di simulazione • • • • • • • • • • • • • • • • • • • • • • wait for 10ns; reset<='0'; -- Fine di Reset di Sistema wait for 170ns; -- Controllo che z non sia ad 1 al primo giro start<='1'; Ser_Input<='0'; -- Inserimento prima serie di bit (Uguale al RegB) Z non deve andare a 1 wait for 2400ns; start<='0'; Ser_Input<='0'; -- Fine inserimento prima serie di bit (8 fronti del clock) "00000000" wait for 500ns; -- Controllo che z non sia 1, se Byte diversi start<='1'; Ser_Input<='1'; -- Inserimento seconda serie di bit wait for 2400ns; start<='0'; Ser_Input<='0'; -- Fine inserimento seconda serie di bit (8 fronti del clock) "00000000" wait for 600ns; reset<='1'; wait for 500ns; reset<='0'; Test di simulazione (2) • • • • • • • • • • • • • • • • • • • • • • • • • -- Controllo che z non sia ad 1 al primo giro con Byte <> da "00000000" start<='1'; Ser_Input<='0'; -- Inserimento terza serie di bit wait for 300ns; Ser_Input<='1'; start<='0'; wait for 600ns; Ser_Input<='0'; wait for 600ns; Ser_Input<='1'; wait for 600ns; Ser_Input<='0'; wait for 300ns; start<='0'; -- Fine inserimento terza serie di bit (8 fronti del clock) "01100110" wait for 800ns; -- Controllo che z sia 1 al secondo giro con 2 Byte uguali start<='1'; Ser_Input<='0'; -- Inserimento quarta serie di bit = alla terza wait for 300ns; Ser_Input<='1'; wait for 600ns; Ser_Input<='0'; wait for 600ns; Ser_Input<='1'; start<='0'; wait for 600ns; Ser_Input<='0'; wait for 300ns; start<='0'; -- Fine inserimento quarta serie di bit (8 fronti del clock) "01100110" wait for 800ns; reset<='1'; WAIT; end process; Simulazioni Behavioural Parte 1 Parte 2 (dopo il reset) Simulazioni Post-Route Parte 1 Parte 2 (dopo il reset)