Inicializando una variable con la entrada de un proceso

0

He estado intentando pensar en formas de reducir el alcance de las variables de indexación usadas en un mux. Hoy se me ocurrió usar algo como el siguiente código como estrategia:

entity control is
  port (
    sel_slv       : in   std_logic_vector (1 downto 0);
    in0, in1, in2 : in   std_logic_vector (31 downto 0);
    out           : out  std_logic_vector (31 downto 0))
end Control;
architecture rtl of Control is 
begin
  mux : process(sel_slv, in0, in1, in2, in3)
    variable sel : integer := to_integer(unsigned(sel_slv));
  begin
    case sel is
      when 0 =>      outp <= in0;
      when 1 =>      outp <= in1;
      when 2 =>      outp <= in2;
      when others => outp <= (others => '-');
    end case;
  end process mux;
end rtl;

Noté que modelsim da una advertencia: el valor inicial de "sel" depende del valor de la señal "sel_slv". Asumí que sel se inicializaría cada vez que se ejecutara el proceso.

    
pregunta Lincoln

2 respuestas

1

Los procesos no son procedimientos. Una variable de proceso mantiene su valor entre las activaciones de ese proceso: así es como DEBE funcionar, de lo contrario, no podría usar variables en un proceso para representar memorias o registros o estados en una máquina de estado.

Lea su código con ese entendimiento: la variable se inicializa una vez y nunca se asigna nuevamente.

Tu propia respuesta está bien en cuanto a qué hacer al respecto; Solo quería aclarar un poco la razón subyacente.

    
respondido por el Brian Drummond
1

Con el código como es sel tomará el valor inicial de sel_slv y nunca cambiará. Mover la declaración de inicialización de la variable después del comienzo hace que el proceso responda a los cambios en sel_slv como se esperaba.

entity control is
  port (
    sel_slv       : in   std_logic_vector (1 downto 0);
    in0, in1, in2 : in   std_logic_vector (31 downto 0);
    out           : out  std_logic_vector (31 downto 0))
end Control;
architecture rtl of Control is 
begin
  mux : process(sel_slv, in0, in1, in2, in3)
    variable sel : integer;
  begin
    sel := to_integer(unsigned(sel_slv));
    case sel is
      when 0 =>      outp <= in0;
      when 1 =>      outp <= in1;
      when 2 =>      outp <= in2;
      when others => outp <= (others => '-');
    end case;
  end process mux;
end rtl;

Recordatorio para la próxima vez: las variables inicializadas en un proceso se inicializan durante el tiempo de elaboración (compilación).

De la especificación VHDL:

IEEE Std 1076-2008 14.6 Elaboración dinámica para 2 b): la ejecución de una llamada a un subprograma implica la elaboración de la lista de asociación de parámetros. Eso no incluye la declaración de variables, ver 14.4.2 Elaboración de una declaración, 14.4.2.2 Declaraciones de subprogramas, cuerpos e instancias y 14.4.2.5 Declaraciones de objetos. Una declaración aquí se puede considerar como reservar espacio y proporcionar una dirección para una variable de pila.

    
respondido por el Lincoln

Lea otras preguntas en las etiquetas