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];

No hay comentarios: