Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Los PLD son dispositivos digitales que se pueden configurar por el usuario para implementar una amplia
variedad de funciones lógicas en sistemas. Estos dispositivos tienen pines de entrada,un arreglo lógico
programable y pines de entrada y salida. Muchos PLD's tienen salidas programablesque incrementan su
flexibilidad haciendolos útiles para una gran variedad de aplicaciones (fig. 1).
Mas de un término AND alimenta una compuerta OR. La salida es la suma de rpoductos.
1
FIG 2. Arreglo AND-OR usado en la mayoría de los PLD.
Una vez tomada la decisión de cambiar de lógica discreta a PLD, la siguiente pregunta es:
"Cuál PLD?" Los más flexible de un PLD es,lo utilizable que es, ya que un diseñador puede implementar
cualquier ecuación lógica. Hay que escoger PLD's que sean compatibles con los otros dispositivos que se
estén utilizando. Hay que tomar en consideración la potencia que se requiere que se gaste, ya que hay unos
que requiren menos potencia para trabajar que otros. La estabilidad es otro factor importante.
PROCESO DE DISEÑO
Un proceso tipico para diseñar con los PLD es el siguiente:
1. La lógica a ser implentada en un PLD se expresa en un archivo fuente usando un lenguaje de diseño. Estos
incluyen ecuaciones booleanas, tablas de verdad y sintaxis de máquinas de estado.
2. El archivo se procesa por un compilador lógico para generar un archivo JEDEC del diseño. El compilador
configura los bits en le archivo JEDEC los cuales determinan las conecciones que se harán en el arreglo
lógico y configurar así las salidas. La figura 3 es una muestra de este proceso.
2
FIG 3. Proceso típico de diseño para PLD's
PRACTICAS
PRACTICA No 1
En esta práctica el alumno analizará la estructura de los archivos fuentes y la sintaxis necesaria para la
implementación y diseño de los PLD's mediante el paquete computacional PLDshell Plus V3.0.
ARCHIVOS FUENTES.
En estos archivos es donde se realizará el diseño del circuito. Lo mínimo que contienen es la sección de
declaración y al menos uno de las siguientes secciones de diseño: Máquinas de estado, ecuaciones o tablas de
verdad. Cabe mencionar que se puede tener más de una tabla de verdad o máquinas de estado. Estos archivos
tienen la extención "PDS" editándose o formándose desde un simple procesador de palabras, en donde el que
más se utiliza es el EDIT del DOS. Para entrar al paquete debemos teclear PLDSHELL <return>. Una vez
hecho esto, entramos al editor con la opcion EDIT dando el nombre del archivo (con extensión PDS). En la
figura 4 se muestra el cuerpo del programa para un archivo fuente.
________________________________________________________________________________
SECCION DE DECLARACION (REQUERIDA)----Debe ser la primer seccion
Información de Cabecera (opcional)
PIN 1 CLK
PIN 2 IN1
PIN 3 OUT1
***************************************************************************************S
ECCION DE DISEÑO ---Al menos una es requerida: Máquinas de estado, ecuaciones o tabla.
________________________________________________________________________________
SECCION DE MAQUINA DE ESTADO (OPCIONAL)
S1:=BUS_REQ -> S2
S2:= BUS_CONT -> S3
+ BUS_WAIT -> S2
________________________________________________________________________________
SECCION DE ECUACIONES (OPCIONAL)
3
OUTA = IN1 * IN2
OUTB := IN1 * /IN2
+IN1 * IN3
________________________________________________________________________________
SECCION DE TABLA DE ESTADO (OPCIONAL)
T_TAB ( in1 in2 >> out1 out2 )
0 0 : 0 0
0 1 : 1 1
1 0 : 0 1
1 1 : 1 0
***************************************************************************************S
ECCION DE SIMULACION (OPCIONAL) ---debe ser la última sesión.
Se pueden introducir comentarios para una mejor comprensión del programa al momento de editarlos. Estos
comentarios se ponen despues de un punto y coma (;).
Los nombres de las señales pueden incluir de 1 a 14 caracteres alfanuméricos (A-Z,a-z y del 0 al 9 y el signo
_ ). el primer caracter debe ser uno alfanumérico.
SECCION DE DECLARACION
Esta sección es opcional al usuario. Aqui se encuentran los datos tanto del diseñador como del diseño. Un
ejemplo sería el siguiente:
;esto es un comentario
TITLE Controlador de DRAM para una Workstation 386
PATTERN 386_DRAM
REVISION 1 ; número de veces que se ha editado
AUTHOR Carlos Valencia Soberanes ;nombre
COMPANY ITSON ;tu compañía
DATE 12/24/96 ;fecha
A continuación, y que si es obligatorio ponerlo, es el tipo de chip que se va a utilizar, como se observa en la
figura 4. Seguido por los nombres de las entradas y salidas que se utilizarán y refiriéndose a el número de PIN
donde se encontrarán en el CHIP. (véase fig. 4)
SECCION DE DISEÑO.
Al menos uno de los siguientes se requiere: Máquinas de estado, Ecuaciones o Tablas de verdad.
Véase Fig 4.
Aqui se pueden implementar ecuaciones secuenciales por medio de tablas de estado, pudiendo así
4
implementar de una manera fácil contadores de n bits y muchos otros circuitos que con lógica discreta, el
tamaño que ocuparía fuera relativamente grande.
SECCION DE ECUACIONES.
Los circuitos combinacionales son fácilmente implementados usando ecuaciones booleanas con PLDShell
Plus. La sección de ecuaciones empieza con la palabra EQUATIONS. La salida de la ecuación es un nombre
de un PIN dado con anterioridad
Las salidas se pueden configurar como activas bajas o activas bajas, esto en la sección de declaración de los
PINES. Se declaran como activas bajas cuando el símbolo de Slash va antes de la palabra de salida
(/out1=in1*in2).
Se cuenta también con un habilitador de salida (Output Enable) el cual permite tener una salida de tercer
estado (alta impedancia), esto es, si la ecuación a evaluar es 1 lógico, habilita la salida del CHIP, en cambio si
evalúa a 0 lógico deshabilita la salida (Tercer estado). Las ecuaciones con OE se identifican cuando el nombre
de la señal de salida tiene la extensión .TRST.
ejm:
OUT1 = IN1 * IN2 * /IN3
OUT1.TRST = IN4 ;SI IN4 ESTA EN UNO OUT1 SE VA A HABILITAR
;SI ESTA EN CERO OUT1 ESTARA EN TERCER ESTADO
Las tablas de verdad proveen una efectiva manera de describir un diseño o partes de un diseño. Por ejemplo,
las tablas de verdad son muy usadas para los decodificadores. PLDShell plus soporta más de una tabla de
verdad en su diseño.
Para comenzar con esta sección es necesario poner la palabra "T_TAB". Las tablas tienen posiciones
dependientes, por ejemplo, cada entrada tiene una correspondiente columna para cada fila de la tabla. La
primer linea de la tabla lista los nombres de entrada y de salida dentro de paréntesis. Las filas siguientes son
5
los valores de cada salida para cada combinación de entrada.
Las entradas se ponen primero, seguidas por un separador (>>) y luego las salidas. Las entradas se separan
por espacios o comas. Valores legales para la tabla son:
0 =Falso
1 =Verdadero
X =No importa
Un ejemplo es el siguiente:
SECCION DE SIMULACION
Uno de los puntos fuertes de éste Software es que permite la simulación antes de llevar a cabo la
implementación y la programación del chip, para evitar posibles fallas en el diseño.
La simulación como las secciones anteriores es un proceso muy fácil. Para empezar con ella debemos teclear
la palabra SIMULATION alntes de proseguir.
Por ejemplo, tenemos un programa donde su salida esta regida por la siguiente ecuación ubicada en la sección
de diseño:
Para simular unas entradas, utilizamos la instrucción SETF seguido por los valores de las entradas que
queramos inicializar, por ejm:
SETF in1 /in2 in3
Aquí le decimos que in1=1 in2=0 in3=1 por lo que al evaluar la función el resultado va a ser cero.
Si tenemos un circuito donde un de sus entradas sea un reloj y queremos simular a éste, usamos la instrucción
:
CLOCKF entrada_clk
Así el reloj dara un pulso a la entrada, provocando una salida la cual la observaremos en el diagrama de
tiempos que el software nos ofrece. Podemos usar ciclos for de la siguiente manera:
FOR X := 0 TO 3 DO
BEGIN
CLOCKF CLK
END
Asi obtendremos cuatro pulsos seguidos.
Para obtener el diagrama de tiempos, una vez hecho y compilado el programa (Mediante la opción COMPILE
el cual genera los archivos necesarios para la programacion de el chip) se escoge la opción VIEW y
seleccionando Vector/Waveform.
Una vez hecho ésto, el programa dara el diagrama con todas las entradas y las salidas que se hayan utilizado.
6
EJEMPLO DE PROGRAMA.
Se cuenta con un GAL22V10 el cual se quiere programar con tres entradas y una salida. La caracteristica de
la ecuación de salida es que va a ser verdadara solo si las tres entradas son falsas. Para comenzar desde el
prompt del DOS teclear "PLDSHELL <enter>" para entrar al paquete. Una vez dentro, escogeremos edit para
editar nustro programa y daremos el nombre "PRACTICA1.PDS".
El programa se editará de la siguiente forma:
;**********************************************************************************TITLE
Práctica 1_
PATTERN pract1
REVISION 1 ;numero de veces que se ha editado
AUTHOR Carlos Valencia Soberanes ;nombre
COMPANY ITSON ;tu compañía
DATE 12/24/96 ;fecha
PIN 2 IN1
PIN 3 IN2
PIN 4 IN3
PIN 14 OUT1
;note que no hay necesidad de declarar todos los pines ni Vcc ni tierra. El software esta encargado ;de hacer
todas las conecciones necesarias
EQUATIONS
OUT1 = /IN1 * /IN2 * /IN3
;Es la condición para que la salida sea verdadera
SIMULATION
TRACE_ON OUT1 IN1 IN2 IN3
;Empieza la sección de simulación indicando todas las variables usadas
TRACE_OFF
;fin de la simulación
; ******************************************************************************
Una vez tecleado nos salimos del EDIT grabando el programa. Hecho ésto, lo compilamos para crear los
archivos necesarios, principalmente el JEDEC que es el con que se programa al chip; si hay errores no va a
generar tales archivos por lo que hay que volver a editar al programa de la misma forma anterior.
Una vez compilado, lo simularemos con el menú view seleccionando vector/waveform observando el
diagrama de tiempos.
7
PRACTICA 2
El alumno diseñará un decodificador de 4 a 7 segmentos con funcion lamp test y lamp blank y un
decodificador de 3 a 8 con salida activo bajo usando el paquete computacional PLDShell Plus de Intel.
DESARROLLO
Primeramente se diseñará un decodificador de 3 a 8 (Tabla 1) en donde sus salidas serán activas bajas. De
acuerdo a las entradas, especificar las salidas por medio de ecuaciones booleanas para posteriormente realizar
el programa con el paquete PLDShell (de acuerdo a lo anteriormente visto en la prácticas anteriores).
Posteriormente se programará al chip GAL22V10 mediante el archivo JEDEC generado a traves del paquete
computacional PLDShell Plus de Intel por lo que primeramente tendrá que ser simulado para comprobar su
funcionamiento.
TABLA 1. Tabla de verdad de un Decodificador de 3 a 8
Como segundo punto se diseñará e implementará un decodificador de 4 a 7 segmentos mediante el uso del
paquete PLDShell por medio de una tabla de verdad, y con esto generar un archivo JEDEC para la
programación del chip GAL22V10.
Ademas de decodificar los cuatro datos de entrada (D0 a D3) tendrá la funcion de LP (lamp Test) el cual
estará desabilitado con un uno lógico. Con un "0" todos los leds del display deberán encender. También
contará con LB que es lo contrario del LP; estará también desactivado con un uno lógico y se habilitará con
un cero; cuando ésto suceda todos los leds del display deberán apagarse. Cuando estas dos entradas (LP y LB)
esten en cero, los leds deberan de apagarse en su totalidad.
Antes de programar el GAL22V10, deberá simularse el diseño para estar completamente seguros de que no
existe ninguna falla.
8
PROGRAMACION DE UN DISPOSITIVO.
La programación de un PLD es independiente del paquete computacional PLDShell Plus de Intel. Para ello se
utilizará el programador universal TUP 300.
La manera en que se entra al éste software es tecleando "GAL1" <ENTER> ya que es aquí donde se encuentra
uno de los chips con que se trabajará (GAL22V10). Se cuenta con otros programas donde se encuentran una
diversidad de chips distintos los cuales son soportados por éste programador. (GAL2 Y GAL3). Si se deseara
programar un PLD del tipo PAL se entra al programa PALP1.
Una vez dentro lo primero que debemos hacer es cargar el archivo JEDEC generado por el paquete PLDShell
Plus, el cual tendrá el mismo nombre del archivo fuente donde se diseñó el circuito, solo que la extensión será
.JED (Si se desea observar el contenido de éste archivo lo podemos ver con cualquier editor, ya que es un
archivo de tipo texto; se observará el mapa de unos y ceros los cuales son necesarios para la programación de
los PLD). Para cargar éste archivo, teclearemos la opción #2 y
A: nombre_archivo.JED
El programador universal TUP 300 carga el contenido de éste archivo en el buffer, el cual puede ser editado,
claro con un previo conocimiento del mismo mapa.
Una vez hecho lo anterior, se selecciona el tipo de dispositivo a usar; Tecleando la opción M se selecciona la
marca (En nuestro caso es LATTICE) y despues el tipo (GAL22V10 NO UES) seleccionando la opción T.
Teniendo el archivo en buffer y el tipo de dispositivo, lo único que queda es la programación la cual se realiza
con los siguinetes pasos:
1. Primeramente, como es un dispositivo Programable, se debe checar si esta en blanco, ya que de lo contrario
la programación será fallida. Para esto se teclea la opción B y respondemos que sí (Y).
2. Una vez que nos aseguremos que el PLD esté en blanco, teclearemos la opción P de programar; el
programador agarrará el archivo del buffer y empezará a programar el dispositivo en u tiempo de corta
duración.
3. Por último se verifica la operación hecha mediante la opción V.
Se puede tener seguridad en el diseño de los PLD's. Si se quiere evitar una copia o inclusive una modificación
al PLD, se cuenta con la Opción S, el cual activa unos fusibles en la entrada del chip, lo cual hace imposible
una futura lectura del mismo dispositivo.
9
PRACTICA 3
El alumno aprenderá a usar la sintaxis necesaria para poder diseñar con máquinas de estado.
Las máquinas de estado proveen una manera efectiva de describir logica secuencial. Un diseñador típicamente
sólo dibuja el diagrama de estado que representan los estados diferentes y las transiciónes para un diseño. Este
diagrama puede ser expresado en sintaxis del paquete PLDShell Plus.
Cada máquina de estado comienza con la palabra "STATE" seguida de un tipo de máquina
(MEALY_MACHINE o MOORE_MACHINE). Las salidas en MOORE_MACHINE dependen solo del
estado presente.Las salidas en este tipo de máquina siempre son las mismas para cada estado que se tenga.
Las salidas en MEALY_MACHINE dependen de el estado presente y del estado siguiente. En éste tipo de
máquina, las salidas no son las mismas para un determinado estado, sino que dependen de las entradas que se
tengan. En esta práctica veremos un diseño con MOORE_MACHINE.
Para diseñar una máquina veremos la implementación de un contador de 2 bits. (véase fig 6).
Primeramente, se pone la sección de declaración como se hizo en las prácticas anteriores (declaración del chip
y de los pines).
Después se pone la palabra STATE seguida del tipo de máquina que se va a a emplear. Si se tiene el peligro
de no poder determinar el estado en que se va a caer o el estado que sigue, el programa cuenta con una
protección que es un salto default DEFAULT_BRANCH estado y siempre caerá en el estado seleccionado.
Esto es por protección. Se cuenta también con otro tipo de protección para dar una salida determinada, esto
con DEFAULT_OUTPUT seguida de una lista de variables de salida.
Las asignaciones de estado definen cada uno de los estados en la máquina, las variables de estado y los
valores de éstas variables. Los estados se definen por un nombre de estado por ejemplo, S1, S2, etc. de la
parte izquierda del signo =. Las variables de estado y los valores de éstas variables se colocan del lado
derecho. Cada estado debe tener un único grupo de valores para las variables de estado. Cuando se definen los
valores para los estados, estos pueden ser verdaderos o falsos(con el prefijo / ).
En las transiciones de estado se define el orden de las transiciones de un estado a otro basado en las
condiciones de transición. Las transiciones de estado que no esten explicitamente definidas en ésta sección
estaran en el estado definido por DEFAULT_BRANCH.
S1 := UP ->S2
+DOWN ->S4
+-> S1
Este ejemplo significa si UP es verdadero, entonces el salto se realizará al estado 2; si DOWN es verdadero el
salto se realizará a S4. Si ninguno se cumple entonces permanecerá en el mismo estado.
Es muy importante poner el signo : = en las transiciones de estado.
La sección de transición de salida (no especificada en la figura 6 ya que no se necesita, puesto que la salida
del contador son las mismas salidas de los flip flops) especifica el estado de las señales de salida durante las
transiciones para las máquinas de estado donde las salidas no son las mismas que la de los registros (flip
flops) como en el ejemplo visto.
Para especificar una salida ésta debe llevar la extensión .OUTF al lado izquierdo del signo : = .
10
Esto significa que cuando se caiga en el estado S1, OUTA y OUTB se llevaran a un estado alto mientras que
OUTC se llevará a uno bajo.
Las salidas se pueden especificar también de la siguinete manera: (P1 y P2 son estados)
P1.OUTF : = CONDICION1 -> /SIGA * SIGB
+CONDICION2 -> SIGA * /SIGB
+CONDICION3 -> SIGA * SIGB
P2.OUTF : = CONDICION1 -> SIGA * SIGB
+CONDICION2 -> /SIGA * /SIGB
+CONDICION3 -> /SIGA * SIGB
Nótese que estando en diferentes estados y sucediendo la misma condición se pueden obtener salidas
diferentes.
Este tipo de salidas se utiliza más generalmente sobre máquinas de tipo MOORE_MACHINE donde para
cada determinado estado se pueden tener diferentes salidas dependiendo de las entradas que se tengan.
Por último se tienen las condiciones de transición que comienza con la palabra CONDITIONS y especifica la
combinación de las señales de entrada que determinan las condiciones de transición. Por ejemplo,UP (en el
ejemplo de la figura 6) es una condición que será verdadera si UPDOWN esta en alto y CLEAR en cero.
El orden de las distintas condiciones es muy importante para el funcionamiento tanto del chip como del
programa.
***********************************************************************************
fig 6. Programa fuente para la implementación de un contador de 2 bits.
CHIP 2_BIT 22V10
; pines
PIN 1 CLK
PIN 2 UPDOWN
PIN3 CLEAR
PIN 15 Q1
PIN 16 Q0
STATE
MOORE_MACHINE
DEFAULT_BRANCH S0 ;indicando por default que salte a S0 si no se determina
;correctamente un salto
;asignaciones de estado
S0 = /Q1 * /Q0 ;0 0
S1 = /Q1 * Q0 ;0 1
S2 = Q1 * /Q0 ;1 0
S3 = Q1 * Q0 ;1 1
;transiciones de estado
S0 := UP ->S1
+DOWN ->S3
S1 := UP ->S2
+DOWN ->S0
11
S2 := UP ->S3
+DOWN ->S1
S3 := UP ->S0
+DOWN ->S2
SIMULATION
; Se utiliza un ciclo FOR para contar seis pulsos de reloj hacia arriba
FOR j := 0 TO 5 DO
BEGIN
CLOCKF CLK
END
SETF CLEAR
CLOCKF CLK
SETF /CLEAR
SETF /UPDOWN
FOR j := 0 TO 5 DO
BEGIN
CLOCKF CLK
END
; borramos al contador
SETF CLEAR
CLOCKF CLK
SETF /CLEAR
TRACE_OFF
12
; fin de la simulacion
***************************************************************************************
Se puede observar que en el diagrama anterior no se tienen salidas externas, ya que sus salidas son los mismo
estados con que se cuentan.
Como último ejemplo se implementará un programa fuente para el siguiente diagrama de estados el cuál
ahora si tendrá salidas externas:
13
PIN 15 STATE1 ;son las variables de estado
PIN 16 STATE0
STATE
MEALY_MACHINE
DEFAULT_OUTPUT /OUT1 /OUT2 ;inicializamos las salidas en cero
DEFAULT_BRANCH E0 ;indicando por default que salte a E0 si no se determina
;correctamente un salto
;asignaciones de estado
E0 = /STATE1 * /STATE0 ;0 0
E1 = /STATE1 * STATE0 ;0 1
E2 = STATE1 * /STATE0 ;1 0
E3 = STATE1 * STATE0 ;1 1
;transiciones de estado
E0 := COND0 ->E0 ;solo pasara a el estado 1 si sucede la condicion 1
+COND1 ->E1 ;sino ocurre esto se quedara en el estado 0
+COND2 ->E0
+COND3 ->E0
E1 := COND0 ->E0
+COND1 ->E0
+COND2 ->E2
+COND3 ->E0
E2 := COND0 ->E0
+COND1 ->E0
+COND2 ->E0
+COND3 ->E3
E3 := COND0 ->E3
+COND1 ->E3
+COND2 ->E3
+COND3 ->E3
;transiciones de salida
;lo que deben de ser en realidad la salida
E0.OUTF = COND0 ->/OUT1 * /OUT2
+COND1 ->/OUT1 * OUT2 ;la salida sera 1solo con la condicion 1
+COND2 ->/OUT1 * /OUT2 ;sino la salida sera cero
+COND3 ->/OUT1 * /OUT2
14
+COND2 -> OUT1 * /OUT2
+COND3 -> OUT1 * OUT2
SIMULATION
15
CLOCKF CLK
TRACE_OFF
; end of simulation
16