viernes, 22 de febrero de 2008

FILOSOFIA DE OPERACIÓN Y CONTROL DE UN SEPARADOR DE PRUEBA


CONTROL DE NIVEL
El sistema consiste en un separador de prueba, el cual separa el crudo del gas, cuyo flujo es proveniente de los pozos productores de petróleo. Una vez que el crudo entra al múltiple de prueba es alineado hacia el sistema de separación para obtener la medición total del crudo y gas producido. El nivel del crudo en el separador es controlado por la válvula XSV-001, de manera que cuando el crudo alcanza un alto nivel, es detectado por el Switch LSH-001, enviando una señal de mando para la apertura de la válvula, de esta manera el nivel de crudo comienza a descender hasta llegar a un nivel bajo, en este momento, es detectado por el switch de bajo nivel LSL-001, y este a su vez envía una señal de mando a la válvula de control para que cierre, controlando de esta forma el nivel en el separador.

CONTROL DE PRESION.
La presión en el sistema es controlada a través de la válvula XSV-002, la cual es accionada para la apertura por una señal de mando enviada por el switch PSH-002, liberando la presión del sistema, hasta alcanzar una baja presión, en este momento el switch de baja presión PSL-001 envía una señal de mando a la válvula de control para que esta cierre.


SISTEMA DE ARRANQUE.
El sistema esta automatizado, por razones de seguridad, es necesario la presencia de un operador en campo, a fin de que en forma manual iniciar el proceso de separación, colocando el selector en ENCENDIDO (ENC). Esta acción es seguida de la activación de la señal de límites completos, es decir, al activarse esta señal es indicativo de que se posee una presión y un nivel necesario para el arranque. Una vez, alcanzado estos límites, se envía una señal de mando a la válvula de bloqueo, la cual permite la entrada de flujo de crudo al separador, de esta manera comienza el proceso de separación y pruebas de pozos.


CONTROL DE PARADA/ARRANQUE DE BOMBA
Una vez que el crudo sale del separador de prueba entra al tanque de almacenamiento y luego es bombeado hasta una estación de recibo principal. La bomba que envía el crudo hasta la estación de recibo principal es accionada y parada por el relé YS-001, el cual indica a la bomba accionarse al momento de detectar una condición anormal, al estabilizarse esta condición, el relé envía una señal de parada a la bomba.


SEÑALES DE ENTRADA:

1.- LSL-001. (SWITCH DE BAJO NIVEL DEL SEPARADOR)
2.- LSH-001. (SWITCH DE ALTO NIVEL DEL SEPARADOR)
3.- PSL-001. (SWITCH DE BAJA PRESION DEL SEPARADOR)
4.- PSH-002. (SWITCH DE ALTA PRESION DEL SEPARADOR)
5.- SELECTOR ON/OFF. (ENC)
6.- INDICADOR DE LÍMITES COMPLETOS. (L.C)



SEÑALES DE SALIDA:

1.- XSV-001. (VALVULA DE CONTROL DE NIVEL DEL SEPARADOR)
2.- XSV-002 (VALVULA DE CONTROL DE PRESION DEL SEPARADOR)
3.- VALVULA DE BLOQUEO. (V. BLOQUEO)
4.- YS-001. (RELE DE ARRANQUE/PARADA BOMBA)




TABLA DE LA VERDAD DEL DISEÑO A IMPLEMENTAR






ECUACIONES PARA LA ELABORACIÓN DEL ESQUEMÁTICO LÓGICO




ESQUEMÁTICO LÓGICO UTILIZADO PARA LA SIMULACIÓN EN XILIN







ECUACIONES GENERADAS POR XILIN DURANTE LA SIMULACIÓN






TABLA DE PINOUT GENERADA POR XILIN DURANTE LA SIMULACIÓN







DIAGRAMA DE ESTADOS UTILIZADOS PARA LA SIMULACIÓN




ESQUEMÁTICOS GENERADOS POR XILIN DURANTE LA SIMULACIÓN










DIAGRAMA DE FLUJO UTILIZADO PARA LA PROGRAMACIÓN






PROGRAMA EN VERILOG DE CONTROL DEL SEPARADOR DE PRUEBA


El siguiente programa muestra la lógica de control de un separador, para el cual se utilizo el lenguaje de programación VERILOG. Se selecciono el dispositivo XA9536XL de la familia 9500XL y luego se creo un modulo para la programación definiendo en este las entradas/salidas de la lógica de control. Adicionalmente se declaran las señales de salidas como registros debido a que arrojan el valor del resultado de cada operación.
El bloque Always contiene la lista de sensibilidad para evaluar las acciones dentro del procedimiento siempre que una o más de las señales de la lista cambie. En este bloque se reflejan los status de las salidas una vez que ocurre algún evento en la señales de entradas, para esto se efectúa una asignación bloqueante (se usa el signo igual); esto modela la conducta de un proceso combinacional. Las ecuaciones en este programa simulan el sistema de control en el separador.


timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 20:44:51 02/29/2008
// Design Name:
// Module Name: Control
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Control(ENC, LC, LSL001, LSH001, PSL001, PSH001, XSV001, XSV002, VBLOQUEO, YS001);
input ENC;
input LC;
input LSL001;
input LSH001;
input PSL001;
input PSH001;
output XSV001;
output XSV002;
output VBLOQUEO;
output YS001;
reg XSV001;
reg XSV002;
reg VBLOQUEO;
reg YS001;

always @ (ENC or LC or LSL001 or LSH001 or PSL001 or PSH001)
begin
XSV001 = (ENC & LC & ~LSL001 & LSH001 & ~PSL001) & (~PSH001 PSH001) (ENC & LC & ~LSL001 & LSH001 & PSL001) & (~PSH001 PSH001);

XSV002 = (ENC & LC & ~LSL001 & ~LSH001 & PSL001) & (~PSH001 PSH001) (ENC & LC & LSL001 & ~LSH001 & PSL001) & (~PSH001 PSH001);

VBLOQUEO = (ENC & LC & ~LSL001 & ~LSH001 & ~PSL001) & (~PSH001 PSH001) (ENC & LC & ~LSL001 & ~LSH001 & PSH001) & (LSH001 & ~PSL001 LSH001 & PSL001) (ENC & LC & LSL001 & LSH001 & ~PSL001 & ~PSH001) & (~PSL001 PSL001);

YS001 = (ENC & LC & ~LSL001 & PSL001 & PSH001) & (LSH001 LSH001) (ENC & LC & LSL001 & LSH001 & ~PSH001) & (~PSH001 PSH001) (ENC & LC & LSL001 & LSH001 & PSL001 & ~PSH001);
end

endmodule



RESULTADOS DE LA SIMULACION




















viernes, 8 de febrero de 2008

DISPOSITIVOS LOGICOS PROGRAMABLES SIMPLES (SPLD)

CONSTRUCCION

Los SPLDs es una combinación de un dispositivo lógico (arreglo de compuertas AND, seguido por otro arreglo de compuertas OR, uno o ambos arreglos programables, algunos incluyen Flip Flops) y una memoria. La memoria se utiliza para almacenar el patrón el que se le ha dado al chip durante la programación. La mayoría de los métodos para almacenar datos en un circuito integrado han sido adaptados para el uso en SPLDs. Entre estos se incluyen: antifusibles de silicio, SRAMs, Células EPROM o EEPROM y memoria flash.

Los antifusibles de silicio son elementos de almacenamiento utilizados en las PAL, el primer tipo de SPLD. Estos antifusibles se encargan de formar conexiones mediante la aplicación de voltaje en un área modificada del chip. Se le llama antifusibles porque funcionan de manera opuesta a los fusiles normales, los cuales permiten la conexión hasta que se rompen por exceso de corriente eléctrica.

Las SRAM, o RAM estáticas, son un tipo volátil de memoria, lo que quiere decir que su contenido se pierde cada vez que se desconectan. Los SPLDs basadas en SRAM tíenen que ser programadas cada vez que el circuito se enciende. Generalmente esto lo hace otra parte del circuito.

Una célula EPROM es un transistor MOS (metal-óxido-semiconductor) que puede activarse atrapando una carga eléctrica permanentemente en su puerta, cosa que realiza un programador PAL. La carga permanece durante algunos años sólo puede ser eliminada exponiendo al chip a una luz ultravioleta fuerte en un dispositivo llamado borrador EPROM.
Las memorias flash son no volátiles, por lo que retienen sus contenidos incluso cuando se les corta la alimentación. Puede ser borradas y reprogramadas tanto como sea necesario, lo que las hace útiles para las memorias SPLD.

A partir de 2005, la mayoría de las CPLDs son del tipo EEPROM y no volátiles. Esto se debe a que son demasiado pequeñas para justificar lo poco conveniente que es la programación interna de celdas SRAM cada vez que se inician, y lo costoso de las células EPROM debido a su encapsulado cerámico con una ventana de cuarzo.

ESTRUCTURA

La estructura típica consiste en "suma de productos"

  • Matriz AND programable + Matriz OR fija
  • Se puede implementar cualquier función de n entradas de hasta p términos producto (p <>

Se programan las interconexiones

  • Número de interruptores=(2n×p × m)

    Figura 1 Arreglo And Or de un SPLD.

FUNCIONAMIENTO

Como se ha mencionado, los SPLD están formadas por una matriz de puertas AND programable conectada a una puerta OR fija. Esta estructura permite implementar cualquier suma de productos lógicos con un número de variables definidas y limitadas, entre otras, por el número de entradas y salidas que tenga el dispositivo.

En la Figura 2 se muestra la estructura básica de un SPLD para tres variables de entrada y salida sin programar. Cada punto de intersección entre una fila y una columna se denomina celda y es el elemento programable del SPLD. Cada fila se conecta a la entrada de una puerta AND y cada columna a la variable de entrada o su complemento. En función de la presencia o ausencia de las conexiones creadas por programación, se puede aplicar cualquier combinación de variables de entrada o sus complementos a una puerta AND para generar cualquier operación producto que se desee.



Figura 2 SPLD con matriz AND sin programar

La implementación de una función lógica sobre un SPLD, se muestra la figura 3, donde las señales que entran a la matriz son las variables de entrada y sus complementos. Cuando se requiere la conexión entre una fila y una columna, el fusible queda intacto, Cuando dicha conexión no se requiere, el fusible se abre en el proceso de programación. La salida de la puerta OR proporciona finalmente la suma de productos. Observe que si alguna entrada de una puerta AND queda sin conectar, esta adquiere el valor del elemento neutro del producto lógico, sin afectar el resultado de dicha puerta.

Figura 3 SPLD con matriz AND programada

FABRICANTES

Dispositivos SPLD se introducen en 1978 por Monolithic Memories, Inc., (MMI), la arquitectura era más sencilla que la FPLA porque omitía la matriz
OR programable. Esto hizo los dispositivos más rápidos, más pequeños y más baratos .

Los SPLD de MMI pronto fueron distribuidos por AMD la cual empleo tecnología PROM de fusibles Titanio-Tungsteno programables una sola vez; Texas Instruments apoya las PALs con arquitectura variable programables una sola vez y National Semiconductor, quien fue el pionero en el desarrollo de Arreglos Lógicos Programables (Programmable Logic Arrays, PLA’s) en forma de un DIP grande de 24 pines o terminales (0.6 pulgadas de ancho) con 96 términos productos, 14 entradas, 8 salidas.

El primer circuito PAL fue el 16L8, de 20 terminales (pines), con soporte para 8 salidas y hasta 16 entradas con tecnología Bipolar, mostrada en la Figura 4, en cada macro celda se observa:


° Cada variable de entrada es distribuida negada y sin negar en la matriz de intersección mediante los literales (columnas).
° Todas las columnas cruzan líneas horizontales donde se puede realizar el AND cableado de las columnas que se elijan y con ello generar en cada fila la suma de productos que se desee.
° Siete filas son unidas mediante una compuerta OR para realizar la suma de productos.
° La señal de salida es negada por cuestiones de velocidad; ya que es más rapida una compuerta NOR que una OR, aunque existe la PAL 16H8, donde la salida en la compuerta OR sale sin negar.
° En algunas macroceldas el valor de salida se realimenta negado y sin negar a todo el circuito, lo cual permite la conexión en cascada de lógica, para la síntesis de funciones más complejas. Esto además facilita el diseño de circuitos realimentados para la elaboración de celdas de memorias.
° Las salidas se pueden controlar individualmente a través de las compuertas Tri-State de cada una y con esto poder seleccionar la salida como entrada.

Figura 4 PAL16L8 en encapsulado DIP20.

Con este tipo de dispositivos pueden simularse arreglos del tipo de Productos Lógicos, o en su caso realizar decodificación de direcciones. Sin embargo, la mayor aportación de los dispositivos PAL fue generar aplicaciones específicas en muy corto tiempo. La operación de estos dispositivos inicio manejando velocidades de 4.7 Mhz para la IBM PC hasta 33 Mhz, para posteriormente alcanzar los 50 Mhz; hoy se pueden encontrar dispositivos que operan con un retraso de propagación de la señal del orden de 5ns.

Sin embargo, su estructura simple también es su principal desventaja, ya que solo se pueden implementar pequeños circuitos lógicos representados con un modesto número de términos producto, porque su estructura de interconexión esta fija en cuanto a que no se puede configurar la salida si se requiere que sea activo alto, activo bajo, con o sin registro. En la Figura 5 se observa el diseño de una PAL con puertas de distintos tipos.

Figura 5 Diseño de una PAL con puertas de distintos tipos.


En el mercado se manejan referencias de las PALs comerciales como la PAL16L8, PAL20L8, PAL20V8 y PAL20X8.

DISEÑO

Puesto que las PAL son circuitos integrados muy complejos desde el punto de vista interno, los fabricantes han adoptado una notación simplificada para eliminar los diagramas lógicos complicados. En la Figura 6 se muestra la notación.

Figura 6 Símbolo simplificado de una SPLD

Buffer de entrada: Para evitar cargar con la gran cantidad de entradas de puertas AND a las que se pueden conectar una variable o su complemento, se añade un buffer a las variables de entrada del SPLD. Un buffer inversor genera el complemento de una variable de entrada.

Puertas AND: una matriz AND de una puerta SPLD típica tiene una gran cantidad de líneas de interconexión y cada puerta AND tiene entradas múltiples. El diagrama lógico de un SPLD muestra cada puerta AND que realmente tienen varias entradas, utilizando una sola línea para representar a todas las líneas de entrada.

Conexiones de un SPLD: Para obtener un diagrama lo más sencillo posible, los fusibles de una matriz AND programable se indican mediante una X en el punto de intersección






jueves, 7 de febrero de 2008

ABEL

Es la abreviatura de Advanced Boolean Expression Language. Es un lenguaje de descripción de hardware y un conjunto de herramientas de diseño para programar dispositivos lógicos programables (PLDs).

1.- HISTORIA DEL LENGUAJE ABEL

Este lenguaje fue creado en 1983 por Data I/O Corporation en Redmond, Washington. El equipo que desarrolló estuvo conformado por Kyu Lee, Mary Bailey, Bjorn Benson, Walter Bright, Michael Holley, Charles Olivier y David Pellerin.

Abel puede ser usado para describir el comportamiento de un sistema en variedad de formas, incluyendo ecuaciones lógicas, tablas de verdad y diagramas de estados usando sentencias parecidas a las de C. El compilador de ABEL permite que los diseños sean simulados e implementados en PLDs, PALs, CPLDs y FPGAs.

Algunos lenguajes de programación de la misma época son CUPL y PLAASM. Desde que se popularizaron las FPGAs, estos lenguajes han decaído debido a la aparición de lenguajes estándar como VHDL.


Debido a una serie de adquisiciones, ABEL es ahora propiedad de Xilinx Inc.

2.- TIPO DE PROGRAMA

El lenguaje Abel permite describir programa de lógica combinaciones, o secuénciales (maquinas de estados)


Es un lenguaje de descripción de hardware ...

  • Permite describir un circuito digital.
  • Permite definir vectores de test para comprobar el funcionamiento.
  • Permite generar el mapa de fusibles para programar el PLD …de bajo nivel.
  • Muy cercano a la circuitería que representa.
  • Muy eficaz para describir diseños digitales pequeños.

3.- ESTRUCTURA DEL PROGRAMA

  • Todos los diseños deben tener una cabecera y un final.
  • Todos los diseños empiezan con una sentencia MODULE y terminan con una sentencia END.
  • Para evitar errores de compilación, el nombre dado al módulo debe coincidir con el nombre del fichero *.abl en el que se almacena la información.
  • La sentencia TITLE es opcional y se usa para identificar el diseño a efectos de documentación. “Va seguida de una cadena de caracteres ASCII encerrados entre comillas simples”.
  • La sentencia END marca el final del módulo. Puede ir seguida por el nombre del módulo, a efectos de documentación.

Estructura Básica de un archivo fuente en lenguaje ABEL es el siguiente:

  • Encabezamiento
  • Declaraciones
  • Descripciones lógicas
  • Vectores de prueba o “Test Vectors”
  • Final

3.1 Encabezado

Tiene las siguientes palabras claves.

• Palabra clave: module.

Esta palabra clave es necesaria pues indica el nombre y el comienzo del módulo. Debe ir siempre un END al final del modulo. Programas largos pueden tener varios módulos, cada uno con su propio nombre, título, declaraciones y ecuaciones.

• Palabra clave: title.

Especifica un string de título que será incluido en los archivos de documentación
generada por el compilador.

• Los comentarios se agregan comenzando el texto con comillas dobles.


3.2 Declaraciones

A esta área corresponden los siguientes aspectos:

• Palabra clave: device.

La declaración device es opcional e incluye un identificador y un string que denota el tipo de dispositivo. El compilador usa el nombre del dispositivo, para verificar que este soporta las ecuaciones lógicas especificadas en el programa.

• Palabra clave: pin (pin declaration)

Las declaraciones de pin informan al compilador acerca de los nombres asociados a los pines del componente. Si el nombre de la señal declarada está precedida por un NOT (!), entonces en el pin asociado se presentará el complemento de la señal en cuestión.

• Palabra clave: node.

Se usa para declarar señales que no son conectadas a pines externos.

• Palabra clave: istype.

Define una lista de atributos de una señal. Se puede usar después de una declaración de pin o node. En el manual de referencia (pág 51) se encuentra una lista de atributos que resulta interesante revisar. Un ejemplo es la palabra clave com que define una salida combinacional.

• Uso de range.

Un rango de nombre de señales puede definirse con el primer y último nombre de del rango separados por ..., por ejemplo “L0...L5”.

• Uso de Set.

Un Set es un conjunto de señales o constantes referenciadas con un solo nombre. Cada operación aplicada al Set es aplicada a cada una de las señales que lo componen.

• También es posible declarar constantes y expresiones que pueden simplificar el programa.


3.3 Descripción Lógica

Un diseño lógico puede ser descrito de las siguientes maneras:

1. Bloques de ecuaciones.

2. Tablas de verdad.

3. Diagrama de estados.

3.3.1Bloques de ecuaciones.

Se utiliza la palabra clave equations para comenzar la descripción lógica. Las ecuaciones se especifican con expresiones lógicas utilizando operadores o bloques “When- Then-Else”.

Alguno de los operadores son los siguientes:

3.3.2 Tablas de verdad.

Es otra manera de especificar funciones combinaciones lógicas. La forma general de utilizar esta característica se muestra en la tabla 2.



Como se observa en la tabla 2 la tabla de verdad debe ir precedida por la palabra clave truth_table. Las palabras input_value y output_value son los nombres de las señales de entrada y salida de la tabla. En el ejemplo presentado en la tabla 3 se ilustra la definición de una función mediante tablas de verdad.




3.3.4 Diagramas de estado.

En un sistema secuencial, para poder generar la salida en un tiempo dado, es preciso conocer valores previos de algunas variables. No bastan los valores presentes de la entrada.

Es decir, debe almacenarse información concerniente a los valores de las entradas pasadas, para poder generar la salida a partir de la entrada presente y los valores almacenados. La información anteriormente mencionada, se almacena en estados internos. Los valores que deben registrarse para recordar la situación, debida a los valores de las entradas pasadas, se almacena en variables de estado.


3.4 Vectores de prueba

Abel posee un sistema opcional de vectores de prueba. El formato general de los vectores de test es similar a las tablas de verdad y se muestra en la tabla 5.



Como se observa en la tabla 6 la tabla de vectores de test debe ir precedida por la palabra clave test_vectors. Las palabras input_value y output_value dan los nombres a las señales de entrada y salida de los vectores de prueba.

Ejemplo:




Cada renglón define un vector, asignando valores a las entradas y salidas. La primera línea, entre paréntesis redondos, muestra los identificadores de las señales de entrada a la izquierda de la asignación; y la o las señales de salida a la derecha. Luego vienen los valores de las entradas que se desea probar y la o las correspondientes salidas que se desean verificar.

4.- ¿COMO DISEÑAR CON EL LENGUAJE ABEL?

ABEL proporciona tres (3) diferentes formatos para describir e introducir un diseño lógico desde el teclado de un computador; los cuales corresponden a: ecuaciones, tablas de verdad y diagramas de estado. Las ecuaciones y las tablas de verdad se usan en los diseños lógicos combinacionales; mientras que los diagramas de estado, así como los otros dos formatos, se pueden utilizar para el diseño de lógica secuencial (máquinas de estado).

Una vez que se ha introducido el diseño lógico, se puede simular su funcionamiento utilizando vectores de prueba para asegurarse que no existan errores en el diseño.

Básicamente, una sección de vectores de prueba enumera todos los posibles valores de entrada y los correspondientes valores de salida. El software, esencialmente, ejercita el diseño lógico para asegurarse de que trabaja como se esperaba, tomando todas las posibles combinaciones de entrada y comprobando los resultados de salida.

El proceso software que convierte la descripción del circuito en formato de ecuaciones, tablas de verdad o diagramas de estado, en el fichero JEDEC estándar requerido para programar un PLD se denomina síntesis lógica. Usualmente, la síntesis lógica incluye la optimización y la minimización del diseño.

4.1 Números

Los números pueden estar en cuatro diferentes bases: binario, octal, decimal y hexadecimal. La base predeterminada es la decimal. Se usan los siguientes símbolos (mayúsculas o minúsculas permitidos) para especificar la base. Cuando no se usan símbolos se asume que se usa la base decimal. Se puede cambiar la base con la directiva “Radix” como se explicará en el próxima sección:


4.2 Directivas

Las directivas permiten la manipulación avanzada del archivo fuente y del procesado, y puede ser colocado en cualquier parte donde se necesite en el archivo.

@ALTERNATE Syntax @alternate

@ALTERNATE habilita alternar sets de operadores. Usando el set operador alternado se evita el uso del operadores ABEL-HDL suma (+), multiplicación (*) y división (/) porque ellos representan los operadores lógicos OR, AND y NOT en el set alternado. Los operadores estándar permanecen trabajando cuando @ALTERNATE esta en efecto. Los operadores alternados permanecen en efecto hasta que la directiva @STANDARD es usada o el final del módulo es alcanzado.

@RADIX Syntax @radix expr ;

Expr: Una expresión válida que produce los números 2, 8 10 y 16 para indicar la predeterminación de una nueva base.

La directiva @Radix cambia la base predeterminada. La base predeterminada es 10 (decimal). La nueva base especificada como predeterminada permanece en efecto hasta que otra directiva @radix es colocada o hasta que el final del módulo es alcanzado. Nótese que cuando un nuevo @radixes colocado, la especificación de la nueva base debe estar en el formato de la actual base.

Ejemplo
@radix 2; “cambia la base predefinida a binario

… @radix 1010; “devuelve el cambio de binario a decimal.

@STANDARD Syntax @standard

La opción @standard hace un reset en los operadores estándar ABEL-HDL. Los set alternados son elegidos con la directiva @alternative.

4.3 Sets

Un set es una colección de señales o constantes usadas para referenciar un grupo de señales por un nombre. Un set es conveniente para simplificar expresiones lógicas. Cualquier operación que este aplicada a un set, es aplicada a cada elemento.

Una lista de constantes o señales set separadas por comas o por el operador de rango (..) se coloca entre corchetes (requerido).

Sin embargo, la siguiente no es permitido: [D0, X];

Donde la X es también un set X = [X3..X0];

En vez de eso, se puede escribir:

[D0, X3..X0];

a. Indexando o accesando a un set

El indexado permite acceder a elementos dentro de un set. Usando valores numéricos para indicar el set index. Los números refieren a la posición del bit en el set de inicio con 0 para el bit menos significativo del set. Aquí se presentan algunos ejemplos.

D1 = [D15..D0]; "declaración set

X2 = [X3..X0]; "declaración set

X2 := D1[3..0]; "hace X2 igual a [D3, D2, D1, D0]

X2 := D1[7..4]; "hace X2 igual a [D7, D6, D5, D4]

Para acceder a un elemento del set, se usa la siguiente sintaxis:

OUT = (X[2] == 1);

Un operador comparador (==) es usado para convertir un elemento (X[2]) en un valor de bit equivalente a X2. El comparador (==) arroja un “1! O “0” dependiendo si la comparación es Verdadera o Falsa. Véase la diferencia entre el operador de asignación (=) y el operador de igual (==). El operador de asignación es usado en ecuaciones en vez de expresiones. Las ecuaciones asignan un valor de una expresión a la señales de salida.

b. Operaciones Set

Muchas de las operaciones pueden ser aplicadas a un set y son ejecutadas en cada elemento del set de acuerdo a las reglas del álgebra Booleana. Las operaciones son ejecutadas de acuerdo a las prioridades de operación; los operadores con la misma prioridad son ejecutados de izquierda a derecha (al menos que use paréntesis). Aquí se muestran un par de ejemplos:

Ejemplo 1:

Signal = [D2,D1,D0]; "declaración de Señal set

Signal = [1,0,1] & [0,1,1];" resultados en Señal siendo "igual a [0,0,1]


Sin embargo considerar la siguiente expresión

2 & [A,B,C];

ahora el número “2” es convertido primero en una representación binaria y completado con ceros (0010) si es necesario. De esta manera la siguiente ecuación es equivalente a:
[0 & A, 1 & B, 0 & C];

4.4 Operadores

Hay cuatro tipos de operadores: lógico, aritmético, relacional y de asignación.

a. Operadores Lógicos

La tabla siguiente muestra operadores lógicos. Estos son ejecutados bit a bit. Con la directiva @ALTERNATIVE, se puede usar el set alternativo de operadores como se indica en la tabla.





b. Operadores Aritméticos

La siguiente tabla muestra los operadores aritméticos. Nótese que los últimos cuatro operadores no están permitidos para los sets. El signo menos puede tener un significado diferente: usado entre dos operandos indica substracción (o suma a complemento a dos), mientras que usado con un operador indica el complemento a dos.



c. Operadores de Relación

Estos operadores producen un valor Booleano de verdadero (-1) o falso (0). El valor verdadero lógico –1 en complemento a dos esta representado por todos los unos (todos los bits serán uno ej: para una palabra de 16 bits todos los bits son uno: -1 está representado por 1111 1111 1111 1111).

Los operadores de relación no tienen signo. Cuidado: ¡0 es el complemento a uno de 0 o 11111111 (8 bit data) el cual es 255 en binario sin signo. Además !0>9 es verdadero. La expresión –1>5 es verdadera por la misma razón.

Una expresión de relación se puede usar donde se sea necesaria por un numero. El –1 o 0 serán sustituidos dependiendo del resultado lógico. Por ejemplo:

A = B !$ (C == D);

A será igual a B si C es igual a D (verdadero o 11111…; B XNOR 1 igual B), sino, A será el complemento de B (si C no es diferente a B (falso o =)).



d. Operadores de asignación

Estos operadores son usados en una ecuación para asignar el valor de una expresión a una señal de salida. Hay dos tipos de operadores de asignación: combinacionales y de registro. En un operador de asignación combinacional ocurre inmediatamente sin retardo. La asignación con registro ocurre con el cambio del pulso de reloj asociado a la salida. Por ejemplo, se puede definir un flip-flop con la siguiente declaración:

Q1 pin istype 'reg';

Q1 := D;

La primera declaración define el Q1 del flip-flop para usar el ‘reg’ como istype (salida de registro). La segunda declaración dice que la salida del flip-flop tomará el valor D de la entrada en la próxima transición de reloj.


e. Operador de prioridad

La prioridad de cada operador esta dada en la siguiente tabla, con prioridad 1 tiene mayor prioridad y con 4 tiene la menor prioridad. Los operadores con la misma prioridad son ejecutados de izquierda a derecha.




4.4 Descripción Lógica

Un diseño lógico puede ser descrito de la siguiente manera.

  • Ecuaciones
  • Tablas de la verdad
  • Descripción de estados.

a. Ecuaciones

Usar el comando equations para empezar la descripción lógica. Equations especifica expresiones lógicas usando los operadores descritos antes, o por declaraciones "When-Then-Else".
Las declaraciones "When-Then-Else" son usadas en ecuaciones para describir funciones lógicas. (Nota: "If -Then-Else" es usado en la sección de los diagramas de estado para describir progresión de estados)

El formato de declaración "When-Then-Else" es el siguiente:

WHEN condition THEN element=expression;

ELSE equation;

or
WHEN condition THEN equation;

Ejemplos de ecuaciones:

SUM = (A & !B) # (!A & B) ; A0 := EN & !D1 & D3 & !D7;

WHEN (A == B) THEN D1_out = A1;

ELSE WHEN (A == C) THEN D1_out = A0;

WHEN (A>B) THEN { X1 :=D1; X2 :=D2; }

Se usan llaves {} para agrupar secciones en bloques. El texto en bloque puede ser usado en una línea o en muchas líneas. Los bloques son usados en ecuaciones, diagramas de estados y directivas.

b. Tablas de verdad

El commando es truth-table y la sintaxis es:

TRUTH_TABLE ( in_ids -> out_ids )

inputs -> outputs ;

o
TRUTH_TABLE ( in_ids :> reg_ids )

inputs :> reg_outs ;

o
TRUTH_TABLE

( in_ids :> reg_ids -> out_ids )

inputs :> reg_outs -> outputs ;

en donde "->" es para salidas combinacionales y “:>” para salidas registradas. La primera línea de la tabla de verdad (entre paréntesis) define las señales de entradas y salida. Cada línea debe finalizar con punto y coma. Las entradas y salidas pueden ser simple señales o set’s. Cuando se usan set’s como entradas o salidas, se usa la notación del set normal, ej señales dentro de corchetes y separadas por comandos. Las condiciones irrelevantes “don’t care” se representan con “X”.

Ejemplo 1: Medio sumador (half adder)

TRUTH_TABLE ( [ A, B] -> [Sum, Carry_out] )

[ 0, 0 ] -> [0, 0 ] ;

[ 0, 1 ] -> [1, 0 ] ;

[ 1, 0 ] -> [1, 0 ] ;

[ 1, 1 ] -> [1, 1 ] ;

Sin embargo, si se define un set IN = [A,B]; y OUT = [Sum, Carry_out]; la tabla de verdad se hace más simple:

TRUTH_TABLE (IN -> OUT )

0 -> 0;

1 -> 2;

2 -> 2;

3 -> 3;

Tablas de verdad pueden ser usadas para definir máquinas secuenciales. Ej: implementando un contador ascendente de 3-bit de 000 a 111 y regresando a 0. Llamemos QA, QB y QC las salidas de los flip-flops. Además, generaremos una salida OUP siempre que el contador alcance el estado 111. También se hará un reset al contador al estado 000 cuando la señal de reset sea alta.

MODULE CNT3;

CLOCK pin; " input signal RESET . pin; " input signal OUT pin istype 'com'; " output signal (combinational) QC,QB,QA pin istype 'reg'; " output signal (registered)

[QC,QB,QA].CLK = CLOCK; "FF clocked on the CLOCK input [QC,QB,QA].AR = RESET; "asynchronous reset by RESET TRUTH_TABLE ) [QC, QB, QA] :> [QC,QB,QA] -> OUT)
[ 0 0 0 ] :> [ 0 0 1 ] -> 0;

[ 0 0 1 ] :> [ 0 1 0 ] -> 0;

[ 0 1 0 ] :> [ 0 1 1 ] -> 0;

[ 0 1 1 ] :> [ 1 0 0 ] -> 0;

[ 1 0 0 ] :> [ 1 0 1 ] -> 0;

[ 1 0 1 ] :> [ 1 1 0 ] -> 0;

[ 1 1 0 ] :> [ 1 1 1 ] -> 0;

[ 1 1 1 ] :> [ 0 0 0 ] -> 1;

END CNT3;

b. Tablas de verdad

El commando es truth-table y la sintaxis es:

TRUTH_TABLE ( in_ids -> out_ids )

inputs -> outputs ;

o
TRUTH_TABLE ( in_ids :> reg_ids )

inputs :> reg_outs ;

o
TRUTH_TABLE
( in_ids :> reg_ids -> out_ids )

inputs :> reg_outs -> outputs ;

en donde "->" es para salidas combinacionales y “:>” para salidas registradas. La primera línea de la tabla de verdad (entre paréntesis) define las señales de entradas y salida. Cada línea debe finalizar con punto y coma. Las entradas y salidas pueden ser simple señales o set’s. Cuando se usan set’s como entradas o salidas, se usa la notación del set normal, ej señales dentro de corchetes y separadas por comandos. Las condiciones irrelevantes “don’t care” se representan con “X”.

Ejemplo 1: Medio sumador (half adder)

TRUTH_TABLE ( [ A, B] -> [Sum, Carry_out] )

[ 0, 0 ] -> [0, 0 ] ; [ 0, 1 ] -> [1, 0 ] ; [ 1, 0 ] -> [1, 0 ] ; [ 1, 1 ] -> [1, 1 ] ;

Sin embargo, si se define un set IN = [A,B]; y OUT = [Sum, Carry_out]; la tabla de verdad se hace más simple:

TRUTH_TABLE (IN -> OUT )

0 -> 0; 1 -> 2; 2 -> 2; 3 -> 3;

Tablas de verdad pueden ser usadas para definir máquinas secuenciales. Ej: implementando un contador ascendente de 3-bit de 000 a 111 y regresando a 0. Llamemos QA, QB y QC las salidas de los flip-flops. Además, generaremos una salida OUP siempre que el contador alcance el estado 111. También se hará un reset al contador al estado 000 cuando la señal de reset sea alta.

MODULE CNT3;

CLOCK pin; " input signal RESET . pin; " input signal OUT pin istype 'com'; " output signal (combinational) QC,QB,QA pin istype 'reg'; " output signal (registered)
[QC,QB,QA].CLK = CLOCK; "FF clocked on the CLOCK input [QC,QB,QA].AR = RESET; "asynchronous reset by RESET

TRUTH_TABLE ) [QC, QB, QA] :> [QC,QB,QA] -> OUT)

[ 0 0 0 ] :> [ 0 0 1 ] -> 0;

[ 0 0 1 ] :> [ 0 1 0 ] -> 0;

[ 0 1 0 ] :> [ 0 1 1 ] -> 0;

[ 0 1 1 ] :> [ 1 0 0 ] -> 0;

[ 1 0 0 ] :> [ 1 0 1 ] -> 0;

[ 1 0 1 ] :> [ 1 1 0 ] -> 0;

[ 1 1 0 ] :> [ 1 1 1 ] -> 0;

[ 1 1 1 ] :> [ 0 0 0 ] -> 1;

END CNT3;

c. Descripción de estado

La sección de diagrama de estado contiene la descrición de estado para el diseño lógico. Esta sección usa la sintaxis State_diagram y las declaraciones "If-Then-Else", "Goto", "Case" y "With". Usualmente se declara nombres de estado simbólicos en la sección de Declaración, el cual hace que la lectura se más fácil.

Sintaxis de Declaración de estado:

state_id [, state_id ...] STATE ;

Como ejemplo: SREG = [Q1, Q2]; asocial el nombre del estado SREG con el estado definido por Q1 y Q2.

La sintaxis para State_diagram es la siguiente:

State_diagram state_reg

STATE state_value : [equation;]

[equation;]
:
:
trans_stmt ; ...
El comando state_diagram indica la descripción del inicio del estado de la máquina.
El comando STATE y las siguientes declaraciones describen un estado de los diagramas de estado e incluyen un valor de inicio o un nombre simbólico de estado, una declaración de transición de estado y una salida de ecuación opcional. Con la siguiente sintaxis,
· state_reg: es un identificador que define las señales que determinan el estado de la máquina. Este puede ser un registro de estado simbólico.

· state_value: puede ser una expresión, un valor o un nombre de estado simbólico del estado actual.
· equation : una ecuación que define los estados de las salidas de la máquina.
· trans_stmt: las declaraciones "If-Then-Else", CASE o GOTO definen el siguiente estado, seguido de un WITH de ecuaciones de transición opcional.

Declaración If-Then-Else:

Esta declaración es usada en la sección state_diagram para describir el próximo estado y especificar mutualmente las condiciones de transiciones exclusivas.

Sintaxis:

IF expression THEN state_exp

[ELSE state_exp] ;

Donde state-exp puede ser una expresión lógica o un nombre simbólico de estado. Nótese que la declaración "IF-Then-Else" puede ser usada solamente en la sección state_diagram (use los "When-If-Then" para describir funciones lógicas). La cláusula ELSE es opcional. Las declaraciones IF-Then-Else pueden estar seguidas con las declaraciones Goto, Case y With.

Ejemplo:
En la sección de declaración se define primero el estado del registro:

SREG = [Q1, Q0]; "definition of state registers S0 = [0, 0]; S1 = [1, 1];

state_diagram SREG state S0: OUT1 = 1;

if A then S1 else S0;

state S1: OUT2 =1;

if A then S0 else S1;

La declaración "If-Then-Else" puede ser conectada de la siguiente manera. Se asume que se ha definido el registro y los estados en la sección de declaraciones.

state_diagram MAK

state INIT: if RESET then INIT else LOOK;

state LOOK: if REST than INIT

else if (X == LASTX) then OK else LOOK;

state OK: if RESET than INIT

else if Y then OK else if (X == LASTX) then OK else LOOK;

state OK: goto INIT;

Declaración "with":

Sintaxis:
trans_stmt state_exp WITH equation [equation ] ... ;

donde trans_stmt puede ser una declaración "If-then-else", 'Goto" o "Case". state_exp: es el estado siguiente, y equation es una ecuación para las salidas de la máquina.
Esta declaración puede ser usada con las declaraciones "If-Then-Else", "Goto" o "Case" en lugar de una simple expresión de estado. La declaración "With" permite a las ecuaciones de salida escribirse en términos de transición.

Ejemplo 1:

if X#Y==1 then S1 with Z=1 else S2;

En este ejemplo, la salida Z sera activada tan pronto la expresión después de la declaración If evalúa un 1 lógico (o TRUE). La expresión después del comando "With" puede ser una ecuación que será evaluada tan pronto como la condición If es verdadera como en el Ejemplo 2:

d. Extensiones punto (Dot extensions)

Se usan condiciones punto para describir de manera más precisa el comportamiento del circuito. Las extensiones de las señales son muy apropiadas y proveen un punto para referir específicamente señales internas y nodos asociados con la señal primaria.
La sintaxis es:

signal_name.ext
Algunas de las extensiones punto son dadas en la tabla siguiente. Las extensiones no son de argumento sensible. Algunas extensiones punto son de propósito general (también llamadas de arquitectura independiente o pin-a-pin) y pueden ser usadas con variedad de arquitecturas de dispositivos. Otras extensiones punto son usadas para especificar clases de arquitecturas de dispositivos o extensiones punto detalladas. En general, se puede usar cualquier extensión punto.

Ejemplo 1:

[S6..S0].OE = ACTIVE;

donde se activa el control de señal tres estados de la señal de salida del buffer S6...S0.

Cuando ACTIVE es alto, las señales serán habilitadas, de lo contrario una señal alta es generada en la salida Z.

Ejemplo 2:

Q.AR = reset;

[Z.ar, Q.ar] = reset;

donde se hace un reset en las salidas del registro (flip flops) a cero cuando el reset es alto.

4.5 Vectores de prueba

Los vectores de prueba son opcionales y proveen un punto para verificar la operación correcta de una máquina de estado. Los vectores especifican la operación lógica esperada de un dispositivo lógico por explícitamente dando a las salidas funciones de las entradas.

Sintaxis: Test_vectors [note]

(input [, input ].. -> output [, output ] .. )

[invalues -> outvalues ; ] : :

Ejemplo:
Test_vectors
( [A, B] -> [Sum, Carry] )

[ 0, 0 ] -> [0, 0];

[ 0, 1 ] -> [1, 0];

[ 1, 0 ] -> [1, 0];

[ 1, 1 ] -> [1, 1];

También se puede especificar los valores para el set con constantes numéricas como se muestra abajo:

Test_vectors
( [A, B] -> [Sum, Carry] )

0 -> 0;

1 -> 2;

2 -> 2;

3 -> 3;

Condiciones irrelevantes (.X.), entradas de reloj (.C.) tantas constantes simbólicas sean permitidas, como se muestra en el ejemplo siguiente:
test_vectors

( [CLK, RESET, A, B ] -> [ Y0, Y1, Y3] )

[.X., 1, .X.,.X.]->[ S0, 0, 0]; [.C., 0, 0, 1 ] -> [ S0, 0, 0]; [.C., 1, 1, 0 ] -> [ S0, 0, 1];