Con el fin de tener unas salidas libres de “glitches” y lo más rápidas posibles con respecto al flanco activo de reloj, suelen necesitarse máquinas de estados finitos con las salidas registradas.
En términos generales registrar una salida implica directamente retrasar el funcionamiento de dichas salidas un ciclo de reloj y así veremos que será absolutamente cierto e inevitable en las Máquinas Mealy; pero no así en las máquinas Moore como ahora veremos
Pautas generales
Veamos que ocurre con los modelos básicos de máquinas de estados (FSM) cuando queremos registrar las salidas:
1. En realidad el modelo Medvedev visto anteriormente puede contemplarse como una máquina con salidas registradas. No requiere transformación
2. Las máquinas Mealy son fácilmente transformables, aunque esta transformación va a tener el coste de retrasar un ciclo las salidas. El modelo funcional quedaría de la siguiente forma:

Figura Ilustración 6 .Modelo Mealy registrado
Evidentemente podríamos adoptar un estilo de descripción con cuatro procesos que modelizaran cada uno de los bloques del modelo funcional. Sin embargo podemos como antes reunir los dos circuitos secuenciales en uno solo, con lo cual tendríamos únicamente tres procesos como podemos ver en el Ejemplo 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
module mealy_reg (RELOJ, RESET_A, SALIDA_REG, ENTRADA); input RELOJ,ENTRADA,RESET_A; output SALIDA; parameter [1:0] /*synopsys enum hola*/ Q1=2'H0, Q2=2'H1, Q3=2'H2 ; reg SALIDA,SALIDA_REG; reg [1:0] /*synopsys enum hola*/ ESTADO, ESTADO_PROX; always @(ESTADO or ENTRADA) case (ESTADO) //synopsys full_case Q1 : if (!ENTRADA) ESTADO_PROX=Q2;else ESTADO_PROX=Q1; Q2 : if (ENTRADA) ESTADO_PROX=Q3; else ESTADO_PROX=Q2; Q3 : if (!ENTRADA) ESTADO_PROX=Q2;else ESTADO_PROX=Q1; endcase always @(posedge RELOJ or negedge RESET_A) if (!RESET_A) begin ESTADO <= Q1; SALIDA_REG<=1'b0; end else begin ESTADO<=ESTADO_PROX ; SALIDA_REG<=SALIDA; end always @(ESTADO or ENTRADA) case (ESTADO) Q1 : SALIDA=1'b0; Q2 : SALIDA=1'b0; Q3 : if (!ENTRADA) SALIDA=1'b1;else SALIDA=1'b0; default: SALIDA=1'bx; endcase endmodule |
Ejemplo 6: Máquina Mealy registrada con tres procesos.