Skip to content

05_ASMD

José Fernando Picó Antolí edited this page Nov 6, 2021 · 40 revisions

Algorithmic State Machine Datapath.

  • Podemos ver un SISTEMA DIGITAL como un conjunto formado por un DATAPATH y una UNIDAD DE CONTROL (FSM), la unidad de control estará formada por una máquina de estados que puede recibir señales DIGITALES EXTERNAS como pulsadores, distintos tipos de sensores, encoders, etc. Estas señales externas no estarán sincronizadas con el reloj del sistema digital por lo que por lo normal se deberán de pasar por un sincronizador ( dos biestables D en serie ) y en muchas ocasiones ( pulsadores mecánicos ) se deberá emplear un circuito "anti-rebotes". Por otra parte, la unidad de control gestionará el envío de las señales de control hacia el Datapath y recibirá las señales de respuesta enviadas por el Datapath a la unidad de control.

  • Pero, ¿ Qué es el DATAPATH ?. Podemos decir que el datapath estará formado por distintos componentes digitales que se pueden controlar en su conjunto para realizar unas tareas concretas, fluyendo datos a través del sistema digital, estaría formado pues por componentes como, contadores, temporizadores, registros de desplazamiento, registros de carga, memorias, transmisores serie, otras máquinas de estado... El Datapath puede recibir datos de entrada que se cargarán al sistema digital, y generará datos de salida.

  • Para que todo el conjunto digital funcione en sincronía la unidad de control será la encargada de gobernar el ritmo de trabajo enviando las señales de control necesarias cuando se requieran, para ello recibirá las señales de respuesta del datapath que le ofrecerán la información que necesita la unidad de control para gestionar el datapath.

  • Podemos ver un esquema gráfico de lo que sería un sistema digital en las siguientes figuras:

Sistema Digital

Sistema Digital

  • Un ASMD chart estará formado por un ASM chart normal donde además se indica información del Datapath
    • ASMD chart = ASM chart + relación con DATAPATH

  • Un ASMD chart está formado distintos bloques "ASMD block" donde cada bloque equivale a un estado de una máquina de estados, cada bloque se ejecuta en un único ciclo de reloj del sistema, esto nos facilita ver una visión temporal ( cuantos ciclos se emplean a lo largo del sistema digital ).

  • Un bloque ASMD está formado por:

    • Una CAJA DE ESTADO.
    • Una CAJA DE DECISIÓN.
    • Una CAJA CONDICIONAL.
  • Las tres cajas del bloque se procesan en un ciclo de reloj y representan un estado como ya habíamos mencionado.

CAJA DE ESTADO.

  • La caja de estado se representa como ** un rectángulo** formado por:
    • Nombre del estado
    • Señales de salida Moore (salidas en función del estado en el que te encuentras).
    • Operaciones con registros sin condición ( se realizan nada más que por el hecho de estar en dicho estado, no están sometidas a ninguna condición)
    • en la parte exterior, en una esquina se puede poner el código binario con el cual se representa el estado en el que estamos.

CAJA DE DECISIÓN.

  • Se representan con un rombo donde dentro se indica la señal de entrada, variable, etc sobre la cual se establece una condición determinada donde en función de dicha condición se establecerá el camino hacia donde discurre el sistema. Tendremos dos posibles caminos, TRUE o FALSE, se pueden encadenar distintas cajas de decisión.

CAJA CONDICIONAL

  • Se representa como un rectángulo con los bordes redondeados donde en su interior se muestra:
    • Señales de salida Mealy donde las salidas son función de las entradas (condición) y el estado donde se encuentra.
    • Operaciones de registros condicionadas a dicha condición de entrada.

Las operaciones que se producen en el Datapath no pertenecen al controlador propiamente dicho ( máquina de estado ) por lo cual no se indican dentro de ninguna de las cajas del bloque ASMD pero si se indican a lo largo del camino fuera de las cajas para establecer visualmente una relación con los elementos de un Datapath.

  • Las señales que gobiernan las operaciones que se realizan en el Datapath si pertenecen al controlador y se incluyen bien en la caja de estado si son señales Moore o en la caja condicional si son señales Mealy.

  • En un ASMD chart las operaciones con los registros se ejecutan todas a la vez ( concurrentes ) al final de cada bloque ASMD y en un ciclo de reloj por bloque ASMD.

  • En un ASMD chart se asocia una transición de estado con las operaciones que se realizan en el DATAPATH y las señales que disparan dichas operaciones.

  • En la siguiente figura vemos las partes que formaría un bloque ASMD dentro de un ASMD chart:

Bloque ASMD

CREAR ASMD chart

Vamos a indicar alguna pauta para crear un ASMD chart.

  • Partimos de un ASM chart (Algoritmo de máquina de estados tradicional) con los estados y señales que causan la transición de un estado a otro.

  • Se anotan en los bordes de las distintas cajas ( de estado/decisión/condicional) las operaciones que se producirían en el Datapath.

  • Se añaden a las cajas que correspondan (estado/condicional) las señales de control que gobernarán el Datapath.

  • No se incluyen todas las señales de control, solo se añaden las señales que sufrirán un cambio.

  • Se omite el reset ( asíncrono para todo el sistema ).

  • Un bloque ASMD se trata como una unidad donde todo se produce en un ciclo de reloj, todas las operaciones en el flanco positivo/negativo del reloj.

  • Después de una caja condicional podría volver a incluirse otra caja de decisión y otras cajas condición y así sucesivamente pero siempre hay que tener en cuenta la relación temporal de las operaciones que se incluyen en un bloque ASMD ya que todas las operaciones que están dentro del mismo bloque ASMD se producirán en el mismo ciclo de reloj, habrá que por lo tanto tenerlo en cuenta para saber si esto es lo que queremos o queremos que se realicen en otro estado por lo tanto, en el siguiente ciclo de reloj.

EJEMPLO ASMD.

  • Vamos a mostrar un pequeño ejemplo con fin didáctico para mostrar el desarrollo de un sistema digital.

  • Queremos realizar un sistema digital que realice lo siguiente:

    • Queremos que al pulsar el botón "start" se transmitan cada 4 segundos por un puerto serie 4 datos, el 1,2,3 y cambio de línea ( \n ) y una vez terminado el último envío no se repita hasta que no se vuelva a pulsar el botón inicio.
  • Si se pulsa el botón reset volvemos al estado inicial.

  • Para conseguir esto, disponemos de un DATAPATH formado por:

    • Un Contador que se encargará de gobernar un Multiplexor por el cual entrará el dato adecuado a transmitir.
    • Un registro de 8 bits sobre el cual se cargará el dato correcto para transmitir por el puerto serie
    • Un módulo transmisor serie encargado de transmitir el dato por el puerto serie cuando este este disponible.
    • Un temporizador que se encargará de controlar los 4 segundos que se desean de espera entre dato y dato.
  • Con dicho DATAPATH y con los requisitos a cumplir, tendremos que realizar una máquina de estado que controle toda la comunicación ordenada con el Datapath.

  • El controlador tendrá como entradas:

    • n[2:0].Valor del contador que controla el Multiplexor.
    • FIN_T1. Comunicará al controlador que el temporizador T1 ha terminado.
    • START. para recibir las señal de arranque del circuito digital.
    • reset. Nos permitirá llevar el sistema al estado inicial
    • clk. reloj del sistema.
  • Como salidas tendremos:

    • INICIA_T1. Para indicar al temporizador T1 que inicie la cuenta de los 4 segundos.
    • RESET_N. Para poder resetear el contador que gobierna el multiplexor.
    • INC_N. Para incrementar el contador.
    • LOAD_DATO. Para cargar el valor del multiplexor en un registro.
    • TX_DATO. Para indicar al módulo transmisor que debe transmitir el dato que tiene a su entrada.
  • Podemos ver un esquema gráfico del Datapath y controlador en la siguiente figura:

Esquema

  • Podemos ver el resumen de las señales que tendrá nuestro controlador en la siguiente figura:

Controlador

ASMD Chart

  • Para nuestro ejemplo construiremos el siguiente ASMD chart:

ASMD Chart

  • El ASMD chart está formado por 4 bloques ASMD ( 4 estados )

bloque ASMD S0

  • En la caja de estado S0, RESET_N se pondrá a 1 provocando reset del contador N, indicamos ese reseteo del contador del Datapath con la anotación N <= 0.
  • Cuando se pulsa el botón de Start el sistema cambiará al estado S1.
  • En un ciclo de reloj se examinará la señal Start por lo cual para que pueda ser capturada con garantías dicha señal que viene de un pulsador debe sincronizarse con el reloj del sistema así como aplicarle una antirrebote ya que es una señal asíncrona que puede ocurrir en cualquier momento.

bloque ASMD S1

  • En la caja de estado S1 la señal INICIA_T1 se pone a 1 para arrancar el temporizador T1, indicamos dicha acción del temporizador del Datapath con la anotación arranca_T1, tenemos una caja de decisión para saber si el temporizador ha finalizado para ello observamos la señal de entrada FIN_T1 mientras FIN_T1 =0 seguiremos en el estado S1 y cuando FIN_T1 = 1 aplicaremos la señal Mealy de salida LOAD_DATO = 1 para capturar el valor del multiplexor en el Registro (indicamos la acción del Datapath con q<= OUT_MUX) y cambiar al estado S2.
  • En un mismo ciclo de reloj se examinará la señal FIN_T1 y se ejecutará la señal LOAD_DATO = 1, la señal FIN_T1 viene del Datapath cuyas señales se suponen sincronizadas con el reloj del sistema, igualmente, nuestra señal generada LOAD_DATO está sincronizada con el reloj del sistema.

bloque ASMD S2

  • En la caja de estado estado S2 no tenemos ninguna señal Moore a realizar ni señales de interacción con el Datapath, seguimos con una caja de decisión donde valoramos si el valor del contador es mayor o igual a 4 N >= 4, en caso de ser cierto, se aplicará una señal Mealy RESET_N=1 ( se indica la interacción con el Datapath con N < = 0 ) y volvemos al estado S0. Si N < 4 aplicamos la señal de Mealy TX_DATO = 1 para indicar al módulo serie del Datapath que inicie la transmisión serie del dato que tiene a su entrada ( indicamos la acción con el Datapath con la anotación "inicia Tx Serie") y cambiamos al siguiente bloque ASMD ( estado S3).
  • En un mismo ciclo de reloj se realiza el chequeo de N >=4 y la emisión de la señal RESET_N=1 o TX_DATO=1.

bloque ASMD S3

  • En la caja de estado S3 no tenemos ninguna acción y pasamos a la caja de decisión donde observamos si la transmisión del dato serie ha terminado ¿ DATO_TX=1 ?, mientras no haya terminado la transmisión serie del dato nos mantendremos en el estado S3 y en caso contrario pasaremos a la caja condicional donde aplicaremos la señal INC_N = 1 para indicar al contador que se incremente en uno su valor ( la acción que se produce en el Datapath la indicamos con la anotación N <= N + 1) y volveremos al estado S1 para continuar con la trasmisión del resto de datos.
  • En un mismo ciclo de reloj se valora si el dato ha terminado de transmitirse ( ¿ DATO_TX = 1 ?) y el incremento del contador INC_N=1 ( cuando se cumpla la caja de decisión ).

Del ASMD Chart a un FSMD

  • Podemos convertir el ASMD Chart en un FSM o FSMD ( añadiendo anotaciones de las acciones que realiza el Datapath ) ya que cada bloque ASMD equivale a un estado, las señales dentro de la caja de estado se corresponden con *señales Moore y las cajas de decisión corresponden con la señal que inicia la transición (arco de la transición) y la señal de la caja condicional con la señal Mealy que se añade como salida Mealy en el arco de transición del gráfico de una máquina de estados FSM.

  • En la siguiente figura podemos ver la conversión a FSMD:

ASMD_FSMD

CREACIÓN DEL CONTROLADOR

  • Una vez creado nuestro ASMD Chart o FSMD podemos desarrollar un módulo del controlador definiendo las señales de entrada/salidas correspondientes y creando nuestra máquina de estados usando cualquiera de los modelos recomendados en los apartados anteriores.

  • En este caso vamos a realizar el controlador usando el modelo donde la máquina se creaba usando un always secuencial en el cual se asignaba al estado actual el estado siguiente y otro always combinacional donde se calcula el estado siguiente en función (estado actual y valor de las entradas) y a la vez se controlan las señales de salida.

  • El módulo a crear sería como el de la figura siguiente:

Mi_maquina

  • El código verilog sería:
parameter [1:0] S0=0,S1=1,S2=2,S3=3;

reg INICIA_T1=0,RESET_N=0,INC_N=0, LOAD_DATO=0,TX_DATO=0;

reg [1:0]  estadoActual=0, estadoNext=0;

// bloque secuencial. Capturar estado Actual
always @(posedge clk or posedge reset)
if(reset) estadoActual <= S0;
else estadoActual <= estadoNext;

// Bloque combinacional. Calculamos estado siguiente y valor de las
// salidas en función de las entradas y del estado.
always @(*)  // * para todas
begin
  //valores por defecto
  INICIA_T1    = 0;
  RESET_N      = 0;
  INC_N        = 0;
  LOAD_DATO    = 0;
  TX_DATO      = 0;
  estadoNext   = 'bx; //Depuración
  
  case(estadoActual)
     S0:begin                                   RESET_N=1;
        if(START)         estadoNext = S1;
        else              estadoNext = S0;
        end
     S1:begin
                                                INICIA_T1 = 1'b1;
        if(FIN_T1) begin                        LOAD_DATO = 1'b1;
                          estadoNext = S2; end
        else              estadoNext = S1;
        end
     S2:begin
        if (n >= 4) begin                         RESET_N = 1'b1;
                          estadoNext = S0; end
        else begin                                TX_DATO = 1'b1;
                          estadoNext = S3; end
        end                  
     S3: if(DATO_TX)      estadoNext = S3;
         else begin                               INC_N   = 1'b1;
                          estadoNext = S1; end
     default:             estadoNext = S0;
   endcase
end
  • En Icestudio quedaría un módulo como el siguiente:

Módulo

  • Y el resultado final en Icestudio sería:

Ejemplo

Clone this wiki locally