Ist die Verwendung von rising_edge bei Nicht-Taktsignalen eine schlechte Praxis? Gibt es Alternativen?

Ich arbeite an einem VHDL-Design und habe es in der Hand, aber der Code ist ziemlich hässlich und die Tatsache, dass ich anscheinend versuche, das Design der Sprache zu umgehen, um mein Ziel zu erreichen, lässt mich das Gefühl haben, dass etwas nicht stimmt. Ich bin ziemlich neu in VHDL, aber ich arbeite seit fast einem Monat an kleineren Teilen des Projekts, also habe ich die allgemeine Idee. Dieser Teil ist jedoch etwas komplexer.

Ich benötige einen Prozess, der nach der ansteigenden Flanke eines Signals (END_ADC) einen Impuls mit einer Taktperiode (LOAD_PULSE) erzeugt, aber erst, wenn 4 Takte von der letzten ansteigenden Flanke dieses Signals (END_ADC) ODER der abfallenden Flanke verstrichen sind eines zweiten Signals (LVAL).

Um die Wartezeit abzuschließen, habe ich ein Timer-Modul erstellt, das Mikrosekunden und Perioden zählt.

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;

Die Prozesse, die ich für den Impulserzeugungsabschnitt des Designs verwende, sind wie folgt:

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 ist die Periode der Uhr, 15.152 ns.

Dieses Design funktioniert, die Simulation zeigt, dass es funktioniert, wie ich es benötige, aber nur nach erheblichem Aufwand, um Fehler zu vermeiden, da mehrere rising_edge- oder falling_edge-Aufrufe verwendet werden, indem sie in separate if-Anweisungen aufgeteilt werden, die wirklich zusammen gehören sollten. Soweit ich mit rising_edge und falling_edge gelesen habe, scheint es nur für Uhren reserviert zu sein. Ist das also nur eine schlechte Praxis? Wie kann man dieses Verhalten vermeiden und trotzdem die gleiche Ausgabe erzeugen?

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage