Ejecuta dos trozos de código en secuencia pero el código mismo en paralelo

0

Tengo un fragmento de código que debe ejecutarse después de otro. Por ejemplo, tengo un slv_reg2 <= slv_reg0 + slv_reg1; adicional y luego necesito que se reste el resultado de un número.

architecture IMP of user_logic is

signal slv_reg0                       : std_logic_vector(0 to C_SLV_DWIDTH-1); --32 bits wide
signal slv_reg1                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal slv_reg2                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal slv_reg3                       : std_logic_vector(0 to C_SLV_DWIDTH-1);
signal flag                           : bit := '0';

begin

  slv_reg2 <= slv_reg0 + slv_reg1;
  flag <= '1'; 

process (flag)
begin
  IF (flag = '1') THEN
    slv_reg3 <= slv_reg0 - slv_reg2;
  END IF;  
end process; 

end IMP;

No he probado el código anterior, pero me gustaría recibir algunos comentarios si mi pensamiento es correcto. Lo que está contenido en el process no necesita ejecutarse en secuencia, ¿cómo puedo hacer que esta parte también se ejecute en paralelo?

En resumen, tengo dos trozos de código que deben ejecutarse en secuencia, pero el código en sí debe ejecutarse en paralelo.

--UPDATE--

begin

process (flag, clk)
begin
IF (flag = '1' AND rising_edge(clk)) THEN
  slv_regX <= (slv_reg0 - slv_reg1) + (slv_reg2 - slv_reg3) +(slv_reg4 - slv_reg5); --...etc
  flag = '0';
END IF;  
end process; 

end IMP;
    
pregunta traveller

1 respuesta

1

Probablemente, el método más simple es eliminar la dependencia de datos, por lo que tendría

slv_reg2 <= slv_reg0 + slv_reg1;
slv_reg3 <= slv_reg0 - (slv_reg0 + slv_reg1);

en el mismo proceso. Esto se ejecutará en paralelo, y el sumador debe ser reutilizado. Bueno, en realidad no lo hará en este caso, ya que la segunda expresión debería simplificarse a solo -slv_reg1, pero con diferentes ecuaciones es posible que no pueda hacer esa simplificación.

Ahora, si encadenar estas dos operaciones en el mismo ciclo de reloj es demasiado lento, entonces lo que puede hacer es agregar un registro de canalización, de este modo:

slv_reg0_delay <= slv_reg0;
slv_reg2 <= slv_reg0 + slv_reg1;
svl_reg2_delay <= slv_reg2;
slv_reg3 <= slv_reg0_delay - slv_reg2;

En este caso, obtendrás el resultado en slv_reg2_delay y slv_reg3 con un retardo de pipeline de 2 ciclos.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas