Post on 04-Nov-2018
UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA División Ciencias Básicas e Ingeniería
Proyecto de Ingeniería Electrónica
PROGRAMADOR DE PALS
Asesor: ING. GONZALO DUCHEN S.
Alumno: NAÑEZ MARTINEZ ARMANDO Matrícula: 84225276
Agosto de 1990
INDICE
INTRODUCCION
El uso de arreglos lógicos programables (PALs) para la
elaboración de circutos combinacionales o secuenciales no es
demasiado complicado. El método de diseño es el mismo que
hemos aprendido durante nuestros cursos de circuitos lógicos,
salvo que en vez de usar compuertas y flip-flops, escogemos el
PAL adecuado para implantarle las funciones Booleanas
obtenidas durante el proceso de diseño.
Este reporte pretende proporcionar al lector la información
básica necesaria para crear sus propias aplicaciones; pero es
indispensable que adquiera un manual editado por el fabricante
del PAL como un complemento a la información que aquí se
presenta.
Este documento consta de cinco capítulos cuyo contenido es el
siguiente:
El capítulo 1 detalla algunas características de los PALs
que no están especificadas claramente en los manuales de los
fabricantes, la discusión está enfocada a los PALs 16L8 y 16R8
por ser los más representativos de esta familia de circuitos
integrados.
En el capítulo 2 se muestra un ejemplo completo del diseño
de un circuito secuencial. Trabajando pacientemente con 91, se
obtendrán provechosas experiencias para que el lector pueda
realizar sus propios diseños.
El capítulo 3 trata del programa PALASM, creado para
determinar automáticamente cuales fusibles habrán de ser
quemados durante la implantación de funciones Booleanas en un
PAL. Se describen ampliamente las características del archivo
de entrada del programa y al final del capítulo se muestra el
listado del código fuente escrito en lenguaje FORTRAN 77.
En el capítulo 4 se explica la manera de usar el circuito
Programador de Pals y se declaran las precauciones que hay que
tomar para no causarle daños al dispositivo a programar.
En el capítulo 5 se expone un resumen de la información
utilizada para el diseño y construcción del circuito
Programador de Pals. El capítulo comienza con la definición
del problema, continúa con los requerimientos para la
programación del dispositivo, explica el funcionamiento del
diseño propuesto y al final se muestran los diagramas del
circuito, el diagrama de colocación de componentes, así como
el listado del programa PR0GPAL.C escrito en lenguaje TURBO C.
OBJETIVOS
El objetivo de este proyecto es el diseño y la construcción
de un circuito programador de PALs controlado por una
computadora de tipo PC compatible (Printaform o Digitel). El
circuito será capaz de programar y copiar los PALs fabricados
por National Semiconductor y Texas Instruments. Se conectará a
la computadora a través del puerto paralelo para la impresora
(LPT1) . Los tipos de PALs que se podrán programar son:
PALs de 2 0 patas 10L8 10H8 12L6 12H6
16L2 16H2 16C1 16A4
16R4 16R6 16R8 16L8
16R4BP 16R6BP 16R8BP 16L8BP
16x4 14L4 14H4
Para la programación del dispositivo, la computadora leerá
un archivo, en formato BHLF, generado por el programa PALASM.
El contenido de ese archivo será una lista de los fusibles que
deberán quemarse durante la programación del PAL. La copia de
la configuración de un PAL será posible solamente cuando el
dispositivo no tenga quemado el fusible de seguridad, y la
información obtenida será almacenada en un archivo en formato
BHLF. Una de las restricciones del circuito es que no
programará el fusible de seguridad del PAL.
1.- INTRODUCCION A LOS PALS
La estructura de un PAL consiste de un arreglo AND
programable y un arreglo OR fijo. L o s dispositivos PAL con
registros en las salidas son muy útiles para la construcción
de circuitos secuenciales, ya que pueden proporcionar una
señal de retroalimentación que altere la función de un estado
determinado basándose en la condición del estado inmediato
anterior.
El tamaño del PAL se especifica por el número de entradas,
el número de términos producto y el número de salidas,
nosotros nos concentraremos en los tipos 16L8 y 16R8
producidos por National semiconductor y Texas Instruments por
ser los que más fácilmente podemos conseguir y que son
frecuentemente utilizados para la elaboración de circuitos
lógicos secuenciales o combinacionales.
1.1.- E l PAL16L8
El PALl6L8 es un PAL combinacional muy popular, en la
figura 1.1 se puede ver como las patas 1 a 9 y la pata 11 se
usan como entradas y las patas de la derecha (patas 12 a 19)
están disponibles como salidas. L a s patas 12 y 19 solamente
pueden utilizarse como salidas, pero 6 de las salidas (patas
- 1 -
O
I / O
I10
110
I /O
110
I 1 0
O
I
13 a 18) están también disponibles como entradas vía la línea
de conexión de retroalimentación después del inversor de
salida. Esta característica, llamada entrada/salida
programable, permite al usuario programar cada una de estas
seis patas para ser ya sea una entrada o salida. El
significado del número de parte PALl6L8 será ahora un poco más
obvio; 16 significa el máximo número de entradas potenciales
(10 entradas dedicadas y 6 entradas/salidas programables) , mientras que 8 significa el número de salidas y L significa el
tipo de salida, el cual es activo bajo para este número de
parte de PAL.
En el diagrama de la figura 1.1 podemos observar que las
líneas verticales que corren a través del arreglo, numerados O
a 31, son las líneas de entrada. Note que cada pata de
entrada/salida está asociada con dos líneas de entrada; una
línea está conectada a la salida no inversora del buffer de
entrada, mientras que la otra está conectada a la salida
complementada (o invertida). Esto permite la disponibilidad de
ambas polaridades de señales de entrada al arreglo.
Las líneas horizontales que corren a través del arreglo,
numeradas O a 63, son las líneas producto. Se puede pensar de
cada una de estas líneas producto como una compuerta AND con
32 entradas, las cuales corresponden al número total de líneas
de entrada. Ambas señales, la invertida y la no invertida, de
cada pata de entrada están conectadas vía fusibles de titanio
- 3 -
tungsteno a cada línea producto antes de que el dispositivo
esté programado. Este es el arreglo AND programable en la
estructura PAL. Para programar al arreglo, el usuario
selecciona diferentes combinaciones de señales de entrada
abriendo los fusibles que conectan a las señales de entrada no
deseadas en una línea producto. En total, hay 2048 fusibles
disponibles en este dispositivo PAL ( 6 4 líneas producto por 32
líneas de entrada).
Note que cada pata de salida tiene 8 líneas producto
asociadas con ella. Las siete líneas producto inferiores de
cada grupo se suman en la compuerta OR, mientras que la línea
producto superior está conectada al buffer inversor de salida.
Las siete líneas producto inferiores y la compuerta OR
proporcionan la suma de productos a el PAL. La compuerta OR
determina si alguna de las líneas producto está activa, o es
verdadera, y luego el buffer de salida invierte la señal que
viene de la compuerta OR y la presenta en la salida. Note que
una línea producto con todos los fusibles dejados intactos no
afectará la suma en la compuerta OR, dado que el resultado
lógico de la operación: (entrada AND entrada') es falso.
1.2- ENTRADA/SALIDA PROGRAMABLE
Esta línea producto superior asociada con cada salida
controla los tres estados lógicos en el buffer de salida.
- 4 -
Cuando esta línea producto está activa, o es verdadera, la
salida es habilitada y la suma de productos determina el
estado de la salida. Sin embargo, cuando esta línea producto
está inactiva, o es falsa, la salida es deshabilitada con el
buffer de tres estados en el estado de alta impedancia.
Además, dado que la mayoría de los dispositivos PAL tienen la
característica de manejar una salida de 24 miliamperes, son
bastante apropiados como interfaces de bus. La línea producto
que controla los tres estados, junto con la trayectoria de
retroalimentación en seis de las salidas, permiten el
funcionamiento de la característica Entrada/salida. La pata es
una entrada al arreglo AND cuando todos los fusibles en la
línea producto que controla los tres estados son dejados
intactos, mientras que la pata es una salida cuando todos los
fusibles están abiertos. Note que una línea será siempre
verdadera, sin importar las combinaciones en la entrada,
cuando todos los fusibles están abiertos. La característica de
Entrada/Salida programable permite al usuario definir a las
patas como entradas o salidas según sea requerido por la
aplicación.
Es posible obtener una mayor flexibilidad, si se permite
que la lógica en la línea de productos superior determine la
dirección de la pata. Esto se hace programando una condición
en la línea de productos para la cual la pata sea una salida.
Se puede usar esta característica para asignar a las patas
disponibles funciones de Entrada/Salida o para poder realizar
- 5 -
transferencias bidireccionales en operaciones tales como
desplazamiento y rotación de datos.
El PALl6L8 se utiliza en aplicaciones tales como
decodificadores, codificadores, multiplexores, comparadores,
etc. Otra manera de ver esto es que el arreglo AND programable
PAL16L8 contiene 2048 fusibles. Se puede programar estos
fusibles para crear casi cualquier configuración de hasta 250
AND, OR, y compuertas inversoras, lo cual equivale a 250
compuertas aproximadamente.
1.3.- PALS CON REGISTROS Y RETROALIMENTACION EN SUS SALIDAS
La estructura de un PAL con registros en las salidas es
similar a la de el PAL16L8 excepto por la adición de salidas
con registro. En el PAL16R8, cada uno de los ocho registros es
un flip-flop D que funciona con la subida del reloj (ver
figura 1.2). La señal de reloj (pata 1) es compartida por los
ocho flip-flops. Cada compuerta OR suma ocho líneas producto y
es la entrada D al flip-flop. La salida Q del flip flop está
disponible para retroalimentación dentro del arreglo PAL y
para salida del dispositivo. Ambas polaridades de la señal de
retroalimentación están disponibles. Esta retroalimentación
permite al PAL recordar el estado anterior, y puede alterar su
función basado en ese estado. Así que, los dispositivos PAL
con registros en sus salidas son ideales para construir
máquinas de estado con un solo circuito integrado.
- 6 -
. 3!
- 7 -
Constants LOW (L) NEGATIVE (N) ZERO (O) GND FALSE x + FUSE NOT BLOWN HIGH (H) POSITIVE (P) ONE (1) Vcc TRUE - I FUSE B L O W
Operators = EQUAL : = REPLACED BY FOLLOWING CLOCK / COMPLEMENT
+ O R , SOM AND, PRODUCT
: + 1 XOR .4: XNOR, , . ( 1 CONDITIONAL THREE S T A T E , I F STATEMENT, ARITHMETIC
Equations
Conventional Symbology
PAL Symbology
- 8 -
2.- PROCEDIMIENTO DE DISEÑO UTILIZANDO PALS
El proceso de diseño consiste de los siguientes pasos
- Definir el problema - Determinar el número requerido de variables de entrada
y el número de variables de salida
- Asignar letras a las variables de entrada y salida - Dibujar un diagrama a bloques
- Seleccionar el PAL apropiado - Deducir la tabla de verdad que define las relaciones entre las entradas y las salidas
- Obtener simplificada, la función de Boole para cada salida
- Correr el programa PALASM, para determinar cuales serán los fusibles que habrán de quemarse en el PAL.
- implantar las funciones Booleanas en el PAL.
La manera más simple de explicar este proceso es a través
de un ejemplo donde el lector obtenga la información básica
para desarrollar sus propias aplicaciones
2.1.- Definir el problema
Se pretende construir un contador binario de 4 bits,
alimentado por uno de cuatro relojes. Hay dos líneas
- 9 -
disponibles para seleccionar los relojes, SELl y SELO. La
tabla 2.1 muestra las entradas requeridas para la seleción de
los relojes. Además se desea que el contador binario pueda
cambiarse a contador de décadas. Esta característica se
controlará mediante una entrada llamada BD. Cuando BD esté en
1 lógico, el contador habrá de contar en binario. Cuando esté
en cero, deberá contar en décadas.
Tabla 2.1. Selección de reloj
SELl SELO 1 SALIDA O O
CLKD 1 1 CLKC 1 O CLKB O 1 CLKA
2.2.- Dibujar un diagrama a bloques
La figura 2.1 muestra el DIAGRAMA A BLOQUES de como podría
elaborarse este ejemplo utilizando circuitos TTL. Como puede
verse se requieren tres circuitos, el ‘LS162 se utiliza para
generar el contador de cuatro bits, mientras que la selección
del reloj se maneja por el ‘LS253. EL ‘LS688 es un comparador
de 8 bits que se usa para seleccionar el contador de décadas o
el contador binario. En este ejemplo únicamente se utilizan
cinco de las 8 entradas de comparación. Se usan cuatro para
comparar las salidas del contador, mientras que la otra se
utiliza para la entrada BD. El comparador está alambrado para
irse a cero si la entrada BD es cero y la salida del contador
- 10 -
es I1gn. Entonces la salida (P=Q) es retroalimentada a la
entrada de borrado CLR del 'LS162. Esto pondrá al contador en
ceros siempre que ocurra esta condición.
'U253
CLK
'U162
QO Q1
CLK Q2
CLR'
BD
- 43
vcc P4 44 ~
I (p=Q) I
I P7 47 - P6 46 P5 Q5
GND GND
Figura 2.1. Elaboración del contador con circuitos TTL.
2.3.- Seleccionar el PAL apropiado
Antes de proceder con el diseño del selector del reloj, la
primera pregunta que debemos responder es cual PAL vamos a
usar. Existen varios tipos diferentes de arquitecturas de
salida, Analizando nuestro ejemplo podemos notar que se
necesitarán cuatro flip-flops con retroalimentación para el
- 11 -
contador de cuatro bits (QO, Q1, Q2, Q3) , mas dos entradas,
una para el reloj (CLK) y otra para el borrado (CLR) , además, se necesitarán siete entradas (SELO, SEL1, CLKA, CLKB, CLKC,
CLKD, BD) y dos salidas simples (CLKOUT, (P=Q) ' ) una para el
selector de reloj y otra para el comparador. En total se
necesitarán nueve entradas, cuatro salidas con registros
(flip-flops) y dos salidas simples. Con esta información a la
mano, podemos ver que el PALl6R4 (figura 2.6) resulta adecuado
para nuestra aplicación, puesto que tiene ocho entradas,
cuatro entradas/salidas simples y cuatro entradas/salidas con
registros.
2.4.- Deducir la tabla de verdad que define las relaciones
entre las entradas y las salidas
El primer paso en la determinación de las funciones de
Boole para el selector del reloj, es generar una tabla de
verdad con todas las posibles combinaciones de entrada. Esto
se muestra en la tabla 2.2. A partir de esta tabla puede
construirse el mapa de Karnaugh, como se muestra en la Figura
2.2, y luego obtener la ecuación simplificada para la salida
CLKOUT . Tabla 2.2. Tabla de verdad para la salida CLKOUT
SELl SELO CLKA CLKB CLKC CLKD CLKOUT O O O O O O O O O O O O 1 O O O O O 1 O O O O O O 1 1 O O O O 1 O O O
- 12 -
O O
O O
O O
O O
O
O O
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
O O O O O O O O O O O 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 O O O O O O O O O O O O O O O O 1 1 1 1 1 1 1 1 1 1 1
O O O 1 1 1 1 1 1 1 1 O O O O O O O O 1 1 1 1 1 1 1 1 O O O O O O O O 1 1 1 1 1 1 1 1 O O O O O O O O 1 1 1
1 1 1 O O O O 1 1 1 1 O O O O 1 1 1 1 O O O O 1 1 1 1 O O O O 1 1 1 1 O O O O 1 1 1 1 O O O O 1 1 1 1 O O O
O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1 1 O O 1
1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O 1 O
O 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
- 13 -
1 1 O O O 1 1 O 1 1
Es importante notar que las ecuaciones derivadas del mapa
de Karnaugh están escritas en notación AND OR. EL PAL que
hemos seleccionado está construido con lógica AND NOR. Esto
significa que tendremos que aplicar el teorema de DeMorgan a
las ecuaciones, o combinar los ceros en el mapa de Karnaugh
como se muestra en la figura 2.3, para obtener el complemento
de la función. Las ecuaciones resultantes pueden configurarse
fácilmente en el PAL16R4.
Sl,C,D\SO,A,B \ O00 001 o11 010 110 111 101 100
O00
001
o11
010
110
111 1 1 1 1
101 1 1 1 1 1 1 1 1
100 1 1 1 1
111 1 1 1 1
101 1 1 1 1 1 1 1 1
100 1 1 1 1
CLKOUT = Sl‘SO‘A + Sl’SOB+ SlSO’C + SlSOD Figura 2.2. Mapa de Karnaugh para CLKOUT
- 14 -
Sl,C,D\SO,A,B \ O00 O01 o11 010
O00
001
o11
O10
110
100
101
O O O O 111
O O O O
110 111 101 100 -I
O
O
O
O
O O O O
O O O O
CLKOUT' = Sl'SOIA' + Sl'SOB' + SISOIC1 + SlSODI
Figura 2.3. Mapa de Karnaugh para CLKOUTI
CONTADOR BINAR10 DE 4-BITS
El mismo procedimiento básico usado en la producción de las
ecuaciones para el selector de reloj, se usa en la
determinación de las ecuaciones para el contador de cuatro
bits. La única diferencia es que ahora estamos tratando con un
estado presente y un estado siguiente. Esto significa que
necesitaremos un flip-flop D para la elaboración del circuito.
Como antes, generamos una tabla de verdad como se muestra en
la tabla 2.3. Las ecuaciones para cada salida pueden derivarse
del mapa de Karnaugh construido a partir de la tabla de
verdad. Esto se muestra en la figura 2 . 4 . Note que estamos
- 15 -
combinando los ceros en los mapas de Karnaugh para que las
ecuaciones sean de la forma AND NOR. Cuando la combinación de
ceros resulta complicada efectuamos la combinación de unos,
aplicamos el teorema de DeMorgan y un poco de manipulación
algebraica para expresar las ecuaciones en la forma deseada.
Tabla 2.3. Tabla de verdad para el contador binario de 4-bits
ESTADO PRESENTE
CLR 43 Q2 Q1 QO
O x x x x 1
0 0 0 1 1 O 0 0 0
O 1 0 1 1 O 1 0 0 1 O 0 1 1 1 O 0 1 0 1
1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 o 1 1 1 1 O 1 1 0 1
ESTADO SIGUIENTE
43 Q2 Q1 QO
0000 0001 0010 0011 0100 0101 0 1 1 0 0111 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0000
010 110 111 101 100
O0
o1
11
10
QO' = CLR' + QO
- 16 -
Figura 2.4.A. Mapa de Karnaugh para QO1
Q1,QO\CLR,Q3tQ2 \ O00 001 o11 O10 110 111 101 100
O 0
o1
11
10
Qll = CLR' + Ql'QO' + QlQO Figura 2.4.B. Mapa de Karnaugh para Qll
Q1 t QO\CLR, 43 142 \ O00 001 o11 010 110 111 101 100
O 0
o1
11
10
Q2 = CLF¿Q2Q1Q11 + CLR QZQO' + CLRQ2'QlQO Q2 = CLR(Q2(Q11 + QO') + Q2'QlQO) Por el teorema de DeMorgan 42' = CLRI + (42' + QlQO)(Q2 + Q1' + QO') Q2l = CLR' + Q2'Ql' + Q2'Q01 + Q2QlQO Q2' = CLRI + Q2IQ1' + Q2QlQO + Q2'QO' Figura 2.4.C. Mapa de Karnaugh para 42
- 17 -
Q1, QO\CLR, Q3 42 \ O00 O01 o11 O10 110 111 101 100
O0
o1
11
10
Q3 = CLRQ3Q2QlQO + CLRQ3Q2' + CLRQ3Ql' + CLRQ3QO' 43 = CLR(Q3'Q2QlQO + Q3(Q2' + Q1' + QO') Por el teorema de DeMorgan Q3' = CLR' + (Q3 + Q2' + Q1' + QO') (Q3' + Q2QlQO) 43' = CLR' + Q3Q2QlQO + 43'42' + 43'41' + Q3'QO' 43' = CLR' + Q3'QZ' + 43'41' + Q3'QO' + Q3Q2QlQO Figura 2.4.D. Mapa de Karnaugh para 43
CONTADOR BINAR10 O CONTADOR DE DECADAS
Recordando que aspiramos a tener un contador de décadas
cuando la entrada BD esté en cero, podemos generar una tabla
de verdad para esta función (Tabla 2.4) . Dado que ya hemos diseñado el contador binario, podemos modificarlo para
simplificar nuestro nuevo diseño. Lo que deseamos es un
circuito cuya salida (Q') se vaya a cero, cuando la entrada BD
sea igual al nivel lógico I1O1I , y la salida del contador sea
igual a 11911. Entonces esta salida puede retroalimentarse a la
entrada CLR del contador para ponerlo a ceros cuando la
entrada BD esté en un nivel bajo. Siempre que la entrada BD
esté en un nivel alto, la salida del circuito (Q') estará en
un nivel alto, y en tal caso tendremos un contador binario.
En este ejemplo en particular, no se necesita un mapa de
Karnaugh porque la ecuación ya no puede simplificarse más.
- 18 -
La ecuación resultante es: BDOUT' = BD'Q3Q2'Ql'QO
Donde BDOUT' es igual a Q en la tabla 2.4.
Tabla 2.4. Tabla de verdad del contador Binario/décadas
0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 O 0 0 1 1 0 0 1 0 0 O 0 1 0 1 O 0 1 1 0 O 0 1 1 1 0 1 0 0 0 O 1 0 0 1 O 1 0 1 0 O 1 0 1 1 O 1 1 0 0 O 1 1 0 1 O 1 1 1 0 o 1 1 1 1
o 1 o 1 o 1 o 1 o 1 o 1 o 1 o 1 o 1 1 0 o 1 o 1 o 1 o 1 o 1 o 1
1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
2.5.- Obtener simplificada, La función de Boole para cada
salida
CLKOUT' = SELl'SELO'CLKA' + SELl'SELOCLKB' + SELlSELO'CLKC' + SELlSELOCLKD'
QO' = CLR' + QO Q1' = CLR' + Ql'QO' + QlQO Q2' = CLR' + Q2'Ql' + Q2QlQO + Q2'QO' 43' = CLR' + Q3'QZ' + 43'41' + Q3'QO' + Q3Q2QlQO BDOUT' = BD'Q3Q2'Ql'QO
- 19 -
2.6.- CORRER EL PROGRAMA PALASM
(Para mayor información consulte el Capítulo 3)
- 20 -
PAL 16R4
8/SEP/9O CONTADOR DE 4 BITS DE DECADAS O BINARIO
CLK SELO SELl CLKA CLKB CLKC CLKD CLR BD GND OE BDOUT NC P3 P2 P1 PO NC CLKOUT VCC
/QO := /CLR + PO
/Q2 := /CLR + /92*/Q1 + P2*Pl*PO + /Q~*/PO
143 := /CLR + /Q3*/Q2 + /Q3*/Q1 + /Q3*/PO + Q ~ * P ~ * Q ~ * Q o
/BDOUT = /BD*Q3*/P2*/Pl*PO
DESCRIPCION:
CONTADOR CON CAPACIDAD PARA SELECCIONAR UNO DE CUATRO RELOJES
MEDIANTE LAS ENTRADAS SELl Y SELO. ADEMAS, CUANDO BD ESTA EN CERO SE CONVIERTE EN CONTADOR DE DECADAS, CUANDO BD ESTA EN UNO SE CONVIERTE EN CONTADOR BINARIO.
"""""
CLK +1 20+ VCC
I I
I I
I I
I I
I I
I I
I I
I I
I I
SELO +2 1 9 + CLKWT
SELl +3 18+
CLKA +4 17+ PO
CLKB +5 16+ Q1
CLKC +6 15+ P2
CLKD +7 14+ P3
CLR +8 13+
BD +9 12+ BDWT
GND +10 1 1 + OE """""
SELl SELO I CLKWT """""+"""-
o o I CLKA O 1 I CLKB 1 O I CLKC 1 1 I CLKD
BD I Q3 P2 a l PO
O I CONTADOR DE DECADAS 1 I CONTADOR BINARIO
ESTE ES EL ARCHIVO FUNC.DAT, CREARLO ANTES DE CORRER PALASM
- 21 -
PROCEDIMIENTO PARA USAR EL PROGRAMA PALASM
Una vez creado a l archivo FUNC.DAT (Ver hoja anterior), guardarnos una copia de este con un nombre más apropiado. Por ejenplo:
A:\> COPY FUNC-DA1 CONTBD.FUN I F i le(s) cop ied
Donde, CONTBD.FUN s i g n i f i c a que e l archivo contiene las funciones correspondientes a l CONTADOR BINARIO/DECADAS.
Ahora, ya estamos l i s t o s p a r a c o r r e r e l progreme
A:\>PALASW
NUMBER OF FUSES BLOUN = 629
OPERATION CODES: P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP a=auIT ENTER OPERATION CODE P
ENTER OPERATION CODE a Stop - Program terminated.
Hemos seleccionado la o p e r a c i h PLOT para obtener l a g r á f i c a de los fus ib les que van a quemarse en e l PAL. E l nombre del archivo
de salida para cualquier operaci6n es FUSES.DAT, por l o que es conveniente renombrarlo
A:\> REN FUSES.DAT CONTBD.PLT
D & , CONTBD.PLT s i g n i f i c a que el archivo contiene La grhf ica
(PLOT) de los fus ib les de un PAL programado como CONTADOR
BINARIO/DECADAS ACLARACION: Este archivo s6lo s i r v e como docunentaci6n para el
usuar io , e l Programador de PALS no puede Leerlo.
Continuamos con l a generaci6n de un archivo en formato BHLF que usaremos como entrada a l Programador de PALS
A:\>PALASM
NUMBER OF FUSES BLOUN = 1496
OPERATION COOES: P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP P=WIT ENTER OPERATION CODE L ENTER OPERATION CODE a Stop - Program terminated.
- 22 -
Hemos elegido e l c6digo de o p e r a c i h L = BHLF y e l a rch ivo de sal ida se l lama FUSES.DAT, como antes, vamos a renombrarlo:
A:\> REN FUSES.DAT CONTBD.BHL
1 F i lecs) copied
Donde, CONTBD.BHL s i g n i f i c a que e l a r c h i v o c o n t i e n e l a l i s t a de los fus ib les , en formato BHLF, para programar al PAL como
CONTADOR BINARIO/DECADAS
Este archivo este en e l formato adecuado para usarlo como entrada a l programador de PALS.
A:\>DIR CONTBD.*
Volune i n d r i v e A i s DISCO49 Directory of A:\
CONTBD FUN 1503 13/08/90 22:21 CONTBD PLT 5289 14/08/90 13:34 CONTBD BHL 3877 14/08/90 13:02
3 F i l e ( s ) 38920 bytes free
- 23 -
SALIDA DEL PROGRAMA P A L A 9 CODIGO DE OPERACION L = BHLF MWTADOR BINARIO/DECADAS
BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BLLLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLLF BHHLHF BHHLHF BHHLHF BHHLLF BHHLHF BHHLHF BHHLHF BHHLLF BHLLHF BLHLHF BHHLHF BHHLHF BHHLHF BLHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHHLHF BHLLLF BHLLHF BHLLHF BHLLHF BHLLHF BHLLLF BHLLHF BHLLHF BHLLHF BHLLHF BLLLHF BHLLHF BHLLHF BHLLLF BLLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLHLF BHLHHF BHLHHF BHLHHF BLLLLF BHLHHF BHLHHF BLLHHF BHLLHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLHHF BHLHHF BHLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF
- 2 4 -
BLLHHF BLLHHF BLLHLF BLLHHF BLLHHF BLLHHF BLLHLF BLLLHF
BLLHHF BLLHHF BLLHLF BLLHHF BLLHHF BLLHHF BLLHHF BLLLHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLLLF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHLF BLLHHF BLLHHF BLLHHF BLLLHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHHF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLLLF BLLHLF BLLHLF BLLHLF BLLLLF BLLHLF BLLHLF BLLHLF BLLLLF BLLHLF BLLHLF BLLHLF BLLLLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLHLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
EL NOMBRE ORIGINAL DE ESTE ARCHIVO ES FUSES.DAT. RENOMBRARLO A: C0NTBD.BHL
- 25 -
SALIDA DEL PROGRAMA PALASM
CODIGO DE OPERACION: P = PLOT
CONTADOR DE 4 BITS DE DECADAS O BINAR10
1 1 1 1 1 1 1 1 1 1 2222 2222 2233 0123 4567 8901 2345 6789 0123 4567 8901
0 "" "" "" "" "" "" "" "" 1 -x" -x" -x" "" "" "" "" "" /SELl*/SELO*/CLKA 2 x"- -x" "" -x" "" "" "" "" /SELl*SELO*/CLKB 3 -x" x"- "" "" -x" "" "" "" SELl*/SELO*/CLKC 4 x"- x"- "" "" "" -x" "" "" SELl*SELO*/CLKD
5 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 6 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
7 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
8 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 9 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
10 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1 1 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 12 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 13 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 14 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 15 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
16 - - - - - - - - - - - - - - - - - - - - - - - - -x-- _ _ _ _ /CLR 17 _ _ _ _ _ _ _ _ "x- _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ QO 18 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 19 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 20 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 21 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 22 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 23 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
24 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - x - - _ _ _ _ /CLR 25 _ _ _ _ _ _ _ _ "-x "-x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /a1 */PO
Ql*QO 26 - _ - - "X- --X- - _ - - - - - - _ - _ - - _ _ _ 27 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 28 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 29 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 30 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 31 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
32 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - x - - _ _ _ _ /CLR 33 "" "" "" "-x "-x "" "" "" /Q2*/Q1 34 "" "" "x- "x- "x- "" "" "" Q2*Q1 *PO 35 "" "" "-x "" "-x "" "" "" /Q2*/QO
36 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 37 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 38 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 39 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
- 26 -
48 xxxx xxxx xxxx XXXX xxxx xxxx xxxx xxxx 49 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 50 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 51 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 52 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 53 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 54 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 55 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
56 - - - - - - - - - - - - - - - - - _ _ _ - _ _ - - _ _ - 57 "" "" "x- "-x "-x "x- "" -x" /BD*Q3*/Q2*/QI*QO 58 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 59 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx M) xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 61 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 62 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 63 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
LEGEND: X : FUSE NOT BLOWN (L,N,O) - : FUSE BLOU (H,P,I)
NOMBRE ORIGINAL DEL ARCHIVO: FUSES.DAT
RENOMBRARLO A: CONTBD-PLT
- 27 -
"
- 28 -
2.7.- Implantar en el pal las funciones de Boole
Conecte el circuito Programador de Pals a la computadora
tal como se especifica en el capítulo 4 , donde encontrará la
información completa de como programar el PAL.
3 . - PROGRAMA PALASM
El programa PALASM crea un archivo que contiene una lista
de los fusibles que deben quemarse para que el PAL ejecute las
funciones lógicas especificadas en el diseño del usuario. El
programa PALASM recibe como entrada un archivo de texto,
denominado FUNC. DAT, que contiene el número de parte del PAL
que se va a programar y la lista de ecuaciones lógicas que
especifican la función del PAL. En la siguiente sección se dá
una explicación más detallada de las características del
archivo de entrada.
- 2 9 -
Operadores PALASM - - Igual
:= Reemplazado por, después del reloj
/ Complemento * AND , PRODUCTO
+ OR, SUMA
:+: XOR
: *: XNOR
( ) Condicional TRI-STATE, proposición IF, aritmético
Ejemplo:
IF(/A) /B = C + D
Significa que si A = 1 lógico, la salida B se coloca en el
estado de alta impedancia (TRI-STATE). Si A = O lógico, la
salida B dependerá del resultado de la operación (C OR D)'.
Ecuaciones
Estándar
PALASM
Q1 = AB' + A'B Q1 = A*/B + /A*B
3.1.- COMO CREAR EL ARCHIVO DE ENTRADA FUNC.DAT
Para utilizar el programa PALASM es necesario crear un
archivo de texto llamado FUNC.DAT donde se escribirán las
funciones lógicas que se van a programar en el PAL. El archivo
no deberá contener tabuladores debido a que el programa PALASM
no los reconoce y los considera como un error de entrada de
- 30 -
datos, el error provocado por el uso de tabuladores es muy
difícil de detectar, pues se trata de un carácter no
imprimible. La salida del programa PALASM es un archivo
denominado FUSES.DAT, para que el circuito programador de pals
pueda aceptar este archivo, es indispensable escoger el
formato de salida BHLF al correr el programa PALASM.
Para crear el archivo F'UNC.DAT se puede utilizar el editor
de Turbo Pascal versión 3, esta versión no inserta tabuladores
automáticamente como lo hacen las versiones más nuevas. Para
salir del editor de Turbo Pascal hay que oprimir las teclas
<Control> <k> <d>.
Línea 1: El número de parte del pal debe empezar en la línea 1
columna 1 en este ejemplo usaremos al PAL12L6.
Línea 2: En el margen izquierdo de la línea 2 se coloca un
número de patrón para este diseño, seguido por el nombre del
diseñador y la fecha.
Línea 3: El nombre o descripción del dispositivo se coloca en
la línea 3, si una línea no es suficiente, puede usarse la
línea 4 para completar la descripción del dispositivo.
Línea 4 : Esta línea se salta si no se utiliza para completar
la línea 3.
- 31 -
Líneas 5, 6, y 7: Estas líneas se utilizan para darle un
nombre simbólico a cada una de las 20 patas del PAL ( Note que
deben incluirse los nombres GND y VCC) . La asignación de
nombres comienza en la pata 1 y continúa secuencialmente hasta
la pata 20.
Línea 8: Comenzando en la línea 8 se escriben las ecuaciones
lógicas que describen las funciones requeridas, utilizando los
símbolos definidos en las líneas 5, 6, y 7, en el formato
correspondiente al PAL seleccionado, por ejemplo los circuitos
12L6, 16L8, etc. tienen inversores en sus salidas, de ahí que,
las ecuaciones lógicas deben ser de la forma
/Ox = f(I1, 12, ...), es decir, /O1 = I1 significa que en
la salida O1 obtendremos el valor de I1 invertido.
En el ejemplo siguiente vamos a presentar un archivo que
declara las funciones siguientes:
o1 = 11' EQUIVALE A 01' = I1
02 = 11'12 I1 I1 02' = I1 + 12'
03 = I1 + I3 II II 03' = 11' + 13'
04 = (13'14)' II I1 04' = 13'14
05 = (13'1516 + I7 + 1819)' EQUIVALE A
05' = 13'1516 + I7 + I819 06 = (I819 + 13817819110)8 EQUIVALE A
06' = I819 + 13'17819110 En el lado izquierdo las ecuaciones están escritas en la
forma lógica AND-OR, y en el lado derecho han sido convertidas
- 32 -
a la forma AND-NOR para que puedan ser utilizadas en las
especificaciones de los PALS del tipo 12L6, 16L8, 16R8, etc.
que tienen inversores en sus salidas. Los pals del tipo 12H6,
14H4, 16H2, no tienen inversores en sus salidas y sus
especificaciones se escriben en la forma AND-OR.
Línea 1 Línea 2 Línea 3 Línea 4 Línea 5 Línea 6 Línea 7 Línea 8 Línea 9 Línea 10 Línea 11 Línea 12 Línea 13 Línea 14 Línea 15 Línea 16 Línea 17 Línea 1 8
""" > Columna 1
PALl2L6 ESPECIFICACIONES DEL DISEÑO PAT 1476 BOB JONES 5/10/81 EJEMPLO DEL DISEÑO DE UN PAL
I1 I2 I3 I4 I5 I6 I7 I8 I9 GND I10 NC 05 06 04 03 02 O1 NC VCC
/o1 = I1 /o2 = I1 + /I2 /O3 = /I1 * /I3 /O4 = /I3 * I4 /O6 = I8 * I9 + /I9 + I3 * /I7 * I9 * I10 /O5 = /I3 * I5 *I6 + I7 + I8 * /I9 DESCRIPCION:
ESTE ES UN EJEMPLO DE UN ARCHIVO F'UNC.DAT PARA USARLO CON EL PROGRAMA PALASM.
- 33 -
OTRO EJEMPLO DE ARCHIVO DE ENTRADA PARA EL PROGRAMA PALASM
PAL12H6 ESPECIFICACIONES DEL DISEÑO P0055A GENARO LOPEZ 5/AG0/90 EJEMPLO DE COMPUERTAS BASICAS
C D F G M N P Q I G N D J K L R O H E B A V C C
B = /A E = C * D H = F + G O = /M * /N R = P * / Q + / P * Q L = /I + /J + / K
DESCRIPCION:
EN ESTE ESPACIO SE PUEDE ESCRIBIR UNA DESCRIPCION MAS AMPLIA DE LA OPERACION DEL DISPOSITIVO, AS1 COMO TABLAS Y EJEMPLOS DE APLICACION, USANDO TANTAS LINEAS COMO SEAN NECESARIAS.
- 3 4 -
3.2.- EJEMPLO DE APLICACION, COMPUERTAS BASICAS
- 35 -
Section 7 Application Examples*
- 36 -
PAL12H6
P0055A EJEMPLO DE COMPUERTAS BASICAS
C D F G M N P Q I G N D J K L R O H E B A V C C
B=/A
E=C*D
H=F+G
O=/M*/N
R=P*/Q+/P*Q
L=/I+/J+/K
DESCRIPCION: ESTE ES EL ARCHIVO FUNC.DAT, CREARLO ANTES DE CORRER PALASM
- 37 -
PROCEDIMIENTO PARA USAR EL PROGRAMA PALASM
Una vez creado e l a r c h i v o FUNC.DAT (Ver hoja anter ior) , guardamos une copia de Bste con un nombre &S apropiado.
Por ejenplo:
A:\> COPY FUNC.DAT BASGATES-FUN 1 F i le (s) cop ied
Donde, BASGATES.FUN s i g n i f i c a que el archivo contiene Las
funciones correspondientes a las CWPUERTAS BASICAS.
Ahora, ya estamos l i s t o s p a r a c o r r e r e l programa
A:\>PALASM
NUMBER OF FUSES BLOUN = 306
OPERATION CODES: P=PLOT H-HEX S=SHORT L=BHLF N=BPNF M=MAP P=PUIT
ENTER OPERATION CODE
P ENTER OPERATION CODE
P
Stop - Program terminated.
Hemos se lecc ionado la operac ih PLOT para obtener l a g r h f i c a de los fus ib les que van a quemarse en e l PAL. E l nombre del archivo de sal ida para cualquier operación es FUSES.DAT, por l o que es conveniente renombrarlo:
A:\> REM FUSES.DAT BASGATES-PLT
Donde, BASGATES.PLT s i g n i f i c a que el arch ivo cont iene la gráf ica
(PLOT) de Los fus ib les de un PAL programado como COMPUERTAS BAS I CAS. ACLARACION: Este archivo sólo s i r v e como docunentación para e l
usuar io , e l Programador de PALs no puede leer lo .
Continuamos con l a generación de un archivo en formato BHLF que usaremos como entrada a l Programador de PALs
A:\>PALASM
NUMBER OF FUSES BLOWN = 306
OPERATION CODES: P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP P=PUIT ENTER WERATION CODE L ENTER OPERATION CODE Q
Stop - Program terminated.
- 38 -
Hemos elegido el c6digo de o p e r a c i h L = BHLF y e l a rch ivo de sa l ida se llama FUSES.DAT, como antes, vamos a renombrarlo
A:\> REY FUSES.DAT BASGATES.BHL
1 F i le(s) cop ied
Donde, BASGATES.BHL s i g n i f i c a que et archivo contiene La L i s t a de los f u s i b l e s , en formato BHLF, para programar a l PAL como COMPUERTAS BASICAS.
Este archivo está en e l formato adecuado para usarlo tomo
entrada a l programador de PALS.
A:\>DIR BASCATES.*
Volune i n d r i v e A i s DISC049
Directory of A:\
BASGATES FUN 248 13/08/90 22:21 BASGATES PLT 5353 14/08/90 13:34 BASGATES BHL 38?7 14/08/90 13:02
3 F i l e ( s ) 40220 bytes free
- 39 -
SALIDA DEL PROGRAMA PALASU CODIGO DE OPERACIOll L = BHLF COnPUERTAS BASICAS
BHLHHF BHHHHF BHLHHF BHHHHF BLHHHF BHHHHF BHHHHF BHHLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BLLLHF BHLLHF BHHHHF BHHHHF BHLLHF BHLLHF BHHHHF BHHHHF BHLLHF BHLLHF BHHHHF BHHHHF BHLLHF BHLLHF BHHHHF BHHHHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BHLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLHHF BLLHHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHLHF BHHHHF BHHHHF BHHHHF BHLHHF BHHHHF BHHHHF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHHF BHHHHF BHHHLF BHHHLF BHHHHF BHHHHF BHHHLF BHHHLF BHHHHF BHHHHF BHHHLF BHHLLF BHHHHF BHHHHF BHHLLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHHHLF BHLHLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF BHHLLF
- 4 0 -
BHHLLF BHHLLF BHHLLF BHLLLF BHHLLF BHHLLF BHHLLF BHHLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHHLLF BHHLLF BHLLLF BHLLLF BHHLLF BHHLLF BHLLLF BHLLLF BHHLLF BHHLLF BHLLLF BHLLLF BHHLLF BHHLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF BHLLLF
NOMBRE ORIGINAL DEL ARCHIVO: FUSES.OAT
RENOHBRARLO A: BASGATES.BHL
- 41 -
SALIDA DEL PROGRAM PALASM CODIGO DE OPERACIW P = PLOT
EJEMPLO DE CCWPUERTAS BASICAS
11 1111 1 1 1 1 2222 2222 2233 0123 4567 8901 2345 6789 0123 4567 8901
8 _ _ _ - "-X "00 "00 "00 "00 - - - - - - - - /A 9 xxxx xxxx xxoo xxoo xxoo xxoo xxxx xxxx 10 xxxx xxxx xxoo xxoo xxoo xxoo xxxx xxxx 11 xxxx xxxx xxoo xxoo xxoo xxoo xxxx xxxx 12 O000 0000 0000 O000 O000 O000 O000 O000 13 O000 O000 O000 O000 O000 O000 O000 O000 14 O000 O000 O000 O000 O000 O000 O000 O000 15 O000 O000 O000 O000 O000 O000 O000 O000
16 X-)(- - - - - "00 "00 "00 "00 "" "" C*D 17 XXXX XXXX XXOO XXOO XXOO XXOO XXXX XXXX 18 O000 O000 O000 O000 O000 O000 O000 O000 19 O000 O000 O000 O000 O000 O000 O000 O000 20 O000 O000 O000 O000 O000 O000 O000 O000 21 O000 O000 O000 O000 O000 O000 O000 O000 22 O000 0000 0000 O000 O000 O000 O000 O000 23 O000 O000 O000 O000 O000 O000 O000 O000
24 _ _ _ _ x"- "00 "00 "00 "00 "" "" F 25 _ _ _ _ - _ _ _ x-00 "00 "00 "00 "" "" G 26 O000 O000 O000 O000 O000 O000 O000 O000 27 O000 O000 O000 O000 O000 O000 O000 O000 28 O000 O000 O000 O000 O000 O000 O000 O000 29 O000 O000 O000 O000 O000 O000 O000 O000 30 O000 O000 O000 O000 O000 O000 O000 O000 31 O000 O000 O000 O000 O000 O000 O000 O000
32 _ _ _ _ _ _ _ _ "00 -xoo -xoo "00 "" "" /M*/U 33 xxxx xxxx xxoo xxoo xxoo xxoo xxxx xxxx 34 O000 O000 O000 O000 O000 O000 O000 O000 35 O000 O000 O000 O000 O000 O000 O000 O000 36 O000 O000 O000 O000 O000 O000 O000 O000 37 O000 O000 O000 O000 O000 O000 O000 O000 38 O000 O000 O000 O000 O000 O000 O000 O000 39 O000 O000 O000 O000 O000 O000 O000 O000
- 4 2 -
40 "" "" "00 "00 "00 x-00 -x" "" P*/Q
41 _ _ _ _ _ _ _ _ --m --m x"- _ _ _ _ /P*Q 42 O000 O000 O000 O000 O000 O000 O000 O000 43 O000 O000 O000 O000 O000 O000 O000 O000 44 O000 O000 O000 O000 O000 O000 O000 O000 45 O000 O000 O000 O000 O000 O000 O000 O000 46 O000 O000 O000 O000 O000 O000 O000 O000 47 O000 O000 O000 O000 O000 O000 O000 O000
48 "" "" "00 "00 "00 "00 "" -x" /I 49 "" "" "00 "00 "00 ---X / J
50 _ _ _ _ _ _ _ _ "00 "00 "00 "00 "-x "" /K 51 XXXX XXXX XXOO XXOO XXOO XXOO XXXX XXXX 52 O000 O000 O000 O000 O000 O000 O000 O000 53 O000 O000 O000 O000 O000 O000 O000 O000 54 O000 O000 O000 O000 O000 O000 O000 O000 55 O000 O000 O000 O000 O000 0000 O000 O000
LEGEND: X : FUSE NOT BLOWN (L,N,O) - : FUSE BLW (H,P,1)
O : PHANTOM FUSE (L,N,O) O : PHANTOM FUSE ( H , P , l )
NOnBRE ORIGINAL DEL ARCHIVO: FUSES.DAT
RENOnBRARLO A: BASGATES.PLT
- 4 3 -
- 4 4 -
3.3.- EJEMPLO DE APLICACION, DECODIFICADOR PARA
MANEJAR UN DISPLAY DE 7 SEGMENTOS
- 4 5 -
r.16 Hexadecimal 7-Segment Display Encoder ( C o n t m d
THREE STAOE HEXADECIMAL D t c o o E n m v E n
NnIvEn OUTPUTS LEWLAYP
- 4 6 -
PAL 16L8 PAL DESIGN SPECIFICATION
PAT0007 HEX DECODER/7SEG. DRIVER U/RIPPLE BLANKING, INTENSITY CON., & LAMP TEST
/RBI DO D l D2 D3 IC LT NC NC GND NC G /RBO F E D C B A VCC
IF (/IC) /A = /RW/DO*/D2 + /RBO*/DO*D3 + /RBO*Dl*D2 + /RBO*Dl*/D2*/D3 + /RWDO*D2*/D3 + /RBO*/Dl*/DZ*D3 + LT
IF (/IC) /B = /RBO*/D2*/D3 + /RBO*/DO*/D2 + /RBO*/DO*/Dl*/D3 + /RWDO*Dl*/D3 + /RBO*DO*/Dl*D3 + LT
IF (/IC) /C = /RBO*DO*/Dl + /RBO*DO*/D2 + /RBO*/Dl*/DZ + /RBO*DZ*/D3 + /RBO*/D2*D3 + LT
IF (/IC) /E = /RBO*/DO*/D2 + /RBO*D2*D3 + /RBO*/DO*Dl + /RBO*Dl*D3 + LT
IF (/IC) /F = /RBO*/DO*/Dl + /RBO*/D2*D3 + /RBO*Dl*D3 + /RBO*/DO*D2 + /RBO*/Dl*DZ*/D3 + LT
IF (VCC) RBO = /DO*/DI*/DZ*/D3*/RBI
I F (/IC) /G = /RBO*Dl*/D2 + /RBO*DO*D3 + /RBO*/D2*D3 + /RBO*/DO*Dl + /RBO*/Dl*DZ*/D3 + LT
DESCRIPTION: THE HEXADECIMAL DECODER/7-SEGMENT DRIVER FEATURES ACTIVE LOU OUTPUTS
FOR DRIVING DISPLAY DIRECTLY.
I F DATA INPUT IS ZERO AND RIPPLE BLANKING INPUT (/RBI) IS LOU THAT DIGIT UILL BE BLANKED AND RIPPLE BLANKING OUTPUT UILL BE LOU.
THE RIPPLE BLANKING OUTPUT (/RBO) PROVIDES BLANKING INFORMATION FOR THE NEXT LEAST SIGNIFICANT STAGE. IT PROVIDES A LOU IF /RBI IS
LOU AND THE DATA IN I S ZERO.
UHEN HIGH THE INTENSITY CONTROL (IC) UILL TURN OFF THE ENTIRE DISPLAY. IC MAY BE PULSED TO VARY THE INTENSITY OF THE DISPLAY.
UHEN HIGH THE LAMP TEST INPUT (LT) UILL TURN ON THE DISPLAY.
ESTE ES EL ARCHIVO FUNC.DAT, CREARLO ANTES DE CORRER PALASM
- 4 7 -
PROCEDIMIENTO PARA USAR EL PROGRAMA PALASM
Una vez creado el archivo FUNC.DAT (Ver hoja anterior), guardamos une copia de este con un nombre m6s apropiado.
Por ejemplo:
A:\* COPY FUNC.DAT HEXDISP.FUN 1 F i lecs) copied
Donde, HEXDISP.FUN s i g n i f i c a que el archivo contiene Las funciones del WEX DISPLAY DECODER DRIVER1'.
Ahora, ya estamos l i s tos para cor rer e l programa
NUMBER OF FUSES BLOUN = 1496
OPERATION CODES: P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP Q=PUIT ENTER OPERATION CODE
P ENTER OPERATION CODE
Q Stop - Program terminated.
Hemos seleccionado la operación PLOT para obtener La g r á f i c a de los fus ib les que van a quemarse en e l PAL. E l nombre del archivo de salida para cualquier operación es FUSES-DAT, por l o que es conveniente renombrarlo:
A:\> REI FUSES-DAT HEXDISP.PLT
Donde, HEXDISP.PLT s i g n i f i c a que e l arch ivo cont iene l a g rá f i ca
(PLOT) de los fus ib les de un PAL programado como olHEXADECIMAL DISPLAY DECODER DRIVER". ACLARACION: Este archivo sólo s i r v e como d o c w n t a c i ó n p a r a e l u s u a r i o , e l Programador de PALs no puede l e e r l o .
Continuamos con l a generación de un archivo en formato BHLF que usaremos como entrada al Programador de PALs
A:\*PALASM NUMBER OF FUSES BLOWN = 1496
OPERATION CODES: P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP P=QUIT ENTER OPERATION CODE L ENTER OPERATION CODE Q Stop - Program terminated.
- 48 -
Hemos elegido e l c6digo de operacih L = BHLF y e l archivo de salida se Llama FUSES.DAT, como antes, conviene renombrarlo
A:\> REN FUSES.DAT HEXDISP.BHL 1 Fi le(s) copied
Donde, HEXDISP.BHL signif ica que e l archivo contiene l a l i s t a de los fusibles, en formato BHLF, para programar a l PAL como "HEX DISPLAY DECODER DRIVER".
Este archivo est6 en e l formato adecuado para usarlo como entrada a l programador de PALS.
A:\>DIR HEXDISP.'
Volune i n d r i v e A i s DISCO49 Directory of A:\
HEXDISP FUN 2039 13/08/90 22:21 HEXDISP PLT 5289 14/08/90 13:34 HEXDISP BHL 3877 14/08/90 13:02
3 Fi le(s) 38920 bytes free
- 4 9 -
SALIDA DEL PROGRAMA PALASM CODIGO DE OPERACION L = BHLF HEX DISPLAY DECODER DRIVER
BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHLHHF BHHHLF BHHHHF BHHHHF BHHHHF BLLHHF BHHHHF BHHHHF BHHHHF BHHLLF BHHHHF BHHHHF BLHHHF BHHLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHLHHF BLHLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLHF BHHHHF BHHHHF BHHHLF BLHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLHHHF BHHLHF BHHHHF BHHHHF BLHHLF BHLLHF BHHHHF BHHHHF BHHHLF BLLHHF BHHHHF BHHHHF BHHHHF BHHLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHLHF BLHHHF BHHHHF BHHHHF BLHLLF BHHHHF BHHHHF BHHHHF BLLHHF BHHHLF BHHHHF BHHHHF BHHHHF BHLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLHLLF BHHHHF BHHHHF BHHHHF BHHHHF BLHLHF BHHHHF BHHHHF BLHHLF BHLHHF BHHHHF BHHHHF BHLLHF BHHHLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLLF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BLLLHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLHLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHLLLF BHLHHF BHHHHF BLHHHF BHLLHF BHHHHF BHHHHF BHHHHF BLLHLF BHHHHF BHHHHF BHHHHF BHLHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLHLLF BHHHHF BHHHHF BHHHHF BHHHHF BHHHHF BLLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHLF BHLLHF BHLHHF BHLHHF BLLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF
- 50 -
BHLHHF BHLHHF BLLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHLF BHLHHF BHLHHF BHLLLF BHLHHF BHLHHF BHLHHF
BHLHHF BLLHHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BLLHLF BHLHHF BHLHHF BHLHHF BHLLHF BHLHHF BHLHHF BHLHHF BHLHLF BHLHHF BHLHHF BHLHHF
BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF
BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHLF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BLLLHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHHF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BLLLLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BHLHLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF BLLLLF
NOMBRE ORIGINAL DEL ARCHIVO: FUSES.DAT RENOMBRARLO A: HEXDISP.BHL
- 51 -
SALIDA DEL PROGRAMA PALASM CoDlGO DE OPERACION P = PLOT
HEX DECODER/7SEG. DRIVER U/RIPPLE BLANKING, INTENSITY CON., & LAMP TEST
1 1 1 1 1 1 1 1 1 1 2222 2222 2233
Dl23 4567 8901 2345 6789 0123 4567 8901
"" /IC "" /RBO*/DO*/D2 "" /RBO*/DO*D3 "" /RBO*Dl*D2
"" /RBO*Dl*/D2*/D3 "" /RWDO*D2*/D3 "" /RBO*/Dl*/D2*D3 "" LT
32 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - x - - _ _ _ _ _ _ _ _ _ _ _ _ /IC 33 -x" "" -x" "" "" "" "x- "" /RBO*/DO*/D2 34 "" "" x"- x"- "" "" "x- "" /RBO*DZ*D3 35 -x" x"- "" "" "" "" --X- - - - - /RBO*/DO*Dl
-56 "" x"- "" x"- "" "" "x- "" /RBO*D1*D3 37 "" "" "" "" "" x"- "" "" LT
38 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 39 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
- 52 -
48 "" "" "" "" "" "" "" ""
49 -)(x- -x" -x" -x" "" "" "" "" /DO*/Dl*/DZ*/D3*/RBI
50 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 51 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 52 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 53 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 54 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 55 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
LEGEND: X : FUSE NOT BLOUN (L,N,O) - : FUSE BLOU ( H , P , l )
NOMBRE ORIGINAL DEL ARCHIVO: FUSES.DAT RENOMBRARLO A: HEXDISP.PLT
- 53 -
3 . 4 . - LISTADO DEL PROGRAMA PALASM VERSION 1 EN
LENGUAJE FORTRAN 77
- 54 -
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C*** *** C*** UNIVERSIDAD AUTONCUA METROPOLITANA IZTAPALAPA *** C*** *** C*** PROYECTO DE INGENIERIA ELECTRONICA *** C*** *** C*** PROGRAMA PALASM-FOR *** C*** *** C*** NAREZ MART I NE2 ARMANDO *** C*** *** C*** MATRICULA 84225276 *** C*** *** C*** 14/AGO/ 1990 *** C*** *** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C C ESTE PROGRAMA FUE CREADO POR MONOLITHIC MEMORIES INC. Y ES DE C DOMINIO PUBLICO. LA VERSION ORIGINAL ESTA ESCRITA EN FORTRAN IV, C ESTA ES UNA ADAPTACION PARA FORTRAN 77. L
C PALASM
C C C
C
C C C C
C C C C C C
C C
- TRADUCE LAS ECUACIONES SIMBOLICAS A COOIGO PAL OBJETO. FORMATEADO PARA ENTRAR DIRECTAMENTE A PROGRAMADORES DE PROM.
ENTRADA: LAS ESPECIFICACIONES DE DISERO Y LAS FUNCIONES BOOLEANAS DEBERAN ESTAR
ALMACENADAS EN EL ARCHIVO: FUNC.DAT
SALIDA: EL PATROU DE FUSIBLES EN FORMATO BHLF,
O LA GRAFICA DE FUSIBLES QUEMADOS QUEDARA EN EL ARCHIVO: FUSES.DAT
NUMERO DE PARTE: EL NUMERO DE PARTE DEL PAL DEBE APARECER EN LA COLUMNA UNO DE LA LINEA UNO
LISTA DE PATAS: 20 NOMBRES SIMBOLICOS DE LAS PATAS DEBEN
APARECER COMENZANDO EN LA LINEA 5 L
C ECUACIONES: COMIENZAN EN LA PRIMERA LINEA DESPUES DE LA
C LISTA DE PATAS EN LAS SIGUIENTES FORMAS:
L
C C C C
C C C C C
C C
A = B*C + D
A := B*C + D
IF( A*B ) C = D + E
A2 := (Al:*:Bl) + /C
LOS ESPACIOS EN BLANCO SE IGNORAN, PERO LOS TABULADORES <HT> (ASCII O9 HEX) PROVOCAN ERRORES DIFICILES DE DETECTAR.
- 5 5 -
C OPERADORES: = IGUALDAD
C := REEMPLAZADO POR (DESWES DEL RELOJ) C / COMPLEMENTO C * AND, PRODUCTO C + OR, SUMA C :+: OR EXCLUSIVA (XOR) C :*: NOR EXCLUSIVA (XNOR) C () TERCER ESTADO CONDICIONAL C (3-STATE OUTPUTS) O SIMBOLO FIJO C C SIMBOLOS FIJOS C PARA PAL 16x4
C Y PAL16A4 C UNICAMENTE: (AN+/BN) DONDE N = O , I , 2, 3 C (AN+BN) PARA PATAS DE SALIDA C (AN 1 17, 16, 15, 14, RESP C ( /AN+/BN ) A ES SALIDA C (/BN) B ES ENTRADA
C (AN:+:BN) C (AN*/BN) C (AN:*:BN) C (BN) C (AN*BN) C (/AN)
C (/AN*/BN) C (/AN*BN)
C
C SUBRUTINAS: INITLZ, GETSYM, INCR, MATCH, FIXSYM, C TUEEK, PLOT, HEX, BHLF, MAP, SLIP C C FUNCIONES: IXLATE C C REV LEVEL: J 1/16/80 JB,SK
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PROGRAMA PRINCIPAL
C- LBLANK,LLEFT,LAND,LOR,LSLASH,LEWAL,LRIGHT LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEPUAL,LRIGHT,LFIRST,LFlX
LOGICAL LFUSES(32,64).LPHASE(2O),LBUF(20)
INTEGER ICOLUM,lBLOU CHARACTER TITLE(80),ILINE(80),ISYM(8,20),IBUF(8,~O)~C,H,R,P~
C S,R,P,L,N,IOT DATA LFUSES/2048*.FALSE./,L/'L'/,H/'H'/,N/'N'/,P/'p'/,
C C/'C'/,R/'Rf/,M/'M'/,Q/'Q'I,S/1S1/lCOLUn/o/,IBLOU/O/
OPEN(1,FILE = 'FUNC.DAT') OPEN(6,FILE = IFUSES.DAT',STATUS = 'NEW)
LFIX = .FALSE. READ(1,lO) INOAI,IOT,INW,T1TLE,ILIWE
10 FORF(AT(3X,I2,A1,11,//,80A1,//,80A1) CALL INITLZ(INOAI,IOT,INW,ITYPE,LFUSES,ILINE,ICOLU~,LFIX) DO 20 J=1,20
20 CALL GETSYM(LPHASE,ISYM,J,ILINE,ICOLUn,LFIX)
- 56 -
IF(.NOT.(LEPUAL.OR.LLEFT.OR.LAND.OR.LOR.OR.LRIGHT)) GOTO 25
bJRITE(*,23) 23 FORMAT( PIN LIST ERROR, LESS THAN 20 SYMBOLS') 25 CALL GETSYM(LBUF,IBUF,1,ILINE,ICOLUM,LFIX)
28 IF(.NOT.LEWAL) GOTO 25 CALL MATCH(IMATCH,IBUF,ISYM) IF( (IMATCH.LT.12) .OR. (IMATCH.GT.19) 1 GOTO 100
I88PRO=(l9-lMATCH)*8 + 1 IF( 1OT.EQ.C ) I88PRO=25
I COLuM=O 30 CALL INCR(ILINE,ICOLUM,LFIX)
IF( .NOT. ( LEQUAL.OR.LLEFT 1 1 GOTO 30 IF(.NOT.LLEFT) CALL SLIP(LFUSES,I88PRO,INOAI,IOT,1N00,IBLOU)
DO 70 I8PRO=1,16 IPROD = 188PRO + I8PRO - 1 LFIRST=.TRUE.
50 CALL CETSYM(LBUF,IBUF,1,ILINE,ICOLuM,LFIX) IF(LFIX) GOTO 59 CALL MATCH(IMATCH,IBUF,ISYM)
IF(IMATCH.EQ.0) GOTO 100 IF(lMATCH.EQ.99) COTO 64 IF(.NOT.LFIRST) GOTO 58
LFIRST=.FALSE. DO 56 I=1,32
IBLOU = IBLOU + 1 56 LFUSES(I,IPROD)=.TRUE. 58 I BUBL=O
IF((( LPHASE(IMATCH)).AND.(.NOT.LBUF(~))).OR. C ((.NOT.LPHASE(IMATCH)).AND.( LBUF(1)))) IBUBL=l
IINPUT=IXLATE(IMATCH,ITYPE)+IBUBL IF(IINPUT.LE.0) GOTO 60 IBLOU = IBLOU - 1 LFUSES(IINPUT,IPROD)=.FALSE. CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.FALSE.,ITYPE)
GOTO 60
59 CALL FIXSYM(LBUF,IBUF,ILINE,ICOLLJM,LFIRST,LFUSES,IPROD,
60 IF(LAND) GOTO 50 64 IF( .NOT.LRIGHT 1 GOTO 68 66 CALL INCR(ILINE,ICOLUM,LFIX)
68 IF(.NOT. (LOR.OR.LEQUAL) ) GOTO 74 70 CONTINUE 74 CALL GETSYM(LBUF,IBUF,1,ILINE,ICOLUM,LFIX)
C LFIX)
IF( .NOT.LEQUAL ) GOTO 66
IF(LLEFT.OR.LEQUAL) GOTO 28 100 IF((IBUF(l,l).EQ.C).AND.(IBUF(2,1).EP.R).AND.(IBUF(4,1).EQ.P)
C .AND.(IBUF(8,1).EQ.N)) GOTO 102 URITE(*,101) (IBUF(I,l),I=1,8),1LINE
101 FORMAT(' ERROR SYMBOL = 1,8A1,/,1X,80A1,/) 102 IF(ITYPE.LE.4) CALL TUEEK(ITYPE,IOT,LFUSES)
URITE(*,104) IBLOU 104 FORMAT(' NUMBER OF FUSES BLOUN = I , 14)
URITE(*,*) ' I
URITE(*,106)
- 57 -
1 0 6 FORMAT(' OPERATION CODES: I ,
c 'P=PLOT H=HEX S=SHORT L=BHLF N=BPNF M=MAP a=auIT') 1 0 8 URITE(*,llO) 110 FORMAT(' ENTER OPERATION CODE '1
READ(*,l20) I O P 120 FORMAT(lA1)
IF(1OP.EP.P) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.TRUE.,ITYPE)
IF(1OP.EP.H) CALL HEX(LFUSES,H) IF(1OP.EQ.S) CALL HEX(LFUSES,S) IF(1OP.EP.L) CALL BHLF(LFUSES,H,L) IF(1OP.EP.N) CALL BHLF(LFUSES,P,N) IF(1OP.EQ.M) CALL MAPCLFUSES) IF(1OP.NE.P ) COTO 1 0 8 STOP END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C SUBROUTINE INITLZ(INOAI,IOT,INW,ITYPE,LFUSES,ILINE,ICOLUM,LFIX)
CHARACTER ILINE(80),IOT,L,R,X,A LOGICAL LFUSES(32,64),LFIX
DATA L/'L'/,R/'R'/,X/'X'/,A/'A'/
IF( INOAI .LT. 16 ) ITYPE = (INOAI/2) - 4 IF( (INOAI .Ea. 16 ) ) ITYPE = 4 IF( (INOAI .Ea. 16 ) .AND. (IN00 .Ea. 8) ) ITYPE = 5 IF( (101 .Ea. R) .OR. (IOT .Ea. A ) .OR. (IOT .Ea. X) 1 ITYPE =6 CALL INCR(ILINE,ICOLUM,LFIX) RETURN
END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C
10
15
20 25 30
40 C
SUBROUTINE GETSYM(LPHASE,ISYM,J,ILINE,ICOLUM,LFIX) COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEPUAL,LRIGHT
LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEPUALlLRICHT,LPHASE(2O),LFIX CHARACTER ILINE(80),ISYM(8,20),IBLANK DATA IBLANK/' '/ LFIX=.FALSE. IF( .NOT.(LLEFT.OR.LAND.OR.LOR.OR.LEPUAL.OR.LRIGHT) COTO 10 CALL INCR(ILINE,ICOLUM,LFIX) IF(LLEFT) COTO 60 LPHASE(J)=( .NOT. LSLASH
IF(LPHASE(J1) COTO 15 CALL INCR(ILINE,ICOLUM,LFIX)
DO 20 I=1,8
ISYM(I,J)=IBLANK DO 30 I=1,7
ISYM(I,J)=ISYM(l+l,J) ISYM(8,J)=ILINE(ICOLUM) CALL INCR(ILINE,ICOLUM,LFIX) IF( LLEFT.OR.LBLANK.OR.LAND.OR.LOR.OR.LR1GHT.OR.LEPUAL 1 GOTO 40 COTO 25 CON1 I NUE URITE(*,50) (ISYM(I,J), I=1,8)
- 5% -
C 50 FORMAT(' ',8A1) RETURN
60 LFIX=.TRUE. RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C
SUBROUTINE INCR(ILINE,ICOLUM,LFIX) COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRlGHT LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LFIX CHARACTER ILINE(80),IBLANK,ILEFT,IAND,IOR,ISLASH,IEQUAL,IRIGHT,
C I COLON DATA IBLANK/' '/,lLEFT/'('/,IAND/'*'/,IOR/'+'/, C ISLASH/f/'/,IEWAL/f=f/,IRIGHT/f )'/,ICOLo)(/f :'/
10
20 30
C C 50
LBLANK=.FALSE. ICOLUM=ICOLUM+1 IF(ICOLUM.LE.79) GOTO 30 READ(1,20,ERR=70,END=70) ILINE ICOLUM=l FORMAT(80Al) IF( ILINE(1COLUM) .Ea. IBLANK 1 LBLANK=.TRUE. URITE(*,50) ILINE(IC0LUM) FORMAT( . I , ?Al) IF( ( ILINE(ICOLUM).EQ.IBLANK 1 .OR.
C ((ILINE(ICOLUM).EQ.ICOLON).AND.(.NOT.LFIX))) GOTO 10 LLEFT =( ILINE(IC0LUM) .Ea. ILEFT ) LAND =( ILINE(IC0LUM) .Ea. IAND )
LOR =( ILINE(IC0LUM) .Ea. IOR )
LSLASH=( ILINE(IC0LUM) .Ea. ISLASH) LEQUAL=( ILINE(1COLUM) .Ea. IEPUAL) LRIGHT=( ILINE(IC0LUM) .Ea. IRIGHT)
60 RETURN 70 LBLANK=.TRUE.
RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C
SUBROUTINE MATCH(IMATCH,IBUF,ISYM) CHARACTER IBUF(8,20),ISYM(8,20),C,A,R,Y LOGICAL LMATCH DATA C/'C'/,A/'A'/,R/'R'/,Y/'Y'/
IMATCH=O DO 20 J=1,20
LMATCH=.TRUE. DO 10 1=1,8
10 LMATCH=LMATCH.AND.(IBUF(I,1).EP.ISYM(I,J)) IF(LMATCH) IMATCH=J
20 CONT I NUE
- 59 -
IF((IBUF(3,1).EQ.C).AND. C (IBUF(4,1).EQ.A).AND. C (IBUF(5,1).EQ.R).AND. C (IBUF(6,1).EQ.R).AND. C (IBUF(7,1).EQ.Y)) IHATCH=99
RETURN END
C .....................................................................
FUNCTION IXLATE(IMATCH,ITYPE)
INTEGER ITABLE(2016)
DATA ITABLE/ C 3 , 1 , 5, 9,13,17,21,25,29,-1,31,-1,-1,-1,-1,-1,-1,-1,-1,-1, C 3 , 1 , 5, 9113,17,21,25,29,-1,31,27,-1,-1,-11-11-11-1, 7, -1 ,
C 3 , 1 , 5, 9,13,17,21,25,29,-1,31,27,23,-1,-1,-11-1,11, 7,-1, C 3 , 1 , 5, 9,13,17,21,25,29,-1,31,27,23,19,-1,-1,15,11, 7,-1, C 3 , 1 , 5, 9,13117121,25,29,-1131,-1,27,23,19,15,11, 7,-1,-11 C -1, 1 , 5, 9113,17,21,25,291-1,-1131127123119,151111 7, 3,-1/
IXLATE=ITABLE(IMATCH,ITYPE)
RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C SUBROUTINE FIXSYM(LBUF,IBUF,ILINE,ICOLUn,LFIRST,LFUSES,IPROD,LFIX)
LOGICAL LBUF(2O),LFUSES(32,64),LFIRST,LMATCH,LFIX CHARACTER IBUF(8,20),ILlNE(80),FIXBUF(8),A,B,ISLASH,IOR,IAND,N,Q,
C N0,Nl ,N2,N3, IBLANK, IRIGHT,TABLE(5,14), ICOLON,K,TITLE(80)
C IAND/~*~/,N/~N1/,Q/1Q1/,NO/1O1/lNl/~l~/,N2/~2~/,N3/131/, C ICOLON/':'/, C TABLE / C C C
C
DATA A/'A1/lB/lB'/,ISLASH/l/~/,IOR/l+l/lIBLANK/l l/lIRIGHT/l)l/,
I I 1AI 1+1 1 / 1 IBI I I I I IAI 1+1 IBI
I I I I I I I I IAI l / I I A I 1 + 1 I I I I I I I I I I 1 / 1 l g l IAI 1 : 1 1 1 + 1 l:l l g l I I IAI I * I I / l l g l I I 1/1 I A I 1+1 IBI IAI l:l I * I I : I IBI I I I I I I I I IBI I I I I IAI I * / IBI
~ , , # 1 1 1 1 1 1 ~ 1 1 ~ 1
I I I I I I I I I I I I I I I * I 1 / 1 IBI I I 1 / 1 IAI I * I lB l/
1 1 , , , # 1 ~ 1 1
I I I I I I I I I I B , I I f I
, 1 1 # # # 1 1 1 # 1 # J #
, I , / , A , i , A , # I I , I , , I INPUT=O
DO 20 1=1,8 IBUF(I,l)=IBLANK
20 FIXBUF(I)=IBLANK
21 CALL INCR(ILINE,ICOLUn,LFIX)
K=ILINE(ICOLUM) IF(K.EQ.IRIGHT) GOTO 40 IF(K.EQ.NO) IINPUT=8 IF(K.EQ.Nl) IINPUT=12
IF(K.EQ.N2) IINPUT=16 IF(K.EQ.N3) IINPUT=20 DO 24 J=1,7
24 IBuF(J,l)=IBUF(J+l,l) IBUF(8,1)=K IF(.NOT. ( (K.EQ.A).OR.(K.EQ.B).OR.(K.EQ.ISLASH).OR.(K.EQ.IOR)
C .OR.(K.EQ.IAND).OR.(K.EQ.ICOLON) 1 ) GOTO 21
- 60 -
30
40
50
60
80 85
90
DO 30 I=1,4 FIXBUF(I)=FIXBUF(I+l)
FIXBUF(5)=lLINE(ICOLUM) COTO 21 IMATCH=O
DO 60 J=1,14 LMATCH=.TRUE.
DO 50 I=1,5 LCUTCH=LMATCH .AND. ( FIXBUF(I).EQ.TABLE(I,J) )
IF(LMA1CH) IMATCH=J
IF(IMATCH.EP.0) COTO 100 IF(.NOT.LFIRST) GOTO 85
LFIRST=.FALSE. DO 80 I=1,32
LFUSES(I,IPROD)=.TRUE. DO 90 1=1,4 IF( (IMATCH-7).GT.O ) LFUSES(IINPUT+I,IPROD)=.FALSE. IF( (IMATCH-7).GT.O ) IMATCH=IMATCH-8 IMATCH=IMATCH+IMATCH
LBUF(l)=.TRUE. CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.FALSE.,ITYPE)
100 LFIX=.FALSE.
CALL INCR(ILINE,ICOLUM,LFIX) RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C SUBROUTINE PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,LDUMP,ITYPE)
LOGICAL LBUF(2O),LFUSES(32,64),LD~P CHARACTER IBUF(8,20),IOUT(64),IBLANK,IAND,IOR,ISLASH,IDASH,X,
C ISAVE(66,32),TITLE(80)
C IOR/'+'/, ISLASH/'/'/,X/'X'/, IDASH/'-'/
DATA IBLANK/' I / , lAND/'*'/, ISAVE/2048*' '/,
IFCLDUMP) GOTO 60 IF(ISAVE(IPROD,l).NE.IBLANK) RETURN
IF( LBUF(1) COTO 5
DO 30 J=1,31 30 ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
ISAVE(IPROD,32)=ISLASH
5 DO 20 1=1,8 IF( lSAVE(IPROD,l).NE.lBLANK 1 RETURN
IF( IBUF(I,1) .EQ. IBLANK 1 GOTO 20 DO 10 J=1,31
10 ISAVE(IPROD,J)=ISAVE(IPROD,J+1) ISAVE(IPRODl32)=IBUF(I,1)
20 CON1 I NUE IF(ISAVE(IPROD,l).NE.IBLANK) RETURN
40 DO 50 J=1,31 50 1SAVE(IPRODlJ)=ISAVE(IPROD,J+1)
ISAVE(IPRODI32)=IAND RETURN
- 61 -
65
70
60 URITE(6,62) TITLE
62 FORMAT(////,' ',80A1,//, C ' 1 1 1 1 1 1 1 1 1 1 2222 2222 2233',/, C 1 0123 4567 8901 2345 6789 0123 4567 8901',/)
DO 100 I88PRO=1,57,8 DO 94 IBPRO=1,8
IPRW=188PRO+I8PRO-1 ISAVE(IPROD,32)=IBLANK
DO 70 I=1,32 IF( ISAVE(IPROO,l) .NE. IBLANK 1 GOTO 70
DO 65 J=1,31 ISAVE(IPROD,J)=ISAVE(IPROD,J+l)
ISAVE(IPROD,32)=lBLANK
CONTINUE DO 80 I=1,32
IWT(I)=X IF( LFUSES(1,IPROD) 1 IWT(I)=IDASH
IWT(I+32)=ISAVE(IPROD,I) 80 CONTINUE
I F ( ITYPE .LE. 4 ) CALL FANTOM(ITYPE,IOUT,IPROD,~BPRO)
IPROD=IPROD-l
URITE(6,90) IPROD,IWT
90 FORMAT(' ' ,12,8(' ' ,4Al), ' ' ,32A1) 94 CONTINUE
URITE(6,96) 96 FORMAT(1X)
1 O0 CONTINUE
URITE(6,110) 110 FORMAT(/,
C' LEGEND: X : FUSE NOT BLOUN (L,N,O) - : FUSE BLOU ( H , P , l ) ' )
IF (ITYPE.LE.4) URITE(6,lll)
1 1 1 FORMAT(
C' O : PHANTOM FUSE (L,N,O) O : PHANTOM FUSE (H,P l l ) ' ) URITE(6,112)
112 FORMAT(////) RETURN
END C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C SUBRWTINE HEX(LFUSES,IOP)
LOGICAL LFUSES(32,64) CHARACTER lTEMP(64),S,H,IOP,NUMHEX DATA H/'H'/,S/'S'/ IF(1OP.EP.H) URITE(6,lO)
1 O FORMAT (// , ' DO 40 1=1,33,32 INC=I-l
DO 40 IPROD=1,7,2 DO 20 J=1,2
DO 20 IINPUT=1,32
I HEX=O
. I , / / )
- 62 -
15 20 30
IF(LFUSES(IINPUT,IPROD + J-1 + O+INC)) IHEX=IHEX+l IF(LFUSES(IINWT,IPROD + J-1 + 8+INC)) IHEX=IHEX+2 IF(LFUSES(IINPUT,IPROD + J-1 +16+INC)) IHEX=IHEX+4 IF(LFUSES(IINPUT,IPROD + J-1 +24+INC)) IHEX=IHEX+8 IF(IHEX .Ea. O ) NUMHEX = '0' IF(1HEX .Ea. 1 ) NUNHEX = ' 1 ' IF(1HEX .Ea. 2) NWHEX = '2' IF(1HEX .Ea. 3) NUNHEX = '3'
IF(1HEX .Ea. 4) NUMHEX = '4' IF(IHEX .Ea. 5) NUWHEX = '5' IF(1HEX .Ea. 6) NUMHEX = '6' IF(1HEX .Ea. 7) NUMHEX = '7' IF(1HEX .Ea. 8) NUMHEX = '8' IF(IHEX .Ea. 9 ) NUMHEX = r9' IF(1HEX .Ea. 10) NWHEX = 'A' IF(1HEX .Ea. 1 1 ) NUWHEX = '6' IF(1HEX .Ea. 12) NUHHEX = 'Cf
IF(1HEX .Ea. 13) NUHHEX I D f
IF(1HEX .Ea. 14) NUMHEX = 'E f IFCIHEX .Ea. 15) NUHHEX = 'F'
20 ITEMP(I1NPUT + 32*(5-1) )=NUMHEX IF(1OP.EQ.H) URITE(6'60) ITEHP
40 IF(1OP.EP.S) URITE(6'61) ITEMP 60 FORHAT(' ' , 3 2 ( A l n f ' , 3 2 ( A l , ' ' I f ' . ' ) 61 FORMAT(' ',64A1)
IF(1OP.EQ.H) URITE(6'70)
70 FORMAT(' .',//I RETURN
END C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C
SUBRWTINE BHLF(LFUSES,H,L)
LOGICAL LFUSES(32.64) CHARACTER ITEHP(4,8),L,H
URITE(6,lO)
10 FORMAT(//,' DO 20 1=1,33,32 INC=I-l
DO 20 IPROD=1,8
DO 20 J=1,25,8 DO 15 K=1,8
IINPUT=J+K-1 ITEMP(l,K)=L ITEHP(Z,K)=L ITEMP(3,K)=L ITEMP(4,K)=L IF(LFUSES(IINPUT,IPROD+ O+INC)) ITEMP(4,K)=H IF(LFUSES(IINPUT,IPROD+ 8+INC)) ITEMP(3,K)=H IF(LFUSES(IINWT,IPROD+16+INC)) ITEMP(Z,K)=H IF(LFUSES(IINPUT,IPROD+24+INC)) ITEMP(l,K)=H CONTINUE
URITE(6,30) ITEMP FORMAT(' ' ,8( 'Bf ,4A1, 'F '1)
- 63 -
URITE(6,lO) RETURN
END C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C
SUBROUTINE TUEEK(ITYPE,IOT,LFUSES) CHARACTER IOT,L,C
LOGICAL LFUSES(32,64)
DATA L/'L'/,C/'C'/ IF(ITYPE.CE.4) COTO 20 DO 10 IPROD=l,64
LFUSES(15,IPROD)=.TRUE. LFUSES(16,IPROD)=.TRUE. LFUSES(19,IPROD)=.TRUE. LFUSES(20,IPROD)=.TRUE. IF(ITYPE.CE.3) COTO 10 LFUSES(ll,IPROD)=.TRUE. LFUSES(12,IPROD)=.TRUE. LFUSES(23,IPROD)=.TRUE. LFUSES(24,IPROD)=.TRUE. IF(ITYPE.GE.2) COTO 10 LFUSES( 7,1PROD)=.TRUE. LFUSES( 8,1PROD)=.TRUE.
LFUSES(27,IPROD)=.TRUE. LFUSES(28,IPRDD)=.TRUE.
10 CONTINUE DO 18 IINWT=7,28
DO 12 IPROD=1,57,8 LFUSES(IIWPUTlIPROD+4)=.FALSE.
LFUSES(IINPUT,IPROD+5)=.FALSE.
LFUSES(IINPUT,IPROD+6)=.FALSE.
12 LFUSES(IINPUT,IPROD+7)=.FALSE. IF(ITYPE.GE.3) COTO 18 DO 14 IPROD=17,41,8
LFUSES(IINPUT,IPROD+2)=.FALSE. 14 LFUSES(IINPUTIIPROD+3)=.FALSE.
IF(ITYPE.CE.2) COTO 18 DO 16 IPR00=1,57,8
LFUSES(IINPUT,IPROD+2)=.FALSE. 16 LFUSES(IINPUT,IPROD+3)=.FALSE. 18 CONTINUE 20 IF( (ITYPE.EP.1) .OR. ((ITYPE.EP.4).AND.(IOT.EQ.L)) ) GOTO 100
DO 99 IINWT=1,32
DO 30 1PRW=1,8
LFUSES(IINPUT,IPROD+ O)= (1OT.NE.L) 30 IF(I0T.NE.C) LFUSES(IINPUT,IPROD+56)= (1OT.NE.L)
IF(ITYPE.LE.2) GOTO 99 DO 40 IPROD=1,8
LFUSES(IINPUT,IPROD+ 8)= (1OT.NE.L) 40 IF(I0T.NE.C) LFUSES(IINPUT,IPROD+18)= (1OT.NE.L)
IF(ITYPE.LE.3) COTO 99 DO 50 IPROD=1,8
LFUSES(IINPUT,IPROD+16)= (I0T.NE.L)
- 6 4 -
50 IF(I0T.NE.C) LFUSES(IINPUT,IPR00+40)= (1OT.NE.L) 99 CONTINUE 100 RETURN
END C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C
SUBROUTINE SLIP(LFUSES,I88PRO,INOAI,IOT,INOO,IBLOU) LOGICAL LFUSES(32,64) CHARACTER IOT,R DATA R/'R1/ I F ( (INOAI.LT.16) .OR. (IN00.LT.4) .OR.
C ( (IOT.EP.R).AND.(INOO.EQ.8) ) .OR. C ( (188PRO.GE. 9).AND.(I88PRO.LE.49).AND.(INOO.EP.6) ) .OR. C ( (I88PRO.GE.17).AND.(I88PRO.LE.41).AND.(INOO.EP.4) ) ) RETURN DO 10 1=1,32 IBLOU = IBLOU + 1
10 LFUSES(I,I88PRO)=.TRUE. 188PRO I88PRO + 1 RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C
SUBROUTINE UAP(LFUSES) LOGICAL LFUSES(32.64) INTEGER ITABLE(32) CHARACTER X,D,ILINE(16) DATA X/'X'/,D/l-l/,
C ITABLE/17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30, C 13,12,15,14, 9, 8,11,10, 5, 4, 7, 6, 1, O, 3, 2/ WRITE(6,lO)
10 FORMAT( ' INPUT',//, C C C
I 11 11 22 22 22 22 22 33',/,
1 1 1 1 1 1 I # / #
I 76 98 10 32 54 76 98 lo1,//,
C ' PROOUCT 32 54 98 10 54 76 10 32',/ )
I
I PROO=7 IDELTA = - 1 DO 50 I=1,2
DO 40 J=1,4 DO
20
21
22
30 K=1,4 DO 20 L=1,16
ILINE(L)=X IF( LFUSES(ITABLE(L)+l ,IPROO+l ) ) ILINE(L)=D
URITE(6,21) IPROO,ILINE FORMAT(' I,12,l ',8(2A1,' )
DO 22 L=1,16 ILINE(L)=X IF( LFUSES(ITABLE(L+16)+1 ,IPROD+1 1 1 ILINE(L)=D
URITE(6,21) IPR00,ILINE lPROO = IPROO + IDELTA DO 23 L=1,16
ILINE(L)=X
- 65 -
23 IF( LFUSES(ITABLE(L+16)+1 ,IPROD+l ) ) ILINE(L)=D
URITE(6,21) IPROD,ILINE DO 24 L=1,16
ILINE(L)=X 24 I F ( LFUSES(ITABLE(L)+l ,IPROD+l ) ) ILINE(L)=D
URITE(6,Zl) IPROD,ILINE 30 IPROD = IPROD + IDELTA
URITE(6,29) 29 FORMAT(' ')
40 IPROD IPROD + 8*(1-IDELTA)
IPROD 32 SO ]DELTA= +I
URITE(6'29)
URlTE(6,29) RETURN END
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C SUBROUTINE FANTOM(ITYPE,IOUT,IPROD,I8PRO) INTEGER ITYPE,IPROD,IlPRO CHARACTER IOUT(64) ,X,IDASH,FX,F lDASH DATA X/'X'/,IDASH/"'/,FX/'O'/,FIDASH/'O'/
DO 10 1.1'32
IF( IWT(I).EQ.X ) IWT(II=FX 10 IF( IOUT(I).EQ.IDASH ) IOUT(I)=FIDASH
IF((ITYPE.EQ.4).AND.((IPROD.LE.24).0R.(IPROD.GE.41))) GOTO 100 IF((ITYPE.EP.3).AND.((IPROO.LE.16).0R.(IPROD.GE.45))) COTO 100 IF((ITYPE.EQ.2).AND.((IPROD.LE. 8).OR.(IPROD.GE.53))) COTO 100 IF((lTYPE.LE.3).AND.(IBPRO.GE. 5)) GOTO 100 IF((ITYPE.LE.2).AND.(IPROD.GE.l9).AND.(IPROD.LE.48).AND.
C (18PRO.GE.3)) GOTO 100 IF((ITYPE.EP.l).AND.(IBPRO.GE. 3 ) ) GOTO 100
DO 50 1=1,32
IF(((I.EP.15).0R.(I.EQ.16).0R.(I.EP.19).OR.(I.EQ.20)).AND. C (ITYPE.LE.3)) COTO 50
IF(( (I .EP . l l ) .~ . (I .EQ.12) .0R. (I .EQ.23) .~ . (I .E~.24)) .AND. C (ITYPE.LE.2)) GOTO 50
IF(((I.EQ. 7).0R.(I.EP. 8).OR.(I.EP.27).OR.(I.EQ.28)).AND. C (ITYPE.LE.1)) GOTO 50
IF(IOUT(I).EP.FX 1 IWT(I)=X IF(IWT(I).EP.FIDASH) IOUT(I)=IDASH
50 CONTINUE
100 RETURN END
C C********************************************************************
C
- 66 -
4 . - COMO USAR EL PROGRAMADOR DE PALS.
- 67 -
4. - COMO USAR EL PROGRAMADOR DE PALS
1.- Conectar el Programador de Pals a la línea de alimentación
de 120 VCA.
2.- Conectar el cable de interfaz, del Programador de Pals, al
puerto paralelo LPTl de la computadora (Puerto para la
impresora) . 3. - Con el Programador de Pals apagado, inserte el PAL a
programar en la base que está colocada en la esquina, de la
tarjeta principal, más cercana al cable de interfaz. En esa
posición existe una etiqueta que le indica hacia donde debe
quedar la pata 1 del Pal.
4. - Encienda la computadora y corra el programa PROGPAL, éste
le indicará cuando encender el circuito Programador de Pals.
Siga cuidadosamente las instrucciones para el encendido y
apagado del Programador de Pals, de lo contrario el
dispositivo a programar puede dañarse irremediablemente.
ADVERTENCIAS
Verifique que el interruptor PROG. esté apagado antes de
encender o apagar el Programador de Pals para no dañar el
dispositivo a programar.
Nunca inserte o remueva el PAL cuando esté encendido el
Programador de Pals.
- 68 -
4.1.- PARA PROGRAMAR UN PAL
i) Consultar el capitulo 1 para elaborar el diseño.
ii) Crear el archivo FUNC.DAT como se explica en el capítulo 3
iii) Correr el programa PALASM y seleccionar la operación BHLF
para generar el archivo NSES.DAT en formato BHLF.
iv) Seguir los pasos 1,2 , 3 y 4 descritos al principio de este
Capítulo.
v) Correr el programa PROGPAL
Por ejemplo para programar un PAL16L8 fabricado por
National Semiconductor, ejecutaremos los pasos siguientes:
A:\>PROGPAL
Aparecerá en la pantalla la portada del programa, oprimir
cualquier tecla para continuar.
Después se presentará lo siguiente:
OPCIONES DISPONIBLES:
1) Programar PAL
2) Copiar PAL
3 ) Salir del programa
SELECCIONE OPCION (1-3) : 1
FABRICANTE DEL PAL:
1) National Semiconductor
2) Texas Instruments
SELECCIONE OPCION (1-2) : 1
- 69 -
NUMERO DE PARTE DEL PAL:
1) PALlOH8, PAL12H6, PAL14H4, PAL16H2 PAL16C1
2) PAL12L6, PAL14L4, PAL16L2, PAL16L8, PAL16R8
PAL16R6, PALl6R4, PALlX4 PALl6A4
SELECCIONE OPCION (1-2): 2
Después el programa solicitará el nombre del archivo, en
formato BHLF, generado por el programa PALASM. Para este
ejemplo responderemos FUSES.DAT
Deme el nombre del archivo: FUSES.DAT
A continuación el programa presentará el mensaje:
Verifique que el interruptor PROG esté apagado y
Encienda el programador de PALS
Pulse <control> <y> para continuar
Después, aparecerá:
Encienda el interruptor PROG
Pulse <control> <y> para continuar
Si todo va bien, aparece:
Espere por favor... Estoy quemando fusibles.
- 70 -
Si todo salió bien, aparece:
Apague el interruptor PROG y después
Apague el PROGRAMADOR DE PALs
Pulse <control> <y> para continuar
Finalmente, nos salimos del programa
OPCIONES DISPONIBLES :
1) Programar PAL
2) Copiar PAL
3) Salir del programa
SELECCIONE OPCION (1-3): 3
Ahora, el PAL16L8 ya está programado y listo para trabajar.
NOTA: El programa hace, automáticamente, hasta cinco intentos
para quemar un fusible. Si no lo logra informa al usuario que
no tuvo éxito, especifica la posición del fusible y pregunta
si se desea continuar. Si la respuesta es afirmativa intenta
quemar un nuevo fusible. Si la respuesta es negativa, solicita
al usuario apagar el Programador de PALs y se sale del
programa.
- 71 -
4.2.- PARA COPIAR UN PAL
Correr el programa PROGPAL
Por ejemplo para copiar la configuración de un PALl6R4
fabricado por National Semiconductor, que funciona como
decodificador, ejecutaremos los pasos siguientes:
A:\>PROGPAL
Aparecerá en la pantalla la portada del programa, oprimir
cualquier tecla para continuar.
Después se presentará lo siguiente:
OPCIONES DISPONIBLES:
1) Programar PAL
2) Copiar PAL
3) Salir del programa
SELECCIONE OPCION (1-3): 2
FABRICANTE DEL PAL:
1) National Semiconductor
2) Texas Instruments
SELECCIONE OPCION (1-2): 1
NUMERO DE PARTE DEL PAL:
1) PALlOH8, PAL12H6, PAL14H4, PAL16H2 PALl6C1
2) PAL12L6, PAL14L4, PALl6L2, PAL16L8, PAL16R8
PAL16R6, PALl6R4, PALlX4 PAL16A4
SELECCIONE OPCION (1-2): 2
- 72 -
Después el programa solicitará un nombre para el archivo que
será generado en formato BHLF. En este archivo se almacenará
la configuración del PAL. Para este ejemplo responderemos
DECODER.BHL
Deme un nombre para el archivo: DECODER.BHL
A continuación el programa presentará el mensaje:
Verifique que el interruptor PROG esté apagado y
Encienda el programador de PALS
Pulse <control> <y> para continuar
Después, aparecerá:
Encienda el interruptor PROG
Pulse <control> <y> para continuar
Si todo va bien, aparece:
Espere por favor... Estoy probando fusibles.
Si todo salió bien, aparece:
Apague el interruptor PROG y después
Apague el PROGRAMADOR DE PALS
Pulse <control> <y> para continuar
- 73 -
Finalmente, nos salimos del programa
OPCIONES DISPONIBLES:
1) Programar PAL
2 ) Copiar PAL
3 ) Salir del programa
SELECCIONE OPCION (1-3) : 3
AVISO IMPORTANTE
Si se propone realizar más de una operación con un mismo
PAL, por ejemplo:
Primero copiarlo para comprobar que no esté programado,
después programarlo, y finalmente, copiarlo para asegurarse
que la programación es la correcta. (Aunque esta última
operación no es realmente necesaria, puesto que el Programador
de Pals hace automáticamente una revisión de los fusibles al
estar programando al PAL).
Entonces, para realizar todas estas operaciones, no es
necesario apagar y encender el Programador de Pals como lo
indica el programa, sino que basta con encenderlo al iniciar
la sesión y apagarlo al terminar.
- 74 -
5.- DISEÑO DEL CIRCUITO PROGRAMADOR DE PALS.
- 75 -
5.1.- DEFINICION DEL PROBLEMA
Se necesita un circuito programador de PALs controlado por
una computadora, Printafom o Digitel, a través del puerto
paralelo LPTl de la impresora. La entrada será un archivo,
generado por el programa PALASM, que contenga la lista de los
fusibles que deberán quemarse en el PAL, así como el número de
parte del dispositivo a programar y el nombre del fabricante.
El circuito deberá tener la capacidad para copiar la
configuración de un dispositivo que no tenga quemado el
fusible de seguridad y la información obtenida deberá
almacenarla en un archivo en formato BHLF. El circuito
programará los PALs fabricados por National Semiconductor y
Texas Instruments, pero no programará el fusible de seguridad.
Se deberá usar un lenguaje de programación estructurado, el
Turbo C.
5.2.- ANALISIS DEL PROBLEMA
En los PALs los niveles de voltaje en las patas determina
si se está en modo de operación normal o en modo de
programación; por ejemplo, durante la operación normal, un PAL
requiere de niveles TTL (11011 = O. O a O. 8 V y I I l V 1 = 2.4 a 5.0
V). Cuando un nivel de voltaje más alto, denominado voltaje de
programación, se aplica a las patas apropiadas (11.75 V para
PALs de National Semiconductor y Monolithic Memories, 10.5 V
para PALs de Texas Instruments), el PAL se coloca en modo de
programación. Entonces cada pata de salida puede ser pulsada
al voltaje de programación durante 20 microsegundos
- 76 -
aproximadamente, con un Itslew rateff que no exceda a
lOV/microsegundo, y no menor que lV/microsegundo. EL fusible
abierto deberá ser verificado para tener la seguridad de
haberlo programado correctamente.
Un aspecto crítico de este proyecto son las condiciones del
ciclo de trabajo en las especificaciones del PAL. Básicamente
el Vcc, pata 20 , no debe estar en VIHH por más de 60
microsegundos y con menos de un 20 porciento de ciclo de
trabajo (duty cycle) . Además, el pulso de programación en las patas de salida debe ser menor de 50 microsegundos y
nominalmente de 20 microsegundos de duración, con un llslew
rate" que no exceda a 10 V/microsegundo y no menor a 1
V/microsegundo.
- 77 -
En esta discusión los siguientes términos representan :
L = VIL = lógico 0 = O V
H = VIH = lógico 1 = +5 V
Z = Alta impedancia = resist. de 4.7k a 5.0 Volts
HH = VIHH = voltaje de programación = 11.75 V o 10.5 V
SELECCION DE LINEA DE ENTRADA
Número de Identificación de la pata Línea de Entrada 1 7 ~ 1 6 ~ 1 5 ~ 1 4 ~ 1 3 ~ 1 2 ~ 1 1 ~ 1 0 ~ L / R O HH HH HH HH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH L H L H
HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH L H L H HH HH HH HH
HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH L H L H HH HH HH HH HH HH HH HH
HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH L H L H HH HH HH HH HH HH HH HH HH HH HH HH
HH- HH HH HH HH HH HH HH HH HH HH HH L H L H HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH
HH HH HH HH HH HH HH HH L H L H HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH
HH HH HH HH L H L H HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH
L H L H HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH
Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH Z z HH HH Z z HH HH z Z HH HH Z Z HH HH
- 78 -
SELECCION DE LINEA PRODUCTO
Número Identificación de la pata de línea Producto 0 3 ~ 0 2 ~ 0 1 ~ 0 0 ~ A 2 ~ A l ~ A O O, 32 Z Z n
1; 33 2, 34 3, 35
5, 37
7, 39 a, 40
4, 36
6, 38
9, 41 10, 42 11, 43 12, 44 13, 45 14, 46 15, 47 16, 48 17, 49
19, 51 20, 52 21, 53 22, 54 23, 55 24, 56 25, 57 26, 58 27, 59 28, 60 29, 61 30, 62 31, 63
18, 50
Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z HH HH HH HH HH HH HH HH
Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z HH HH HH HH HH HH HH HH Z Z Z Z Z Z Z Z
Z Z Z Z Z Z Z Z HH HH HH HH HH HH HH HH Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
HH HH HH HH HH HH HH HH Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
El número de fusible se calcula
Z Z Z Z HH HH HH HH Z Z Z Z HH HH HH HH Z Z Z Z HH HH HH HH Z Z Z Z HH HH HH HH
Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH Z Z HH HH
L
HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH Z HH
con la ecuación:
núm-fus = (líneagroducto * 32) + línea-entrada Analizando el número de fusible se puede calcular todas las
direcciones necesarias para programar ese fusible. Las líneas
de entrada están organizadas en grupos de cuatro, esto es:
IO = (0,1,2,3), I1 = (4,5,6,7), I2 = {8,9,10,11),
- 79 -
I 3 = { 1 2 , 1 3 , 1 4 , 1 5 } I 4 = { 1 6 , 1 7 , 1 8 , 1 9 } , I5 = ( 2 0 , 2 1 , 2 2 , 2 3 ) ,
I 6 = ( 2 4 , 2 5 , 2 6 , 2 7 } , I 7 = ( 2 8 , 2 9 , 3 0 , 3 1 } .
Las dos líneas de entrada con los números más bajos de cada
grupo vienen del lado izquierdo del diagrama del PAL, mientras
que las dos líneas de entrada con los números más altos de
cada grupo vienen del lado derecho del diagrama.
La figura 5 . 1 muestra las diferentes configuraciones para la
programación de PALS de 2 0 patas. El PAL se divide en dos
mitades: Las líneas producto O a 3 1 están en la primera mitad,
y las líneas producto 32 a 63 están en la segunda mitad.
Dependiendo de la mitad que esté tratando de programar, el
significado de las patas OD y CLOCK se intercambia, OD está en
la pata 1 para la primera mitad del arreglo y CLOCK está en la
pata 1 para la segunda mitad. Las posiciones de las patas Ox,
L/R, Ax también cambia.
El 16L8 tiene 2048 fusibles, 32 líneas de entrada y 64
líneas producto. De mamera que, si (num-fus < 2048 /2 ) entonces
el fusible está en la primera mitad del PAL (líneas producto
0-31) : de otro modo está en la segunda mitad (líneas producto
3 2 - 6 3 ) . Se selecciona una línea de entrada colocando un valor
de L o H en la pata Ix apropiada donde ( I O <= Ix <= 17) . Un valor lógico L en la pata Ix selecciona un número de línea de
entrada par y un valor H en la pata Ix selecciona un número de
línea de entrada impar, un valor HH en una pata Ix indica que
ese grupo de cuatro líneas de entrada no está seleccionado. Un
valor lógico de Z en la pata L/R selecciona las líneas de
- 8 0 -
P R O D U C T O S (3 Q 3 1 ”
P R O D U C T O S 32 EI 6 3 ”
OD VGC 1 1 L f l I
118 j 19 I 1 18 I I
IT5/ I3 -! 16
I
01/
- I I5 l-7 15 -1 14 1
I
I6
T;;i I7 -1
02
03
OD I I I
I-+ I7 1 2 i
d 2
I @ND
F I G U R F I 5 . 1 . - C O N F I G U R Q C I O N P F I R Q P R O G R O M F I C I O N
D E PFILs D E 2(3 P R T Q S .
- 8 1 -
entradas con los números más bajos de un grupo Ix, mientras
que un valor de HH en la pata L/R selecciona las líneas de
entradas con los números más altos.
La polaridad de la señal de entrada se determinará por la
variable línea-entrada, si la variable línea-entrada es par,
la entrada es la no inversora, y se deberá colocar un valor de
L en la pata Ix apropiada. Si línea-entrada no es par, la
entrada es la inversora y se deberá colocar un valor de H en
la pata Ix apropiada. Los términos producto se agrupan en ocho
para cada salida.
Para encontrar la pata de salida Ox que corresponde a un
fusible, calcule: Ox = num-fus / (32 * 8 )
Para encontrar la dirección (AO,Al, o A2) del término producto
de esa salida, calcule: (air = num-fus MODULO 8 ) .
Cada bit O de la dirección de tres bits se coloca a Z. Cada
bit 1 de la dirección se coloca a HH.
ALGORITMO DE PROGRAMACION
El procedimiento para abrir un fusible es el siguiente:
Colocar el voltaje VIHH de acuerdo al fabricante del PAL,
10.75 V para Texas Instruments y 11.75 V para National
Semiconductor.
Colocar los valores apropiados en las entradas IO-I7,AO,Al,A2
y L/R; manteniendo a OD como antes.
Enviar un pulso de programación a la pata de salida
seleccionada. Se puede verificar el bit pulsando la pata CLOCK
de bajo a alto y luego hacia abajo de nuevo.
- 82 -
Después de haber programado al fusible hay que colocar todas
las patas del PAL al valor Z excepto la pata OD a VIHH y la
pata CLOCK a VIL.
Finalmente habrá que seleccionar al siguiente fusible,
cargando una nueva línea de entrada y la dirección como antes,
o colocar a todas las patas del PAL al valor lógico Z para
salir del modo de programación/verificación.
Una operación de verificación se lleva a cabo ejecutando l o s
pasos anteriores excepto que no debe enviarse el pulso de
programación para abrir el fusible.
5.3.- ESPECIFICACION DE LA SOLUCION
De la definición del problema se sabe que el Programador de
Pals será controlado por una computadora, razón por la cual se
usa un circuito de interfaz programable para periféricos, el
8255, para controlar el flujo de los datos de la PC hacia el
PAL y viceversa. Como puede verse en la figura 5.2, para que
el 8255, U19, se vaya a un estado inicial conocido, se ha
colocado un circuito que genere un pulso de reset ya sea por
orden de la computadora o durante el encendido del Programador
de Pals, ver U24B, U22d, RlOl y C101.
Unicamente se usan cuatro líneas de entrada de datos hacia
la computadora y se utiliza al circuito U21 74LS157 para poder
leer los cuatro bits de salida de datos del PAL. El circuito
U21 seleccionará las patas 12, 13, 14, y 15 del PAL, para
verificar los fusibles con direcciones entre O y 1023, y
- 83 -
seleccionará las patas 16, 17, 18 y 19, para verificar los
fusibles con direcciones entre 1024 y 2047. A las patas de
salida del PAL se les aplican 11 volts, aproximadamente,
durante la programación del dispositivo y para evitar que ese
voltaje dañe al circuito U21, se utilizan los diodos Dl, D2,
D3, D4, D5, D6, D7 y D8 como recortadores de voltaje.
Se usan cinco circuitos 74LS374 (latchs U8, U9, U10 y U11)
para retener la dirección del fusible que se va a programar o
verificar. El circuito U20 74LS138 se usa para aplicar el
pulso de reloj, que provocará la carga del dato, en uno de
esos cinco latchs. Como puede verse en las figuras 5.3 y 5.4,
a las salidas de los circuitos de retención, latchs, se han
colocado buffers 7407 de colector abierto para poder trabajar
con los 11 volts, aproximadamente, que se utilizan para
direccionar los fusibles del PAL. Los transistores PNP 2N2905,
desde Q1 hasta 418, se usan para poder suministrar las
corrientes y los voltajes que se requieren para la
programación y verificación del PAL
En cada transistor conectado a una pata de salida del PAL,
hay dos buffers 7407 cuyas salidas están conectadas en
paralelo que controlan su estado de corte y conducción, uno de
los buffers se usa para seleccionar un bit de la dirección de
un fusible, mientras que el otro se usa para aplicar un pulso
de programación a una pata de salida del PAL; sin embargo,
ambas funciones son mutuamente excluyentes, es decir, mientras
uno tenga su entrada en un nivel alto, el otro la tendrá en un
nivel bajo. Por otra parte, cada transistor tiene conectado en
- 84 -
su colector la salida de un buffer 7407 y una resistencia de
4.7k a +5 volts, esto sirve para poder aplicar a cualquier
pata del PAL O, +5 o +11 volts.
Puede verse en la figura 5.4 que los circuitos NE555, U16,
U17 y U18 están configurados como multivibradores monostables.
U16 genera un pulso de 50 microsegundos que se utiliza para
colocar al PAL en modo de programación, U18 genera un pulso de
20 microsegundos que se aplicará a alguna de las patas de
salida del PAL a través del circuito U15 74LS138. El circuito
U17 genera un pulso de 15 microsegundos para centrar al pulso
de 20 microsegundos con respecto al de 50 microsegundos.
Para generar los voltajes de programación adecuados para
los PALS fabricados por National Semiconductor o Texas
instruments se usan los circuitos U25, U7E, U24A y U24B de la
figura 5.5. Cuando la salida del circuito U7E esté en un nivel
llbajoll, se tendrán 10.5 volts en la salida de U25 LM317, y
cuanto la salida de U7E esté en un nivel llaltoll, se tendrán
11.75 volts en la salida de U25. Este voltaje va al emisor de
los transistores Q1 hasta 418 y se le denomina VIHH.
Finalmente, para aplicar a la pata 20 del PAL el pulso de
programación de 11 volts, aproximadamente, o el voltaje normal
de alimentación de +5 volts se usan los circuitos U23, U14E,
U14F, U22C, U22D y U22C de la figura 5.2. Cuando en U22C pata
8 hay un rlO'l y se le aplica un pulso de 50 microsegundos al
circuito U22A pata 2, aparece en U23 un pulso de 11.75 volts
que dura 50 microsegundos, y cuando en U22C pata 8 hay un 11111
- 85 -
y se le aplica el pulso a U22A, aparece en U23 un pulso de
10.5 volts con la misma duración que el anterior.
Como información adicional para entender el programa
PROGPAL.C, se listan a continuación las patas del puerto
paralelo LPTl que se usan en el Programador de PALS, además se
especifica si el bit pasa por un inversor colocado
internamente en la computadora (Ver figura 5.7).
DIRECCION OX3BE (BIDIRECCIONAL) USADO PARA CONTROL PIN BIT PROGRAMADOR PALS 1 DO INV."""""" m' "- 8255 14 Dl IW."""""" 8255 16 D2 NO Im."""""-- RESET - 8255 17 D3 IW."""""" 8255
A0 ---- Al ----
- 86 -
DIRECTORIO DEL DISCO PROGPAL/PALASM
Volume in drive A has no label Directory of A:\
COMMAND COM 25276 MODE COM 15440 ATT BGI 6269 CGA BGI 6253 EGAVGA BGI 5363 HERC BGI 6125 IBM8514 BGI 6665 PC3270 BGI 6029 TURBO COM 39552 PRGPAL EXE 50416 PROGPAL BAT 85 TRIP CHR 7241 CONTBD FUN 1503 CONTBD PLT 5289 PALASM EXE 53264 HEXDISP FUN 2039 HEXDISP PLT 5289 HEXDISP BHL 3877 BASGATES FUN 263 BASGATES PLT 5353 BASGATES BHL 3877 CONTBD BHL 3877
22 File ( S )
1/01/88 O: O 0 1/01/88 O: O 0
11/05/89 2 : O 1 11/05/89 2: O 1 11/05/89 2: O1 11/05/89 2: O 1 11/05/89 2 : O 1 11/05/89 2: O1 20/01/80 4 : 22
1/09/90 18:58 11/05/89 2: O 1 8/09/90 20: 26 8/09/90 20:29 14/08/90 13 : 02 13/08/90 22 : 21 13/08/90 22:23 13/08/90 22: 31 13/04/90 22 : 37 14/08/90 14:07 14/08/90 14: 15 8/09/90 20:31
35840 bytes free
1/09/90 21:02
- 87 -
1 f
I 1
I I I I I J
l l l l l l l Y
I t
I
I;
I
I
r I c
r
L
.
w wr 1 k
1
93 - N c X m
5 . 4 . - LISTADO DEL PROGRAMA PROGPAL EN LENGUAJE TURBO C
- 9 4 -
.................................................................... /*** ***/ /*** UNIVERSIDAD AUTONWA METROPOLITANA IZTAPALAPA ***/ /*** ***/ /*** PROYECTO DE INGENIERIA ELECTRONICA ***/ /*** ***/ /*** /*** /*** /*** /*** /*** /*** /***
PROGRAMA: PR0GPAL.C
NAME2 MARTINEZ ARMANDO
MATRICULA 84225276
18/AGO/90
***/ ***/ ***/ ***/ ***/ ***/ ***/ ***/
....................................................................
/* Este programa controla l a operaci6n del circuito programador de PALS, envihndole señales a traves del puerto paralelo LPTl de La PC. Para l a programacih de un PAL, lee un archivo en formato BHLF creado por e l programa PALASH-EXE (En base a funciones booleanas). El copiado de un PAL se l leva a cabo creando un
archivo en formato BHLF. */
.......................................................................
#include <string.h> #include *stdl ib.h>
#include *conio.h> #include *stdio.h* #include *dos.h>
#define #define
#define #define
#define #define #define
#define #define #define
BUS-DATOS Ox3BC
ENTRADA Ox3BD CONTROL Ox3BE
XOR
z 1 H 1 L 2 HH 3 SEGUIR 0x19 ARCHFIN '\032'
h
/* Bus de &tos de puerto LPTl */ /* Entrada de &tos desde puerto LPTl */ /* Salidas de control del puerto LPTl */ /* Func ih o r exc lus iva */ /* +5 vo l ts a traves de r e s i s t . 4.7k */ /* +5 vo l ts */ /* o vo l ts */ /* 11.75 volts para NSC, 10.5 volts para T I */ /* P u l s a r * c t r b *p para continuar */ /* Final del archivo */
.......................................................................
- 95 -
/*"""""""""""""- prgpall.c _""""""""""""" */
#include lldefn.hll char fusible120491; /* Los fusibles que van a abrirse estaren marcados
extern unsigned char pa; /* Contiene dato de fabricante del pal */ .......................................................................
con une H */
main0
c p o r t a d a 0 ; while(1) C
switch (menu-selec()) C case 1 : p r o g r a m a r p l 0 ; break; case 2: c o p i a r g a l 0 ; break; case 3: return ( O ) ;
1 >
> ..................................................................... /* Para seleccionar una o p e r a c i h de progremacidn o copiado */
i n t menu-selec(void)
c char ~1101; i n t c ;
c l r s c r 0 ; puts ( I1\n PROGRAMADOR DE PALS \nI1); puts ( ll\nOPCIONES DISPONIBLES: \n1I); puts ( II 1 ) Programar PAL"); puts ( II 2) Copiar PALn1); puts ( 11 3) S a l i r d e l programa lo);
d o c pr intf("\n SELECCIONE OPCION (1-3): "1; g e t s W ; c = a t o i ( s ) ;
> h i l e (c<l I I 0 3 ) ;
c l r s c r 0 ; return (c) ;
1
..................................................................... /* Presenta un menú para seleccionar el fabricante del PAL. */ /* La variable g lobal pa almacena e l contenido del 8255 puerto A */
selec-fabric(char *oper)
c char S 1103 ; i n t c ;
- 96 -
c l r s c r o ; pr i n t f ("\n %s\n\n", oper); puts ( lo\nFABRICANTE DEL PAL: \n"); puts ( 1 ) National Semiconductor1a);
puts ( 2) Texas Instrunentslt);
d o c printf(*'\n SELECCIONE OPCION (1-2): ");
getscs); c = ato i(s1;
1 whi le (c*l I I CQ);
c l r s c t - 0 ; i f ( c == 1 )
pa = OxBF; /* Para PALs marca National Semiconductor */ e l s e pa = Ox7F; /* Para PALs marca Texas Instruments */
1 ..................................................................... /* Para se lecc ionar e l t ipo de sa l ida de l pa l . Cuando se quema un
f u s i b l e en un p a l con s a l i d a i n v e r t i d a , l a v e r i f i c a c i 6 n i n d i c a que l a sa l ida es t6 en un nive l bajo L . S i l a s a l i d a no t iene
inversor, La v e r i f i c a c i h i n d i c a que l a sa l ida es t6 en un n i v e l
a l t o H */
int tipo-salida(char *oper)
c char S 11 01 ; i n t c ;
c l r s c r o ; pr in t f ( "\n %s\n\n", oper); puts ( lo\nNUnERO DE PARTE DEL PAL: \not); puts ( 1 ) PALlOH8, PAL12H6, PAL14H4, PAL16H2, PAL16Cl\nt1);
puts ( It 2) PAL12L6, PAL14L4, PAL16L2, PALl6L8, PALl6R8 ");
puts ( PAL16R6, PAL16R4, PAL16X4, PALl6A4");
d o c pr in t f (*\n SELECCIONE OPClON (1-2): It);
gets(s) ; c = stoics);
1 h i l e (c* l I I 02);
c l r s c r o ; i f ( c == 2)
return(L); /* Salida con inversor */ else return(H); /* Sal ida s in inversor */
1 ..................................................................... /* Lee un archivo en formato BHLF y graba su contenido en un p a l ,
las loca l idades donde hay una H indican que e l f u s i b l e del pal debe quemarse */
p r o g r a m a r g a l 0 c
FILE *arch-fte, *fopen(); int sa l ida-t ipo; char arch-fusCl51;
- 97 -
selec-fabric(Il PROCRAMACION DE PAL"); salida-tipo = tipo-salida(Il PROGRAMACIOU DE PAL");
puts("\n PROCRAMACION DE PAL la);
printf (I@\n\n Deme e l nombre d e l archivo: II);
gets(arch-fus); i f ((arch-fte = fopen(arch-fus, llrll)) == NULL) C
fpr int f (stderr ," \n ERROR, No puedo abrir archivo: %S \n *l,arch-fus); exit(1);
> lee-arch(arch-fte); i n i c ia l i za ( ) ; qwma-fusibles(salida-tipo); apegargrogpal( 1;
> ..................................................................... /* Guarda en un archivo en formato BHLF e l contenido de un pal */
c o p i a r g e l 0 c
FILE *fopen(), *archgel ; int salida-tipo; char copiat151; /* Contiene e l nombre del archivo
con e l estado de los fus ib les de l pal */
selec-fabric(oo COPIAR PAL");
salida-tipo = tipo-salida(88 COPIAR PAL"); puts(#*\n COPIAR PAL #I);
printf("\n Deme un nombre para e l archivo: );
gets(copia1; i f ( ( a r c h g e l = fopen(copia, W a ) ) == NULL) <:
fp r in t fcs tder r , "\n ERROR, No puedo a b r i r archivo: %S \n8O,copia); exit(1);
> in ic ia l i za( ) ; revisa-fusibles(sa1ida-tipo); formato-bhlf(archga1);
apagargrogpa 1 ( 1; > ......................................................................
/* Aquf se lee un archivo en formato BHLF y se indica con una H
e l n h r o de fus ib le que debertí abr i rse en un arreglo de 2049 caracteres denominado fusible[ ] */
lee-arch(F1LE *arch-fte) c
int n, /* Separa a l archivo en dos mitades, l a primera mitad corresponde a las lfneas producto 0-31, l a segunda m i t a d corresponde a l as lfneas producto 32-64 */
i, /* Sirve para contar 8 grupos de cuatro lfneas del archivo */ j , /* Sirve para contar hasta cuatro lfneas de archivo */ k, /* Sirve para contar hasta ocho palabras BHLF por cada
l ínea de archivo */
- 98 -
m, /* Sirve para contar hasta 4 caracteres H o L por cada palabra */
l fneagroducto, /* Contiene minero de línea producto */ linea-entrada, /* Contiene minero de l fnea de entrada */ nun-fusible; /* Contiene núnero de fus ib le */
int c ta - l in = O; /* Cuenta las lfneas de archivo */ char buffert801; /* contiene a l a última lfnea de archivo lefda */
/* Se i n i c i a l i z a n todos los fusibles con una L para indicar que no deben abrirse, una H indica que e l f u s i b l e deber6 abr i rse */
fusibletnun-fusible1 = 'L'; for (nun-fusible = O ; nun-fusible < 2048; nun-fusible++)
fo r (n=O; ng2; n++) /* Separa a l archivo en dos mitades */ fo r (i=O; ig8; i++) /* Cuenta 8 grupos de 4 líneas de arch. */
fgets (buffer, 80, arch-fte); /* Lee l fnea de arch. */ cta-1 in++; fo r (k=O; k<8; k++) /* Cta. 8 palabras BHLF por l fnea */
fo r (11~1; m5; m++) /* Cta. 4 caracteres H o L */
f o r ( j=O; j<4; j++) C /* Cuenta 4 lfneas de arch. */
i f ((buffer17*k+l l == 'B') 8& (buffer[7*k + 61 == ' F f ) ) C
i f ( b u f f e r t p k + 1 + ml == 'H' ) C l ineagrcducto = (4-m)*8 + i + 32*n; linea-entrada = 8* j + k; nun-fusible = ( l ineagroducto * 32) + linea-entrada; fusibletnun-fusible] = 'tif;
1 else i f (bu f fe r1Fk + 1 + ml != 'L') C
printf(81\nError: se esperaba L o H en archivo.Il "Lfnea producto %d lfnea entrada xd \n", (4-m)*8 + i + 32*n, 8* j + k);
exit(1); 1
1 else C printf(I l\nError: Faltan o están mal colocados 1 0 s ~ ~
M caracteres B y F en la l fnea de archivo %d \n", cta-1 in);
exit(1); 1
1 close(arch-fte);
1 ....................................................................... /* Almacene e l contenido del pal que se quiera copiar en un archivo
con formato BHLF */
- 99 -
formato-bhlf(F1LE *archga l ) C
/* char fusible[] ; global */ int i, j, k, m, n, inc, prod, input;
char tempt51 C91;
fprintf(archgal, la \n \n \n \nlI);
for (i=l; iq34; i+=32) C inc = i - 1; for (prod =O; prod <8; prod++) C
f o r ( j = l ; j<26; j += 8) C for (k=l ; k<9; k++) C
input = j+k-2; temp[ll [kl = 'L'; templ21 [k l = 'L ' ; temp131 [k l = 'L'; temp141 [k l = 'L ' ; if (fusible[ input + (prod+O+inc)*321 == ' H I )
tempL41 [k l = 'Ií,;
temp131 Ckl = 'H ' ;
tempC21 [k l = 'H';
temp[ll [kl = 'HI;
i f ( fusible[ input + (prod+8+inc)*321 == 'H')
if (fusiblet input + (prod+l6+inc)*321 == ' H I )
if (fusible[ input + (prod+24+inc)*321 == ' H I )
1 f o r (ml; w9; w+)
fpr int f (archgal I1 ' B%c%c%c%cF",tenpCll [m1 ,temp[ZI Iml, temp[31 [m1 ,temp141 Iml);
f p r i n t f ( a r c h p 1 , " \n"); 1
1 1 fpr int f (archga1," \n \n
fp r in t f (a rchga1, l%cxc", ARCHFIN);
fclose(archga1);
(I \n \n");
1 .......................................................................
. \no#
. \n"
- 100 -
/*"""""""""""""" prgpaL2.c """"""""""""" */
%include Iadefn.h" extern char fusible[];
. ...................................................................... /*
Esta funci6n regresa un núnero de entrada i x del PAL y e l v a l o r del v o l t a j e que debe aplicarse a esa entrada. i 1x1 agrupa a 4 líneas de entrada, donde: i o = C0,1,2,31; il = C4,5,6,7); i 2 = C8,9,10,111; i 3 = c12,13,14,15); i 4 = C16,17,18,191; i 5 = C20,21,22,231; i 6 = C24,25,26,271; i 7 = C28,29,30,311; Un va lor HH en i x indica que ese grupo de 4 líneas de entrada no está seleccionado. Un valor L indica que se t r a t a de una lfnea de entrada par. Un valor H indica que se t ra ta de una lfnea de entrada inpar. */
int selec-entradacint nun-fus, int *valor) c
int ix, linea-entrada;
1 i nee-entrada = nun-f us X 32; i x = linea-entrada / 4; /* Calcula e l ruin. de grupo */ /* Entrada i x <- L o H, las demgs <- HH */ i f ((linea-entrada X 2) == O)
else *valor = H; /* Lfnea de entrada impar */ return( ix);
*valor = L; /* Lfnea de entrada par */
1 ....................................................................... /* Regresa un valor 2 s i las l fneas de entrada seleccionadas tienen
rnjmeros bajos o regresa un valor HH s i t i enen rnjmeros a l tos */
int selec-lr( int nun-fus) c
int lr, linea-entrada;
1 inea-entrada = nun-fus X 32; i f ((linea-entrada X 4) < 2)
lr = 2; /* selecciona líneas de entrada con núneros bajos */ e lse l r = HH; /* selecciona lfneas de entrada con mineros a l tos */ returnclr);
1 ....................................................................... /* Regresa un minero de sa l ida ox del PAL. ox agrupa a 8
líneas producto, donde: 00 = (0, 1 , , , 7 ) o C32,33,, ,391; 01 = C8,9,, ,151 o C40,41,, ,47); 02 = C16,17,,,231 o C48,49,,,551; o3 = C24,25,,,311 o C56,57,,,63); Un va lor HH en ox indica que ese grupo de 8 sal idas est6 seleccionado, un valor Z indica que no l o est6 */
- 101 -
int selec-salida(int nun-fus) c
int ox, l ineagroducto;
l ineagroducto = nun-fus / 32; /* La sa l ida ox <- HH, las demás salidas <- 2 */ i f ( l ineagroducto > 31)
else ox = l ineagroducto / 8; returncox);
ox = ( l ineagroducto - 32) / 8;
1 ....................................................................... /* Regresa un minero entre O y 8, este rximero deber6 ser convertido
a binario, donde aparezca un b i t O coloca un valor 2 y donde aparezca un b i t 1 coloca un valor HH */
int selec-dir(int Mm-fus) c
in t dir, l ineagroducto;
l ineagroducto = nun-fus / 32; d i r = l ineagroducto X 8; return(dir1;
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* En e l d a t o l se coloca a 1 e l b i t correspondiente a l a entrada ix,
los demás b i t s se ponen a O, esto provoca que l a entrada i x se vaya a un valor L o H (seleccionado 'con e l dato2). mientras que las entradas se van a HH.
En e l dato2 se coloca a O e l b i t correspondiente a l a entrada i x donde valor sea L. los demás b i t s se ponen a 1. */
envia-ix(int nun-fus) c
int ix, valor; unsigned char datol, dato2;
i x = selec-entrada(nun-fus, &valor); su i tch( ix ) C
case O : datol = 0x01; break; case 1 : datol = 0x02; break; case 2 : datol = 0x04; break; case 3 : datol = 0x08; break; case 4 : datol = 0x10; break; case 5 : datol = 0x20; break; case 6 : datol = 0x40; break; case 7 : dato l = 0x80; break;
1 /* Coloca e l d a t o l en e l puerto B del 8255 */ /* Envfa e l d a t o l a las patas 2-9 del PAL */ /* Esto pone a todas las entradas a HH excepto a i X */ enviar-datocdatol, O ) ;
- 102 -
i f (valor != L) d a t d = OxOFF;
else switch(ix) C case O : d a t d = OxOFE; break; case 1 : dato2 = OxOFD; break; case 2 : d a t d = OxOFB; break; case 3 : dato2 = OxOF7; break; case 4 : dato2 = OxOEF; break; case 5 : dato2 = OxODF; break; case 6 : dato2 = OxOBF; break; case 7 : dato2 = OxO7F; break;
1 /* Coloca e l dato2 en e l puerto B del 8255 */ /* Envía e l dato2 a las patas 2-9 del PAL */ /* Esto pondr6 a l a entrada i x en L o H */ enviar-dato(dato2, 1);
> ....................................................................... /* Aplica los vo l ta jes apropiados para e l rwinero de fus ib le que se debe
abr i r . Dado que e l minero de f us ib le es menor que 1024 l a configura- c i6n de las patas del pal es l a siguiente: pata 19 = O0 bit7-dato pata 15 = A0 bit3-dato pata 18 = O1 bit6-dato pata 14 = A l bit2-dato pata 17 = 02 bit5-dato pata 13 = A2 b i t l -da to pata 16 = 03 bit4-dato pata 12 = L/R bit0-dato */
envia-ox-ax-lr-mitadl(int nun-fus)
C int ax, lr; unsigned char dato2;
ax = selec-dir(nm-fus); switch(ax) C
case O : dato2 = OxFF; break; case 1 : dato2 = OxF7; break; case 2 : dato2 = OxFB; break; case 3 : dato2 = OxF3; break; case 4 : dato2 = OxFD; break; case 5 : dato2 = OxF5; break; case 6 : dato2 = OxF9; break; case 7 : dato2 = OxF1; break;
1
/* Se forma e l b y t e que se enviar6 a l p a l mediante una operac ih AND entre Los datos obtenidos */
lr = selec-lr(nun-fus); i f ( 1 r == HH)
dato2 &= OxOFE; /* Envía valor HH a l a pata L/r del PAL */
/* Coloca e l dato2 en e l puerto B del 8255 */ /* Envía e l dato2 a las patas 12-19 del PAL */ enviar-dato(dato2, 3); activa-LS374sO;
- 1 0 3 -
........................................................................ /* Aplica un pulso de 20 microseg. a l a pata ox del pa l con l a f i na l i dad
de a b r i r un fusible, d e d s envfa un pulso de 50 microseg. a l Vcc */
abrir-fus-mitadl(int nun-fus) c
int ox;
ox = selec-salida(nun-fus); pulso-2OMS(7 - ox); /* Aplica pulso de p r o g r m c i h en pata ox */
> .......................................................................... /* Aplica los vo l ta jes apropiados para e l rwinero de fus ib le que se debe
abr i r . Dado que e l núnero de fus ib le es mayor que 1023 l a con f igu rac ih de las patas del pal es l a siguiente: pata 19 = L/R bit7-dato pata 15 = O0 bit3-dato pata 18 = A0 bit6-dato pata 14 = O1 bit2-dato pata 17 = A l bit5-dato pata 13 = 02 bi t l -dato pata 16 = A2 bit4-dato pata 12 = 03 bit0-dato */
envia_ox_ax_lr_mitad2(int nun-fus) c
int ax, lr; unsigned char dat02;
ax selec-dir(nun-fus); suitch(ax) C
case O : dato2 = OxFF; break; case 1 : dato2 = OxBF; break; case 2 : dato2 = OxDF; break; case 3 : dato2 = Ox9F; break; case 4 : dato2 = OxEF; break; case 5 : dato2 = OxAF; break; case 6 : dato2 = OxCF; break; case 7 : dato2 = Ox8F; break;
>
/* Se forma e l b y t e que se enviar6 al pa l mediante una
l r = selec-lr(nun-fus); i f ( 1 r == H H )
o p e r a c i h AND entre los datos obtenidos */
dato2 &= Ox7F; /* Envfa valor HH a l a pata l/r del PAL */ /* Coloca e l dato2 en e l puerto 6 del 8255 */ /* Envfa e l dato2 a las patas 12-19 del PAL */ enviar-dato(dato2, 3); activa-LS374sO;
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Aplica un pulso de 20 microseg. a l a pata ox del pal con l a f i na l i dad
de a b r i r un fusible, además envfa un pulso de 50 microseg. a l VCC */
- 104 -
abrir_fus_mitad2(int nun-fus)
c int ox;
ox = selec-saLida(nun-fus); pulso-2OMS(3 - ox); /* Aplica pulso de programacih en pata ox */
1 .......................................................................... /* S i e l núnero de f us ib le que queremos ab r i r es menor que 1024 entonces
est6 en l a mitad1 y debe apl icarse a l a pata 1 (OD) un vo l ta je HH y a l a pata 11 (CLK) un vo l ta je L */
envia-od-clk-mitad10 c
enviar-dato(OxF6, 2); 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* S i e l núnero de f us ib le que queremos ab r i r es mayor que 1023 entonces
est6 en l a mitad2 y debe apl icarse a l a pata 11 (OD) un vo l ta je HH y a l a pata 1 (CLK) un vo l ta je L */
envia_od_cLk_mitad2() c
enviar-dato(OxF9, 2); 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Para v e r i f i c a r s i e l f u s i b l e se abri6 correctamente se aplica un
pulso en l a pata 11 (CLK) del pal. Esta funcih regresa e l estado L o H de l a s a l i d a ox */
int ver i f -mitadlc int nun-fus) c
int ox, edo; unsigned char dato;
enviar-dato(OxFE, 2); /* Envia un pulso de v e r i f i c a c i h a La */ enviar-dato(OxF6, 2); /* pata 11 (CLK) del pal */
switch (ox) C case O : i f ((0x80 8 dato) == 0x80)
edo = H;
break; case 1 : i f ((0x40 & dato) == 0x40)
edo = H;
break; case 2 : i f ((0x20 8 dato) == 0x20)
edo = H; break;
case 3 : i f ((Ox10 8 dato) == 0x10) edo = H;
break;
- 105 -
1 return C e d o ) ;
1 .......................................................................... /* Para v e r i f i c a r s i e l f u s i b l e se abr i6 correctamente se apl ica un
pulso en l a pata 1 (CLK) del pal, despds se l e e e l estado de l a sal ida ox. Esta f u n c i h regresa e l estado L o H de la sa l i da ox */
int verif-mit&(int nun-fusl c
int ox, e d o ; unsigned char dato;
enviar-dato(OxF6, 2); /* Envfa un pulso de v e r i f i c a c i h a l a */ enviar-dato(OxF9, 2); /* pata 1 (CLK) del pal */
edo = L; dato = leer-dato(); /* Lee las sal idas del pal */ ox = selec-salida(nun-fus);
suitch (ox) C case O : i f ((0x08 8 dato) == 0x08)
edo = H; break;
case 1 : i f ((0x04 8 dato) == 0x04) edo = H;
break; case 2 : i f ((0x02 8 dato) == 0x02)
edo = H; break;
case 3 : i f ((Ox01 8 dato) == 0x01) edo = H;
break; 1 return ( e d o ) ;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Aquf se revisan todos los elementos del arreglo fusible, los fusibles
que deben abrirse esthn marcados con una H. Se hacen hasta 5 intentos para quemar un fusible, s i no hay (x i to se envfa un mensaje de er ro r y se cuestiona a l usua r io s i desea continuar. E l PAL se d iv ide en dos mitades, la configuración de las patas del PAL depende de cual mitad es l a que se quiere programar, por t a l motivo se tienen procedimientos d i s t i n tos para programar los fusibles 0-1023 (mitad11 y los fusibles 1024-2027 (mitad2) . */
quema-fusibles(int abierto) c
/* char fus ib le t l ; g lobal */ int nun-fus, intento, edo;
gotoxy(l6,ll); puts(@' Espere por favor ... Estoy quemando fusibles.\n@@);
- 106 -
f o r (nun-fus -- O; nun fus < 2048; nun-fus++) i f (fusibletnun_fusl == 'Ií') C
- intento = O; d o c
intento++; i f ( nun-fus < 2048/2) C /* mitadl, lfneasgroducto 0-31 */
envia-od-clk-mitadl(); envia-ix(nun-fus); envia-ox-ax-lr-mitadl(nun-fus); abrir-fus-mitadl(nun-fus); edo = verif-mitadl(nun-fus);
1 else C /* mi tadZ, lfneas producto 32-63 */ envia-od-clk-mitad20; envia-ix(nun_fus); envia_ox_ax_lr_mitad2(nun_fus); abrir-fus_mitadZ(nun-fus); edo = verif-mit&(nun-fus);
1 edo = prueba-fus-qwmedo(nun-fus, edo, intento, abierto);
1 uh i l e (edo != abierto); 1
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Prueba s i e l f u s i b l e ya est6 quemado, s i e l resultado es correcto
regresa con e l parámetro edo = abierto. S i e l f u s i b l e no puede ser quemado en 5 intentos, pregunta a l usuario s i desea continuar, s i l a respuesta es negativa, abandona e l programa, s i l a respuesta es af i rmat iva intenta con un nuevo fus ib le */
int prueba-fus-quemado(int nun-fus, i n t edo, in t in tento, int abierto) c
i n t j;
char c;
/* Desactiva 74LS374s y coloca todas las sal idas del pal en 2 */
desactiva-LS374sO; for(j=O; j<5; j++)
enviar-dato(OxFF, j ) ;
printf(lo\nError, no se pudo quemar fus ib le colocado en:\nI*); printf(" Lfnea producto %d, Linea de entrada %d Io,
d o c
i f ( ( e & I = abierto) 88 ( intento == 5) ) C
nun-fus / 32, nun-fus X 32);
p r in t f ( " \n ¿ Desea continuar (s/n) ? lo);
switch(c = getcheo) C case Inr : case 'N' : apagargrogpa10; exit(1); break; case ' s f : case 'S f : edo = abierto; c = 'S'; break;
1 1 uh i l e (c != 'S');
1 return(edo1;
- 107 -
1 .......................................................................... /* Revisa cada fus ib le de l pal y guarda en e l a r r e g l o f u s i b l e t l e l estado
de cada uno, s i e l f us ib le es t6 ab ie r to coloca una H de l o contrar io coloca m L. E l procedimiento de v e r i f i c a c i h es muy s imi la r a l de grabacih, pero durante l a v e r i f i c a c i h no se envta un pulso de progremecih a l a sa l i da ox. EL p a r h t r o a b i e r t o i n d i c a que e l f u s i b l e est6 ab ier to s i l a sal ida es baja (L), como es e l caso de los PALs PAL16L8, PAL16L2, etc.. En otros casos abierto = H para indicar que e l f us ib le es t6 ab ie r to s i l a sal ida es alta, como sucede con los PALs 12H6, 10H8, etc. */
revisa-fusibles(int abierto) c
/* char fus ib le t l ; global */ int nun-fus, j , edo;
gotoxy(l6.11); puts(" Espere por favor... Estoy probendo fusibles.\n"); for(nun-fus = O; nun-fus < 2048; nun-fus++) C
if (nun-fus < 2048/2) C /* mitad1 , ltneasgroducto 0-31 */ envia-od-clk-mitadlo; envia-ix(nun-fus); env i a-ox-ax- 1 r-mi t ad1 ( nun-f us 1 ; edo = verif-mitadl(nun-fus); i f (edo == abierto)
fusibletnun-fusl = 'HI; else fusibleCnun-fusI = 'Lr;
1 else c /* mitad2, ltneas producto 32-63 */ envia-od-cLk-mitad20; envia-ix(nun-fus); envia-ox-ax-lr_mitad2(nun-fus); edo = verif-mitad2(nun-fus); i f (edo == abierto)
fusibletnun_fusl = 'HI ; else fusibletnun-fusl = IL' ;
1 /* Desactiva 74LS374s y coloca todas Las sal idas del pal
en 2 */ desactiva_LS374s( ); for(j=O; j'5; j++)
enviar-dato(OxFF, j); 1
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
- 108 -
/*""""""""""""""- prgpa13.c """""""""""""" */
#include Wefn.hI1 unsigned char pa; .......................................................................... /* Genera un pulso de 20 rnicrosegwrdos en una de Las sal idas
yO,yl,. .,y7 de u15 74LS138. C = PC6, B = PC5, A = PC4 se genera un pulso de 50 microsegundos */
pulso-20nS(int y) C
sui tch(y) C /* A , B , C */ case O: reset-PC(6); reset-PC(5); reset-PC(4); break; /* O, O, O */ case 1: reset-PC(6); reset-PC(5); set-PC(4); break; /* O, O, 1 */ case 2: reset-PC(6); set-PC(5); reset-PC(4); break; /* O, 1, O */ case 3: reset-PC(6); set-PC(5); set-PC(4); break; /* O, 1, 1 */ case 4: set-PC(6); reset-PC(5); reset-PC(4); break; /* 1, o , O */ case 5: set-PC(6); reset-PC(5); set-PC(4); break; /* 1, O, 1 */ case 6: set-PC(6); set-PC(5); reset-PC(4); break; /* 1, 1, O */ case 7: set-PC(6); set-PC(5); set-PC(4); break; /* 1, 1, 1 */
1 pukso-reloj(5); /*activa los pulsos de 50 y 20 microsegundos */
1 .......................................................................... /* Sirve para enviar un pulso en alguna de las sal idas yO,yl,y2,,,y7
de U20 74LS138 especificada por e l p a r h t r o y */
pulso-reloj( int y) C
suitch(y1 C /* A , B ,
case O: reset-PC(3); reset-PC(2); reset-PC(1); break; /* O, O, case 1: reset-PC(3); reset-PC(2); set-PC(1); break; /* O, O, case 2: reset-PC(3); set-PC(2); reset-PC(1); break; /* O, 1, case 3: reset-PC(3); set-PC(2); set-PC(1); break; /* O, 1, case 4: set-PC(3); reset-PC(2); reset-PC(1); break; /* 1, O,
case 5: set-PC(3); reset-PC(2); set-PC(1); break; /* 1, O, case 6: set-PC(3); set-PC(2); reset-PC(1); break; /* 1, 1, case 7: set-PC(3); set-PC(2); set-PC(1); break; /* 1, 1,
1 set-PC(0); /* C1 = 1 U20 sal ida y5 = O ,las demás estan en 1*/ reset-PC(0); /* G1 = O, todas las sal idas de U20 se van a 1 */
1
c */ o */ 1 */ o */ 1 */ o */ 1 */ o */ 1 */
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Enviar un dato a 74LS374 activado por pulso de reloj proveniente
de yO,yl,y2,y3,y4 de U20 , e l p6rametro clk-y especifica cual sal ida y de U20 enviar6 e l pulso de r e l o j */
- 109 -
.......................................................................... /* pa = pa AND OxDF h a b i l i t a l as sa l idas de los 74LS374 colocando a O
l a s a l i d a PA5 del 8255 s i n a l t e r a r las demas sa l idas del puerto A */
activa_LS374s()
c pa &= OxDF;
bus-agtoA(pa); 1 .......................................................................... /* pa = pa OR 0x20 deshabi l i t a las sa l idas de los 74LS374 colocando a 1
l a s a l i d a PA5 del 8255 s i n a l t e r a r las demas sa l idas del puerto A */
desactiva_LS374s()
c pa I= 0x20;
bus-agtoA(pa); 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i n i c i a l i z a 0
c i n t j ;
encendergrogpal0;
reset( 1; /* d e f i n i r pto-a, pto-b, pto-c como ptos. de sa l ida */ bus-a-ctrl(Ox80); /* coloca todas l as sa l idas del puerto B en 1 */ /* envia pulsos de r e l o j a yO,yl ,y2,y3,y4 para que l as sa l idas
de los 74LS374 se vayan a 1 */ for (j = O; j < 5; j++)
enviar-dato(OxFF, j ) ;
> .......................................................................... /* Coloca a 1 e l b i t del puerto C especificado por n.
byte de control-8255 a c c i h O1 set pc0 03 set p c l 05 set pc2 07 set pc3 O9 set pc4 OB set pc5 OD set pc6 OF set pc7 */
set-PC(unsigned char n)
c bus_a_ctrl(2*n + 1 ) ;
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Coloca a O e l b i t del puerto C especificado por n.
byte de control-8255 a c c i h O0 reset pc0 02 reset pcl O4 reset pc2 O6 reset pc3 O8 reset pc4 OA reset pc5 OC reset pc6 O€ reset pc7 */
reset-PC(unsigned char n)
c krs-a-ctrl(2*n);
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
- 110 -
/* En los procedimientos:
Se envfan datos a las sal idas del puerto paralelo de l a conputadora, esas sa l idas se ut i l i zan para CONTROL del 8255. Se e jecuta l a operac ih (dato a enviar XOR OB hex) para invertir algunos bits del dato. Dado que OB(Hex) = O000 1 0 1 1 ( B i n ) l o s b i t s del dato qw se invierten coinciden con los b its que estOn en 1. E s t a i n v e r s i h s e hace debido a que el puerto paralelo t iene inversores para esos bits. Asf que l a i n v e r s i h por programa anula l a i n v e r s i h por hardware.
bus-a-ct r 1 b u s - a g t d b u s - a g t a
*/ .......................................................................... /* E l 8255 tiene internamente un puerto de contro l , as( que e l
procedimiento bus-a-control envfa un dato al puerto interno de contro l del 8255. */
bus-a-ctrl(unsigned char dato)
c /* E l dato que va a enviarse a l puerto de control del 8255 se coloca
en e l bus de datos */ outportb(BUS-DATOS, dato); /* sal idas para control del 8255 A l RESET’ A0 UR’ */
outportb(CONTROL, (OXOF XOR 0x06)); /* 3state 1 1 1 1 */ outportb(CONTROL, (OxOE XOR OxOB)); /* b u s - x t r l 1 1 1 O */ outportb(CONTROL, (OxOF XOR OxOB)); /* 3state 1 1 1 1 */
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / * bus-agtoA envfa un dato al puerto A del 8255 */
bus-agtoA(unsigned char dato)
c /* EL dato que va a enviarse al puerto A del 8255 se coloca
en e l bus de datos */ outportb(BUS-DATOS, dato); /* sal idas para control del 8255 A l RESET’ A0 UR‘ */
outportb(CONTROL, (0x05 XOR 0x06)); /* 3state O 1 O 1 */ outportb(CONTRO1, (0x04 XOR OxOB)); /* bus->ptaA O 1 O O */ outportb(CONTROL, (0x05 XOR OxOB)); /* 3state O 1 O 1 */
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* bus-agtoB envfa un dato al puerto B del 8255 */
bus-agtoB(unsigned char dato)
c /* et dato q w va a enviarse al puerto B del 8255 se coloca
en e l bus de datos */ wtportb(BUS-DATOS, dato); /* sal idas para control del 8255 A l RESET’ A0 UR’ */
outportb(CONTR0L. (0x07 XOR OxOB)); /* 3state O 1 1 1 */ outportb(CONTROL, (0x06 XOR OxOB)); /* b u s - p p t a o 1 1 o */ outportb(CONTROL, (0x07 XOR OxOB)); /* 3state O 1 1 1 */
> ..........................................................................
- 111 -
/* Envfa pulso de reset a 8255 */
reset( 1 c
/* salidas para control del 8255 A l RESET' A0 UR' */ outportb(CONTROL, (OxOF XOR OxOB)); /* 3state 1 1 1 1 */ outportb(CONTROL, (OxOB XOR OxOB)); /* reset 1 O 1 1 */ outportb(COWTROL, (OxOF XOR OxOB)); /* 3state 1 1 1 1 */
1 .......................................................................... /* Pide a l usuario que encienda e l programador de pals */
encedergrogpa 1 ( 1 c
c l r s c r o ; gotoxy( 1,111; puts(" Verif ique que e l in te r rup tor PROG est6 apagado y"); puts(" Encienda e l PROGRAMADOR DE PALs *);
puts("\n Pulse <control><p para continuar la);
whi le (getcho != SEGUIR); /* Espera por <control><y> */ c l r s c r o ; gotoxy(l , l l ) ; puts(" Encienda e l in te r rup tor PROG In);
puts(" Pulse *control>*y> para continuar *I);
uh i le (ge tch0 != SEGUIR); /* Espera por <cont ro l>*p */ clrsct-0;
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Pide a l usuario que apague e l programador de pals */
apagargrogpal( 1 c
c l r s c r o ; gotoxy(l , l l ) ; puts(" Apague e l in te r rup tor PROG y despds la);
puts(" Apague e l PROGRAMADOR DE PALs la);
puts("\n\n Pulse *control><p para continuar 18);
h i l e (ge tcho != SEGUIR); /* Espera por <control><y> */ clrscr() ;
1 .......................................................................... /* Debido a que solamente pueden leerse 4 b i t s a l a vez a traves del
puerto LPTl ( b i t s M,b5,b4,b3), primero se leen los 4 b i t s d s bajos y se almacenan en l a var iab le nibble-lou, &spuds se corren 3 b i t s a l a derecha para colocar e l dato en l o s b i t s b3,b2,bl,bO. A con t inuac ih se leen los 4 b i t s d s a l tos por e l p w r t o LPT1, y se almacenan en la var iab le dato-entrada, se corre a l a izquierda un b i t para que e l dato quede en los b i t s b7,M,b5,b4, para dejar los
8 b i t s en l a var iable dato-entrada se hace una operac ih OR entre nibble-low y dato-entrada y el resul tado se deja en dato-entrada */
unsigned char leer-dato0 c
unsigned char nibble-low, dato-ent;
- 112 -
/* Leer dato nibble L o u */ reset-PC(7); /* se1 A' 74157 */ nibble-Lou = inportb(ENTRADA); nibble-low >>=3; /* Corre a La derecha 3 bits */ nibble-low &= OxOF; /* Los 4 b i t s Rles a l tos se hacen O */ /* Leer dato nibble high */ set-PC(7); /* se1 6 74157 */ dato-ent = inportb(ENTRADA); dato-ent <*= 1; /* Corre a l a izquierda 1 b i t */ dato-ent &= OxOFO; /* Los 4 b i t s Rles bajos se hacen O */ /* Form u1 byte con los 4 b i t s bajos y los 4 b i t s a l t o s */ dato-ent I = nibble-low; return(dat0-ent);
1 ..........................................................................
- 113 -
/*"""""""""""""""- port&.c """"_"""""""" */
#include <dos.h> #include <conio.h> #include <stdio.h>
#include <stdLib.h>
#include <stdarg.h* #include *graphics.h>
int GraphDriver; /* E l manejador de grhf icas */ i n t GraphMode; /* E l va lor de l modo grhf ico */ double AspectRatio; /* P r q p o r c i h de e x p o s i c i h de un p i x e l */ i n t MaxX, MaxY; /* L a d x i m a r e s o l u c i h de La panta l la */ int MaxColors; /* E l h x i m o # de colores d isponibles */ int Errorcode; /* Reporta cualquier error de grhf icos */ struct palettetype palette; /* Para leer palette info */
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* Prototipos de funciones */
v o i d I n i t i a l i z e ( v o i d ) ; vo id caratu la(void) ; void Pause(void); void MainUindou(char *header);
void StatusLine(char *msg); void DrawBorder(void); void changetextstyle( int font, int d irect ion, int charsize); in t gpr int f ( in t *x loc , in t *yL~c , char * fmt , ... 1;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* PORTADA: Presenta l a portada del Programador de pa ls */
in t por tada0
c
I n i t i a l i z e O ; caratu la( 1; closegraph( ); return(0);
>
/* Se coloca en modo Grhfico */
/* Retorno a l modo de Texto */
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . /* INITIALIZE: In ic ia l i za e l s i s tema de grhf icas y reporta */ /* s i Ocurre algún error. */
v o i d I n i t i a l i z e ( v o i d )
c int xasp, yasp; /* Usado para leer l a p r o p o r c i h de e x p o s i c i h */
GraphDriver = DETECT; /* A u t o - d e t e c c i h de manejador de grhf icos */ initgraph( &GraphDriver, &GraphMode, 11'1 1; Errorcode = graphresul t() ; /* Lee el resultado de La i n i c i a i i z a c i h */ i f ( E r rorcode != grOk IC /* Error Occurr ido durante in it */
- 114 -
pr int f(" Error en e l s is tema de grhf icas: %S\n", grapherrormsg( Errorcode 1; e x i t ( 1 );
>
getpalette( &palette 1; MaxColors = getmaxcolor0 + 1 ; /* Lee d x i m nún. de colores */
MaxX = getmaxxo;
MaxY = getmaxyo; /* Lee e l tamaño de l a panta l la */ getaspectratio( Bxasp, Byasp 1; /* Lee l a proporc. de e x p o s i c i h */ AspectRetio = (doub1e)xasp / (doub1e)yasp; /* factor de c o r r e c c i h */
1 .......................................................................... /* Carhtula: Presentac ih del programador de pals. */
void caratu la(void)
C i n t f o n t , s i z e ; i n t h , x , y , i; struct vieuporttype vp; char buffer t801;
font = 1 ; MainUindou(18 It); getvieusettings( &vp );
set text just i fy( CENTER-TEXT, CENTER-TEXT 1; x = (vp-r ight - v p . l e f t ) / 2; y = textheight( l1Hl1 1;
s i z e = 3; changetextstyle( font, HORIZ-DIR, s i z e 1; h = textheight( l I H l 4 1; y += h; s p r i n t f ( b u f f e r , WNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA ");
wttextxy( x , y , buf fer 1; s i z e = 2; changetextstyle( font, HORIZ-DIR, s i z e );
h = textheight( 11H88 ); y += 2*h; s p r i n t f ( b u f f e r , IIPROYECTO DE INGENIERIA ELECTRONICA 11, s i z e 1; outtextxy( x , y , buffer 1; y += 3*h; s p r i n t f ( b u f f e r , I#);
outtextxy( x , y , buffer );
i f ( font I= DEFAULT-FONT )C y += h / 2; /* Avanza hacia abajo */ set text just i fy( CENTER-TEXT, TOP-TEXT );
setusercharsize( 5 , 6 , 3 , 2 1; changetextstyle( font, HORIZ-DIR, USER-CHAR-SIZE );
outtextxy( (vp.r ight-vp. left)/2, y , O8Programador de PALS" 1;
- 115 -
> s ize = 1; changetextstyle( font, HORIZ-DIR. s ize ); h = textheight( 11Hn4 1; y += 6*h; spr in t f ( buf fer , IIASESOR: ING. GONZALO DUCHEN S.") ;
outtextxy( x, y, bu f fe r 1; y += 2*h; spr in t f ( hu f fe r , 8mALUMNO: ARMANDO NANEZ MARTINEZ");
outtextxyc x, y, buffer 1;
Pause( ); >
.......................................................................... /* PAUSE: Espera hasta que e l usuario pulse una tecla. */
void Pause(void) c
StatusLine(IlPu1se cualquier teclaa1);
getch( 1; /* Lee un c a r k t e r del teclado */ cleardevice(); /* Borra l a pantal la */
.......................................................................... /* MAINUINDW: Coloca l a ventana pr incipal para la portada */
vo id Mainblindow( char *header )
c int height;
cleardeviceo; /* Borra l a pan ta l l a g rh f i ca */ setcolor( MaxColors - 1 1; /* Selec. color blanco */ setviewport( O , O , MaxX, MaxY, 1 ); /* Abre toda La pantalla*/
height = textheight( IhHl4 1; /* Altura besica del tex to */
changetextstyle( DEFAULT-FONT, HORIZ-DIR, 1 1; se t tex t j us t i f y ( CENTER-TEXT, TOP-TEXT 1; w t t e x t x y ( MaxX/2, 2, header 1; setviewport( O , height+4, MaxX, MaxY-(height+4), 1 1; DrauBorderO; setviewport( 1, height+5, MaxX-1, MaxY-(height+S), 1 );
> .......................................................................... /* STATUSLINE: Presenta un mensaje en l a par te i n fe r i o r de l a */ /* pantal la */
void StatusLine( char *msg )
c int height;
- 116 -
setvieuport( O, O , MaxX, MaxY, 1 1; /* Selec. toda l a pantal la */ setcolor( MaxColors - 1 1; /* Selec. color blanco */
changetextstyle( DEFAULT-FONT, HORIZ-DIR, 1 1; se t tex t j us t i f y ( CENTER-TEXT, TOP-TEXT 1; set l ines ty le ( SOLID-LINE, O, NORM-UIDTH );
se t f i 1 l s t y le ( EMPTY-FILL, O 1;
height = textheight( W 1 1; /* Determina l a a l tu ra */ bar( O , MaxY-(height+4), MaxX, MaxY 1; rectangle( O, MaxY-(height+4), MaxX, MaxY 1; outtextxy( MaxX/2, MaxY-(height+2), lnsg 1; setvieuport( 1, height+5, MaxX-1, MaxY-(height+5), 1 );
.......................................................................... /* DRAUBORDER: Dibuja una Lfnea alrededor de La ventana */
void DrauBorder(void) c
struct vieuporttype vp;
setcolor( MaxColors - 1 1; /* Selecciona color blanco */
se t l ines ty le ( SOLID-LINE, O, NORM-UIDTH 1;
getvieusettingsc 8vp );
rectangle( O, O , vp.right-vp.left, vp.bottom-vp.top );
.......................................................................... /* CHANCETEXTSTYLE: s im i la r a settextstyle, pero revisa Los */ /* errores qw pudieran ocurrir mientras carga e l archivo de */ /* es t i l os de letras. */
void changetextstyle(int font, int direct ion, int charsize) c
int Errorcode;
graphresult(); /* Borra e l c6digo de error */ settextstyle(font, direct ion, charsire); Errorcode = graphresult(); /* Ver i f ica e l resul tado */ i f ( Errorcode != grOk IC /* S i se presenta un error */
closegraph0; printf(" Error en e l sistema de grbficas: %s\n8#, grapherrormsg( Errorcode ) );
e x i t ( 1 1; >
>
..........................................................................
- 117 -
/* CPRINTF: usado como PRINTF excepto qw l a sal ida se envla a */ /* La pantat l a en rnodo grh f ico a una coordenada especificada */ /* por *xloc, *yloc */
int gp r in t f ( int *xloc, int *yloc, char * fmt , ... 1 c
va-list argptr; /* Apuntador a l i s t a de argunentos */ char s t r 11401 ; /* Buffer para una cadena */ int cnt; /* Resultedo de GPRINTF para retorno */
va-start( ergptr, format 1; /* I n i c i a l i z a va- functions */
cnt = vspr in t f ( s t r , fmt, argptr ); /* Inprime cadena a buf fe r */ outtextxy( *xloc, *yloc, s t r ); /* Envla l a cadena en modo grh f ico */ *yloc += textheight( mmHmm 1 + 2; /* Avanza a La siguiente lfnea */
va-end( argptr 1; /* Cierra va- functions */
return( cnt 1; /* Regresa La cuenta de conversi6n */
- 118 -
CONCLUSIONES
El desarrollo de este proyecto ha sido muy ilustrativo para
mí, pues he tenido oportunidad de utilizar las enseñanzas que
he recibido en mis cursos anteriores, y es por esa razón que
me siento profundamente agradecido con los todos los
profesores y las personas que han contribuido a mi educación.
El proyecto abarca las dos facetas de mi carrera, el Hardware
y el software, y como toda obra humana puede mejorarse mucho
todavía; Sin embargo, como primera versión que es, cumple
satisfactoriamente con su cometido a un precio relativamente
bajo. Un complemento muy útil para este proyecto sería la
integración de un programa para la simplificación de funciones
booleanas usando, por ejemplo, el método de Quine-McKluskey.
Cuando recién recibí la asignación de este proyecto, no
tenía una idea muy clara del potencial de aplicaciones que
este tiene, pero ahora que lo conozco mejor, me he dado cuenta
de su gran utildad y espero que le proporcione un buen
servicio a usted estimado lector.
- 119 -
BIBLIOGRAFIA
Vincent J. Coli: IIIntroduction to Programmable Array Logice1,
BYTE, January 1987
Robert A. Freedman: !'Getting Started whith PALsII, BYTE,
January 1987
Trevor G. Marshall "PALS Simplify Complex Circuits1#, BYTE,
January 1987
Robert A. Freedman: "A PAL Programmer",BYTE, January 1987
V. Lakshminarayanan: IIProgramming p. 1. ds" , ELECTRONICS &
WIRELESS WORLD January 1 9 8 8 , February 1988
National Semiconductor: IIProgrammable Logic Devices Databook
and Design Guide", 1989
Texas Instruments: "Programmable Logic Databook", 1988
M. Morris Mano, "Lógica Digital y Diseño de Computadoresll,
Prentice- Hall Hispanoamericana, 1986
Frederick J.Hil1, Gerald R. Peterson: IITeoría de Conmutación y
Diseño Lógico11, Editorial Limusa, 1987
Jacob Millman: IIMicroelectronics, Digital and Analog Circuits
and Systems11, Mc-Graw Hill, 1984
Motorola: "Fast and LS TTL data", 1989
Texas Instruments: 'IThe linear control Circuits Data Book for
design Engineers", 1986
- 120 -