Proyectos en WINCUPL
3. PROYECTOS EN WINCUPL
60
Proyectos en WINCUPL
4.1. Compuertas lógicas Código Name Name Partno Partno Revision Revision Date Date Designer Designer Company Location Location Assembly Assembly Device Device
Gates; 01; 00; 02/07/2012; Teth; ITS Zapopan; None; None; g16v8a;
/* Inputs:
define inputs to build simple gates from
*/
Pin 1 = a; Pin 1 Pin 2 Pin 2 = b; /* Outputs: Pin 12 Pin 12 Pin 13 Pin 13 Pin 14 Pin 14 Pin 15 Pin 15 Pin 16 Pin 16 Pin 17 Pin 17 Pin 18 Pin 18 Pin 19 Pin 19
= = = = = = = =
= = = = = = = =
*/
inva; invb; and; nand; or; nor; xor; xnor;
/* Logic: Logic: inva invb and nand or nor xor xnor
define outputs as active HI levels
!a; !b; a & !(a a # !(a a $ !(a
examples of simple simple gates gates expressed expressed in CUPL */ /* NOT inverters b; & b); b; # b); b; $ b);
/* /* /* /* /* /*
*/
AND gate */ NAND gate */ OR gate */ NOR gate */ XOR exclusive or gate XNOR exclusive nor gate
*/ */
Observe la identificación de símbolos para cada compuerta, compuerta, NOT !, AND &, OR # y XOR $, las funciones negadas de estas compuerta solo están acompañadas del símbolo de negación ! seguido de paréntesis.
61
Proyectos en WINCUPL
4.1. Compuertas lógicas Código Name Name Partno Partno Revision Revision Date Date Designer Designer Company Location Location Assembly Assembly Device Device
Gates; 01; 00; 02/07/2012; Teth; ITS Zapopan; None; None; g16v8a;
/* Inputs:
define inputs to build simple gates from
*/
Pin 1 = a; Pin 1 Pin 2 Pin 2 = b; /* Outputs: Pin 12 Pin 12 Pin 13 Pin 13 Pin 14 Pin 14 Pin 15 Pin 15 Pin 16 Pin 16 Pin 17 Pin 17 Pin 18 Pin 18 Pin 19 Pin 19
= = = = = = = =
= = = = = = = =
*/
inva; invb; and; nand; or; nor; xor; xnor;
/* Logic: Logic: inva invb and nand or nor xor xnor
define outputs as active HI levels
!a; !b; a & !(a a # !(a a $ !(a
examples of simple simple gates gates expressed expressed in CUPL */ /* NOT inverters b; & b); b; # b); b; $ b);
/* /* /* /* /* /*
*/
AND gate */ NAND gate */ OR gate */ NOR gate */ XOR exclusive or gate XNOR exclusive nor gate
*/ */
Observe la identificación de símbolos para cada compuerta, compuerta, NOT !, AND &, OR # y XOR $, las funciones negadas de estas compuerta solo están acompañadas del símbolo de negación ! seguido de paréntesis.
61
Proyectos en WINCUPL
Simulación
Tabla de verdad a 0 0 1 1
b 0 1 0 1
inva 1 1 0 0
invb 1 0 1 0
and 0 0 0 1
nand 1 1 1 0
or 0 1 1 1
nor 1 0 0 0
xor 0 1 1 0
xnor 1 0 0 1
En la simulación los vectores verticales 1, 2, 3, y 4 cambian sucesivamente sucesivamente los valores asignados a las variables a y b, para cada vector las salidas asignadas a cada compuerta lógica modifica su valor según estas variables, por ejemplo en el vector 2 a = 0 y b = 1, el resultado de la compuerta lógica AND es 0, se observa que la línea de la grafica grafica de tiempos esta en bajo para para esta condición.
62
Proyectos en WINCUPL
63
Proyectos en WINCUPL
4.2. Ecuaciones lógicas Código Name ECULOG1 ; PartNo 00 ; Date 02/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /* *************** INPUT PINS *********************/ PIN 1 = A; PIN 2 = B; PIN 3 = C; /* *************** OUTPUT PINS *********************/ PIN 19 = Ecu1; PIN 18 = Ecu2; /* ************** LOGIC EQUATIONS *****************/ Ecu1 = (!A&!B&C)#(!A&B&!C)#(A&B&!C)#(A&B&C); Ecu2 = (!A&!B&C)#(!A&B&C)#(A&!B&C)#(A&B&!C);
El código que se muestra arriba presenta las ecuaciones lógicas en la forma de suma de productos SOP, para su fácil identificación cada producto está encerrado entre paréntesis, de esta forma también se garantiza que cada producto AND se realice primero antes de la sentencia OR. En ambos casos las ecuaciones tienen como entradas de excitación las mismas variables identificadas como A, B y C.
64
Proyectos en WINCUPL
Simulación
En la simulación se observa que las 8 posibles combinaciones para A, B y C están cambiando sucesivamente en los vectores, modificando las salidas de las ecuaciones lógicas identificadas como Ecu1 y Ecu2. ̅ ̅ ̅ () ̅ ̅ ̅ ( ) ̅
Tabla de verdad A 0 0 0 0 1 1 1 1
B 0 0 1 1 0 0 1 1
C 0 1 0 1 0 1 0 1
Ecu1 0 1 1 0 0 0 1 1
Ecu2 0 1 0 1 0 1 1 0
Observe que las ecuaciones lógicas están expresadas en la forma de suma de productos y su transformación en sumatoria de minterminos (Ecu1 = 1,2,6,7; Ecu2 = 1,3,5,6) corresponde con la presencia de 1 lógico en la configuración de las entradas ABC.
65
Proyectos en WINCUPL
66
Proyectos en WINCUPL
4.3. Sumador completo Código Name FA ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly None ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN 1 = A; PIN 2 = B; PIN 3 = Cin; /**************** OUTPUT PINS *********************/ PIN 19 = S; PIN 18 = Cout; /************** LOGIC EQUATIONS *******************/ S= A$B$Cin; Cout= (B&Cin) # (A&Cin) # (A&B);
Ecuaciones lógicas para los bits de salida: ( ) El sumador completo es un circuito que recibe dos bits sumando A y B, además de un bit de acarreo de entrada Cin, genera un bit de suma S y un bit de acarreo de salida Cout.
67
Proyectos en WINCUPL
Simulación
Tabla de verdad del sumador Bit sumando
Bit sumando
Bit acarreo
Bit de suma salida
Bit de acarreo salida
A
B
Cin
S
Cout
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
0 1 1 0 1 0 0 1
0 0 0 1 0 1 1 1
Cuando uno de los dos sumando es 1 la variable S muestra 1, cuando ambos sumando tienen 1 la variable S muestra 0 y 1 en el bit de acarreo de salida. El acarreo de entrada es un sumando que se agrega a las entradas A y B. Cuando A, B y Cin tienen 1, la salida es S = 1 y Cout = 1. Si analizamos esta entrada desde numeración decimal la suma de tres sumandos en 1 da 3, 3 en binario se expresa como 11. Note que el bit de acarreo Cout es el bit más significativo.
68
Proyectos en WINCUPL
69
Proyectos en WINCUPL
4.4. Sumador completo de 4 bits Código Name Partno Date Rev Designer Company Assembly Location Device
Adder; 001; 02/07/2012; 01; Teth Cortes; ITS; NA; NA; G16V8;
/** Inputs **/ Pin [1..4] = [X1..4]; Pin [5..8] = [Y1..4];
/* First 4-bit number /* Second 4-bit number
*/ */
/** Outputs **/ Pin [12..15] = [Z1..4]; Pin [16..18] = [C1..3]; Pin 19 = Carry;
/* 4-bit sum /* Intermediate carry values /* Carry for 4-bit sum
*/ */ */
/* Adder-slice circuit - add 2, 1-bit, numbers with carry */ function adder_slice(X, Y, Cin, Cout) { Cout = Cin & X /* Compute carry */ # Cin & Y # X & Y; adder_slice = Cin $ (X $ Y); /* Compute sum */ } /* Perform 4, 1-bit, additions and keep the final carry */ Z1 Z2 Z3 Z4
= = = =
adder_slice(X1, adder_slice(X2, adder_slice(X3, adder_slice(X4,
Y1, 'h'0, C1); /* Initial carry = 'h'0 */ Y2, C1, C2); Y3, C2, C3); Y4, C3, Carry); /*Get final carry value*/
70
Proyectos en WINCUPL
Simulación
El sumador completo de 4 bits está conformado por cuatro sumadores completos conectados entre sí, donde el acarreo de salida del primero se enlaza al acarreo de entrada del segundo y así sucesivamente. Los cuatro bit de los dos sumandos X y Y entran en paralelo. Observe que el circuito no tiene el acarreo de entrada en el primer sumador y el acarreo de salida del cuarto, representa el acarreo total del circuito. En la simulación las entradas y las salidas se muestran como hexágonos enlazados y representan un bus de 4 bits, para observar su valor es necesario seleccionar la señal y el vector para la intersección deseada.
71
Proyectos en WINCUPL
72
Proyectos en WINCUPL
4.5. Decodificador paralelo de 2 bits Código Name Dec2 ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN 1 = A; PIN 2 = B; /**************** OUTPUT PINS *********************/ PIN 19 = M0; PIN 18 = M1; PIN 17 = M2; PIN 16 = M3; /************* LOGIC EQUATIONS *******************/ M0 M1 M2 M3
= !A & !B; = !A & B; = A & !B; = A & B;
El decodificador paralelo de 2 bits es un circuito muy simple que se construye con cuatro ecuaciones lógicas. Para las cuatro posibles combinaciones de las entradas A y B se debe activar en alto una y solo una de las cuatro salidas identificadas en el código como M0, M1, M2 y M3.
73
Proyectos en WINCUPL
Simulación
Tabla de verdad
A
B
Mo
M1
M2
M3
0 0 1 1
0 1 0 1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Observe la correspondencia entre la grafica de tiempos de la simulación y la tabla de verdad que describe el funcionamiento del circuito. Las ecuaciones lógicas descritas en el código están modeladas por minterminos, es decir: ̅ ̅
74
Proyectos en WINCUPL
75
Proyectos en WINCUPL
4.6. Decodificador paralelo de 3 bits Código Name DEC3; PartNo 00; Date 03/07/2012; Revision 01; Designer Teth Cortes; Company ITS ZAPOPAN; Assembly NA; Location NA; Device g16v8a; /**************** INPUT PINS *********************/ PIN 1 = C; /* MSB */ PIN 2 = B; PIN 3 = A; /* LSB */ /**************** OUTPUT PINS *********************/ PIN 19 =M0; PIN 18 =M1; PIN 17 =M2; PIN 16 =M3; PIN 15 =M4; PIN 14 =M5; PIN 13 =M6; PIN 12 =M7; /************** LOGIC EQUATIONS ******************/ M0 M1 M2 M3 M4 M5 M6 M7
= = = = = = = =
!C !C !C !C C C C C
& & & & & & & &
!B !B B B !B !B B B
& & & & & & & &
!A; A; !A; A; !A; A; !A; A;
76
Proyectos en WINCUPL
Simulación
Tabla de verdad
C
B
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
CA M0 0 1 0 1 0 1 0 1
1 0 0 0 0 0 0 0
M1
M2
M3
M4
M5
M6
M7
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
El circuito decodificador paralelo de tres bits exhibe un comportamiento similar al decodificador de dos bits, pero en esta ocasión se utilizan tres bits de selección C, B y A para colocar en alto uno y solo uno de los ocho bit de salida identificados como M0, M1, M2, M3, M4, M5, M6 y M7; como se observa en la grafica de tiempos de la simulación y la tabla de verdad.
77
Proyectos en WINCUPL
78
Proyectos en WINCUPL
4.7. Decodificador BCD a 7 segmentos Código Name DECBCD; PartNo 00; Date 03/07/2012; Revision 01; Designer Teth Cortes; Company ITS ZAPOPAN; Assembly NA; Location NA; Device g16v8a; /**************** INPUT PINS *********************/ PIN PIN PIN PIN
2 3 4 5
= = = =
A0; /* LSB */ A1; A2; A3; /* MSB */
/**************** OUTPUT PINS *********************/ PIN PIN PIN PIN PIN PIN PIN
12 13 14 15 16 17 18
= = = = = = =
a; b; c; d; e; f; g;
/************ LOGIC EQUATIONS *********************/
TABLE A3,A2,A1,A0 => a,b,c,d,e,f,g { 'h'0=> 'b'1111110; 'h'1=> 'b'0110000; 'h'2=> 'b'1101101; 'h'3=> 'b'1111001; 'h'4=> 'b'0110011; 'h'5=> 'b'1011011; 'h'6=> 'b'0011111; 'h'7=> 'b'1110000; 'h'8=> 'b'1111111; 'h'9=> 'b'1110011;
79
Proyectos en WINCUPL
'h'A=> 'h'B=> 'h'C=> 'h'D=> 'h'E=> 'h'F=> }
'b'0000000; 'b'0000000; 'b'0000000; 'b'0000000; 'b'0000000; 'b'0000000;
Simulación
El circuito decodificador BCD a 7 segmentos recibe como entrada un número binario de cuatro bits de A0 como el bit menos significativo LSB hasta A3 como el bit más significativo MSB, y genera siete salidas a, b, c, d, e, f, y g que encienden o apagan un arreglo de leds que forman un carácter numérico en un dispositivo conocido como display de 7 segmentos. En la figura de la derecha DP es un punto que acompaña al carácter, en el código DP se omite.
80
Proyectos en WINCUPL
Tabla de verdad
A3 A2 A1 A0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
a
b
c
d
e
f
g
1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0
1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0
1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0
1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0
0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0
Observe que todas las posibles combinaciones de A0, A1, A2 y A3 están presentes en la tabla de verdad, sin embargo solo se despliega un valor en el display de 0 (0000) a 9 (1001), después a partir de 10 (1010) hasta 15 (1111) las salidas se asignan en cero. En el caso de desear continuar la cuenta en hexadecimal, desplegando los caracteres alfabéticos a, b, c, d, e y f es necesario configurar las salidas desde 1010 hasta 1111 para que se enciendan los leds correspondientes a cada carácter. Observe que en el código la palabra reservada table realiza una asignación de las salidas en función de las entradas simplificando la programación, de otra forma se debe definir una ecuación lógica por cada una de las salidas.
81
Proyectos en WINCUPL
82
Proyectos en WINCUPL
4.8. Codificador de 8 posiciones a binario Código Name COD8 ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Azrael ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN PIN PIN PIN PIN PIN PIN PIN
2 3 4 5 6 7 8 9
= = = = = = = =
E0; E1; E2; E3; E4; E5; E6; E7;
/**************** OUTPUT PINS *********************/ PIN 19 = S0; /* LSB */ PIN 18 = S1; PIN 17 = S2; /* MSB */ /************ LOGIC EQUATIONS *********************/ TABLE E7,E6,E5,E4,E3,E2,E1,E0 => S2,S1,S0 { 'b'00000001 => 'b'000; 'b'00000010 => 'b'001; 'b'00000100 => 'b'010; 'b'00001000 => 'b'011; 'b'00010000 => 'b'100; 'b'00100000 => 'b'101; 'b'01000000 => 'b'110; 'b'10000000 => 'b'111; }
83
Proyectos en WINCUPL
Simulación
El circuito codificador de 8 posiciones a binario, en palabras simples, funciona de manera inversa al decodificador de tres bits. Es decir tiene ocho entradas y cuando una y solo una de ellas se activa en alto la salida muestra el número binario correspondiente. En la grafica de tiempos se observa como se fue activando sucesivamente cada una de las entradas y consecuentemente la cuenta binaria en S0-S2 fue incrementando, hasta llegar a 111. En el diagrama del circuito electrónico de prueba se propone colocar un conmutador rotativo de ocho posiciones, para evitar que ocurran dos o más entradas en alto, de lo contrario el circuito va hacia una situación no definida.
84
Proyectos en WINCUPL
85
Proyectos en WINCUPL
4.9. Multiplexor de 4 a 1 Código Name MUX4A1 ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN PIN PIN PIN PIN PIN PIN
1 2 3 4 5 6 7
= = = = = = =
G; D0; D1; D2; D3; A; B;
/* /* /* /* /* /* /*
Senal de habilitacion estroboscopica */ Senal de dato 0 */ Senal de dato 1 */ Senal de dato 2 */ Senal de dato 3 */ LSB del codigo de seleccion */ MSB del codigo de seleccion */
/**************** OUTPUT PINS *********************/ PIN
19 = Y;
/* salida del muxtiplexor de 4 a 1 */
/************** LOGIC EQUATIONS *******************/ Y = !B&!A&D0&G # !B&A&D1&G # B&!A&D2&G # B&A&D3&G;
El multiplexor de 4 a 1 es un circuito que coloca un bit de dato de cuatro señales de datos identificados como D0, D1, D2 y D3 en el bit de salida Y. La señal de habilitación G es un estrobo que indica el tiempo en el que se muestrea el dato de las líneas de entrada. La ecuación lógica es:
() () () ()
86
Proyectos en WINCUPL
Simulación
En el vector 1, B=0, A=0 y G=0, la salida se coloca en Y=0 porque la señal de habilitación inhibe que el dato de D0 se transfiera hacia Y. Por el contrario en el vector 2 B=0, A=0 y G=1, la selección de línea corresponde a D0 con 1 por lo tanto la salida Y=1, es decir Y tiene asignado el valor de D0 (Y=D0). En los vectores 3, 5 y 7 la señal de habilitación esta en cero G=0 y no existe muestreo de la señal de datos, la salida Y exhibe un valor en bajo. En el vector 4 con B=0, A=1 y G=1, la selección corresponde a la línea de datos D1, que muestra un 0, así la salida Y= D1=0. En el vector 6 con B=1, A=0 y G=1, la selección corresponde a la línea de datos D2, que muestra un 1, así la salida Y=D2=1. Finalmente en el vector 8 con B=1, A=1 y G=1, la selección corresponde a la línea de datos D3, que muestra un 1, así la salida Y=D3=1.
87
Proyectos en WINCUPL
88
Proyectos en WINCUPL
4.10. Multiplexor de 8 a 1 Código Name MUX8a1 ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN PIN PIN PIN PIN PIN PIN PIN PIN PIN PIN PIN
1 = G; 2 = D0; 3 = D1; 4 = D2; 5 = D3; 6 = D4; 7 = D5; 8 = D6; 9 = D7; 12 = A; 13 = B; 14 = C;
/* LSB */ /* MSB */
/**************** OUTPUT PINS *********************/ PIN
19 = Y;
/* salida del multiplexor de 8 a 1 */
/************** LOGIC EQUATIONS *******************/ Y = !C&!B&!A&D0&G # !C&!B&A&D1&G # !C&B&!A&D2&G # !C&B&A&D3&G # C&!B&!A&D4&G # C&!B&A&D5&G # C&B&!A&D6&G # C&B&A&D7&G;
El multiplexor de 8 a 1 es similar al multiplexor de 4 a 1. Transfiere un dato hacia el bit de salida Y de una selección de líneas, en este caso son ocho las líneas de datos de D0 a D7 y son tres los bits de selección C, B y A, donde C es el bit más significativo y A es el bit menos significativo.
89
Proyectos en WINCUPL
Simulación
En la simulación los vectores impares tienen la señal de habilitación en bajo, en consecuencia no existe muestreo en las señales de datos, la salida es Y=0. Por el contrario en los vectores pares se transfiere el dato de las líneas D0 a D7 según el código de selección en CBA, como se muestra en la siguiente tabla: C
B
A
Y
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
Y=D0 Y=D1 Y=D2 Y=D3 Y=D4 Y=D5 Y=D6 Y=D7
90
Proyectos en WINCUPL
91
Proyectos en WINCUPL
4.11. Comparador de magnitud de dos palabras Código Name COMP2 ; PartNo 00 ; Date 03/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**************** INPUT PINS *********************/ PIN 1 = A0; PIN 2 = A1; PIN 3 = B0; PIN 4 = B1; /**************** OUTPUT PINS *********************/ PIN 19 = F1; /* Ecuacion A menor que B */ PIN 18 = F2; /* Ecuacion A igual que B */ PIN 17 = F3; /* Ecuacion A mayor que B */ /************** LOGIC EQUATION ********************/ F1 = !A1&B1 # !A1&!A0&B0 # !A0&B1&B0; F2 = !A1&!A0&!B1&!B0 # !A1&A0&!B1&B0 # A1&!A0&B1&!B0 # A1&A0&B1&B0; F3 = A1&!B1 # A0&!B1&!B0 # A1&A0&!B0;
Este circuito compara dos palabras binarias de dos bits cada una, identificadas como A y B, donde A0 y B0 son los bits menos significativos. Son tres los posibles resultados, A>B solo F3 se coloca en alto, A=B solo F2 se coloca en alto y A
92
Proyectos en WINCUPL
Simulación
Tabla de verdad A1
A0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
B1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
B0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
F1 A
F2 A=B
F3 A>B
0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0
Entre la tabla de verdad y la simulación se observa la relación de las tres comparaciones.
93
Proyectos en WINCUPL
94
Proyectos en WINCUPL
4.12. Contador de décadas Código Name Partno Date Revision Designer Company Assembly Location Device /**
Inputs
Pin 1 Pin 2 Pin 3 Pin 11 /**
Count10; 001; 02/07/12; 02; Teth Cortes; ITSZ; NA; NA; g16v8a;
= = = =
**/
clk; clr; dir; !oe;
Outputs
/* /* /* /*
Counter clock Counter clear input Counter direction input Register output enable
*/ */ */ */
**/
Pin [14..17] = [Q3..0]; Pin 18 = carry;
/* Counter outputs /* Ripple carry out
*/ */
/** Declarations and Intermediate Variable Definitions **/ field count = [Q3..0]; $define S0 'b'0000 $define S1 'b'0001 $define S2 'b'0010 $define S3 'b'0011 $define S4 'b'0100 $define S5 'b'0101 $define S6 'b'0110 $define S7 'b'0111 $define S8 'b'1000 $define S9 'b'1001 field mode = [clr,dir]; up = mode:0; down = mode:1; clear = mode:[2..3];
/* declare counter bit field */ /* define counter states */
/* /* /* /*
declare mode define count define count define count
control field */ up mode */ down mode */ clear mode */
/** Logic Equations **/
95
Proyectos en WINCUPL Sequenced count {
/* free running counter */
present S0
next S1; next S9; next S0; out carry; next S2; next S0; next S0; next S3; next S1; next S0; next S4; next S2; next S0; next S5; next S3; next S0; next S6; next S4; next S0; next S7; next S5; next S0; next S8; next S6; next S0; next S9; next S7; next S0; next S0; next S8; next S0; out carry;
present S1 present S2 present S3 present S4 present S5 present S6 present S7 present S8 present S9
if up if down if clear if down if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up if down if clear if up
/* carry output */
}
Simulación
96
Proyectos en WINCUPL
El circuito contador de décadas realiza una cuenta de 0 a 9 en sentido ascendente o descendente, cuando la entrada dir=0 la cuenta es ascendente, si dir=1 entonces la cuenta es descendente. En la simulación los hexágonos llevan la cuenta que se muestra en la casilla value, para ver resultado se debe seleccionar el renglón [Q3..Q0] y el vector deseado. Se comienza por definir en el código los diez estados, después a través de la función sequenced se determina la transición entre los estados según el valor de dir y en respuesta a cada pulso de la señal de reloj.
Diagrama de estados dir=0 dir=0
S8
S9
S0
dir=0
dir=1
S1
dir=1 dir=1
dir=0
dir=0
dir=1
dir=1
S7
S2 dir=1
dir=1
dir=0
dir=0
S6
dir=1
dir=0
S5
dir=1
dir=1
S4
S3 dir=0
dir=0
97
Proyectos en WINCUPL
98
Proyectos en WINCUPL
4.13. Detector de secuencia Código Name FSM2 ; PartNo 00 ; Date 04/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly None ; Location ; Device g16v8a ; /* *************** INPUT PINS *********************/ PIN 1 = clock ; PIN 2 = s ; /* data input */ PIN 3 = !enable ; /* *************** OUTPUT PINS *********************/ PIN [14..15] = [Q1..0]; PIN 19 = found; field STATE = [Q1..0]; $define S0 'b'00 $define S1 'b'01 $define S2 'b'10 $define S3 'b'11 SEQUENCE STATE { present S0 if s default present S1 if s default present S2 if s default present S3 if s out found; default }
next S1; next S0; next S2; next S1; next S3; next S1; next S0; next S0;
99
Proyectos en WINCUPL
Simulación
Diagrama de estados
1 0
0 SO 00
1
S1 01
1
S2 10
1
S3 11
0 0 Este circuito tiene implementado una maquina de estados para detectar la secuencia 0111. Cuando es detectada found se coloca en alto de lo contrario found permanece en bajo. El diagrama de estados esta modelado en el código a través de la instrucción sequence que determina las transiciones de un estado a otro en respuesta al bit se entrada s. En la simulación se observa la llegada de s de dos secuencias 0111 una después de la otra y la activación en alto de found en el último bit se la secuencia.
100
Proyectos en WINCUPL
101
Proyectos en WINCUPL
4.14. Generador de secuencia Código Name FSM3 ; PartNo 00 ; Date 05/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /* *************** INPUT PINS *********************/ PIN 1 = clock ; PIN 2 = s ; /* data input */ PIN 11 = !enable ; /* *************** OUTPUT PINS *********************/ PIN [14..15] = [Q1..0]; PIN 19 = sal; field STATE = [Q1..0]; $define S0 'b'00 $define S1 'b'01 $define S2 'b'10 $define S3 'b'11 SEQUENCE STATE { present S0 if s default present S1 if s default present S2 if s default present S3 if s default }
next S1 ; next S0; next S2 out sal; next S0; next S3 out sal; next S2; next S0 out sal; next S0;
Este circuito es la implementación de una maquina de estados que genera en la salida sal la secuencia 0111 con la llegada de los pulsos de reloj y la transición entre los estados.
102
Proyectos en WINCUPL
Secuencia
Tabla de excitación
S S0 S1 S2 S3
0
1
S0 / 0 S0 / 0 S0 / 0 S0 / 0
S1 / 0 S2 / 1 S3 / 1 S0 / 1
En la tabla de excitación se deduce lo siguiente: cuando la entrada s es igual a 0 todas las transiciones son hacia el estado S0 con la sal en 0, por otro lado cuando la entrada s es igual a 1 las transiciones ocurren de S0 hacia S1 con sal en 0, de S1 hacia S2 con sal en 1, de S2 hacia S3 con sal en 1 y de S3 hacia S0 con sal en 1. En el circuito electrónico s se propone como un botón pulsador, mientras permanezca oprimido el circuito genera de forma ininterrumpida la secuencia 0111, cuando el botón deje de oprimirse la secuencia no se genera, es decir sal es 0 y el estado actual fija en S0.
103
Proyectos en WINCUPL
104
Proyectos en WINCUPL
4.15. Contador de anillo Código Name CONTADOR ; PartNo 00 ; Date 05/07/2012 ; Revision 01 ; Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA ; Location NA ; Device g16v8a ; /**
Inputs
Pin 1 Pin 2 Pin 3 Pin 11 /**
= = = =
**/
clk; clr; dir; !oe;
Outputs
/* Register output enable
*/
/* Counter outputs
*/
**/
Pin [14..17] = [Q3..0];
/** Declarations and Intermediate Variable Definitions **/ field count = [Q3..0]; $define S0 'b'0000 $define S1 'b'0001 $define S2 'b'0010 $define S3 'b'0100 $define S4 'b'1000
/* declare counter bit field */ /* define counter states */
field mode = [clr,dir]; anillo_up = mode:0; anillo_dw = mode:1; clear = mode:[2..3];
/* declare mode control field */ /* define count clear mode
*/
105
Proyectos en WINCUPL
/** Logic Equations **/ Sequenced count { present S0 present S1 present S2 present S3 present S4
if anillo_up if anillo_dw if clear if anillo_up if anillo_dw if clear if anillo_up if anillo_dw if clear if anillo_up if anillo_dw if clear if anillo_up if anillo_dw if clear
next S1; next S4; next S0; next S2; next S4; next S0; next S3; next S1; next S0; next S4; next S2; next S0; next S1; next S3; next S0;
}
Simulación
El contador de anillo va colocando en alto cada uno de los bits de forma sucesiva, como se observa en la tabla de verdad. En el diagrama electrónico construido con flip flops tipo D la salida Q del cuarto dispositivo alimenta la entrada D del primero.
106
Proyectos en WINCUPL
107
Proyectos en WINCUPL
4.16. Contador Johnson Código Name johnson ; PartNo 00 ; Date 05/07/2012 ; Revision 01 Revision 01 ; Designer Teth Designer Teth Cortes ; Company ITS ZAPOPAN ; Assembly NA Assembly NA ; Location NA Location NA ; Device g16v8a ; /** Pin Pin Pin Pin */ /**
Inputs 1 2 3 11 Outputs
**/ = = = =
clk; clr; dir; !oe;
/* Register output enable
**/
Pin [14..17] Pin [14..17] = [Q3..0];
/* Counter outputs
*/
/** Declarations and Intermediate Variable Definitions **/ field count = [Q3..0]; field count $define S0 $define S0 'b'0000 $define S1 $define S1 'b'0001 $define S2 $define S2 'b'0011 $define S3 $define S3 'b'0111 $define S4 $define S4 'b'1111 field mode = [clr,dir]; field mode anillo_up = mode:0; anillo_dw = mode:1; clear = mode:[2..3];
/* declare counter bit field */ /* define counter states */
/* declare mode control field */ /* define count clear mode
*/
108
Proyectos en WINCUPL
/** Logic Equations **/ Sequenced count Sequenced count { present S0 present S0 present S1 present S1 present S2 present S2 present S3 present S3 present S4 present S4
if anillo_up if anillo_up if anillo_dw if anillo_dw if clear if clear if anillo_up if anillo_up if anillo_dw if anillo_dw if clear if clear if anillo_up if anillo_up if anillo_dw if anillo_dw if clear if clear if anillo_up if anillo_up if anillo_dw if anillo_dw if clear if clear if anillo_up if anillo_up if anillo_dw if anillo_dw if clear if clear
next S1; next S1; next S4; next S4; next S0; next S0; next S2; next S2; next S4; next S4; next S0; next S0; next S3; next S3; next S1; next S1; next S0; next S0; next S4; next S4; next S2; next S2; next S0; next S0; next S1; next S1; next S3; next S3; next S0; next S0;
}
Simulación
El contador de Johnson va colocando en alto sucesivamente los bits hasta completar los cuatro bits, como se observa en la tabla de verdad. En el diagrama electrónico construido con flip flops tipo D la salida del cuarto dispositivo alimenta la entrada D del primero.
109
Proyectos en WINCUPL
110
Proyectos en WINCUPL
Anillo CLK
Q0 1 0 0 0 1 0 0 0
Q1 0 1 0 0 0 1 0 0
Q2 0 0 1 0 0 0 1 0
Johnson Q3 0 0 0 1 0 0 0 1
Q0 1 1 1 1 1 1 1 1
Q1 0 1 1 1 0 1 1 1
Q2 0 0 1 1 0 0 1 1
Q3 0 0 0 1 0 0 0 1
Los contadores de anillo y Johnson se consideran como registros simples de corrimiento ( shift register ).
El diagrama electrónico mostrado arriba representa un circuito SIPO serial-in parallel-out , Su funcionamiento es el siguiente, entra un dato de forma serial que se va recorriendo de Q1 hacia Q4 con la llegada de cada pulso de la señal de reloj. Este circuito es un ejemplo de la importancia de los registros de corrimiento en los sistemas digitales, ya que permiten manejar flujos de datos entre formatos serie y paralelo.
111
Proyectos en WINCUPL
4.17. Control de motores a pasos Código Name Partno Date Revision Designer Company Assembly Location Device /**
Stepper; 01; 14/04/11; 01; ELECTRONICA 2; ITS ZAPOPAN; None; None; g16v8a;
Inputs
Pin 1 Pin 2 Pin 3 /* Pin 11 /**
Outputs
**/ = clk; = motor; = dir; = !oe;*/
/* /* /* /*
Step advance Select which motor to step Step direction input Register output enable
*/ */ */ */
**/
Pin [19..16] = [A3..0]; Pin [15..12] = [B3..0];
/* Stepper A outputs /* Stepper B outputs
*/ */
/** Declarations and Intermediate Variable Definitions **/ field stepA = [A3..0]; field stepB = [B3..0]; $define S0 'b'0011 $define S1 'b'0010 $define S2 'b'0110 $define S3 'b'0100 $define S4 'b'1100 $define S5 'b'1000 $define S6 'b'1001 $define S7 'b'0001 $define SI 'b'1111
/* declare stepper bit field */ /* define stepper excitation states */
field mode = [motor,dir]; upA = mode:1; downA = mode:0; upB = mode:3; downB = mode:2;
/* the power-on state */ /* declare mode control field */
112
Proyectos en WINCUPL
/** Logic Equations **/ Sequenced stepA { present SI default present S0 if upA if downA default present S1 if upA if downA default present S2 if upA if downA default present S3 if upA if downA default present S4 if upA if downA default present S5 if upA if downA default present S6 if upA if downA default present S7 if upA if downA default } Sequenced stepB { present SI default present S0 if upB if downB default present S1 if upB if downB default present S2 if upB if downB default present S3 if upB if downB default present S4 if upB if downB default present S5 if upB if downB default present S6 if upB
/* stepper A counter */ next S0; next S1; next S7; next S0; next S2; next S0; next S1; next S3; next S1; next S2; next S4; next S2; next S3; next S5; next S3; next S4; next S6; next S4; next S5; next S7; next S5; next S6; next S0; next S6; next S7; /* stepper B counter */ next S0; next S1; next S7; next S0; next S2; next S0; next S1; next S3; next S1; next S2; next S4; next S2; next S3; next S5; next S3; next S4; next S6; next S4; next S5; next S7;
113
Proyectos en WINCUPL if downB default if upB if downB default
present S7
next S5; next S6; next S0; next S6; next S7;
}
El circuito controla de manera alternada dos motores a pasos identificados en el código dentro de las secuencias como A y B. El pin 2 permite seleccionar cual de los dos motores estará activado, es importante recalcar que el código no permite que los dos motores trabajen de forma simultanea. El pin 3 selecciona el sentido de giro del motor invirtiendo la transición de estados según el valor almacenado en las variables up y down. field mode = [motor,dir]; upA = mode:1; downA = mode:0; upB = mode:3; downB = mode:2;
/* declare mode control field */
El segmento de código reproducido arriba es una parte importante de la estructura del código, su análisis es el siguiente: Las variables motor y dir configuradas a través de los pines 2 y 3 del circuito integrado se almacenan en un campo de dos variables. El campo mode determina las cuatro posibles opciones de operación del circuito descritas en la siguiente tabla.
mode motor mode:0 mode:1 mode:2 mode:3
0 0 1 1
dir 0 1 0 1
Descripción downA upA downB upB
Motor A activado con giro reverso Motor A activado con giro directo Motor B activado con giro reverso Motor B activado con giro directo
Según el valor del campo mode se carga en alto el valor de una de las variables upA, upB, downA y downB, que posteriormente son evaluadas en las sentencias if que configuran la transiciones de estados dentro de las dos instrucciones sequenced asignada cada una para el control de un motor distinto.
114
Proyectos en WINCUPL
115
Proyectos en WINCUPL
En el proyecto se propone el control de un motor a pasos unipolar con secuencia de medio paso, sin embargo existen otras dos formas de secuencia. A continuación se describen sus características principales. Secuencia de medio paso. Se obtiene un paso más corto activando dos bobinas y luego sólo una y así sucesivamente.
Bobina
Paso
A
B
C
D
1
1
0
0
0
2
1
1
0
0
3
0
1
0
0
4
0
1
1
0
5
0
0
1
0
6
0
0
1
1
7
0
0
0
1
8
1
0
0
1
116
Proyectos en WINCUPL
Secuencia de paso completo. Consiste en activar cada una de las bobinas de forma independiente, lo que provoca que el eje del motor se oriente hacia la bobina activada. En algunos motores esto brinda un funcionamiento más suave. Su desventaja es que al estar solo una bobina activada el par de paso y de retención es menor.
Bobina
Paso
A
B
C
D
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1
Impulsor (motor) unipolar Unipolar significa que cada extremo de bobina tiene solamente una polaridad. Una bobina unipolar cuenta con dos bobinas. De forma alternativa, la corriente circula a través de una de estas bobinas y en una dirección. Comparado con un motor bipolar, sólo se utiliza la mitad de cobre. El devanado en fase del motor debe tener una derivación central. Con frecuencia se utiliza un diodo Zener adicional para asegurar un rápido decaimiento de corriente en la bobina apagada. Esto proporcionará un par motor mayor, especialmente en frecuencias más altas.
117
Proyectos en WINCUPL
Secuencia de paso completo doble. Consiste en tener activadas dos bobinas al mismo tiempo, ambas consecutivas, de modo que el eje del motor se oriente hacia el punto medio de ambas bobinas. Esta es la secuencia más usada y la que generalmente recomienda el fabricante. Con esta secuencia se obtiene un alto par de paso y de retención.
Bobina
Paso
A
B
C
D
1
1
1
0
0
2
0
1
1
0
3
0
0
1
1
4
1
0
0
1
Velocidad de rotación Revoluciones del motor por minuto se calculan mediante , donde f = frecuencia de pasos, α = ángulo de paso.
Paso Movimiento rotativo del rotor a través de un ángulo de paso. Ángulo de paso Ángulo rotativo a través del cual el eje del motor gira por un pulso controlado. Frecuencia de pasos Número de pasos del motor (paso a paso) en un segundo.
118
Proyectos en WINCUPL
4.18. Control de un torniquete de paso Código Name turnstile1 ; PartNo 02 ; Date 29/06/2012 ; Revision 01 ; Designer Engineer ; Company ITS ZAPOPAN ; Assembly None ; Location Zapopan ; Device g16v8 ; /** INPUT PINS **/ PIN 1 = clock; PIN 2 = Walk_Thru; PIN 3 = coin; /** OUTPUT PINS **/ PIN 14 = CNT_PULSE; PIN 15 = LOCK; $define LOCKED 'b'0 $define OPEN 'b'1 /** State Machine **/ Sequenced LOCK { Present LOCKED if coin next OPEN; if !coin next LOCKED; Present OPEN if Walk_Thru next LOCKED; Default next OPEN; Out CNT_PULSE; }
El código es la implementación de una maquina de estados para el control de un torniquete de paso para el acceso de personas. Su funcionamiento es muy simple, si el usuario deposita una moneda, el torniquete se desbloquea y permite el paso, después se vuelve a bloquear y envía un pulso en alto para realizar una cuenta del transito de las personas.
119
Proyectos en WINCUPL
Diagrama de estados
!coin
LOCKED 0 walk_thru
coin OPEN 1
!walk thru CNT_PULSE En el estado LOCKED pueden ocurrir dos situaciones, mientras no se detecte una moneda (coin) el sistema se mantiene en el mismo estado, cuando se detecta una moneda existe una transición del estado LOCKED hacia OPEN, el torniquete esta desbloqueado esperando que una persona pase a través de él. Mientras no se detecte el transito de una persona por un giro del torniquete el sistema permanece en OPEN. La variable CNT_PULSE (contador de pulsos) se coloca en alto para enviar la señal a otro circuito externo para que realice la cuenta del número de veces que el sistema estuvo en OPEN como la interpretación del número de personas que pasaron por el torniquete. Si la variable walk_thru se coloca en alto, está es la señal del transito de una persona por el giro del torniquete, en consecuencia el siguiente estado es LOCKED y el sistema bloquea el torniquete hasta que no se vuelva a recibir una moneda.
120
Proyectos en WINCUPL
Simulación
Del análisis del código de control de un torniquete de paso se deduce lo siguiente: En el vector 1 se recibe en alto las señal coin y la señal de salida LOCK está en alto desbloqueando el pasador magnético del torniquete y este queda libre para girar. En el vector 2 se mantiene el estado OPEN. En el vector 3 se activa en alto la señal Walk_Thru está puede ser generada por un interruptor electromecánico o un sensor de presencia que detecte el giro del torniquete ciertos grados, inmediatamente ocurre una transición de estados hacia LOCKED bloqueando el pasador, quedando el sistema en espera de una nueva señal de coin. El proceso se vuelve a replicar a partir del vector 6. Cabe señalar que la señal CNT_PULSE va reproduciendo los valores de LOCK sin embargo sus aplicaciones son diferentes. La señal LOCK se utiliza para controlar el pasador magnético que bloquea el giro del torniquete, por otro lado CNT_PULSE produce una señal de pulsos hacia un circuito contador externo, con las conexiones correctas es posible visualizar en un display el número de personas que han transitado a través del torniquete.
121