Cuándo usar State Machines - FPGA

2

Al leer tutoriales de VHDL, he leído mucho sobre FSM (Máquinas de estados finitos). Son fáciles y los he usado mucho, pero aún no entiendo algo y no puedo encontrar la respuesta en línea:

¿Cuándo debo usar FSMs (Moore o Mealy) en mi diseño VHDL?

Por ejemplo, si implemento un algoritmo (anteriormente en lenguaje C) en VHDL, ¿debo usar un FSM?

    
pregunta João Pereira

4 respuestas

4

Si tiene que dividir una operación en varios ciclos de reloj, tiene dos opciones: canalización y secuenciación

Consideremos una operación mítica que consiste en cuatro multiplicaciones, por ejemplo, donde cada multiplicación (excepto la primera) requiere la salida de la multiplicación anterior como una de sus entradas. Sin embargo, las ideas básicas son mucho más generales.

En la canalización, tiene suficiente hardware para realizar cada operación simultáneamente, interconectado por registros de tubería. Esto implica cuatro multiplicadores, separados por registros de tubería. Tomará 4 ciclos de reloj para obtener el primer resultado (por lo que decimos que la tubería tiene 4 etapas de profundidad y la latencia es de 4 ciclos) pero luego obtiene un nuevo resultado en cada ciclo de reloj (por lo que decimos que la tasa de rendimiento es de 1 ciclo) . Un poco más de información sobre el diseño de tuberías. ..

Desventaja: esta es una gran pieza de hardware: 4 multiplicadores son relativamente caros (es por eso que algunas familias de FPGA ofrecen muchos pequeños multiplicadores como bloques altamente optimizados).

La alternativa es secuenciar cada operación en el mismo multiplicador, dando un diseño mucho más pequeño, pero entregando un resultado cada 4 ciclos.

En este caso, puede usar un solo multiplicador, almacenando su resultado en un solo registro, para un diseño mucho más pequeño.

Cada 4º ciclo (o cuando algo más indique que hay una nueva entrada lista) conectas la nueva entrada a un puerto de entrada del multiplicador; en otros ciclos, alimenta ese puerto desde el registro de salida (para utilizar el resultado multiplicado anterior). Y en cada ciclo alimenta los datos apropiados (coeficientes de filtro, valores de matriz, lo que sea) en el otro puerto multiplicador. Cuatro ciclos más tarde, presenta el resultado final como su salida y le indica a su consumidor que un nuevo resultado está listo.

La forma obvia de secuenciar estas operaciones es una máquina de estado (FSM).

De hecho, los cálculos se pueden incrustar en las acciones asociadas con cada estado, por ejemplo:

if rising_edge(clk) then
   Done <= '0';   -- and any other default actions
   case state is
   when Idle =>
      if Start = '1' then
         Temp  := Input * C1;
         State := S1;
      end if;
   when s1 =>
      Temp  := Temp * C2;
      State := S2;
   when s2 =>
      Temp  := Temp * C3;
      State := S3;
   when s3 =>
      Temp  := Temp * C4;
      State := S4;
   when s4 =>
      Output <= Temp;
      Done   <= '1';
      State  := Idle;
      -- optional alternative for bombproof handshaking
      -- if Start = '0' then
      --    Done <= '1';
      --    State <= Idle;
      -- end if;
   end case;
end if;

Si está interactuando con otras unidades: interfaces SPI, UART, etc., el FSM suele ser el mejor método.

    
respondido por el Brian Drummond
3

En el diseño de FPGA, hay dos clases principales de operaciones:

  • Combinatoria, en otras palabras, implementando expresiones lógicas.
  • Operaciones cronometradas, en otras palabras, conexión a pestillos (por ejemplo, flip flops tipo D), o en términos de programación; implementando secuencias de operaciones .

Como puede que sepas, hay un límite en cuanto al tamaño de los circuitos combinatorios. Cada compuerta lógica tiene un retardo de tiempo, si la señal de entrada aumenta de "0" a "1", tomará tiempo para que la salida se estabilice hasta la respuesta correcta. Si lo coloca en cascada demasiado lejos, encontrará que la salida puede estar desincronizada, produciendo errores.

La solución a esto es, por supuesto, confiar en los cierres. En un momento determinado, muestrea la salida, manteniéndola válida hasta la próxima vez. Aquí es donde las operaciones cronometradas ingresan a la imagen.

Pipelining se sigue naturalmente de esto. Si no puede hacer todo en un ciclo, divídalo en más partes, donde cada parte alimenta el resultado parcial a la siguiente. La parte final presenta el resultado final, usualmente N ciclos más tarde.

Pero, a veces no es tan simple como eso. Si el problema requiere que ocurra algo diferente según el estado (generalmente tiempo , o algunas entradas externas), entonces Finite State Machines (FSM) es la solución más lógica.

Los FSMs reducen la complejidad lógica. "Cuando esto y eso suceda, deberíamos hacer esto". Los ejemplos están en orden, pero considere que la ejecución de una CPU es en realidad una máquina de estado gigante.

Como regla general, si puede dividir su problema en un número finito de pasos en los que la transición de un paso a otro es potencialmente variable , entonces debe considerar el uso de un FSM. Dado que este es, con mucho, el escenario más común, descubrirá que usará bastante FSM.

    
respondido por el Pål-Kristian Engstad
1

Daría una respuesta opuesta. ¿Cuándo no usar un FSM?

Si su secuencia de operaciones necesita más de alrededor de 30 estados, probablemente esté:

  • Intentando mezclar en un estado el comportamiento de varias máquinas. Por ejemplo, en un protocolo en serie, la generación de los bits a partir de bytes puede ser realizada por un FSM, reuniendo bytes para generar cuadros por otro.
  • El software de escritura, la máquina de estado debería reemplazarse normalmente por microcódigo.
respondido por el TEMLIB
0

Los sistemas digitales no triviales que casi siempre son sincrónicos y, por lo tanto, utilizan un reloj, pueden considerarse como una línea de registros que encierran datos con lógica combinatoria entre ellos que procesa los datos. Los datos están representados por señales binarias. Esta línea, que puede ser una sola línea o bifurcarse hacia otras líneas, se describe como una ruta de datos. Los datos fluyen en esta ruta y se procesan mediante operaciones booleanas implementadas a través de la lógica combinatoria, los resultados intermedios se almacenan en el registro y luego se procesan mediante el siguiente grupo de lógica combinatoria. También es así como se ve "pipeline".

Necesitamos una máquina de estados para controlar básicamente este flujo de datos, es decir, tomamos decisiones basadas en resultados intermedios sobre cómo progresar los datos, ¿continúa de forma lineal, se ramifica, se elimina o se sobrescribe? ¿Obtenemos un nuevo valor de entrada, guardamos el valor de salida y enviamos una señal que indica a la otra parte del hardware que el procesamiento de datos en esta parte del hardware está completo o que solicita datos nuevos de otra parte del diseño? Estas cosas son sencillas de escribir en un lenguaje de alto nivel. En VHDL donde describimos el hardware, creamos una máquina de estado para hacer esto.

Lo que he dado es una descripción muy general que puede no tener sentido completo. Tendrá sentido cuando diseñe un sistema en el que necesite usarlo.

    
respondido por el quantum231

Lea otras preguntas en las etiquetas