Advertencia al sintetizar el código VHDL

0

Recibo advertencias al sintetizar el siguiente código. Probé de muchas maneras pero en vano. ¿Puede alguien sugerir qué podría haber fallado con mi código? El código es enclavar los datos cuando los valores de contador de anillo correspondientes se vuelven uno. ¡Acabo de empezar a aprender la codificación HDL! ..

entity PLowLatch is
  Port ( 
    ppOut_MUX1    : in   STD_LOGIC;
    ring          : in   STD_LOGIC_VECTOR (3 downto 0);
    PlowLatch_out : out  STD_LOGIC_VECTOR (3 downto 0)
  );
end PLowLatch;

architecture Behavioral of PLowLatch is
begin

  process (ring, ppOut_MUX1) begin
    if (ring(0) = '1') then
      PlowLatch_out(0) <= ppOut_MUX1;
    elsif (ring(1) = '1') then
      PlowLatch_out(1) <= ppOut_MUX1;
    elsif (ring(2) = '1') then
      PlowLatch_out(2) <= ppOut_MUX1;
    elsif (ring(3) = '1') then
      PlowLatch_out(3) <= ppOut_MUX1;
    else
      PlowLatch_out <= "0000";
    end if;
  end process;

end Behavioral;

A continuación se muestra la advertencia

WARNING:Xst:737 - Found 1-bit latch for signal <PlowLatch_out_0>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <PlowLatch_out_1>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <PlowLatch_out_2>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <PlowLatch_out_3>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
    
pregunta user40295

1 respuesta

4

Siempre que tenga un proceso asíncrono que no asigne a cada variable de salida en cada ruta posible a través del código, creará un cierre asíncrono implícito para cada variable no asignada. De esto se tratan las advertencias: cada una de sus variables PlowLatch_out solo se asigna en una rama de su estructura if-then-else , por lo que se crea un cierre para cada una.

Es posible que esto sea lo que pretendías, pero el problema es que se trata de un enfoque de diseño deficiente para los FPGA. En general, la estructura lógica de un FPGA no está totalmente caracterizada con respecto al rendimiento de las máquinas de estado asíncronas (incluidos los latches básicos), y las herramientas de diseño hacen todo lo posible para alentar a que su diseño sea sincrónico (es decir, con un reloj). ).

Debería traer el mismo reloj que impulsa el contador de timbres en este módulo, algo como esto:

entity PLowLatch is
  Port ( 
    clock         : in   STD_LOGIC;
    ppOut_MUX1    : in   STD_LOGIC;
    ring          : in   STD_LOGIC_VECTOR (3 downto 0);
    PlowLatch_out : out  STD_LOGIC_VECTOR (3 downto 0)
  );
end PLowLatch;

architecture Behavioral of PLowLatch is
begin

  process (clock) begin
    if rising_edge(clock) then
      if (ring(0) = '1') then
        PlowLatch_out(0) <= ppOut_MUX1;
      elsif (ring(1) = '1') then
        PlowLatch_out(1) <= ppOut_MUX1;
      elsif (ring(2) = '1') then
        PlowLatch_out(2) <= ppOut_MUX1;
      elsif (ring(3) = '1') then
        PlowLatch_out(3) <= ppOut_MUX1;
      else
        PlowLatch_out <= "0000";
      end if;
    end if;
  end process;

end Behavioral;
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas