# Consulta PAL, GAL Para hacer un contador



## seaarg (Ago 24, 2013)

Estoy buscando achicar un circuito digital que consta de contadores para direccionar memoria y compuertas para manejar señales.

Me regalaron varias placas de videojuegos (arcades) de las cuales estoy sacando muchos integrados logicos, entre ellos algunas PAL y GAL como GAL22V10, PAL16L8, TIBPAL20L8 (este es de texas), etc.

Se que con estos puedo hacer la logica combinacional, pero entiendo que no tienen flip-flops adentro para hacer el "contador" que direccione la memoria ram.

Es posible que haya un integrado PAL o GAL con el que pueda construir esto? La idea basica es meterle una señal de clock por un pin y que tenga salidas de contador binario (8bits o mas, veremos que puedo conseguir). Ademas, aprender a usar estos integrados que estan muy interesantes. (y sus programas para generar los fuses)

Cualquier informacion es bienvenida, muchas gracias! ...


----------



## 1024 (Ago 24, 2013)

Hola, con la Gal22v10 por supuesto que se puede hacer logica secuencial.


----------



## BKAR (Ago 24, 2013)

tengo entendido que si!!, nunca le metí mucha mano a esos dispositivos.

para eso estan las macroceldas (OLMC)


----------



## seaarg (Ago 25, 2013)

Excelente noticia. A estudiar como se hace entonces. Por lo pronto me baje un programa llamado wincupl de atmel.

La simulacion la puedo hacer en proteus y me pide un archivo jedec.

Recomiendan algun programa con el que generar lo necesario para programarlas? Por casualidad hay alguno que sea visual, donde pueda disponer de compuertas e ir conectandolas?

Gracias!


----------



## seaarg (Ago 26, 2013)

Bueno, pude hacer un contador binario de 10 bits (simulado por el momento) con una GAL22v10

Las salidas son Q0..Q9

El problema que me encuentro es que wincupl no compila cuando quiero hacerlo de 10 bits, solo hasta 9 bits. Si agrego la ecuacion para Q9 se produce el error: "excessive number of product terms: Q9.d"

Googleando encontre que en este modelo de GAL se pueden incluir hasta 8 terminos en una ecuacion (¿Es esto cierto?)

Si fuese asi, en Q8 tengo mas de 8 terminos (son 9) y si compilo sin optimizacion tambien da error en Q8 pero con optimizacion activada pasa y funciona lo mas bien. SOLO cuando quiero adicionar Q9 es donde no compila de ninguna forma.

- ¿Puedo optimizar esto de alguna forma para lograr usar los 10 pines de salida y hacer un contador binario de 10 bits, o con esta GAL tengo que conformarme con 9 bits? 
- ¿Hay alguna forma mejor de hacer lo mismo? 
- ¿Puede ser que, si me pongo a ver mapas de karnaugh, etc minimizar los terminos o es tiempo perdido?

Ademas, luego de dominar esta parte, este contador funcionara o no de acuerdo al estado de otros pines de entrada por lo que supongo que tendre que adicionar mas terminos a cada ecuacion de Q.

Desde ya, les agradezco cualquier informacion. Esto es un mundo nuevo para mi, que vengo de los PIC 

Aqui esta el codigo completo que uso:


```
Name     counter ;
PartNo   00 ;
Date     26/08/2013 ;
Revision 01 ;
Designer Engineer ;
Company  60008009 ;
Assembly None ;
Location  ;
Device   g22v10 ;

PIN	1 = CLK;
PIN 	[14..23] = [Q0..Q9];

[Q9..Q0].ar = 'b'0;
[Q9..Q0].sp = 'b'0;

Q0.d  = 
!Q0;

Q1.d  = 
!Q0 & Q1
# Q0 & !Q1;

Q2.d  =
!Q0 & Q1 & Q2
# Q0 & Q1 & !Q2
# !Q1 & Q2;

Q3.d  =
!Q0 & Q1 & Q2 & Q3
# Q0 & Q1 & Q2 & !Q3
# !Q1 & Q2 & Q3
# !Q2 & Q3;

Q4.d  =
!Q0 & Q1 & Q2 & Q3 & Q4
# Q0 & Q1 & Q2 & Q3 & !Q4
# Q1 & Q2 & !Q3 & Q4
# !Q2 & Q4
# !Q1 & Q2 & Q4;

Q5.d  =
!Q0 & Q1 & Q2 & Q3 & Q4 & Q5
# Q0 & Q1 & Q2 & Q3 & Q4 & !Q5
# Q1 & Q2 & Q3 & !Q4 & Q5
# !Q3 & Q5
# Q1 & !Q2 & Q3 & Q5
# !Q1 & Q3 & Q5;

Q6.d  =
!Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6
# Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & !Q6
# Q1 & Q2 & Q3 & Q4 & !Q5 & Q6
# !Q2 & Q3 & Q6
# !Q3 & Q6
# Q1 & Q2 & Q3 & !Q4 & Q6
# !Q1 & Q2 & Q3 & Q6;

Q7.d  =
!Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7
# Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & !Q7
# Q1 & Q2 & Q3 & Q4 & Q5 & !Q6 & Q7
# !Q2 & Q4 & Q7
# !Q3 & !Q4 & Q7
# Q1 & Q2 & Q3 & Q4 & !Q5 & Q7
# Q2 & !Q3 & Q4 & Q7
# !Q2 & Q3 & !Q4 & Q7
# !Q1 & Q2 & Q3 & Q7
# Q1 & Q2 & Q3 & !Q4 & Q7;

Q8.d  =
!Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & Q8
# Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & !Q8
# Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & !Q7 & Q8
# !Q1 & Q3 & Q4 & Q8
# !Q3 & !Q4 & !Q5 & Q8
# Q1 & Q2 & Q3 & Q4 & Q5 & !Q6 & Q8
# Q2 & !Q3 & !Q4 & Q5 & Q8
# !Q2 & Q3 & !Q4 & !Q5 & Q8
# !Q2 & !Q4 & Q5 & Q8
# Q2 & Q3 & !Q4 & Q8
# Q1 & Q2 & Q3 & Q4 & !Q5 & Q8
# !Q3 & Q4 & Q8
# Q1 & !Q2 & Q3 & Q4 & Q8;

Q9.d  =
!Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & Q8 & Q9
# Q0 & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & Q8 & !Q9
# Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & !Q8 & Q9
# !Q1 & Q2 & Q3 & Q4 & Q9
# !Q3 & !Q4 & !Q5 & !Q6 & Q9
# Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & !Q7 & Q9
# Q2 & !Q3 & !Q4 & !Q5 & Q6 & Q9
# !Q2 & Q3 & !Q4 & !Q5 & !Q6 & Q9
# !Q2 & !Q4 & !Q5 & Q6 & Q9
# Q2 & Q3 & !Q4 & !Q5 & Q9
# Q1 & Q2 & Q3 & Q4 & Q5 & !Q6 & Q9
# !Q3 & Q4 & !Q5 & Q9
# Q3 & !Q4 & Q5 & Q9
# !Q3 & Q5 & Q9
# Q1 & Q2 & Q3 & Q4 & !Q5 & Q9
# !Q2 & Q3 & Q4 & Q9;
```


----------



## chclau (Ago 26, 2013)

Si el compilador que usas es bueno es probable que hacer mapas de Karnaugh sea una perdida de tiempo.

Tengo tres cosas para proponerte:

1. Usar contadores Gray
2. Usar contadores pseudo aleatorios, es un poco engorroso usarlos pero son super optimos con respecto a logica combinatorica necesaria.
3. Por mas que las PAL te hayan salido gratis... dejarlas de lado y usar un CPLD que hoy en dia valen dos pesos.

Saludos


----------



## seaarg (Ago 26, 2013)

Perfecto, voy a buscar esos terminos gracias!

Sobre el #3 por supuesto, si los consigo aqui donde vivo  En estas mismas placas tengo unos ALTERA EP610PC-35 que el datasheet dice que son EPLD, lo que no se es la diferencia. Es esto similar a CPLD?


----------



## chclau (Ago 26, 2013)

No, esos EPLD son casi lo mismo que una PAL. Busca por CPLDs de Altera o Xilinx en uso en nuestros dias, la diferencia es la misma como entre un PIC y un 6502. Si no mas, mucho mas.


----------



## seaarg (Ago 26, 2013)

Bueno, les traigo algo de informacion que a alguien le puede resultar util.

El error que tenia antes de que para Q9 tenia mas terminos de los que puede soportar la GAL 22v10 se solucionaba leyendo en el datasheet:

"The GAL22V10 has a variable number of product terms per OLMC.
Of the ten available OLMCs, two OLMCs have access to eight
product terms (pins 14 and 23, DIP pinout), two have ten product
terms (pins 15 and 22), two have twelve product terms (pins 16 and
21), two have fourteen product terms (pins 17 and 20), and two
OLMCs have sixteen product terms (pins 18 and 19). In addition
to the product terms available for logic, each OLMC has an additional
product-term dedicated to output enable control."

Donde dice que los pines 14 y 23 tienen acceso hasta 8 terminos solamente. Como yo usaba el pin 23 para el MSB de mi contador, no podia acceder a todos.

Reorganice los pines y listo. Funciona mi contador de 10 bits perfectamente.

Aqui el codigo en wincupl por si a alguien le sirve.


```
Name     counter ;
PartNo   00 ;
Date     26/08/2013 ;
Revision 01 ;
Designer Engineer ;
Company  60008009 ;
Assembly None ;
Location  ;
Device   g22v10 ;

/** Inputs **/

Pin 1 = ck; /* Counter clock */

/** Outputs **/

Pin 	14 = Q0;

Pin 	15 = Q1;
Pin 	16 = Q2;
Pin 	17 = Q3;

Pin 	23 = Q4;

Pin 	20 = Q5;
Pin 	21 = Q6;
Pin 	22 = Q7;

Pin 	18 = Q8;
Pin 	19 = Q9;



[Q9..Q0].sp = 'b'0;
[Q9..Q0].ar = 'b'0;

field conteo = [Q9..Q0];

sequenced conteo{
	present 'D'0 
	next 'D'1;

	$repeat i =[1..1022]
		Present 'D'{i} 
	next 'D'{i+1};

	$repend

	present 'D'1023 next 'D'0; 
}
```


----------



## chclau (Ago 27, 2013)

Leer el datasheet siempre ayuda...

Felicitaciones, que te anduvo!


----------



## maficruzmar (Oct 25, 2019)

hola una pregunta, como podria hacer 3 contadores en una sola gal y las salidas salgan en 3 displays?


----------



## DOSMETROS (Oct 25, 2019)

Que llevas averiguado , investigado , diseñado por tu cuenta hasta ahora ?


----------

