Codificación de los estados

De todos los diseñadores de máquinas de estados es sabido que una de las cuestiones más importantes desde el punto de vista de la obtención de óptimos resultados en la síntesis de las FSM es la codificación  del estado de la máquina. Así, entre otras, tenemos que podemos realizar las siguientes codificaciones:

·     Secuencial: binario natural. Utiliza el  mínimo número de bits.

·     Gray, Johnson: disminuyen la posibilidad de transiciones incorrectas ante entradas que cambian dentro de los márgenes de set-up de los flip-flops. Lo cual las hace interesantes para cambiar de dominio de reloj.

·     One-hot: tantos flip-flops como estados. Cada estado se representa por un flipflop a uno y el resto a cero. Adecuado en aquellas arquitecturas tecnológicas que disponen de un alto número de flip-flops frente a lógica combinacional para cada registro. Por ejemplo las FPGAs son arquitecturas de este tipo.

Ante estas diferentes posibilidades, que me pueden dar mejores o peores resultados, el diseñador puede utilizar inteligentemente los tipos de datos disponibles en Verilog para conseguir alternativas de codificación que le lleven a resultados óptimos sin tener que escribir código de manera exhaustiva y continua. Vamos a resumir los diferentes tipos de datos que podemos gastar para la variable de ESTADO y ESTADO_PROX y las codificaciones que ellos implican.

Tipos de datos y codificaciones asociadas

Podemos utilizar otros tipos de datos que ahora vamos a describir.

a) Usando tipo integer: La codificación es implícita pero única: secuencial.

b) Usando tipo vectores (reg, bit o logic): La codificación es explícita (normalmente mediante parámetros) y por tanto especificada y fijada por la descripción. Es a nuestro modo de ver la solución más sencilla cuando se quiere una codificación a la carta de nuestra máquina de estados .

c)  Usando tipo enumerado: La codificación es explícita como en el caso b); sin embargo el uso de directivas especiales hacen que el sintetizador entienda que se está tratando de un tipo de datos parecido a un enumerado, con lo cual la codificación final del diseño sintetizado corre a cargo del sintetizador. Dicho sintetizador normalmente admite en sus opciones de síntesis diferentes alternativas de codificación como las vistas anteriormente, que pueden ser elegidas y aplicadas sin problemas por él. Hemos utilizado en los dos ejemplos anteriores este tipo de directivas y hemos comentado que a veces la elección de diferentes codificaciones obliga (en algunos tipos de software) a rectificar el código Verilog, puesto que se parte de una codificación explícita que aunque luego superada por el sintetizador, a veces interfiere lamentablemente en el proceso de elaboración.