¿Cómo implementar una función de convolución en VHDL?

3

Estoy tratando de aprender VHDL. Escribí este código para hacer una convolución, pero no funciona: la salida no cambia de 0 cuando lo ejecuto. Intenté agregar un reloj, pero tampoco funciona (¿necesito uno?). ¿Qué pasa?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
package mypack is
type real_vector is array (integer range <>) of real;
end mypack;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.mypack.all;

entity convolution is
port (x:in real_vector(0 to 3);
      y:in real_vector(0 to 1);
      f:out real_vector (0 to 4));
end convolution;

architecture Behavioral of convolution is
--signal temp : real_vector (0 to 4):= (others => 0.0);
--signal enable : std_logic :='0';
begin
process (x,y)
variable sum :real;
begin

  for n in f'range loop
     enable <= '0';
     for k in y'range loop
        sum:=sum + x(k)*y(n-k);
      end loop;
     -- temp(n) <= sum;
      f(n) <= sum ;
      sum:=0.0;
  end loop;
enable <= '1';

--if (enable'event and enable='1') then
--    f <= temp;
--end if;

end process;

end Behavioral;
    
pregunta elahe

2 respuestas

4

Es difícil decir con certeza por qué f se está configurando en 0, pero veo problemas con tu código.

Para empezar, la suma nunca se inicializa a 0.0 cerca del comienzo del proceso. Lo configura al final, después de que se asigna f, pero no hace ninguna diferencia allí. Con algunos sintetizadores / simuladores, su código podría funcionar, pero sigue siendo una mala práctica y no siempre funcionará. Es mejor inicializar la suma.

A continuación, mira este segmento de código. He sustituido 'rango con los valores reales para mayor claridad:

for n in 0 to 4 loop
     for k in 0 to 1 loop
        sum := sum + x(k) * y(n-k);

¿Qué sucede si n = 0 y k = 1? Entonces estás indexando y (-1), que es un índice no válido. Me sorprende que su simulador no se esté quejando de esto.

Así que no sé por qué f es cero; pero con la suma no iniciada y el uso de índices no válidos para y, ciertamente no obtendrá los resultados que espera.

    
respondido por el user3624
-2

Algoritmo para convolución lineal
Donde, l = longitud de x (n)
m = longitud de h (n)
N = l + m-1 = longitud de salida

1.  Start
2.  Initialize sum=0,result array={0,0,0,0,0,0,0}
3.  For i in 0 to N-1 do
4.  Sum=0
5.  For j in 0 to l-1 do
6.  For k in m-1 to 0 do
7.  If (i=j+k) then product=x(k)*h(k-j)--------------this  product will be calculated using Vedic multiplier.
8.  Sum=sum+product
9.  End loop k;
10.  End loop j
11.  Result(i)=sum
12.  End loop i;
13.  End
    
respondido por el malay

Lea otras preguntas en las etiquetas