Ich möchte gerne eine Impulsabstandmessung durchführen. D.h ich habe ein digitales Signal welches regelmäßig den Wert 1 und 0 hat. Jetzt möchte ich mit einer Referenzfrequenz, die deutlich höher ist als mein obiges Signal, das Signal abtasten und die Impulse der Referenzfrequenz zwischen zwei steigenden Flanken des Signals zählen. Wie kann ich das am besten in VHDL realisieren?
hier ein Lösungsvorschlag mit Testbench (im Anhang ZIP-Datei).
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all;
entity Messung is Port ( reset : in std_logic; Zu_testendes_Signal : in std_logic; clk_ref : in std_logic; Impulsabstand : out std_logic_vector(15 downto 0); Messung_fertig : out std_logic; Ueberlauf : inout std_logic ); end Messung;
architecture Behavioral of Messung is signal halten : std_logic; -- zum Messen einer ganzen Periode des zu messenden Signales signal Impulsabstand_zaehler : std_logic_vector(15 downto 0); begin process (reset, clk_ref) begin if reset = '1' then Impulsabstand_zaehler <= X"0000"; Impulsabstand <= X"0000"; Messung_fertig <= '0'; Ueberlauf <= '0'; halten <= '0'; elsif rising_edge (clk_ref) then if Impulsabstand_zaehler = X"FFFF" then Impulsabstand_zaehler <= X"0000"; Ueberlauf <= '1'; else -- kein Überlauf if Ueberlauf = '0' then if Impulsabstand_zaehler = X"0000" then if Zu_testendes_Signal = '1' then Impulsabstand_zaehler <= Impulsabstand_zaehler + 1; halten <= '1'; Messung_fertig <= '0'; end if; else -- Impulsabstand_zaehler nicht 0 if halten = '1' then if Zu_testendes_Signal = '1' then Impulsabstand_zaehler <= Impulsabstand_zaehler + 1; else Impulsabstand_zaehler <= Impulsabstand_zaehler + 1; halten <= '0'; end if; else -- halten = '0' if Zu_testendes_Signal = '0' then Impulsabstand_zaehler <= Impulsabstand_zaehler + 1; else Impulsabstand_zaehler <= X"0000"; Messung_fertig <= '1'; Impulsabstand <= Impulsabstand_zaehler; end if; end if; end if; else -- Überlauf = 1 if Zu_testendes_Signal = '0' then Impulsabstand_zaehler <= X"0000"; Ueberlauf <= '0'; halten <= '0'; end if; end if; end if; end if; end process; end Behavioral;