Maquinas de estado en WINCUPL

Hola a todos!!

Quisiera saber como implementar una maquina de estados en un GAL22V10 tengo el wincupl de atmel esta constaria de 1 bit de control (ascendente y descendente) y 4 estados de 4 bits cada uno

Es lo q llevo
:cry:
Código:
Name     MACH_STATE ;
PartNo   00 ;
Date     21/03/2010 ;
Revision 01 ;
Designer Engineer ;
Company  ceti ;
Assembly None ;
Location  ;
Device   g22v10 ;

/* *************** INPUT PINS *********************/
PIN   1  = CLK                        ; /*                                 */ 
PIN   2  = AD                         ; /*                                 */ 


/* *************** OUTPUT PINS *********************/
PIN  20   =         S0                ; /*                                 */ 
PIN  21   =         S1                ; /*                                 */ 
PIN  22   =         S2                ; /*                                 */ 
PIN  23   =         S3                ; /*                                 */ 

....
 

Adjuntos

  • MACH_STATE.GIF
    MACH_STATE.GIF
    4.2 KB · Visitas: 984
Saludos, lo primero que deberás hacer es, crear las ecuaciones que describen la maquina de estados, lo básico con compuertas , o flip flop's y si requieres simplificar puedes usar mapas de Karnaugh o algún otro método, es decir, necesitas esa ecuación y la escribes y debería funcionar esa es la parte clave , aunque si ya las tiene solo es cuestión de implementarlas..

Solo algo de trabajo, pero ya cuentas con las entrada y salidas del sistema y eso ya es algo significativo.

PD: recién comienzo a aprender un poco de estos dispositivos.

Suerte.
 
Gracias Elvic, pero es lo que me quiero ahorrar, existe una manera de hacerla con if, next, entre otras funciones. Solo pongo los estados con condicionantes pero no encontre en ningun lado un ejemplo que me explicara realmente como hacerlo.

=/

Muchas gracias por la ayuda pero ya consegui por otros medios como lograrlo
:D

Aqui les dejo la maquina que ocupe para el control de motores a pasos.

Código:
Name     FULL_STEP ;
PartNo   00 ;
Date     23/03/2010 ;
Revision 01 ;
Designer Jaime ;
Company  CETI ;
Assembly None ;
Location  ;
Device   g22v10 ;


/* *************** INPUT PINS *********************/
PIN   1  = CLK                        ; /*                                 */ 
PIN   2  = AD                         ; /*        ASCENCENTE                         */ 

/* *************** OUTPUT PINS *********************/
PIN  20   =         S0                ; /*   bobina 1                              */ 
PIN  21   =         S1                ; /*   bobina 1                              */ 
PIN  22   =         S2                ; /*   bobina 2                              */ 
PIN  23   =         S3                ; /*   bobina 2                              */ 

field maquina=[S0,S1,S2,S3];

$define SA 'b' 0000
$define S0 'b' 0101
$define S1 'b' 1001
$define S2 'b' 1010
$define S3 'b' 0110

sequence maquina{
present SA
next S0;
present S0
if AD  next S1;
if !AD next S3;
present S1
if AD  next S2;
if !AD next S0; 
present S2 
if AD  next S3;
if !AD next S1;
present S3 
if AD  next S0;
if !AD next S2;
}
 
El facil lenguaje de programacion del Wincup, es la ventaja sobre otros como el ABEL ,VHDL, pero cada quien se acomoda a lo que ha trabajado.
Amigo Jaimepsantos ¿Puedes subir información gráfica, tabla de verdad, diagrama de estados, objetivo, etc., de tu proyecto?. Ya que me interesa a fin de reforzar algunos conocimientos sobre PLD`s, hacerlos como práctica en mi universidad.
Recibe un saludo y felicidades por encontrar solución a tu problema.
 
Que tal beto DJ aqui te incluyo alguna informacion sobre el proyecto:

Trata de un control sencillo de un motor a paso donde con un bit este gira hacia un lado o hacia otro (AD) cambiando la secuencia, el programa consiste en la maquina de estado que se programa en un GAL22V10 de Latice.

El objetivo es sencillo lograr el control de un motor a paso mediante una maquina de estado.

La maquina se inicializa en cero para que comienze a funcionar despues de esto solo interviene el bit de control y la secuencia es ciclica.
 

Adjuntos

  • SIM_FULLSTEP.PNG
    SIM_FULLSTEP.PNG
    25.4 KB · Visitas: 281
  • FULL STEP.rar
    4 KB · Visitas: 545
Saludos, muy bien, que bueno que hayas solucionado el problema que tenías con la programación de la máquina de estados, ya que no te puede ayudar en mucho....:oops:

Me he puesto a simular tu código en el Proteus y si, realmente si funciona, tal como lo comentas(y).

Les dejo una captura de pantalla de tu codigo simulado y por supuesto el archivo creado en Proteus... para que puedan ver.. y por supuesto la imagen no hay manera de ver la dirección de giro,:LOL: pero he puesto las dos condiciones en el pin2.

Suerte
 

Adjuntos

  • FULL STEP.rar
    18.9 KB · Visitas: 391
  • maquina.JPG
    maquina.JPG
    40.9 KB · Visitas: 377
No habia visto el tema, yo les muestro mis tres máquinas de estado para control de motores a pasos en distintas configuraciones con bit de control de giro y bit de control para avanzar o mantenerse fijo.

Código:
Name     FULL_STEP ;
PartNo   00 ;
Date     06/04/2010 ;
Revision 01 ;
Designer EARL ;
Company  CETI Colomos ;
Assembly None ;
Location  ;
Device   G22V10 ;

/* *************** INPUT PINS *********************/
PIN   1  = CLK                        ; /*                                 */ 
PIN   2  = STOP                       ; /*                                 */ 
PIN   3  = AVANZA                     ; /*                                 */ 

/* *************** OUTPUT PINS *********************/
PIN  14   =         S0                ; /*                                 */ 
PIN  15   =         S1                ; /*                                 */ 
PIN  16   =         S2                ; /*                                 */ 
PIN  17   =         S3                ; /*                                 */ 


field cont=[S0,S1,S2,S3];

$define S0 'b'0000
$define S1 'b'0101
$define S2 'b'1001
$define S3 'b'1010
$define S4 'b'0110

sequence cont{
present S0 next S1;

present S1
if STOP&AVANZA next S1;
if STOP&!AVANZA next S1;
if !STOP&AVANZA next S2;
if !STOP&!AVANZA next S4;

present S2
if STOP&AVANZA next S2;
if STOP&!AVANZA next S2;
if !STOP&AVANZA next S3;
if !STOP&!AVANZA next S1;

present S3
if STOP&AVANZA next S3;
if STOP&!AVANZA next S3;
if !STOP&AVANZA next S4;
if !STOP&!AVANZA next S2;

present S4
if STOP&AVANZA next S4;
if STOP&!AVANZA next S4;
if !STOP&AVANZA next S1;
if !STOP&!AVANZA next S3;
}

Código:
Name     HALF_STEP ;
PartNo   00 ;
Date     06/04/2010 ;
Revision 01 ;
Designer EARL ;
Company  CETI Colomos ;
Assembly None ;
Location  ;
Device   G22V10 ;

/* *************** INPUT PINS *********************/
PIN   1  = CLK                        ; /*                                 */ 
PIN   2  = STOP                       ; /*                                 */ 
PIN   3  = AVANZA                     ; /*                                 */ 

/* *************** OUTPUT PINS *********************/
PIN  14   =         S0                ; /*                                 */ 
PIN  15   =         S1                ; /*                                 */ 
PIN  16   =         S2                ; /*                                 */ 
PIN  17   =         S3                ; /*                                 */ 

field cont=[S0,S1,S2,S3];

$define S0 'b'0000
$define S1 'b'1010
$define S2 'b'0010
$define S3 'b'0110
$define S4 'b'0100
$define S5 'b'0101
$define S6 'b'0001
$define S7 'b'1001
$define S8 'b'1000

sequence cont{
present S0 next S1;

present S1
if STOP&AVANZA next S1;
if STOP&!AVANZA next S1;
if !STOP&AVANZA next S2;
if !STOP&!AVANZA next S8;

present S2
if STOP&AVANZA next S2;
if STOP&!AVANZA next S2;
if !STOP&AVANZA next S3;
if !STOP&!AVANZA next S1;

present S3
if STOP&AVANZA next S3;
if STOP&!AVANZA next S3;
if !STOP&AVANZA next S4;
if !STOP&!AVANZA next S2;

present S4
if STOP&AVANZA next S4;
if STOP&!AVANZA next S4;
if !STOP&AVANZA next S1;
if !STOP&!AVANZA next S3;

present S5
if STOP&AVANZA next S5;
if STOP&!AVANZA next S5;
if !STOP&AVANZA next S6;
if !STOP&!AVANZA next S4;

present S6
if STOP&AVANZA next S6;
if STOP&!AVANZA next S6;
if !STOP&AVANZA next S5;
if !STOP&!AVANZA next S7;

present S7
if STOP&AVANZA next S7;
if STOP&!AVANZA next S7;
if !STOP&AVANZA next S8;
if !STOP&!AVANZA next S6;

present S8
if STOP&AVANZA next S8;
if STOP&!AVANZA next S8;
if !STOP&AVANZA next S7;
if !STOP&!AVANZA next S1;
}

Código:
Name     WAVE_STEP ;
PartNo   00 ;
Date     06/04/2010 ;
Revision 01 ;
Designer EARL ;
Company  CETI Colomos ;
Assembly None ;
Location  ;
Device   G22V10 ;

/* *************** INPUT PINS *********************/
PIN   1  = CLK                        ; /*                                 */ 
PIN   2  = STOP                       ; /*                                 */ 
PIN   3  = AVANZA                     ; /*                                 */ 

/* *************** OUTPUT PINS *********************/
PIN  14   =         S0                ; /*                                 */ 
PIN  15   =         S1                ; /*                                 */ 
PIN  16   =         S2                ; /*                                 */ 
PIN  17   =         S3                ; /*                                 */ 

field cont=[S0,S1,S2,S3];

$define S0 'b'0000
$define S1 'b'0001
$define S2 'b'1000
$define S3 'b'0100
$define S4 'b'0010

sequence cont{
present S0 next S1;

present S1
if STOP&AVANZA next S1;
if STOP&!AVANZA next S1;
if !STOP&AVANZA next S2;
if !STOP&!AVANZA next S4;

present S2
if STOP&AVANZA next S2;
if STOP&!AVANZA next S2;
if !STOP&AVANZA next S3;
if !STOP&!AVANZA next S1;

present S3
if STOP&AVANZA next S3;
if STOP&!AVANZA next S3;
if !STOP&AVANZA next S4;
if !STOP&!AVANZA next S2;

present S4
if STOP&AVANZA next S4;
if STOP&!AVANZA next S4;
if !STOP&AVANZA next S1;
if !STOP&!AVANZA next S3;
}

Espero sirvan de algo! :)
 
Última edición:
Earl, te digo que mas sencillo apagar el motor ponle el clock a una or + un uno o cero, así se mantiene el estado Y NO HAY TRANSICIÓN
IN-------OUT
CLK--0--CLK
CLK--1---1
 
Con esto me evito tener que cablear esa AND y es lo mismo en cuanto a funcionalidad. Pero buena opcion! :)
 
Última edición:
Aunque tuve un problemita, el motor a pasos solo giraba hacia un lado y hacia el otro no giraba bien, creo que se debe a la secuencia de las maquinas de estados en reversa, intentare arreglarlo y te aviso. Saludos !
 
Hola, pues aprovechando que saben mas sobre Wincupl que yo (realmente no se casi nada), quise implementar las compuertas not, and, or, etc. en una gal22v10 pero no se si el programa que hice tenga un error de sintaxis, pero a la hora de compilarlo no me marca ningún error ni warnings, el problema viene cuando abro el archivo .jed en el software del programador que estoy usando pues dice que el archivo esta corrupto o que no lo reconoce, el programador que uso es el Bk Presision 848 y su software pg4uw si no mal recuerdo.


Código:
Name     compuertas ;
PartNo   00 ;
Date     4/21/2010 ;
Revision 01 ;
Designer Engineer ;
Company  keko ;
Assembly None ;
Location  ;
Device   g22v10 ;

/* *************** INPUT PINS *********************/
PIN     1=a; /*                                 */
PIN     2=b; /*                                 */

/* *************** OUTPUT PINS *********************/
PIN     20=nota; /*                                 */
PIN     19=and; /*                                 */
PIN     18=nand; /*                                 */
PIN     17=or; /*                                 */
PIN     16=nor; /*                                 */
PIN     15=xor; /*                                 */
PIN     14=xnor; /*                                 */

nota=!a;
and=a&b;
nand=!(a&b);
or=a#b;
nor=!(a#b);
xor=a$b;
xnor=!(a$b);
 
Que tal foro les dejo este decodificador binario a hexadecimal en siete segmentos, lo dejo por que no venden estos decos.

Código:
Name     BIN_TO_HEX ;
PartNo   00 ;
Date     28/05/2010 ;
Revision 01 ;
Designer Jaime ;
Company  CETI ;
Assembly None ;
Location  ;
Device   g16v8 ;

/* *************** INPUT PINS *********************/
PIN [1..4]    =    A, B, C, D         ; /*                                 */ 

/* *************** OUTPUT PINS *********************/
PIN  13   =       Sa                  ; /*                                 */ 
PIN  14   =       Sb                  ; /*                                 */ 
PIN  15   =       Sc                  ; /*                                 */ 
PIN  16   =       Sd                  ; /*                                 */ 
PIN  17   =       Se                  ; /*                                 */ 
PIN  18   =       Sf                  ; /*                                 */ 
PIN  19   =       Sg                  ; /*                                 */ 


Sa = !A&!B&!C&D#!A&B&!C&!D#A&B&!C&D#A&!B&C&D;
Sb = !A&B&!C&D#B&C&!D#A&B&!D#A&C&D;
Sc = !A&!B&C&!D#A&B&!D#A&B&C;
Sd = !A&!B&!C&D#!A&B&!C&!D#A&!B&C&!D#B&C&D;
Se = !B&!C&D#!A&B&!C#!A&D;
Sf = A&B&!C&D#!A&!B&D#!A&!B&C#!A&C&D;
Sg = !A&B&C&D#A&B&!C&!D#!A&!B&!C;
 
Hola que tal estoy siguiendo el codigo pero lo ocupo un poco diferente pero no se que pasa me da varios error y no se como repararlo, les enseño el codigo ke ando tratando de hacer.

PD: No se programar solo intento seguir el codigo :rolleyes:

Código:
Name     Name ;
PartNo   00 ;
Date     08/12/2010 ;
Revision 01 ;
Designer Engineer ;
Company  Tez ;
Assembly None ;
Location  ;
Device   g22v10 ;

/* *************** INPUT PINS *********************/
PIN     1=CLK                         ; /*                                 */ 
PIN     2=A                         ; /*                                 */ 
PIN     3=B                        ; /*                                 */ 
PIN     4=C                         ; /*                                 */ 

/* *************** OUTPUT PINS *********************/
PIN     20= Q0                        ; /*                                 */ 
PIN     21= Q1                        ; /*                                 */ 
PIN     22= Q2                        ; /*                                 */ 
PIN     23= Q3                        ; /*                                 */ 

FIELD PUSH1=[Q3,Q2,Q1,Q0];
FIELD PUSH2=[Q3,Q2,Q1,Q0];
FIELD PUSH3=[Q3,Q2,Q1,Q0];

$DEFINE QA 'b' 0000
$DEFINE QB 'b' 0000 
$DEFINE Q0 'b' 1010 
$DEFINE Q1 'b' 1001 
$DEFINE Q2 'b' 0101  
$DEFINE Q3 'b' 0110

SEQUENCE PUSH1{ 
	PRESENT QA 
		NEXT Q0;
	PRESENT Q0
		IF A NEXT Q1;
	PRESENT Q1
		IF A NEXT Q2;
	PRESENT Q2
		IF A NEXT Q3;
	PRESENT Q3
		NEXT QA;	} /* Aqui lo que quiero hacer es que solamente de 3 ciclos */

SEQUENCE PUSH2{ 
	PRESENT QA 
		NEXT Q3;
	PRESENT Q3
		IF B NEXT Q2;
	PRESENT Q2
		IF B NEXT Q1;
	PRESENT Q1
		IF B NEXT Q0;
	PRESENT Q0
		NEXT QB; 	 

	PRESENT QB 
		NEXT Q0;
	PRESENT Q0
		IF A NEXT Q1;
	PRESENT Q1
		IF A NEXT Q2;
	PRESENT Q2
		IF A NEXT Q3;
	PRESENT Q3
		NEXT QA;        }   /* Aqui que de 2 ciclos hacia la izq y 2 ciclos a la der. */


SEQUENCE PUSH3{ 
	PRESENT QA 
		NEXT Q3;
	PRESENT Q3
		IF B NEXT Q2;
	PRESENT Q2
		IF B NEXT Q1;
	PRESENT Q1
		IF B NEXT Q0;
	PRESENT Q0
		NEXT QB; 	 

	PRESENT QB 
		NEXT Q0;
	PRESENT Q0
		IF A NEXT Q1;
	PRESENT Q1
		IF A NEXT Q2;
	PRESENT Q2
		IF A NEXT Q3;
	PRESENT Q3
		NEXT QA; 	

	PRESENT QA 
		NEXT Q3;
	PRESENT Q3
		IF B NEXT Q2;
	PRESENT Q2
		IF B NEXT Q1;
	PRESENT Q1
		IF B NEXT Q0;
	PRESENT Q0
		NEXT QB;	/* y por ultimo que de 2 ciclos a la izq, 2 ciclos a la der y 1 ciclo a la izq.*/
}
 
Tez, el programa que tenia originalmente igual es para un motor a pasos lo que hace es que dependiendo las entradas declaradas, y también las salidas, donde el campo ( FIELD ), es donde indicamos que es un solo dato en nuestro caso de 4 bits, lo que tu quieres hacer es que con un push boton cambie, poes asi con esta base no se puede, es combinacional, no es activada con interrupciones, a menos que le pongas unos FF a la entrada para que te guarden el dato ;),, a volviendo al programa, donde dice DEFINE, estamos declarando los estados de la maquina, la cual la de debemos inicializar en cero y luego ya tu diras lo que hace segun tus entradas, poniendo sintaxis parecida a esta

...
sequence cont{
present S0 next S1;

present S1
if STOP&AVANZA next S1;
if STOP&!AVANZA next S1;
if !STOP&AVANZA next S2;
if !STOP&!AVANZA next S4;

present S2
if STOP&AVANZA next S2;
...


lo que hacemos aqui es decir que si el estado es S0 pase al S1 asi, ya en el S1 si la entrada declarada como stop Y(and) avanza son 1 el siguiente es el estado S1, se enclava ;),, y asi le vas poniendo tus combinaciones.
 
Atrás
Arriba