Practica 2 ed c fsm verilog - 24 marzo 2014 (2)

14
DEPARTAMENTO DE TECNOLOGÍA INFORMÁTICA ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA Máquinas de Estados Finitos (FSM) en Verilog Enunciados de Prácticas de Laboratorio Estructura de Computadores v1.03 1 Introducción y objetivos En esta práctica nos basaremos en los conocimientos adquiridos en la práctica anterior. Por tanto, se presupone que el alumno sabe: Crear un proyecto en el entorno ISE de Xilinx. Trabajar con módulos Verilog simples, de tipo secuencial y de tipo combinacional. Trabajar con módulos más complejos definidos de forma estructural mediante la interconexión de instancias de módulos más simples. Usar módulos de testbench para simular y comprobar el funcionamiento de los módulos diseñados. Modificar un módulo de testbench para adaptarlo a las pruebas a las que desea someter el módulo a probar. Los objetivos para esta práctica son trabajar con módulos Verilog más complejos correspondientes a la descripción de Máquinas de Estados Finitos (FSM). En concreto, se pretende: Describir en Verilog de forma estructural un Circuito Secuencial Síncrono (CSS) partiendo del esquema de puertas lógicas y biestables de dicho circuito. Describir en Verilog de forma procedimental un circuito secuencial síncrono que implemente una Máquina de Estados Finitos (FSM) utilizando como punto de partida únicamente el diagrama de estados de dicha máquina. Usar y modificar módulos de testbench para simular y verificar el comportamiento de los módulos diseñados.

Transcript of Practica 2 ed c fsm verilog - 24 marzo 2014 (2)

DEPARTAMENTO DE TECNOLOGÍA INFORMÁTICA

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA

Máquinas de Estados Finitos (FSM) en Verilog

Enunciados de Prácticas de Laboratorio

Estructura de Computadores

v1.03

1 Introducción y objetivos

En esta práctica nos basaremos en los conocimientos adquiridos en la práctica anterior. Por tanto, se

presupone que el alumno sabe:

• Crear un proyecto en el entorno ISE de Xilinx.

• Trabajar con módulos Verilog simples, de tipo secuencial y de tipo combinacional.

• Trabajar con módulos más complejos definidos de forma estructural mediante la interconexión

de instancias de módulos más simples.

• Usar módulos de testbench para simular y comprobar el funcionamiento de los módulos

diseñados.

• Modificar un módulo de testbench para adaptarlo a las pruebas a las que desea someter el

módulo a probar.

Los objetivos para esta práctica son trabajar con módulos Verilog más complejos correspondientes a

la descripción de Máquinas de Estados Finitos (FSM). En concreto, se pretende:

• Describir en Verilog de forma estructural un Circuito Secuencial Síncrono (CSS) partiendo del

esquema de puertas lógicas y biestables de dicho circuito.

• Describir en Verilog de forma procedimental un circuito secuencial síncrono que implemente una

Máquina de Estados Finitos (FSM) utilizando como punto de partida únicamente el diagrama de

estados de dicha máquina.

• Usar y modificar módulos de testbench para simular y verificar el comportamiento de los

módulos diseñados.

Estructura de Computadores 2

• Hacer uso de las herramientas de síntesis del entorno ISE de Xilinx para comprobar que a partir

de la descripción procedimental de un modulo Verilog se obtiene un circuito equivalente.

2 Estudio previo

En esta práctica se va a describir en Verilog, de dos formas distintas, el Circuito Secuencial Síncrono

(CSS) de la figura 1.

Figura 1: Circuito Secuencial Síncrono (CSS)

Utilizando las técnicas de análisis vistas en la asignatura CED podríamos analizar el CSS de la figura

2 y obtener el diagrama de estados de la máquina de estados finitos (FSM) que implementa. Dicho

diagrama se muestra en la figura 2.

Figura 2: Diagrama de estados de la FSM

Por tanto, es fácil interpretar que el circuito de la figura 1 es capaz de detectar en la entrada 'x' una

secuencia de tres unos seguidos (con solapamiento) y, en ese momento, activar la salida 'z'.

La figura 3 nos muestra la forma general de cualquier Circuito Secuencial Síncrono (CSS).

Estructura de Computadores 3

Figura 3: Estructura general de un CSS

Si reorganizamos los elementos del circuito de la figura 1 para adaptarlos a la forma general de un

CSS mostrada en la figura 3, obtenemos un circuito como el que se muestra en la figura 4. Nótese que

en el gráfico de la figura 4 no se están mostrando todos las puertas lógicas que forman parte del circuito

combinacional, porque es tarea del alumno completarlo, como veremos más adelante.

Figura 4: Reestructuración de los elementos del circuito para adoptar la forma general de un CSS

Estructura de Computadores 4

3 Descripción estructural de un CSS a partir del circuito

Se pretende describir en Verilog el circuito secuencial síncrono de la figura 4 y que, como sabemos,

es equivalente al de la figura 1. Realizaremos una descripción Verilog de tipo estructural, instanciando e

interconectando módulos .

Para esta parte de la práctica se dispone de los seis archivos Verilog detallados a continuación, en la

tabla 1:

ARCHIVO CONTENIDO TAREA A REALIZAR

biestable_JK.v Descripción Verilog de un biestable JK.

Estudiar su funcionamiento antes de la sesión de laboratorio.

biestable_T.v Descripción Verilog incompleta de un biestable T.

Completar la descripción Verilog durante la sesión de laboratorio.

circuito_combinacional.v Descripción Verilog incompleta del circuito combinacional de la figura 4.

Completar la descripción Verilog durante la sesión de laboratorio.

circuito_secuencial.v Descripción Verilog incompleta del circuito secuencial de la figura 4.

Completar la descripción Verilog durante la sesión de laboratorio.

biestable_T_tb.v Descripción Verilog del modulo de testbench del módulo biestable_T.

Usarlo durante la sesión de laboratorio para probar que el módulo biestable_T funciona correctamente.

circuito_secuencial_tb.v Descripción Verilog del modulo de testbench del módulo circuito_secuencial.

Usarlo durante la sesión de laboratorio para probar que el módulo circuito_secuencial funciona correctamente. Modificarlo durante la sesión de laboratorio para probar nuevas secuencias de entrada.

Tabla 1

3.1 Creación del proyecto.

Cree un proyecto en el entorno ISE, tal y como aprendió en la primera práctica, dándole el nombre

que prefiera. Recuerde que no puede aparecer ningún carácter acentuado en ninguna parte de la ruta

de carpetas que conduce al proyecto.

Añada al proyecto, de una sola vez, los seis archivos de la tabla 1, salvo que su profesor le indique

que debe ir añadiendo los archivos al proyecto conforme los vaya necesitando.

3.2 Descripción Verilog del biestable T

Complete el módulo biestable_T presente en el archivo biestable_T.v (fragmento de código 1). Luego

utilice el testbench del archivo biestable_T_tb.v para comprobar que funciona correctamente. El aspecto

de los primeros 50 ns de la simulación debe ser idéntico al de la figura 5. Fíjese bien en los resultados

completos de la simulación y si cree que el biestable T que ha diseñado no funciona correctamente

revise el código Verilog y modifíquelo hasta que esté usted conforme con lo que ve en la simulación.

Cuando crea que todo es correcto conteste a las siguientes cuestiones sobre la simulación:

1. ¿Cómo se puede apreciar, en la simulación, que la señal de clear (cl) es asíncrona?

Estructura de Computadores 5

2. ¿En que instantes (en ns) se pone a 1 el biestable?

3. ¿En qué instantes (en ns) se pone a 0 el biestable sin que sea a causa de la señal de clear (cl)?

Para averiguar fácilmente los tiempos que se le preguntan puede hacer click sobre las formas de

onda con el ratón. Esto hace que aparezca en esa posición un cursor amarillo, como el que se ve en la

figura 5, que le informa del valor del tiempo de simulación en ese instante. De forma similar, al hacer

click y arrastrar el ratón sobre las formas de onda aparecen dos cursores y podemos medir diferencias

de tiempo.

// Biestable T sincronizado por flancos de subida de reloj.// Tiene una señal de clear 'cl' asincrona, activa en baja.

module biestable_T( input clk, input T, input cl, // 'cl' es asincrona y activa en baja output reg q ); // Describa el funcionamiento del biestable T de forma // procedimental utilizando un bloque 'always' // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO

endmodule

Fragmento de código 1: Contenido del archivo biestable_T.v

Figura 5: Resultado de simular el testbench biestable_T_tb

3.3 Descripción Verilog del circuito combinacional

Complete el módulo circuito_combinacional presente en el archivo circuito_combinacional.v

(fragmento de código 2) de forma que su funcionamiento corresponda al del circuito combinacional de la

figura 4. Un buen método para no equivocarse en esta tarea sería dibujar primero, sobre el bloque del

circuito combinacional de la figura 4, las puertas lógicas que faltan y que hacen que su comportamiento

sea equivalente al de la figura 1.

Si comete algún error al describir el módulo circuito_combinacional, el error debería detectarse

cuando ejecute, más adelante, el testbench del módulo circuito_secuencial que, como ya se intuye en la

figura 4, va a contener una instancia del módulo circuito_combinacional.

Estructura de Computadores 6

// modulo circuito_combinacional

module circuito_combinacional(

input x, input q1, input q2, output z, output T1, output J2, output K2 );

// Del esquema del circuito secuencial se ha // sacado la ecuacion de la salida 'z' y se ha // descrito con un 'assign'. assign z = x & q2;

// Saque usted de dicho esquema las ecuaciones // de excitacion de los biestables y describalas // todas con varios 'assign' justo a continuacion // ESCRIBA AQUI UN 'assign' // ESCRIBA AQUI OTRO 'assign' // ESCRIBA AQUI OTRO 'assign'

endmodule

Fragmento de código 2: Contenido del archivo circuito_combinacional.v

3.4 Descripción Verilog del circuito secuencial

En este apartado debe completar el módulo circuito_secuencial presente en el archivo

circuito_secuencial.v (fragmento de código 3) de forma que su funcionamiento se corresponda con el del

circuito secuencial representado en la figura 4.

Dispone del esquema de la figura 7 para facilitarle el trabajo. En dicho esquema se muestran las tres

instancias de módulos que forman parte del módulo circuito_secuencial. La figura 7 muestra, para evitar

errores, los nombres de todos los elementos (los módulos, las instancias, los puertos de entrada y de

salida de los módulos y los cables necesarios) de manera idéntica a como aparecen en las diferentes

descripciones Verilog que estamos manejando.

Cuando haya terminado de modificar el archivo circuito_secuencial.v utilice el testbench del archivo

circuito_secuencial_tb.v para comprobar que el módulo circuito_secuencial funciona correctamente. El

aspecto de la simulación durante los primeros 150 ns debe ser el de la figura 6. Si la respuesta del

circuito a las formas de onda generadas por el testbench no es la adecuada, sin duda es porque ha

cometido algún error en este mismo apartado o bien en el apartado anterior (el del módulo

circuito_combinacional), por lo que tendrá que averiguar en qué se ha confundido y solventar el error.

Estructura de Computadores 7

// modulo circuito_secuencial//// Definido de forma estructural, mediante la interconexion// de instancias de otros modulos previamente definidos.

module circuito_secuencial( input clk, input x, input clear, output z );

// Cables necesarios para unir las instancias // de los dos biestables y del circuito combinacional wire cable_T1_T, cable_J2_J, cable_K2_K, cable_q_q1, cable_q_q2; // Instancia del modulo biestable_JK biestable_JK instancia_biestable_JK( .clk(clk), .J(cable_J2_J), .K(cable_K2_K), .cl(clear), .q(cable_q_q2) );

// Instancia del modulo biestable_T // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO

// Instancia del modulo circuito_combinacional // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO // ESCRIBA AQUI SU CODIGO

endmodule

Fragmento de código 3: Contenido del archivo circuito_secuencial.v

Figura 6: Primera parte del resultado de simular el testbench circuito_secuencial_tb

Si piensa que los resultados de la simulación del módulo circuito_secuencial_tb son correctos,

conteste a las siguientes preguntas:

1. El testbench del archivo circuito_secuencial_tb.v inyecta al módulo circuito_secuencial una

secuencia de ceros y unos sincronizada con el reloj. ¿Cuál es la secuencia completa dígitos

binarios que está generando el módulo de testbench en la entrada 'x' para probar si funciona

correctamente el circuito secuencial?

2. ¿Cuántos pulsos de nivel alto aparecen en la salida 'z' del circuito_secuencial en respuesta a la

secuencia de entrada? ¿Cuánto dura cada pulso (en ns)?

3. ¿Habría sido la salida 'z' distinta si el circuito detector de la secuencia 111 estuviese

programado para detectar dicha secuencia de entrada pero sin solapamiento? Indique cómo

habrían sido los pulsos que habrían aparecido en la salida 'z' para este mismo testbench.

Estructura de Computadores 8

Figura 7: Esquema del módulo circuito_secuencial utilizando “nombres Verilog”

3.5 Modificación del testbench del circuito secuencial

Modifique el testbench del archivo circuito_secuencial_tb.v (fragmento de código 4) para comprobar

que el modulo circuito_secuencial funciona correctamente cuando recibe la secuencia de entrada

001110111101111100110. Tenga en cuenta que la parte inicial de esa secuencia ya la está generando

el testbench actual. Tan solo debe añadir al final del archivo de testbench el código necesario para

generar los últimos bits de la secuencia (los nuevos). Si lo hace correctamente, al ejecutar la nueva

simulación ésta debe durar 450 ns y el aspecto de la última parte debe ser el de la figura 8. Cuando crea

que los resultados de la nueva simulación son correctos, conteste a las siguientes preguntas sobre ella:

1. ¿En que instante de tiempo (en ns) termina el pulso de mayor duración (de nivel alto) que se

aprecia en la salida 'z'?

2. ¿Habría cambiado la forma de onda de la salida 'z' si el último pulso de nivel alto de la entrada

'x' hubiese durado 50 ns en lugar de 40 ns? Si es así, indique qué forma habría tenido la salida.

Figura 8: La parte final de la simulación del módulo circuito_secuencial_tb, tras las modificaciones

Estructura de Computadores 9

`timescale 1ns / 1ps

// Modulo de testbench del modulo circuito_secuencial

module circuito_secuencial_tb;

// datos 'reg' para conectar a las entradas del modulo a probar reg tb_clk; reg tb_x; reg tb_clear;

// datos 'wire' para conectar a las salidas del modulo a probar wire tb_z;

// Instancia del modulo a probar circuito_secuencial instancia_circuito_secuencial ( .clk(tb_clk), .x(tb_x), .clear(tb_clear), .z(tb_z) );

always begin // always: Siempre generando reloj de periodo 20ns #10; // espero 10ns ... tb_clk = ~tb_clk; // ...y ahora invierto la señal de reloj end initial // initial: solo se ejecuta una vez al inicio begin

tb_clk = 0; tb_x = 1'bZ; // Inicialmente 'x' está desconectada (alta impedancia = Z) tb_clear = 1; // Empiezo con el 'clear' asincrono DES-activado. #5; tb_clear = 0; // Activo 'clear' asincrono poco antes del primer flanco de subida. @(posedge tb_clk); @(posedge tb_clk); tb_clear = 1; // DES-activo 'clear' justo después de flanco subida.

// Generación se la secuencia de entrada. tb_x = 0; repeat (2) // x=0 durante 2 ciclos. @(posedge tb_clk);

tb_x = 1; repeat (3) // x=1 durante 3 ciclos. @(posedge tb_clk);

tb_x = 0; repeat (1) // x=0 durante 1 ciclo. @(posedge tb_clk);

tb_x = 1; repeat (4) // x=1 durante 4 ciclos. @(posedge tb_clk);

tb_x = 0; repeat (1) // x=0 durante 1 ciclo. @(posedge tb_clk);

// ESCRIBA AQUI EL NUEVO CODIGO PARA // GENERAR NUEVAS SECUENCIAS DE ENTRADA // AL CIRCUITO SECUENCIAL.

$finish; end

endmodule

Fragmento de código 4: Contenido del archivo de testbench circuito_secuencial_tb.v

Estructura de Computadores 10

4 Descripción Verilog de una FSM a partir del diagrama de estados

Se pretende describir en Verilog la maquina de estados finitos (FSM) cuyo diagrama de estados se

muestra en la figura 2. Esta descripción debe comportarse, como es lógico, de forma idéntica al circuito

de la figura 4, pero no la vamos a obtener como hemos hecho anteriormente, a partir de dicho circuito,

sino que vamos a obtener el código Verilog directamente, a partir del diagrama de estados, usando la

técnica explicada en el tema 1 de EdC.

Para esta parte de la práctica se dispone de los archivos Verilog que a continuación se detallan en la

tabla 2:

ARCHIVO CONTENIDO TAREA A REALIZAR

fsm.v Descripción Verilog incompleta de la máquina de estados (FSM) cuyo diagrama de estados se muestra en la figura 2.

Completar la descripción Verilog durante la sesión de laboratorio.

fsm_tb.v Descripción Verilog del módulo de testbench del módulo fsm.

Usarlo durante la sesión de laboratorio para probar que el módulo fsm funcionacorrectamente.

Tabla 2

4.1 Añadir los nuevos archivos al proyecto.

Añada al proyecto que ya tiene creado los dos archivos de la tabla 2. Tenga en cuenta que es normal

que le aparezcan errores de sintaxis en el panel de Consola y en el panel de Errores, pues el archivo

fsm.v está incompleto.

4.2 Descripción procedimental en Verilog a partir del diagrama de estados

Complete el modulo fsm presente en el archivo fsm.v (fragmento de código 5) de forma que

represente el funcionamiento de una máquina de estados finitos con un diagrama de estados como el de

la figura 2 (recuerde la técnica vista en el tema 1 de EdC)

Utilice el testbench del archivo fsm_tb.v para comprobar que el módulo fsm funciona correctamente.

El testbench fsm_tb le está suministrando la secuencia de entrada 001110111101111100110 al

módulo fsm y el comportamiento de dicho módulo debe ser el mismo que tendría el módulo

circuito_secuencial pues debe recordar que el diagrama de estados del que hemos partido (el de la

figura 2) lo obtuvimos analizando el circuito secuencial de la figura 1. Si observa un comportamiento

diferente en el módulo fsm es debido a algún fallo en la descripción procedimental. En ese caso, revise

con cuidado lo que ha hecho hasta encontrar el error y arreglarlo.

Si la simulación es correcta conteste a las siguientes preguntas:

1. ¿En que instantes (en ns) se producen flancos de subida en la salida 'z' del módulo fsm?

2. ¿En qué instante empieza (en ns) y cuanto dura (en ns) el pulso de nivel alto de mayor duración

que genera el módulo de testbench en la entrada 'x'?

Estructura de Computadores 11

// Modulo fsm

// Descripcion procedimental en Verilog de// una maquina de estados (FSM) obtenida de// forma directa a partir de su diagrama de estados.

module fsm( input x, output reg z, input clk, input clear // El 'clear' es asincrono y activo en baja. ); reg [1:0] current_state, next_state; // Complete la declaracion de los estados. parameter A = // RELLENE LO QUE FALTA // RELLENE LO QUE FALTA // RELLENE LO QUE FALTA // Bloque 'always' para generar 'current_state' always @ ( ) // RELLENE LA LISTA DE SENSIBILIDAD if (clear==0) current_state <= A; else current_state <= next_state;

// Bloque 'always' para generar 'next_state' y salida 'z' always @ * begin z=0; case (current_state) A: if (x==1) next_state=B; else next_state=A;

// RELLENE EL 'case' CON LOS ESTADOS QUE FALTAN // RELLENE EL 'case' CON LOS ESTADOS QUE FALTAN // RELLENE EL 'case' CON LOS ESTADOS QUE FALTAN

default: begin z=1'bX; next_state=2'bXX; end endcase end endmodule

Fragmento de código 5: Contenido del archivo fsm.v

4.3 Circuito equivalente a la descripción procedimental de la FSM

Aunque lo único que hemos hecho hasta ahora con las descripciones Verilog ha sido ejecutar

simulaciones, no debemos olvidar que lo que estamos describiendo en Verilog es el funcionamiento de un

circuito.

Las herramientas de síntesis del entorno de desarrollo ISE de Xilinx son capaces de analizar una

descripción Verilog y a partir de ella sintetizar (generar) el diseño de un circuito cuyo funcionamiento

sea equivalente al descrito en Verilog.

Vamos a seguir una serie de pasos para usar una herramienta de síntesis que nos permita ver el

circuito equivalente del módulo fsm que hemos descrito de forma procedimental. Se trata de la

herramienta (o proceso) llamado View RTL Schematic

Estructura de Computadores 12

Las herramientas o procesos de síntesis están disponibles en la vista de implementación, dentro del

panel de diseño, por lo que debe seleccionar ahora dicha vista, de implementación, tal como muestra

la primera flecha de la figura 9.

Figura 9: Pasos a seguir para ver el esquema gráfico del Top Module

Las herramientas o procesos de síntesis solo pueden aplicarse al Top Module de nuestro

proyecto, es decir, al módulo de nivel más alto, que es el que contiene a otros módulos y no está

contenido en ningún otro. Como nuestro proyecto tiene dos módulos con esas características, el Top

Module actual no es el que nosotros queremos, así que tendremos que hacer click con el botón derecho

del ratón sobre el módulo fsm y seleccionar en el menú contextual la opción Set as Top module para

convertirlo en Top Module. Al hacerlo nos saldrá un mensaje de advertencia como el de la figura 10 al

que debemos responder Yes. Si lo hacemos bien, el módulo fsm aparecerá con un icono específico a su

izquierda, indicando que es el Top Module de nuestro diseño, tal y como indica la segunda flecha de la

figura 9.

El siguiente paso es lanzar el proceso View RTL Schematic. Para ello, habiendo seleccionado con un

click de ratón el módulo fsm en la jerarquía de módulos de la vista de implementación, nos iremos a la

Estructura de Computadores 13

parte de abajo del panel de diseño, al subpanel de procesos, y desplegaremos la rama

Synthesize - XST, que nos mostrará el proceso View RTL Schematic. Ejecutamos (Run) el proceso con

un doble click del ratón, tal y como indica la tercera flecha de la figura 9 y nos aparecerá el cuadro de

diálogo de la figura 11, en el que debemos marcar la opción Start with a schematic of the top-level

block y pulsar OK. Si todo va bien se nos habrá abierto una nueva ventana llamada fsm (RTL1) como

la marcada con la cuarta flecha de la figura 9 en la que podremos ver el esquema de nivel RT (RTL) del

módulo fsm, de momento representando únicamente sus puertos de entrada y de salida.

Figura 10: Confirmamos que queremos cambiar el Top Module del proyecto

Figura 11: Confirmamos que queremos empezar viendo el esquema del módulo de más alto nivel

Haciendo doble click sobre recuadro que representa el módulo fsm se nos abre un nuevo esquema

mostrando más detalles sobre el funcionamiento interno de ese módulo. Seguramente tengamos que

hacer uso de los iconos que regulan el zoom ( Zoom In, Zoom Out y Zoom to Full View) para

poder ver el esquema en su totalidad (de forma análoga a como se hacía en el simulador ISim para ver

las formas de onda al tamaño adecuado).

Si continuamos haciendo doble click varias veces sobre los nuevos módulos que nos van apareciendo

(ajustando siempre el zoom en cada esquema) llegaremos a un punto en el que no podremos adentrarnos

más y en el que veremos el diseño a nivel RT (RTL) del circuito que las herramientas de síntesis han

obtenido a partir de la descripción Verilog del módulo fsm.

Estructura de Computadores 14

El esquema de ese circuito es como el mostrado en la figura 12 y en él se aprecian algunas puertas

lógicas y un par de biestables, interconectados formando un circuito secuencial síncrono (CSS).

Nótese que si queremos anular un doble click hecho sobre un módulo del esquema y volver atrás, al

esquema anterior, podemos hacerlo pulsando el icono Previous Schematic o bien usando la opción

del menú View > Previous Schematic

Figura 12. Circuito equivalente a la descripción procedimental en Verilog del módulo fsm

Un análisis cuidadoso del circuito de la figura 12 nos revelaría que si bien es cierto que el diagrama

de estados de la máquina de estados que implementa dicho circuito es idéntico al de la figura 2, vemos

que la herramienta de síntesis se ha tomado la libertad de cambiar la asignación de códigos efectuada a

los diferentes estados de la máquina. Ha utilizado los códigos binarios 00, 01 y 11 para los estados A, B y

C en lugar de los códigos binarios 00, 01 y 10, que son los que seguramente haya usted usado en el

módulo fsm del archivo fsm.v. El motivo de esto es, simplemente, que la herramienta de síntesis intenta

obtener un circuito funcionalmente equivalente al descrito, pero además pretende cumplir ciertos

criterios de optimización (de coste, velocidad, etc.) que aunque no le hayamos indicado expresamente,

están ahí. Es para satisfacer esos criterios de optimización por lo que que a veces la herramienta de

síntesis hace cosas como la que estamos comentando.