library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; library UNISIM; use UNISIM.VComponents.all; entity Schaltung_Counter_und_Auswertung is Port ( i_clk : in STD_LOGIC; i_empfangseingang1 : in STD_LOGIC; i_empfangseingang2 : in STD_LOGIC; o_Ausgefallenes_Signal_1 : out STD_LOGIC ; o_Ausgefallenes_Signal_2 : out STD_LOGIC ; o_fehlempfangszaehler1 : out STD_LOGIC ; o_fehlempfangszaehler2 : out STD_LOGIC ; o_power_sw : out STD_LOGIC ; o_kameraausloeser : out STD_LOGIC ); end Schaltung_Counter_und_Auswertung; architecture Behavioral of Schaltung_Counter_und_Auswertung is Signal vorteiler_clk, int_start, int_reset, int_gate, int_empfangseingang1_s, int_empfangseingang2_s, int_fehlempfang1_s, int_fehlempfang2_s, flag_empfang1, flag_empfang2, int_Ausgefallenes_Signal_1_s, int_Ausgefallenes_Signal_2_s: std_logic :='0'; signal vorteiler : natural range 0 to 40:=0; signal verzoegerung_1_32ms, verzoegerung_2_32ms, verzoegerung_3_32ms, verzoegerung_4_32ms: unsigned(11 downto 0):="000000000000"; signal counter1, counter2 : unsigned (14 downto 0):="000000000000000"; begin o_power_sw<='1'; -- o_Ausgefallenes_Signal_1 <='Z'; -- o_Ausgefallenes_Signal_2 <='Z'; -- o_fehlempfangszaehler1 <='Z'; -- o_fehlempfangszaehler2 <='Z'; --Vorteiler process (i_clk) begin if rising_edge(i_clk) then vorteiler <= vorteiler + 1 ; vorteiler_clk <= '0'; if vorteiler = 39 then vorteiler_clk <= '1'; vorteiler <= 0; end if; --Startbedingung if(int_start = '0' and i_empfangseingang1 ='1') then int_start <='1'; end if; end if; end process; --Ausgefallene Signale process (vorteiler_clk) variable flag_vergleich : std_logic_vector(1 downto 0); begin if rising_edge(vorteiler_clk) then --Counter if int_start = '1' then counter1 <= counter1 + 1; counter2 <= counter2 + 1; --alle 240ms wird der counter1 zurückgesetzt if counter1 = 24000 then counter1 <=(others =>'0'); end if; end if; --Counter reset if int_reset = '1' then counter1 <= (others =>'0'); counter2 <= (others =>'0'); flag_empfang1 <= '0'; flag_empfang2 <= '0'; end if; int_reset <='0'; --wird ein Flankenwechsel inerhalb des zugelassenen Zeitfensters ermittelt werden die Counter resettet o_kameraausloeser <= '0'; if counter2 = 24008 then counter2 <= counter1; flag_vergleich := flag_empfang2 & flag_empfang1; case flag_vergleich is when "00" => o_kameraausloeser <= '1'; int_Ausgefallenes_Signal_1_s <='1'; o_Ausgefallenes_Signal_1 <= '0'; int_Ausgefallenes_Signal_2_s <='1'; o_Ausgefallenes_Signal_2 <= '0'; when "01" => int_Ausgefallenes_Signal_2_s <='1'; o_Ausgefallenes_Signal_2 <= '0'; flag_empfang1 <= '0'; when "10" => int_Ausgefallenes_Signal_1_s <='1'; o_Ausgefallenes_Signal_1 <= '0'; flag_empfang2 <= '0'; when others => flag_empfang1 <= '0'; flag_empfang2 <= '0'; end case; end if; --Zeitfenster wird geöffnet. 24006 - 23995 = 11 >> gate für 100µs offen if 23991 < counter2 and counter2 < 24008 then int_gate <= '1'; else int_gate <= '0'; end if; --Empfangserkennung int_empfangseingang1_s <= i_empfangseingang1; int_empfangseingang2_s <= i_empfangseingang2; if int_gate = '1' then --Wird mit aktivirtem Gate eine Steigende Flanke empfangen setzt es ein Flag und der letzte Empfang resettet den Counter1 if int_empfangseingang1_s = '0' and i_empfangseingang1 = '1' then flag_empfang1 <= '1'; counter1 <= (others => '0'); end if; if int_empfangseingang2_s = '0' and i_empfangseingang2 = '1' then flag_empfang2 <= '1'; counter1 <= (others => '0'); end if; else -- Ist das Gate deaktivirt und es wird eine steigende Falanke empfangen, so wir ein Fehlempfangsignal gesetzt if int_empfangseingang1_s = '0' and i_empfangseingang1 = '1' then o_fehlempfangszaehler1 <= '0'; int_fehlempfang1_s <= '1'; end if; if int_empfangseingang2_s = '0' and i_empfangseingang2 = '1' then o_fehlempfangszaehler2 <= '0'; int_fehlempfang2_s <= '1'; end if; end if; --Signal für Fehlempfangszähler1 wird auf GND gezogen if int_fehlempfang1_s = '1' then verzoegerung_1_32ms <= verzoegerung_1_32ms + 1; if verzoegerung_1_32ms = 3200 then verzoegerung_1_32ms <= (others => '0'); o_fehlempfangszaehler1 <= 'Z'; int_fehlempfang1_s <= '0'; end if; end if; --Signal für Fehlempfangszähler1 wird auf GND gezogen if int_fehlempfang2_s = '1' then verzoegerung_2_32ms <= verzoegerung_2_32ms + 1; if verzoegerung_2_32ms = 3200 then verzoegerung_2_32ms <= (others => '0'); o_fehlempfangszaehler2 <= 'Z'; int_fehlempfang2_s <= '0'; end if; end if; --Ausgefallene Signale des ersten Empfängers werden gezählt if int_Ausgefallenes_Signal_1_s = '1' then verzoegerung_3_32ms <= verzoegerung_3_32ms + 1; if verzoegerung_3_32ms = 3200 then verzoegerung_3_32ms <= (others => '0'); o_Ausgefallenes_Signal_1 <= 'Z'; int_Ausgefallenes_Signal_1_s <= '0'; end if; end if; --Ausgefallene Signale des zweiten Empfängers werden gezählt if int_Ausgefallenes_Signal_2_s = '1' then verzoegerung_4_32ms <= verzoegerung_4_32ms + 1; if verzoegerung_4_32ms = 3200 then verzoegerung_4_32ms <= (others => '0'); o_Ausgefallenes_Signal_2 <= 'Z'; int_Ausgefallenes_Signal_2_s <= '0'; end if; end if; end if; end process; end Behavioral;