Me gustaría codificar un fsm one-hot 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 system verilog, sintetizamos el resultado correcto.
Pero... Vhdl no parece permitir una declaración de caso inverso. No hay necesidad de paralelo_caso ya que el caso siempre es paralelo en vhdl. El mejor ejemplo que encontré, del artículo de Steve Golson (¡en 1994!) usa sentencias if en cascada. No hay "más", pero me parece que estos deberían 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 lo bien que funciona. Pero tal vez haya una razón por la que estos tipos de vhdl no lo usan...
En VHDL, describe los estados de 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 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 johnson * código one-hot * ...
Incluso puede especificar su propia codificación definida por el usuario.
La herramienta de síntesis elegirá en función de: * número de estados * número de transiciones * patrones de transición, por ejemplo, rutas paralelas en su FSM * formato de salida necesario * requisitos de tiempo * estrategia de optimización
cuál será la mejor codificación. Por ejemplo, si habilita la optimización de la velocidad, podría elegir one-hot con más frecuencia, porque es más fácil de verificar y puede manejar frecuencias más altas. Si optimiza por área, optará 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). Por eso, las herramientas pueden manejar los literales de enumeración internamente como 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.
FSM_ENCODING
y ENUM_ENCODING
en los manuales de usuario de síntesis de sus proveedores.
Eugenio Sh.
Mate
Mate
Mate
Mate
el fotón
Mate