/* Contents of file "STEPMOT.PLD" */
Name STEPMOT; /* Remember... it is BEST to make Name and filename match up */
Partno 0001;
Date 10/25/2000;
Revision 01;
Designer KEH;
Company RHIT;
Assembly EC130;
Location Terre Haute, IN;
Device G20V8A;
/******************************************************************/
/* Stepping Motor Controller */
/* (Up/Down 2-bit Gray Code Counter */
/* Example of using "Sequence" Statement to design State Machine*/
/******************************************************************/
/* Allowable Target Device Types: G20V8A */
/******************************************************************/
/** Inputs **/
Pin 1 = CLK ; /* CLOCK (10 Hz) */
Pin 2 = DIR ; /* DIRECTION */
Pin 3 = START ; /* START */
/** Outputs **/
Pin 22 = !Q1 ; /* Coil A */
Pin 21 = !Q0 ; /* Coil B */
Pin 20 = !Q1B ; /* Coil C */
Pin 19 = !Q0B ; /* Coil D */
Pin 18 = REVOLUTION; /* This output pulses once per mag field revolution */
/** Declarations and Intermediate Variable Definitions **/
field my_state = [Q1..0]; /* "field" is a keyword used to define the state variables
collectively referred to as "my_state".
-- in this example, only 4 states need be defined, so
only two state variables Q1 and Q0 are created. */
$define NE 'b'00 /* Define states using "define" keyword..give states meaningful names. */
$define SE 'b'01 /* The 'b' prefix indicates binary number follows. */
$define SW 'b'11 /* The state names refer to direction of motor's magnetic field vector, */
$define NW 'b'10 /* NE = northeast, SE = southeast, SW = southwest, NW = northwest. */
/*** NOTE -- THERE ARE NO SEMICOLONS ON $define STATEMENT!! ******/
sequence my_state /* The "sequence" key word is used to create a state machine in CUPL. It identifies
the field "my_state" (defined above) as the collection of state variables. */
{
present NE if (!START) next NE; /* Start with state NE because it is the reset state = 'b'00 */
/* If START is not asserted, remain in state NE. */
if (START & DIR) next SE; /* If START is asserted and DIR = 1, rotate mag fld clockwise */
if (START & !DIR) next NW;/* If START is asserted and DIR = 0, rotate mag fld CCW */
out REVOLUTION; /* Moore type output handled with "out" keyword. */
present SE if (!START) next SE; /* Remain in this state if START is not asserted */
if (START & DIR) next SW; /* If START is asserted and DIR = 1, rotate mag fld CW */
if (START & !DIR) next NE;/* If START is asserted and DIR =0, rotate mag fld CCW */
present SW if (!START) next SW;
if (START & DIR) next NW;
if (START & !DIR) next SE;
present NW if (!START) next NW;
if (START & DIR) next NE;
if (START & !DIR) next SW;
}
/** Logic Equations **/
Q1B = !Q1;
Q0B = !Q0;