miércoles, 30 de enero de 2008

1era Asignacion

UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA
“ANTONIO JOSÉ DE SUCRE”
VICE RECTORADO PUERTO ORDAZ
DEPARTAMENTO DE INGENIERÍA ELECTRÓNICA

ELECTRONICA INTEGRADA

PAL Y VERILOG
Ing. ARISTOTELES ANATO Y VICTOR RODRIGUEZ
Profesor: Ing. Angel Custodio PHD

PAL (Programmable Array Logic)

PAL (Programmable Array Logic). Es el dispositivo programable más simple de los PLD. El circuito interno de un PAL consiste en un arreglo, o matriz, de compuertas AND y un arreglo de compuertas OR. El arreglo AND es programable mientras que el OR generalmente es fijo, ver figura 1. Mediante una matriz de conexiones se seleccionan cuales entradas serán conectadas al arreglo AND, cuyas salidas son conectadas al arreglo OR y de esta manera obtener una función lógica en forma de suma de productos. Una matriz de conexiones es una red de conductores distribuidos en filas y columnas con un fusible en cada punto de intersección.

Figura 1

Esta estructura permite implementar cualquier suma de productos lógica con un número de viables definido, sabiendo que cualquier función lógica puede expresarse como suma de productos. La PAL se implementa con tecnología bipolar (TTL o ECL).
Los circuitos tipo PAL son no reprogramables ya que la síntesis de las ecuaciones lógicas se realiza mediante quema de fusibles en cada punto de intersección de los pines de entrada con las compuertas

ESTRUCTURA

La estructura arreglos lógicos programables (PAL) es una combinación entre los circuitos PAL y los PROM. Contiene un decodificador programable (arreglo lógico AND), y un arreglo lógico OR fijo. De esta forma pueden implementarse funciones a partir de términos de mayor nivel que los mintérminos; es decir, a partir de los implicantes primos. Son llamadas también FPLA (Field Programable Logic Array) ya que son programadas por el usuario y no por el fabricante.

Estrucutura Interna de un PAL
La estructura básica de un PAL etá formada por un arreglo de matrices de puetas AND y OR interconectadas a través de fusibles.

Figura 2


Matriz AND
La matriz AND está formada por una red de compuertas AND conectadas a través conductores y fusibles en cada punto de intersección. Cada punto de intersección entre una fila y una columna se denomina celda. La figura 3 muestra un arreglo de compuertas no programado.

Figura 3

Cuando se requiere una conexión entre una fila y una columna, el fusible queda intacto y en caso de no requerirse la conexión, el fusible se abre en el proceso de programación. La figura 4 muestra un arreglo AND programado.

Figura 4

Matriz OR
La matriz OR está formada por una red de compuertas OR conectadas a través conductores y fusibles en cada punto de intersección. La figura 5 muestra un arreglo de compuertas no programado.

Figura 5

FUNCIONAMIENTO

Como se puede observar, para proporcionar todas las posibles combinaciones de entrada, cada una es enrutada al arreglo en ambas formas; verdadera y complementada. Estas entradas están conectadas a compuertas AND vía puntos de interconexión programables. Es un producto de arreglos OR, los cuales forman una suma de productos de arreglos lógicos. Como un PLD tiene más entradas y salidas que el arreglo simple mostrado anteriormente, se usa una notación especial llamada diagrama lógico, este se emplea para describir gráficamente las estructuras complejas PAL asociadas con estos dispositivos. Cuando el arreglo es programado para implementar una función lógica en particular, la interconexión deseada puede ser indicada sobre el diagrama con X’s. La figura 6, muestra el arreglo lógico de dos entradas y una salida, trazado en forma de diagrama lógico y programado con una simple función lógica.



Figura 6

En algunos dispositivos, la estructura AND/OR es remplazada por una estructura NAND/NAND ó NOR/NOR, pero el resultado es el mismo: con un arreglo bastante grande, cualquier función puede ser implementada.



Figura 7

La figura representa un segmento de un PAL programado.

La programación de los dispositivos es realizada por habilitación o deshabilitación de las interconexiones en el arreglo programable del dispositivo. Las conexiones actuales pueden ser a condición de una variedad de caminos dependiendo de la tecnología del dispositivo.

El símbolo representa un buffer de entrada

Figura 8

el cual es equivalente lógico a


Figura 9

Un buffer es usado para cada entrada del PAL y maneja cualquier entrada a la compuerta AND.
Cuando el arreglo es programado, los fusibles que unen son seleccionados para fundirse de acuerdo a la conexión deseada a las entradas de la compuerta AND. Por ejemplo, conectando las entradas a la compuerta AND en una PAL, quedaría como sigue

Figura 10

La mayoría de las funciones lógicas de n variables pueden implementarse con menos de 2n términos producto. Para mayor eficiencia del mapa de las funciones lógicas con un gran número de entradas, se desarrollaron los dispositivos PLA y PAL. La estructura PLA virtualmente es la base para todos los PLDs en la actualidad. Esta estructura proporciona una gran flexibilidad ya que los términos producto se localizan en las compuertas OR y sus salidas asociadas. La estructura PLA, caracteriza a un arreglo programable AND, y un arreglo programable OR. Para una PAL con n entradas, cualquier variable de entrada (o su complemento) puede ser una entrada a cualquier entrada AND. Por lo tanto, cualquier compuerta AND en el arreglo puede configurarse para implementar cualquiera de 3n posibles términos productos (por que cada entrada a una compuerta tiene tres posibles valores, verdadero, complemento y, no conectado).

El diseño del PAL permite que cualquier término producto en el arreglo esté conectado a la compuerta OR de cualquier salida. Esta característica algunas veces es referida como términos producto compartido.


APLICACION

Memorias PROM (Programmable Read Only Memory).
La principal característica de las memorias ROM (nombre genérico) es que son memorias programables no volátiles, es decir, cuando se desconecta de la tensión de polarización, los datos almacenados no desaparecen, a diferencia de las memorias RAM.

Básicamente las memorias ROM se pueden clasificar en:
Memorias ROM, las cuales son programadas (una sola vez) por el fabricante.
Memorias PROM, las cuales son programadas (una sola vez) por el usuario mediante un programador.
Memorias EPROM, las cuales son programadas (pudiéndose borrar para volver a programar) por el usuario mediante un programador.

Las memorias ROM están formadas por una matriz de puertas AND, que generan todos los minterminos posibles correspondientes al numero de entradas, por lo que funcionalmente hablando equivale a un decodificador. Las salidas de estas puertas son conectadas, a través de un fusible, a una puerta OR por cada bit de salida. Por lo tanto, este dispositivo se caracteriza por tener una matriz de puertas AND fija, y una matriz de puertas OR programable. Debido a que están disponibles todos los mintèrminos de las posibles funciones, este tipo de dispositivos entraran dentro del tipo de dispositivos universales, ya que se puede implementar cualquier función con el numero de entradas del dispositivo. La notación de las memorias ROM es:

CONSTRUCCION

Los circuitos y pistas de un PDL están compuesta generalmente de 100 porciento metal de aluminio diluido, los contactos son 100 porciento metal de aluminio diluido, Como características especiales posee tecnología "FLASH FAST". Las compuertas en el canal N son del orden de 0.45 micra, y el canal P son del orden de 0.5 micra. El dispositivo esta formado por una capa de nitruro de silicio sobre otra capa de dióxido de silicio. Posee dos capas de polisilicio. El PLOY 1 fue utilizada exclusivamente en compuertas flotantes, y POLY 2 (polisilicio y silicio de tusteno) fue utilizado para todas las compuertas estándar, en la matrix de lineas de programas y de palabra. La matrix de celdas programables son EEPROM (tecnología FAST FLASH), será utilizado para las líneas de programa y de la palabra de dato. El aluminio diluido distribuye la tierra GND y una línea de un bit. El dielétrico se encuentra entre las capas POLY es de ONO "óxido-nitruro-óxido". el color anaranjado es Nitruro de Silicio, el color azul es Metal 1 y 2, el color amarillo es Óxido, el color verde es polisilicio, color rojo difusión del canal P y N, y el color gris es el substrato P. Ver figura 11.

Figura 11

Si el dispositivo es borrable eléctricamente EEPROM, sus conexiones es a base de transistores MOS de puerta flotante, que contiene una puerta adicional embebida en el aislante entre la puerta normal (accesible desde el exterior) y el substrato. esta puerta extra, sin conexión al exterior y completamente rodeada de material aislante, es la puerta flotante. los transistores MOS, inicialmente no tienen carga en la puerta flotante, de forma que actúan como transistores normales: en cada linea vertical se realiza la operación lógica Y; es necesario que todas las líneas horizontales estén bajas (a=b=c=d=L) para que las líneas verticales sean altas (x=y=z=H), y basta que una de las entradas sea baja (a=L, por ejemplo) para que su línea correspondiente sea alta, y por tanto los transistores cuyas puertas están conectadas a esa línea de entada pasan a conducción, y entonces las líneas verticales se hacen L.

En otras palabras, los transistores hacen el punto de conexión entre las líneas verticales y horizontales. Para desconectar un punto de conexion (un transistor), en la fase de programación se aplica una tensión relativamente elevada (15 a 20)V en la puerta del transistor a desconectar; esta tensión hace que, por un proceso físico conocido como efecto túnel, atraviesen electrones desde el substrato por la fina capa de aislante y queden almacenados en la puerta flotante. En definitiva la introducción de electrones en la puerta flotante desconecta el transistor del circuito, ya que siempre estará cortado (estado off).

Fabricantes.

A principios de 2007, el mercado de los FPGA se ha colocado en un estado donde hay dos productores de FPGA de propósito general que están a la cabeza del mismo, y un conjunto de otros competidores quienes se diferencian por ofrecer dispositivos de capacidades únicas.

Xilinx es uno de los dos grandes líderes en la fabricación de FPGA.

Altera es el otro gran líder.

Lattice Semiconductor lanzó al mercado dispositivos FPGA con tecnología de 90nm En adición, Lattice es un proveedor líder en tecnología no volátil, FPGA basadas en tecnología Flash, con productos de 90nm y 130nm.

Actel tiene FPGAs basados en tecnología Flash reprogrammable. También ofrece FPGAs que incluyen mezcladores de señales basados en Flash.
QuickLogic tiene productos basados en antifusibles (programables una sola vez).

Atmel es uno de los fabricantes cuyos productos son reconfigurables (el Xilinx XC62xx fue uno de estos, pero no están siendo fabricados actualmente). Ellos se enfocaron en proveer microcontroladores AVR con FPGAs, todo en el mismo encapsulado.

Achronix Semiconductor tienen en desarrollo FPGAs muy veloces. Planean sacar al mercado a comienzos de 2007 FPGAs con velocidades cercanas a los 2GHz.

MathStar, Inc. ofrecen FPGA que ellos llaman FPOA (Arreglo de objetos de matriz programable.


Figura 12

VERILOG

Verilog es un lenguaje para la descripción de hardware (HDL: Hardware Description Language) mas utilizado. Uno de los aspectos más destacados del lenguaje Verilog es su similitud con el lenguaje C/C++, lo que facilita su aprendizaje; su mayor diferencia es que permita modelar sistemas digitales reales que funcionan en forma concurrente y no secuencial como en C/C++.

Las herramientas CAD soportan el ingreso de diseños digitales en base a esquemáticos, los cuales se arman conexionando componentes básicas o de bibliotecas en un ambiente visual.

Sin embargo a medida que el sistema aumenta su tamaño, cada vez es más difícil la descripción por esquemáticos. Los esquemáticos describen la conectividad y por lo tanto el armado del sistema, pero no destacan o enfatizan la funcionalidad de éste.

Los lenguajes descriptivos de hardware permiten diseñar, en forma abstracta, complejos sistemas digitales que luego de ser simulados podrán ser implementados en dispositivos programables como FPGA o CPLD, lo cual se logra describiendo el sistema digital mediante código HDL.

Las herramientas computacionales de ayuda al diseño (CAD) permiten diseñar, verificar códigos de alto nivel, simular el circuito representado y crear los códigos binarios que serán cargados en los dispositivos programables (síntesis).

Debido a que los módulos pueden reutilizarse, y los subsistemas más frecuentemente utilizados pueden estar prediseñados, la programación a través de lenguajes toma cada vez más importancia en el diseño de sistemas digitales.

Los lenguajes HDL deben permitir la simulación, cuyos objetivos son: verificar que el diseño es funcionalmente correcto; es decir que se cumplan las especificaciones lógicas; y además que se cumplan las especificaciones temporales; es decir que los tiempos de propagación a través de las componentes y de los caminos que permiten la interconexión cumplan las especificaciones de setup y hold de los registros, en caso de sistemas secuenciales sincrónicos. Como deben considerarse todos lo casos, es difícil asegurar que la simulación entregará la solución definitiva, ya que el conjunto de estímulos, para los cuales se realiza la simulación, puede no ser completo. Al mismo tiempo los lenguajes deben realizar la síntesis lógica; es decir traducir el programa a una serie de compuertas y flip-flops; también deben efectuar minimizaciones, y permitir mapear a los bloques tecnológicos disponibles; para finalmente colocar y enrutar de forma conveniente los bloques en el dispositivo programable.

Verilog permite que en un diseño se puedan usar diferentes niveles de descripción de sistemas digitales en un mismo ambiente; las diferentes descripciones pueden ser simuladas para verificar el funcionamiento y además pueden ser sintetizadas; es decir traducidas a la interconexión de componentes básicas de un dispositivo programable.

Verilog permite la descripción estructural del diseño en base a componentes básicos, y descripciones más abstractas que se enfocan en la conducta del sistema. La conducta puede describirse mediante expresiones lógicas y también empleando procedimientos.

Un diseño basado en descripciones funcionales o de comportamiento puede resultar lento y de gran costo en área. Las descripciones en niveles estructurales permiten optimizar los circuitos lógicos para maximizar la velocidad y minimizar el área.

Se expondrán las formas de descripción para sistemas combinacionales y secuenciales.


La Figura 13 resume las principales etapas del diseño digital.

Figura 13

Descripción estructural.

Nivel compuertas.

Permite representar una red lógica mediante sus ecuaciones. Para esto se emplean funciones lógicas básicas para representar compuertas.
Los operadores and, or not, en minúsculas, son palabras reservadas, y se emplean como nombres de funciones.
La función and [nombre de compuerta] (salida, entrada1, entrada2); describe un and de dos entradas. Donde el nombre de compuerta puede ser opcional. Importante es destacar que estas compuertas pueden tener "muchas" entradas.
La función or(x, ~a, b, ~c); representa a la compuerta or de tres entradas que puede describirse por la ecuación lógica:

x = a + b + c

Las compuertas definidas son: and, nand, or, nor, xor, xnor, buf, not. La salida es el primer argumento de la lista.

El inversor y el buffer pueden tener varias salidas, el último elemento de la lista es la entrada.
Para representar un sistema se requiere definir un módulo, el que se describe como una función del lenguaje C; en la cual los argumentos son los nombres de las variables de entrada, de salida y bidireccionales del módulo.
Luego deben colocarse listas de variables de entrada, de salida y bidireccionales. El módulo debe estar terminado con la sentencia endmodule.

Pueden emplearse comentarios, para mejorar la legibilidad.
Los identificadores de variable deben comenzar con una letra o el carácter ‘_’. Cuando se definen identificadores se consideran distintas las letras minúsculas y mayúsculas.

La Figura 14 representa una red lógica con dos salidas y cuatro entradas. Su descripción puede efectuarse mediante un módulo.

Figura 14

Ejemplo
Se tiene la función de cuatro variables:

Z = (A ,B ,C ,D ) = ∑ m(0,3,5,12,13) + ∑ d(1,2,15)

Empleando alguna herramienta de minimización (ver A3.2 en Apéndice 3) se obtiene la forma minimizada en suma de productos:


Z = BCD + AB + ABC

La ecuación se puede traducir en el módulo siguiente, notar el empleo de los nodos internos: n1,
n2 y n3 para formar la salida Z.

module ejemploA5_1(A, B, C, D, Z);
input A, B, C, D;
output Z;
and(n1, B, ~C, D);
and(n2, ~A, ~B);
and(n3, A, B, ~C);
or(Z, n1, n2, n3);
endmodule

Con fines de simulación puede asociarse un retardo de propagación a cada compuerta. Por ejemplo, la descripción: and #10 (x, y, z) indica que esa compuerta and tiene asociado un retardo de 10 unidades de tiempo de simulación. También puede darse un nombre a cada compuerta, escribiéndolo antes de la lista de puertas.

En un proceso de síntesis no es recomendable asociar retardos a las compuertas, ya que losalgoritmos pueden aumenttiempo de las compuertas.

Las conexiones o nets permiten ir uniendo componentes de un diseño digital. En el ejemplo anterior; n1 y n0, los nodos internos, son declarados wire (en español alambres) y son un tipo de
net. Las señales tipificadas con wire, no tienen capacidad de almacenamiento; se consideran continuamente alimentadas por la salida de un módulo o por una asignación continua assign. Si las señales de tipo wire de entrada se dejan desconectadas, toman el valor x, que significa desconocido. Una variable de tipo wire es simplemente un rótulo sobre un alambre.

Una señal con tipo de datos de modo wire representa la actualización continua en circuitos combinacionales de las salidas, respecto a cambios de las entradas. Otro tipo de datos, que suele estar asociado a salidas de flip-flops es reg, que es abreviatura de registro.

Nivel transistores.
Verilog permite descripciones a nivel de conmutación de transistores, lo cual permite modelar compuertas.

Ejemplo
Descripción de inversor CMOS en nivel de conmutación.

Figura 15

La Figura 15 muestra las señales empleadas en el módulo. Los tipos de conexiones o nets: supply1 y supply0 conectan señales a un voltaje de polarización y a tierra, respectivamente.

Los transistores cmos se especifican con tres argumentos (salida, entrada, control), y se dispone de las formas nmos y pmos.

El siguiente módulo implementa al inversor cmos de la Figura 15.


module inv_sw (out, in);
output out; // salida inversor
input in; // entrada inversor
supply1 power; // "power" conexión a Vdd . Tipos de net.
supply0 ground; // "ground" conexión a Gnd
pmos (out, ground, in); // instancia switch pmos
nmos (out, power, in); // instancia switch nmos

endmodule

Descripción del comportamiento (Behavior).

Cuando son numerosas las ecuaciones de la red puede ser muy laboriosa la descripción de laestructura mediante compuertas.

Los lenguajes permiten una descripción más abstracta, y a la vez compacta, de las redesbooleanas, ya que puede describirse el comportamiento o la conducta de la red.
Se describe lo que debe efectuar el sistema, empleando sentencias del lenguaje; es decir, la red booleana se describe como un programa.

Lo que el programa describe en este nivel son los registros y las transferencias y transformaciones de vectores de información entre los registros; este nivel se denomina RTL (Register Transfer Level).

También podría decirse que la descripción del comportamiento es una descripción de la arquitectura del sistema digital.

El diseñador se puede concentrar en el análisis de arquitecturas alternativas, mediante la simulación, determinando que partes del diseño requerirán un estudio más detallado.
Este lenguaje permite describir con precisión la funcionalidad de cualquier diseño digital.
La descripción del comportamiento puede efectuarse de dos modos: Mediante expresiones lógicas o mediante procedimientos.

El compilador del lenguaje traduce estas representaciones abstractas a ecuaciones lógicas y stas a su vez son mapeadas a los bloques lógicos del dispositivo programable.

Ejemplo A5.5. Expresiones.
Mediante la asignación continua, y escribiendo expresiones lógicas, empleando los operadores lógicos al bit del lenguaje C, puede obtenerse la misma funcionalidad de la descripción de Z mediante compuertas, vista en el Ejemplo A5.1.

module ejemploA5_5(input A, B, C, D, output Z);
assign Z = (B & ~C & D) ( ~A & ~B) (A & B & ~C );
endmodule

Operadores.

Los operadores al bit del lenguaje C: ~ para el complemento a uno, & para el and, para el or, y ^ para el xor, efectúan la operación bit a bit del o los operandos. Además se dispone siguientes: ~& para el nand, ~ para el or, y: ~^ o ^~ para la equivalencia o not xor.

Se dispone de operadores unarios que efectúan la reducción del operando a un bit. Lo que efectúan es aplicar el operador a todos los bits de la señal. Se tienen: & para la reducción AND,
para la reducción OR, ^ para la reducción XOR, ~& para la reducción NAND, ~ para la reducción NOR, y ~^ para la reducción XNOR.

Verilog dispone de dos operadores adicionales, no incluidos en el lenguaje C, que son la igualdad y desigualdad, considerando los valores no conocido x, y alta impedancia z. En ejemplo anterior se describe la forma de escribir valores. Se anotan: (a = = = b) y (a != = b), en estas operaciones si se incluyen bits con valores x o z, también deben los correspondientes bits ser iguales para que la comparación sea verdadera, valor 1; o valor 0 en caso contrario.
En los test de igualdad o desigualdad (a = = b) y (a != b), que están presentes en C, si existen operandos con valores x o z, el resultado es desconocido, es decir x.

Ejemplo Procesos.
La descripción de la conducta mediante procedimientos está basada en la definición de un bloque always. Esta construcción está acompañada de una lista de sensibilidad, cuyo propósito es evaluar las acciones dentro del procedimiento siempre que una o más de las señales de la lista cambie.

Si se produce un evento de la lista de sensibilidad y se desea que la salida cambie inmediatamente, se efectúa una asignación bloqueante (se usa el signo igual); esto modela la conducta de un proceso combinacional. El calificativo bloqueante deriva del modelo de simulación orientado a eventos del lenguaje Verilog; en este sentido se dice bloqueante, ya que todos los otros eventos quedan pendientes hasta que se produzca la renovación del valor; es decir, esta asignación no puede ser interrumpida por otras órdenes Verilog concurrentes.

Si se produce un evento de la lista de sensibilidad y se desea que la salida cambie luego de un tiempo, se efectúa una asignación nobloqueante (se usa el signo <=), esto modela el proceso de escritura en un flip-flop. Apenas producido el evento, se recalculan los lados derechos de las asignaciones nobloqueantes; una vez que se han actualizado todos los valores, correspondientes ese paso de simulación, se copian en las variables a la izquierda. Importa el orden en que se efectúan una serie de asignaciones bloqueantes; ya que las acciones dentro de un bloque de un proceso se ejecutan secuencialmente. Cuando se tiene una serie de asignaciones nobloqueantes, no importa el orden en que son escritas. Cada bloque always define un hebra de control. Si hay varios bloques always en un módulo, se considera que están corriendo concurrentemente. Las acciones dentro del bloque o proceso son evaluadas en orden secuencial. En esta construcción puede tenerse uno o más bloques always dentro del módulo; y por lo menos una acción en uno de los bloques always. Si dentro del procedimiento se asigna valores a una de las señales, ésta debe ser declarada de tipo reg.

module ejemploA5_7(A, B, C, D, Z);
input A, B, C, D;
output Z;
reg Z; //se marca como registrada pero es combinacional.
always @(A or B or C or D)
begin
Z = (B & ~C & D) ( ~A & ~B) (A & B & ~C );
end
endmodule

Cuando se efectúa la síntesis de esta descripción, Z será la salida de compuertas, y no se usará un flip-flop para guardar el valor de Z.

Las entradas deben estar en la lista de sensibilidad, las salidas deben ser asignadas en cada una de las alternativas controladas por sentencias.

En forma similar se dispone de initial que crea un proceso que se realiza sólo una vez, lo cual permite inicializar variables. El proceso always se ejecuta siempre.

La diferencia fundamental entre el tipo net y reg es que a este último se le asignan valores en forma explícita. El valor se mantiene hasta que se efectúe una nueva asignación. Las salidas de flip-flops serán de tipo reg.

Sentencias.

Los modelos que describen el comportamiento contienen procesos que controlan la simulación y que manipulan variables. Cada proceso tiene su propio flujo de acciones. Las acciones de cada proceso se ejecutan concurrentemente, permitiendo modelar sistemas digitales que son inherentemente concurrentes o paralelos.

Se dispone de similares construcciones de secuenciación de acciones que en el lenguaje C.
Algunos detalles son diferentes: si se emplea una variable índice entera en un for debe ser declarada de tipo integer (no int); no se emplea ++ para incrementar variables, sino var=var+1;
se emplea begin .. end en lugar de {..}.

En la sentencia case no son necesarios los break; en los casos pueden colocarse valores con x o z, y sólo si sintonizan exactamente, se realiza la acción asociada al caso.

Existen adicionalmente casez y casez que permiten comparación con condiciones superfluas con valores que contengan x o z.

La ejecución de una acción puede ser retardada hasta que una condición se haga verdadera.
Esto se logra con la construcción: wait (condición) acción; Se dice que la sentencia wait es sensible a los cambios de nivel, a diferencia de los eventos controlados por @, que disparan la acción con los cantos de las señales de la lista.

Se evalúa la condición del wait, y si es falsa la acción se detiene; es decir se espera hasta que la condición sea verdadera, momento en el cual se realiza la acción.

Ejemplo de uso:
Cuando se habilita la escritura, con WEnable=1, se transfiere el contenido del busA al registro regA, puede escribirse:

wait (!WEnable) regA <= busA;

Sincronización entre procesos.

A los eventos por cantos puede dárseles un nombre.

Por ejemplo la transferencia: @ trigger rega <= regb;

Puede ser realizada desde otro proceso, mediante: -> trigger;

Acciones en paralelo.
Entre las palabras fork y join las acciones se consideran de ejecución paralela. Los separadores begin, end encierran sentencias secuenciales. Si las sentencias tienen retardos, en un conjunto de acciones en paralelo, éstos se consideran respecto del inicio del bloque.

Diseños jerárquicos.
Verilog permite descripciones jerárquicas de redes complejas. Por ejemplo un sumador completo de 4 bits puede describirse mediante la instanciación de cuatro módulos con las variables actuales de un sumador completo de un bit.

Si se tiene en un archivo, denominado sumadorcompleto.v, el siguiente módulo combinacional definido por asignaciones continuas:

module sumadorcompleto(cin, a, b, sum, cout);
input cin, a, b;
output sum, cout;
assign sum = a ^ b ^ cin, // Operador or exclusivo
assign cout = (a & b) (a & cin) (b & cin);
endmodule

El cual puede representarse en el esquema de la Figura 16

Figura 16

Alternativamente podría haberse efectuado una descripción estructural:

module sumadorcompleto (Cin, a, b, sum, Cout);
input Cin, a, b;
output sum, Cout;
wire n1, n2, n3;
xor (sum, a, b, Cin);
and (n1, a, b);
and (n2, a, Cin);
and (n3, b, Cin);
or (Cout, n1, n2, n3);
endmodule


El sumador de 4 bits, puede estar en otro archivo, en el cual se incluye la definición del módulo básico. Se le da un nombre a cada instancia, etapai en el ejemplo, el que debe estar precedido por el nombre del módulo básico.

En la Figura 17 se ilustran las instancias y las correspondencias de los nombres de las puertas de cada etapa con los nombres del módulo básico. Con este diagrama resulta sencillo fectuar las instancias dentro del módulo.

Figura 17

`include " sumadorcompleto.v"


module fulladder4 (Cin, a3, a2, a1, a0, b3, b2, b1, b0, sum3, sum2, sum1, sum0, Cout);
input Cin, a3, a2, a1, a0, b3, b2, b1, b0;
output sum3, sum2, sum1, sum0, Cout;

sumadorcompleto etapa0 (Cin, a0, b0, sum0, c1);
sumadorcompleto etapa1 ( c1, a1, b1, sum1, c2);
sumadorcompleto etapa2 ( c2, a2, b2, sum2, c3);
sumadorcompleto etapa3 ( c3, a3, b3, sum3, Cout);

endmodule

Los módulos no deben ser considerados procedimientos o funciones, en el sentido que no son invocados. Se dice que son instanciados al inicio del programa y permanecen hasta el final del programa. En el ejemplo anterior, fulladder4 crea 4 sumadorescompletos, denominados etapa0 hasta etapa3.

Fundamentos de simulación.

El lenguaje debe proveer facilidades para generar estímulos, medir respuestas, y efectuar despliegues de los datos.
Empleando programación jerárquica un esquema que mantiene separado el módulo del diseño con el módulo de test, se visualiza en la Figura A5.9. La ventaja de esto es que el módulo con el diseño debe luego sintetizarse; de esta forma todas las sentencias que tienen que ver con la simulación quedan definidas dentro del módulo test; la finalidad de éste es generar los estímulos y grabar los resultados de los test. El módulo test podría describir un elemento de hardware, por ejemplo si se generaran los estímulos posibles mediante un contador o una memoria.

La activación del diseño y test se logra con un tercer módulo denominado Banco de prueba ubicado en el tope de la jerarquía, en el diagrama de la Figura


Funcionamiento del simulador.
En forma simplificada el funcionamiento del simulador es como sigue:
Initial y always comienzan a ejecutarse en el tiempo t=0, y continúan hasta encontrar un retardo (#); cuando esto ocurre, la condición que lo produce se almacena en la cola de los que esperan, por el tiempo indicado; luego del cual vuelve a colocarse el bloque en la cola de eventos activos para atender; es decir reasume la ejecución del bloque desde donde fue detenido.

Los siguientes eventos activos se itineran en cualquier orden: Salidas de compuertas, asignaciones continuas y bloqueantes, lectura de entradas y actualización de salidas, ejecución de comandos display, cálculo de lados derechos de asignaciones nobloqueantes.

Cuando, para un intervalote tiempo de simulación, no quedan eventos activos por ser atendidos, se procesa la cola de eventos de asignaciones nobloqueantes, pasando al lado izquierdo los valores ya calculados. Luego de lo cual se procesan los eventos de monitor, los comandos strobe y monitor.
Después de esto se pasa al procesar los eventos asociados al siguiente intervalo de tiempo.

Los comados $monitor, $display y $strobe operan en forma similar a printf.

El comando $monitor muestra los valores actualizados de todas las variables de su lista, al final de un paso de simulación y después que todas las asignaciones para ese paso de simulación hayan sido efectuadas.

El comando $display muestra los cambios que se producen antes de que las asignaciones nobloqueantes sean actualizados, ya que se considera evento activo.

El comando $strobe permite mostrar las asignaciones nobloqueantes una vez realizadas.
Cuando un proceso está en ejecución sólo se detiene al encontrar un retardo (#) o un evento de una lista de sensibilidad (@) o el comando wait, este último comando espera hasta que su variable argumento sea verdadera.

Un bloque always o proceso debe contener alguno de los elementos de control de tiempo para que la simulación se detenga. El bloque continúa su ejecución: cuando transcurre el retardo, o cuando cambia una de las señales de la lista de sensibilidad o cuando ocurre el evento que espera wait. Un evento produce otros eventos. Son éstas las únicas instancias en que se asume que el tiempo transcurre; el resto de los comandos (if-else, case, etc.) se considera que son instantáneos.

Los procesos detienen la simulación en determinados instantes, y también lo hacen las activaciones de salidas de compuertas.
Los eventos son itinerados para tiempos específicos y son colocados en una cola de espera, ordenados en el tiempo, para ser atendidos. Los primeros eventos quedan al frente, los últimos al fondo. Estando en el intervalo presente pueden procesarse varios eventos, no importando el orden; una vez atendidos todos los eventos asociados al intervalo presente, se pasa al siguiente.
Durante el procesamiento pueden generarse nuevos eventos, que son ubicados en los lugares temporales que les corresponden para su posterior procesamiento.

Verilog emplea la sintaxis de C, pero es un lenguaje que permite describir procesos concurrentes, los eventos descritos en el párrafo anterior no están implementados en C, que es un lenguaje procedural.

La simulación en Verilog se produce por eventos que ocurren en determinados instantes; es una simulación por eventos discretos.

Buses, registros, vectores, arreglos. Valores constantes.

En numerosas situaciones de sistemas digitales, las variables de entrada y salida son multivaluadas, sin embargo ha sido tradicional codificarlas como vectores booleanos.
En general cuando se agrupan una serie de señales con un nombre común se origina un bus o vector booleano.

En Verilog, los tipos de datos net y reg pueden ser declarados como vectores. Existen mecanismos de acceso a partes o a la totalidad del vector Puede convenirse en establecer el bit más significativo del vector como el que se escribe primero; además importa el orden con el que se declara el ancho del bus.

Valores.
Para describir constantes o valores se emplea la notación: . Donde la base suele ser binaria y hexadecimal; si no se coloca ’ se asume decimal. A los valores binarios 1 y 0, se agregan los valores z y x que representan alta impedancia y desconocido, respectivamente.

El nombre de una variable puede tener componentes. En este caso se define un arreglo.

reg datos[31:0]; // define a datos como un arreglo de 32 bits.
Puede tenerse acceso individual a los bits, por ejemplo: datos[5]=1’bz;

Notar que en la definición del arreglo los corchetes van después del nombre del arreglo.

Una memoria es un arreglo de registros.
reg [15:0] mem16_1024 [1023:0];

Síntesis.

El proceso de síntesis describe las etapas para convertir, la descripción HDL (Verilog o VHDL) de un sistema digital, a una forma que pueda ser armada o manufacturada o descargada a un dispositivo programable.

El o los elementos en los que será implementado el diseño, se denomina sistema tecnológico objetivo (target), normalmente es de tecnología semiconductora. Se denomina ASIC (Application-Specific Integrated Circuit), a los dispositivos que se construyen especialmente para soportar un diseño particular. En los dispositivos programables como FPGA y CPLD el diseño es descargado al chip, que suele ser reprogramable.

Una metodología que puede emplearse es efectuar una descripción del comportamiento lo más abstracta posible, luego preparar una serie de estímulos que al ser aplicados al diseño, en una simulación, confirmen su funcionalidad. La preparación cuidadosa de un banco de pruebas suele ser más difícil que el diseño mismo.

Puede ser que algunas descripciones abstractas no puedan ser sintetizadas, ya que el programa de síntesis reconoce sólo las estructuras que se le han almacenado en su inteligencia artificial. Si por ejemplo puede reconocer: registros, sumadores, multiplexores, comparadores, contadores, etc., es porque se ha almacenado en bibliotecas la descripción (en Verilog) de estas unidades en términos de compuertas y flip-flops.

Si a pesar de lo abstracta de la descripción, ésta puede ser sintetizada, es decir traducida a la interconexión de compuertas y flip-flops, entonces se podría pasar a la siguiente etapa. En caso
que esto no sea posible, el diseñador debe descomponer en partes su idea original, posiblemente mediante descripciones RTL de la arquitectura. Lo cual implica crear nuevos módulos, que deben ser sintetizables, cada uno de los cuales debe ser sometido a simulaciones funcionales cuidadosas.

Cuando ya se dispone de una red booleana, la siguiente etapa es minimizarla, normalmente en área, considerando que se tendrá multifunciones y multiniveles, esto es realizado por complejas heurísticas programadas en la herramienta CAD. Luego de esto viene el mapeo tecnológico, en el cual las configuraciones de compuertas y flip-flops se hacen calzar con los arreglos de multiplexores o tablas de búsqueda con que está formado el dispositivo tecnológico.

Luego es necesario colocar e interconectar los bloques (en caso de dispositivos programables).
En estas condiciones es preciso evaluar, mediante simulaciones temporales, si se cumplen los requerimientos de velocidad de los sistemas combinacionales y los tiempos de hold y set-up de los flip-flops. En caso de no cumplirse, deben rediseñarse partes y volver al lazo de diseño (ver Figura 12).

Mientras más abstracto el diseño, más rápido es el desarrollo.

Debido a la incorporación de nuevos algoritmos y heurísticas para efectuar la síntesis en términos de compuertas y flip-flops, debería evaluarse la necesidad de enfrentar un diseño en términos de más bajo nivel. Una forma de ir controlando el descenso de nivel, es llevar registro
del número de elementos usados en el diseño y de los tiempos de ejecución, para cada una de las arquitecturas que se vayan desarrollando; esto permitirá evaluar si es preciso confeccionar módulos con más nivel de detalle. También ayuda, conocer los subsistemas que la herramienta de ayuda al diseño, que se está empleando, sintetiza eficientemente.

Una de las ventajas de Verilog, es que, por un lado, permite describir módulos en términos de compuertas y flip-flops, lo cual posibilita llegar a niveles muy bajos de abstracción. Por el otro extremo, a medida que se tienen más experiencias, se han desarrollado por expertos, algunas bibliotecas o núcleos que pueden ser reutilizados, entre ellos microcontroladores embebidos, lo cual facilita la realización de diseños abstractos sintetizables.

La forma más básica de programar o diseñar es mediante descripciones estructurales explícitas. Es decir construir módulos solamente con compuertas, sin emplear procesos (always, nitial) ni asignaciones continuas (assign). Son dificultosas de escribir pero fáciles y seguras de sintetizar.
Las descripciones estructurales implícitas, emplean los operadores al bit del lenguaje y el comando assign para describir expresiones. Tampoco se emplean procesos. Estas descripciones
son más fáciles de escribir y también puede asegurarse que son sintetizables.

Algunos operadores más complejos (como la suma) suelen ser reconocidos por las herramientas de síntesis; el operador condicional también es sintetizable ya que suele traducirse a multiplexores.

En el mapeo tecnológico se traducen las compuertas genéricas (por ejemplo compuertas de 8 entradas) a los bloques lógicos del dispositivo; también algunas operaciones pueden ser mapeadas tecnológicamente (por ejemplo multiplicadores, si existen en el dispositivo), empleando este tipo de chips suele mapearse tecnológicamente con software que provee el mismo fabricante.

Una de las dificultades que tiene trabajar con herramientas de ayuda al diseño es que se pierde contacto rápidamente con el problema, en la forma en que fue escrito por el diseñador.

Esto se debe a varias causas. Los compiladores suelen proceder a través de la generación de numerosos archivos intermedios y además usan innumerables archivos auxiliares con información; de los archivos generados para la compilación del diseño, algunos de ellos son binarios, otros con formatos adecuados a los datos y tablas del programa y no son legibles con facilidad por un humano; además si existen archivos de texto, los rótulos e identificadores son elegidos por un autómata, y son de difícil asociación para el programador. Es decir, prácticamente se pierde control del proceso de síntesis, sólo puede verse lo que la aplicación está diseñada para mostrar: resúmenes del proceso de síntesis, esquemas, etc.

Conviene conocer el diseño en bajo nivel de los subsistemas típicamente usados, de esta manera se conocerá su funcionalidad, sus alcances, la forma de generalizarlos, y su costo. Luego las descripciones de la arquitectura pueden realizarse basada en esos módulos.

Un curso básico en sistemas digitales debe profundizar en el diseño de los bloques básicos, y también capacitar en descomponer un problema en términos de esos bloques. Esto garantiza plantear arquitecturas con partes que serán sintetizadas eficientemente.

La Figura 12 muestra el proceso de síntesis como un nivel intermedio, entre las descripciones de arquitecturas mediante módulos sintetizables (top-down), y el desarrollo de módulo básicos implementados mediante compuertas y flip-flops (bottom-up). Los lenguajes de descripción de hardware, como Verilog, permiten las descripciones y simulaciones en los diferentes niveles, dando homogeneidad al proceso de diseño.

Historia

Verilog fue inventado por Phil Moorby en 1985 mientras trabajaba en “Automated Integrated Design Systems” , más tarde renombrada Gateway Design Automation. El objetivo de Verilog era ser un lenguaje de modelado de hardware. Gateway Design Automation fue comprada por Cadence Desing System en 1990. Cadence ahora tiene todos los derechos sobre los simuladores lógicos de Verilog y Verilog-XL hechos por Gateway.

Estándar abierto
Con el incremento en el éxito de Cadence decidió hacer el lenguaje abierto y disponible para estandarización. Cadence transfirió Verilog al a través de Open Verilog International, actualmente conocida como Accellera. Verilog fue después enviado a la IEEE que lo convirtió en el estándar IEEE 1364-1995, habitualmente referido como Verilog 95.


Verilog 2001
Extensiones a Verilog 95 fueron enviadas a la IEEE para cubrir las deficiencias que los usuarios habían encontrado en el estándar original de Verilog. Estas extensiones se volvieron el estándar IEEE 1364-2001 conocido como Verilog 2001.

Refrencias

Dispositivos Lógicos Programables
Andres.Iborra@upct.es
mailto:Juan.Suardiaz@upct.es

Tecnología de Dispositivos Programables
M. en C. Juan Carlos Herrera Lozada
M. en C. Juan Carlos González Robles
{jcrls; jgrobles}ipn.mx
FPGAs – 1.0
Jordi Albó Canals : jalbo@salle.url.edu
EALS – Dpt. Electrònica
Blog del Estudiante: Ing. Edgart Marchán
Estudiante de Maesatria de la Unexpo
http://www.xilinx.com/
http://www.altera.com/