library IEEE; use IEEE.STD_LOGIC_1164.all; package EdgeDet is subtype tBuffer is std_logic_vector(1 downto 0); constant tBuffer_InitLow : tBuffer := "00"; constant tBuffer_InitHigh : tBuffer := "11"; procedure setNext ( signal b : inout tBuffer; signal n : in std_logic ); function risingEdge ( b : in tBuffer ) return boolean; function fallingEdge ( b : in tBuffer ) return boolean; function anyEdge ( b : in tBuffer ) return boolean; function stableHigh ( b : in tBuffer ) return boolean; function stableLow ( b : in tBuffer ) return boolean; end EdgeDet; package body EdgeDet is -- Prozedur: -- b ist Schieberegister nach links der Länge 2, von rechts neuer ein neuer Bitwert eingeschoben procedure setNext ( signal b : inout tBuffer; signal n : in std_logic ) is begin b <= b(0) & n; end setNext; -- detektiere steigende Taktflanke bei b="01" (Wechsel von "00" -> "01"), liefere "true" function risingEdge ( b : in tBuffer ) return boolean is begin return (b = "01"); end risingEdge; -- detektiere fallende Taktflanke bei b="10" (Wechsel von "11" -> "10"), liefere "true" function fallingEdge ( b : in tBuffer ) return boolean is begin return (b = "10"); end fallingEdge; -- detektiere steigende oder fallende Taktflanke (jeder Zustandswechsel), liefere "true" function anyEdge ( b : in tBuffer ) return boolean is begin return risingEdge(b) or fallingEdge(b); end anyEdge; -- detektiere stabilen Zustand high (immer 1, kein Zustandswechsel), liefere "true" function stableHigh ( b : in tBuffer ) return boolean is begin return (b = "11"); end stableHigh; -- detektiere stabilen Zustand low (immer 0, kein Zustandswechsel), liefere "true" function stableLow ( b : in tBuffer ) return boolean is begin return (b = "00"); end stableLow; end EdgeDet;