Un código con latches- vhdl

1

El código de la figura siguiente crea un cierre innecesario. a) ¿Qué declaración (s) se debe escribir y dónde se debe eliminar?

signal next_p, p: std_logic_vector(1 downto 0);
signal a, b, c, d, q, next_q: std_logic;

process(select,a,b,c,d)
begin
  if (select=”00”) then
    next_q<=a;
    next_p<=”00”;
  elsif (select=“01”) then
    next_q<=b;
    next_p<=”10”;
  elsif (select=“10”) then
    next_q<=c;
                      <------- next_P isnt assigned here (latch?)
  else
    next_q<=d;
                      <------- next_P isnt assigned here (latch?)
  end if;
end process;

process(clk)
begin
  if (clk’event and (clk=’1’)) then
    q<=next_q;
    p<=next_p;
  end if;
end process;

Realmente no puedo encontrar el pestillo en este código. Pero no estoy seguro al 100 por ciento de si esa es la respuesta, ¿puede alguien ayudarme a comprender dónde ocurre el cierre?

saludos

un estudiante.

    
pregunta draaknar

2 respuestas

3

Sus comentarios son exactamente correctos: si no asigna una señal en cada rama de una declaración condicional, el sintetizador lógico debe crear un cierre para recordar la asignación anterior a esa señal, donde sea que haya estado.

    
respondido por el Dave Tweed
2

Sus comentarios son correctos.

Puede mejorar el código actual, hasta que el frágil proceso de combinación haga lo que usted pretende, o podría reemplazar el lote con un solo proceso síncrono:

process(clk)
begin
  if rising_edge(clk) then
    case select is
    when "00" =>
      q <= a;
      p <= "00";
    when "01" =>
      q <= b;
      p <= "10";
    when "10" =>
      q <= c;
    when others =>
      q <= d;
    end case;
  end if;
end process;

un poco más simple ... no es propenso a errores de lista de sensibilidad, y debido a que las asignaciones faltantes están en el proceso cronometrado, el valor antiguo de p se almacenará en un registro.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas