One-hot fsm in vhdl

1

Me gustaría codificar un fsm de un solo calor en vhdl. He hecho muchos en verilog pero mi empleador actual prefiere vhdl. En verilog usaría la "declaración de caso inverso" (caso 1'b1) para comparar cada bit en el vector de estado en paralelo. Luego, con un pragma de caso paralelo o una declaración "única" en el sistema verilog, sintetizamos el resultado correcto.

Pero ... Vhdl no parece permitir una declaración de caso inverso. No hay necesidad de parallel_case ya que el caso siempre es paralelo en vhdl. El mejor ejemplo que encontré, del artículo de Steve Golson (¡en 1994!) Usa declaraciones en cascada si. No hay "otra cosa", pero me parece que estos deben convertirse en codificadores de prioridad y no en una verificación de estado paralela. Así que estoy un poco perdido.

Preguntar a los compañeros de trabajo no ayudará, nadie usa este estilo de codificación y estoy tratando de mostrarles qué tan bien funciona. Pero tal vez hay una razón por la cual estos chicos de vhdl no lo usan ...

    
pregunta Matt

1 respuesta

1

En VHDL, describe los estados FSM con un tipo de enumeración como este:

type T_STATE is (ST_IDLE, ST_READING, ST_WRITING, ST_FINISHED, ST_ERROR);

Este tipo no tiene ningún significado sobre cómo representar los literales de enumeración (los nombres de estado) como valores binarios en su dispositivo de destino. Puede ser: * secuencial * código gris * código de johnson * código de un solo calor * ...

Incluso puedes especificar tu propia codificación definida por el usuario.

La herramienta de síntesis elegirá en base a: * numero de estados * numero de transiciones * patrones de transición, por ejemplo Caminos paralelos en tu FSM * necesita formato de salida * requisitos de tiempo * estrategia de optimización

cuál será la mejor codificación. Por ejemplo, si habilita la optimización de la velocidad, es posible que elija una opción más a menudo, porque es más fácil de verificar y puede manejar frecuencias más altas. Si optimiza por área, decidirá por códigos más compactos como gris o secuencial (números binarios).

He visto FSM codificado en caliente con hasta 31 registros (estados) en las herramientas de síntesis de Xilinx.

Puede especificar una codificación FSM predeterminada globalmente por opciones de sintetizador o por FSM o por tipo de enumeración con atributos VHDL.

Un tipo de enumeración es un tipo discreto. Todos los literales de enumeración tienen un número de posición ( T_STATE'pos(ST_ERROR) es 4). Debido a eso, las herramientas pueden manejar literales de enumeración internamente como números enteros, porque una posición en la escala numérica es un valor entero. Pero este hecho no significa que cada estado se codificará como el formato binario de su número de posición.

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas