VHDL sintetizar un módulo no funciona, pero simularlo sí lo hace. Error: descripción incorrecta del sincronizador

0

Me pregunto por qué la síntesis de este código no funciona, pero la simulación sí funciona. SOLO AL INTENTAR LA SINTETIZACIÓN obtengo el siguiente error:

  

Signal sig_enable no se puede sintetizar, mala descripción síncrona. El estilo de descripción que está utilizando para describir un elemento síncrono.   (registro, memoria, etc.) no es compatible con el software actual   lanzamiento.

Aquí está mi código:

architecture Behavioral of myModule is
signal sig_outSerial: std_logic := '1';
signal tri_output: std_logic := '1';
signal sig_enable: std_logic := '0';
signal sig_done: std_logic := '1';

component triBuffer
    port(
    input: in std_logic;
    control: in std_logic;
    output: out std_logic
    );
end component;

begin

U1: triBuffer port map(input => CLK_IN, control => sig_enable, output => tri_output);

process(tri_output, SEND)
    variable i: integer := 0;
begin
    if falling_edge(tri_output) and sig_enable = '1' then
        if i = 8 then
            i := 0;
            sig_enable <= '0';
            sig_outSerial <= '1';
            sig_done <= '1';
        else
            sig_outSerial <= inByte(i);
            i := i + 1;
            sig_done <= '0';
        end if;
    end if;

    if rising_edge(SEND) then
        sig_enable <= '1';
    end if;
end process;

outSerial <= sig_outSerial;
done <= sig_done;
CLK_OUT <= tri_output;

end Behavioral;
    
pregunta Calin

1 respuesta

4

Tu código tiene dos formas de cambiar sig_enable

if falling_edge(tri_output) and sig_enable = '1' then
    if i = 8 then
        i := 0;
        sig_enable <= '0';

...

if rising_edge(SEND) then
    sig_enable <= '1';
end if;

Por lo tanto, está solicitando que sig_enable cambie en un borde descendente de tri_output o en un borde ascendente de SEND .

No hay un pestillo ni un flip-flop que puedan hacer esto, y es por eso que el diseño no se puede sintetizar.

En un diseño ASIC, es posible que pueda lograr lo que quiere con un pestillo SR. Pero necesitaría escribir código que refleje el comportamiento real de un pestillo SR (sensible al nivel en lugar de al borde).

En un diseño FPGA, sería más habitual utilizar SEND como una entrada combinatoria a la lógica que cambia sig_enable cuando se sincroniza con tri_output o con un reloj de ejecución rápida (dependiendo de sus requisitos de tiempo).

    
respondido por el The Photon

Lea otras preguntas en las etiquetas