Promedio móvil VHDL FSM

0

Estoy tratando de escribir un módulo de media móvil VHDL (ponderada uniformemente) que usa FSMD (ata). Por lo que entiendo, los estados necesarios serían algo así como buscar, dividir, producir. A continuación se muestra el proceso que escribí, pero siento que mi lógica está un poco apagada. Tenga en cuenta que los datos que estoy promediando son solo una matriz constante de números de 8 bits, por lo que pensé que debería estar bien usar un diseño no causal.

Los datos tienen 64 entradas, y en este momento la ventana para el promedio es 4.

process (clk,rst) is

    variable temp : integer range 0 to 1020;
    begin
        if rst = '1' then
            count  <= 0;
            n_state <= s0;
        elsif (clk'event and clk = '1') then
            c_state <= n_state;
            case c_state is
                when s0 =>
                    for i in 0 to (len) loop
                        temp := temp + pattern(count+i);
                    end loop;
                    n_state <= s1;
                when s1 =>
                    temp := temp/4;
                    n_state <= s2;
                when s2 =>
                    data <= std_logic_vector(to_unsigned(pattern(count),8));
                    data_avg <= std_logic_vector(to_unsigned(temp,8));
                    n_state <= s0;
                    count <= count+1;
                end case;
        end if;
    end process;

¿Qué tan mal se ve esto?

    
pregunta user1710566

2 respuestas

1

Algunos problemas que puedo ver de inmediato:

  1. No [re] inicializa temp en ningún lugar.
  2. No tiene ninguna comprobación de límites para count (¿es un subtipo o solo un natural / integer ? ¿Qué sucede con pattern(count+i) cuando se acerca al límite? ¿Cómo se transfiere?)
  3. Su for-loop es 0 to len - ¿está seguro de que no quiso decir 0 to (len - 1) ?
  4. Dado que todo el proceso de decodificación de su estado está sincronizado, no necesita n_state en absoluto. Tenga en cuenta que ni siquiera está inicializando c_state (pero todavía lo está descodificando). O bien, haga que su estado decodifique un proceso combinado independiente o simplemente deshágase de n_state y asigne a c_state directamente.

De lo contrario, depende de sus objetivos de diseño. Si no le importa el rendimiento, pero necesita ejecutarse a una velocidad de reloj muy alta, es posible que desee realizar su adición de forma secuencial en lugar de en paralelo, por ejemplo.

    
respondido por el fru1tbat
0

¿Es un ejercicio sobre el uso de un FSM, o simplemente necesita generar un vector que contenga los promedios? Si los datos de entrada son constantes, todos los cálculos se pueden realizar durante la síntesis o al comienzo de la simulación.

Por lo tanto, puede escribirlo como una función simple, como lo haría en un lenguaje de programación de software 'normal'.

Aquí hay un ejemplo:

TYPE array_byte IS ARRAY(natural RANGE <>) OF unsigned(7 DOWNTO 0);

CONSTANT pattern : array_byte(0 TO 63):=(0 => x"00",1 => x"10",2 => x"20",
                                       OTHERS => x"30");

FUNCTION average4(CONSTANT v : array_byte) RETURN array_byte IS
    VARIABLE vo : array_byte(0 TO v'length-5);
    VARIABLE temp : unsigned(9 DOWNTO 0);
BEGIN
    FOR i IN 0 TO v'length-5 LOOP
       temp:=(OTHERS =>'0');
       FOR j IN 0 TO 3 LOOP
          temp:=temp + v(i+j);
       END LOOP;
       temp:=temp / 4;
       vo(i):=temp(7 DOWNTO 0);
    END LOOP;
    RETURN vo;
 END FUNCTION;

 CONSTANT vout : array_byte(0 TO 59):=average4(pattern);
    
respondido por el TEMLIB

Lea otras preguntas en las etiquetas