¿Es una mala práctica el uso de rising_edge en señales sin reloj? ¿Hay alternativas?

Estoy trabajando en un diseño VHDL y lo tengo funcionando, pero el código es bastante feo y el hecho de que parece que estoy tratando de evitar el diseño del lenguaje para lograr mi objetivo me hace sentir que algo está mal. Soy bastante nuevo en VHDL, pero he estado trabajando en fragmentos más pequeños del proyecto durante casi un mes, así que tengo la idea general. Sin embargo, esta parte es un poco más compleja.

Necesito un proceso que cree un pulso largo de un período de reloj (LOAD_PULSE) después del borde ascendente de una señal (END_ADC), pero no hasta que hayan pasado 4 relojes desde el último borde ascendente de esa señal (END_ADC) O el borde descendente de una segunda señal (LVAL).

Para lograr el período de espera, he creado un módulo de temporizador que cuenta microsegundos y períodos, aquí:

entity uS_generator is
    generic(
        Frequency       : integer := 66                                     -- Frequency in MHz
    );
    Port ( 
        CLK     : in STD_LOGIC;
        RESET   : in STD_LOGIC;
        T_CNT   : out integer range Frequency downto 1 := 1;
        uS_CNT  : out integer range 65535 downto 0 := 0
    );
end uS_generator;

architecture behavior of uS_generator is

    signal T_CNT_INT        : integer range Frequency downto 1 := 1;        -- Counter for 1 uS
    signal uS_CNT_INT       : integer range 65535 downto 0 := 0;

begin

    COUNT: process(CLK, RESET)
    begin
        if RESET = '1' then
            T_CNT_INT   <= 1;
            uS_CNT_INT  <= 0;
        elsif rising_edge(CLK) then
            if T_CNT_INT = (Frequency - 1) then                             -- Increment one clock early so last rising edge sees one uS elapsed.
                uS_CNT_INT <= uS_CNT_INT + 1;
                T_CNT_INT <= T_CNT_INT + 1;
                if uS_CNT_INT = 65535 then
                    uS_CNT_INT <= 0;
                end if;
            elsif T_CNT_INT = Frequency then
                T_CNT_INT <= 1;
            else
                T_CNT_INT <= T_CNT_INT + 1;
            end if;
        end if;
    end process COUNT;

    T_CNT   <= T_CNT_INT;
    uS_CNT  <= uS_CNT_INT;

end behavior;

Los procesos que estoy usando para la porción de generación de pulso del diseño son los siguientes:

loadPulseProc: process(PIXEL_CLK, END_ADC, RESET)
begin

    if RESET = '1' then
        PULSE_FLAG <= '0';
        LOAD_PULSE <= '0';
    elsif rising_edge(END_ADC) then
        PULSE_FLAG <= '1';
    end if;

    if rising_edge(PIXEL_CLK) then
        if PULSE_FLAG = '1' and END_ADC = '1' and LVAL <= '0' and ADC_TMR_T >= 4 and LVAL_TMR_T >= 4 then
            LOAD_PULSE <= '1', '0' after PIXEL_CLK_T;
            PULSE_FLAG <= '0';
        end if;
    end if;

end process loadPulseProc;

ADCTimerProc: process(END_ADC, RESET)
begin

    if RESET = '1' then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if rising_edge(END_ADC) then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if falling_edge(END_ADC) then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

end process ADCTimerProc;

LVALTimerProc: process(LVAL, RESET)
begin

    if RESET = '1' then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if rising_edge(LVAL) then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if falling_edge(LVAL) then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;         

end process LVALTimerProc;

PIXEL_CLK_T es el período del reloj, 15.152 ns.

Este diseño funciona, la simulación muestra que hace lo que necesito, pero solo después de una molestia significativa para evitar errores debido al uso de múltiples llamadas rising_edge de falling_edge separándolos en declaraciones separadas si realmente deberían estar juntas. Por lo que he leído, el uso de rising_edge y falling_edge parece estar reservado solo para relojes, entonces, ¿es esta una mala práctica? ¿Cómo puede evitar este comportamiento pero aún crear la misma salida?

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta