Proyectos en WINCUPL 3. PROYECTOS EN WINCUPL 60 Proyectos en WINCUPL 4.1. Compuertas lógicas Código Name Partno Revision Date Designer Company Location Assembly 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 2 = b; /* Outputs: Pin Pin Pin Pin Pin Pin Pin Pin 12 13 14 15 16 17 18 19 = = = = = = = = = = = = = = = = */ inva; invb; and; nand; or; nor; xor; xnor; /* 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 gates 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, 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 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 de tiempos esta en bajo para esta condición. 62 Proyectos en WINCUPL 63 Proyectos en WINCUPL 4.2. Ecuaciones lógicas Código Name PartNo Date Revision Designer Company Assembly Location Device ECULOG1 ; 00 ; 02/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device FA ; 00 ; 03/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; None ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device Dec2 ; 00 ; 03/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device DEC3; 00; 03/07/2012; 01; Teth Cortes; ITS ZAPOPAN; NA; NA; 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 CA M0 M1 M2 M3 M4 M5 M6 M7 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 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 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 PartNo Date Revision Designer Company Assembly Location Device DECBCD; 00; 03/07/2012; 01; Teth Cortes; ITS ZAPOPAN; NA; NA; 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 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 A0 a b c d e f g 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 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 PartNo Date Revision Designer Company Assembly Location Device COD8 ; 00 ; 03/07/2012 ; 01 ; Teth Azrael ; ITS ZAPOPAN ; NA ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device MUX4A1 ; 00 ; 03/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device MUX8a1 ; 00 ; 03/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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 PartNo Date Revision Designer Company Assembly Location Device COMP2 ; 00 ; 03/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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<B solo F1 se coloca en alto. Las ecuaciones lógicas de las funciones de salida son: ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ ̅̅̅̅ 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<B 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 /** Pin Pin Pin Pin /** Count10; 001; 02/07/12; 02; Teth Cortes; ITSZ; NA; NA; g16v8a; Inputs 1 2 3 11 = = = = **/ 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 { present S0 present S1 present S2 present S3 present S4 present S5 present S6 present S7 present S8 present S9 if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if if /* free running counter */ up down clear down up down clear up down clear up down clear up down clear up down clear up down clear up down clear up down clear up down clear up 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; /* 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 S9 S0 dir=0 dir=1 S1 dir=1 S8 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 PartNo Date Revision Designer Company Assembly Location Device FSM2 ; 00 ; 04/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; None ; ; 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 next next next next next next S1; S0; S2; S1; S3; S1; 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 PartNo Date Revision Designer Company Assembly Location Device FSM3 ; 00 ; 05/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; 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 next next next next next next next S1 ; S0; S2 out sal; S0; S3 out sal; S2; S0 out sal; 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 PartNo Date Revision Designer Company Assembly Location Device /** Pin Pin Pin Pin /** CONTADOR ; 00 ; 05/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; g16v8a ; Inputs 1 2 3 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 if if if if if if if if if if if if if if anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear next next next next next next next next next next next next next next next S1; S4; S0; S2; S4; S0; S3; S1; S0; S4; S2; S0; S1; S3; 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 PartNo Date Revision Designer Company Assembly Location Device /** Pin Pin Pin Pin */ /** johnson ; 00 ; 05/07/2012 ; 01 ; Teth Cortes ; ITS ZAPOPAN ; NA ; NA ; g16v8a ; Inputs 1 2 3 11 Outputs **/ = = = = clk; clr; dir; !oe; /* Register output enable **/ Pin [14..17] = [Q3..0]; /* Counter outputs */ /** Declarations and Intermediate Variable Definitions **/ field count = [Q3..0]; $define S0 'b'0000 $define S1 'b'0001 $define S2 'b'0011 $define S3 'b'0111 $define S4 'b'1111 field mode = [clr,dir]; 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 { present S0 present S1 present S2 present S3 present S4 if if if if if if if if if if if if if if if anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear anillo_up anillo_dw clear next next next next next next next next next next next next next next next S1; S4; S0; S2; S4; S0; S3; S1; S0; S4; S2; S0; S1; S3; 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 field upA = downA upB = downB /* declare stepper bit field */ /* define stepper excitation states */ mode = [motor,dir]; mode:1; = mode:0; mode:3; = 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 upA = downA upB = downB mode = [motor,dir]; mode:1; = mode:0; mode:3; = 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 dir mode:0 mode:1 mode:2 mode:3 0 0 1 1 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 PartNo Date Revision Designer Company Assembly Location Device /** PIN PIN PIN turnstile1 ; 02 ; 29/06/2012 ; 01 ; Engineer ; ITS ZAPOPAN ; None ; Zapopan ; g16v8 ; INPUT PINS **/ 1 = clock; 2 = Walk_Thru; 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 Proyectos en WINCUPL 122