¿Cómo implementar un derivado y crear un retraso de docenas de ciclos de reloj?

0

Tengo una entidad uart que tiene las siguientes señales (solo escribo las relevantes - para tx)

-- The output data: 8 bit - this is the UART receiver
-- Data is only valid during the time the STB is high
-- Acknowledge the data with a pulse on ACK, which is confirmed by
-- revoking STB.
-- When the following start bit is received the data becomes
-- invalid and the STB is revoked. So take care about fetching the
-- data early enough, or install your own FIFO buffer
DATA_STREAM_OUT     : out std_logic_vector(7 downto 0);
DATA_STREAM_OUT_STB : out std_logic;
DATA_STREAM_OUT_ACK : in  std_logic;
TX                  : out std_logic;

Tengo otro bloque cuya entrada de habilitación debería cambiarse a alta para solo un reloj cuando hay un cambio de DATA_STREAM_OUT_ACK (de mayor a menor) más un retraso de 50 ciclos clk.

Supongo que debería obtener DATA_STREAM_OUT_ACK , pero no estoy seguro de implementar esto, y también el retraso (puede ser con el contador).

    
pregunta sara r

1 respuesta

0

Esto hará la función que pediste. Puede que tenga que ajustar la constante '51' para obtener su tiempo preciso.

  signal delayCtr       : natural range 0 to 51;

  Delayed : process(RST, CLK) is
  begin
    if (RST = '1') then
      delayCtr     <=   0 ;
      delayedEn    <=  '0';

    elsif rising_edge(clk) then

      if (data_stream_out_stb = '1') then
        delayCtr   <=  51;

      elsif (delayCtr > 0) then
        delayCtr   <=  delayCtr - 1;

      end if;

      if (delayCtr = 1) then
        delayedEn  <=  '1';
      else
        delayedEn  <=  '0';
      end if;

    end if;
  end process Delayed;

Obviamente, tendrás que conectarlo al resto de tu VHDL, proporcionando reloj y reinicio. De lo contrario tendremos un intercambio de comentarios eternos. Pero muestra el principio de funcionamiento de la solución.

    
respondido por el TonyM

Lea otras preguntas en las etiquetas