sábado, 2 de febrero de 2008

CPLD & Verilog

CPLD


Funcionamiento de un CPLD

Un CPLD (del acrónimo inglés Complex Programmable Logic Device) es un dispositivo electrónico que extiende el concepto de un PLD (del acrónimo inglés Programmable Logic Device) a un mayor nivel de integración ya que permite implementar sistemas más eficaces, porque utilizan menos espacio, mejoran la fiabilidad del diseño, y reducen costos.

Un CPLD se forma con múltiples bloques lógicos, cada uno similar a un PLD. Los bloques lógicos se comunican entre sí utilizando una matriz programable de interconexiones, lo cual hace más eficiente el uso del silicio, conduciendo a una mejor eficiencia a menor costo.

Matriz de Interconexiones Programables

La matriz de interconexiones programables (PIM) permiten unir los pines de entrada/salida a las entradas del bloque lógico, o las salidas del bloque lógico a las entradas de otro bloque lógico o inclusive a las entradas del mismo. La mayoría de los CPLDs usan una de dos configuraciones para esta matriz: interconexión mediante bloques o interconexión mediante multiplexores.

El primero se basa en una matriz de filas y columnas con una celda programable de conexión en cada intersección. Al igual que en las GAL esta celda puede ser activada para conectar/desconectar la correspondiente fila y columna. Esta configuración permite una total interconexión entre las entradas y salidas del dispositivo o bloques lógicos. Sin embargo, estas ventajas provocan que disminuya el rendimiento del dispositivo, además de aumentar el consumo de energía y el tamaño del componente.

En la interconexión mediante multiplexores, existe un multiplexor por cada entrada al bloque lógico. Las vías de interconexión programables son conectadas a las entradas de un número de multiplexores por cada bloque lógico. Las líneas de selección de estos multiplexores son programadas para permitir que sea seleccionada únicamente una vía de la matriz de interconexión por cada multiplexor la cual se propagara a hacia el bloque lógico. Cabe mencionar que no todas las vías son conectadas a las entradas de cada multiplexor. La rutabilidad se incrementa usando multiplexores de mayor tamaño, permitiendo que cualquier combinación de señales de la matriz de interconexión pueda ser enlazada hacia cualquier bloque lógico. Sin embargo, el uso de grandes multiplexores incrementa el tamaño de dispositivo y reduce su eficiencia.

Bloques Lógicos

Un bloque lógico es similar a un PLD, cada uno pose un bloque de compuertas AND y OR en forma de suma de productos, una configuración para la distribución de estas sumas de productos, y macroceldas. El tamaño del bloque lógico es una medida de la capacidad del CPLD, ya que de esto depende el tamaño de la función booleana que pueda ser implementada dentro del bloque. Los bloques lógicos usualmente tienen de 4 a 20 macroceldas.

Macroceldas

Estas también están provistas con registros, control de polaridad, y buffers para salidas en alta impedancia. Por lo general un CPLD tiene macroceldas de entrada/salida, macroceldas de entrada y macroceldas internas u ocultas (buried macrocells), en tanto que un 22v10 tiene solamente macroceldas de entrada/salida. Una macrocelda interna es similar a una macrocelda de entrada/salida, sólo que esta no puede ser conectada directamente a un pin de salida. La salida de una macrocelda interna va directamente a la matriz de interconexión programable.

Celda de Entrada / Salida

La función de una celda de entrada/salida es permitir el paso de una señal hacia dentro o hacia el exterior del dispositivo. Dependiendo del fabricante y de la arquitectura del CPLD estas celdas pueden o no ser consideradas parte del bloque lógico.


Estructura de un CPLD

Los CPLD son dispositivo lógicos programables con una complejidad entre los dispositivos PLA y FPGA. La característica principal comun entre los CPLD y PAL, es la configuración de memoria no-volatil, y con respecto a los dispositivo FPGA, la característica común de éste último es que posee un desarrollo de compuertas de grande densidades, con la diferencia que los FPGA, tienen mayor densidad que los CPLD. A modo general un CPLD es como si se tuviera varios PLD, tipo PAL, dentro de un sólo chip. el tamaño mas grande los CPLD permite implementar ecuaciones lógicas o diseños mas complicados. la programación de estos dispositivos es generalmente en lenguajes de descripción de hardware , por ejemplo, VHDL o Verilog.


Matriz de Suma de Puntos

Se relacionan con un mayor número de interconexión de secciones de compuertas programables, tales secciones pueden ser otros PLD, es decir el CPLD puede contener similares PLD de baja densidad, "PAL", interconectados entre sí, en un solo chip.



Figura # 1: Diagrama de Bloque de un CPLD (por ALTERA)

Figura # 2: Diagrama de Bloque de un CPLD (por XILINX)

La estructura principal son los bloques de matriz lógicos (LAB) o bloques de Función (Funtion Block), que se comunican en un bus interno con la matriz de Interconexión Programable (PIA) o también llamado Fast CONNECT Switch Matrix. Cada bloque es un grupo de 16 macroceldas; tienen entradas y salidas similares a los PLD de baja densidad, con capacidad de programarse. El número de pines de entrada y/o salida dependerá del dispositivo, para el caso de la figura 1, corresponde al modelo MAX7000S, basados en celdas EEPROM, del fabricante ALTERA, de 6 a 16 pines de entrada y salida, estas últimas se encuentran en el bloque de control de entrada y salida, la cual también posee conexión con el PIA, y en la figura 2, el bloque de salida y entrada I/O, poseen un bufer para los dispositivos de entrada y salida.


Cada bloque de función, para el caso de XILINX modelo de ejemplo "XC9500", esta compuesto de 18 macroceldas independientes. Los bloques funcionales también reciben una señal (reloj) de sincronismo global, una señal para habilitar la salida y una señal para habilitar el reset/set. El bloque funcional genera 18 salidas que maneja el FAST CONNECT. estas 18 salidas y su correspondiente señales de habilitación son gobernadas por el bloque I/O. la lógica dentro de los bloques funcionales es implementada utilizando la representación de suma de producto .

Figura # 3: Bloque de Función

Las macroceldas pueden ser configuradas individualmente por una función de registro. 5 matriz de compuertas AND, directos al "product terms "(termino de producto), son utilizados como entrada de datos primario (para las compuertas OR y XOR) para implementar funciones combinacionales, o como entradas de control incluyendo el reloj, señales set/reset, y señal de habilitación de salida. Los registros de las macroceldas pueden ser configurados como FLIP-FLOP tipo D o FLIP-FLOP tipo T. o este puede ser omitido por una operación combinacinoal. Cada registro soporta operaciones set y reset asincronos. durante el encendido del dispositivo, todos los registro son inicializados al estado predefinido por el usuario.


Figura # 4: Macrocelda con Bloque de Función

Las señales de contro global son desarrolladas individualmente en cada macrocelda, incluyendo señal de reloj, señal de set/reset, y la señales de habilitación. la macrocelda registra señales de reloj de cada uno de los tres relojes globales o del termino producto. La señal GSR, es una señal de Reset/set, de entrada que permite que sea definido por el usuario.


Figura # 5: Reloj de Macrocelda

El termino producto, controla que la matriz de las 5 AND sean asignadas a cada macrocelda, un ejemplo pudiera ser que todas las AND sean manejadas por una OR. El inconveniente de esto es que se evidencia el retardo de un termino producto a otro como se observa en la siguiente figura.


Figura # 6: Lógica de Macrocelda utilizando termino producto

Figura # 7: Lógica de un termino producto

El FAST CONNECT Switch Matriz conecta las señales a la entrada del bloque de función; tanto las salidas del bloque I/O como las salidas del bloque de función las manejas el Fast Connect Switch Matrix, cualquiera de estas pueden ser seleccionadas, a través de la programación del usuario, para poder manejar cada bloque con un retardo uniforme.


Figura # 8: Fast Connect Switch Matrix

El Bloque I/O es la interfaz entre la lógica interna y los pines de entrada y salida del dispositivo CPLD. Cada bloque de I/O incluye un bufer de entrada y un manejador de salida; un multiplexor que selecciona la salida habilitada, y también incluye una señal de control de tierra para la programación del usuario. El bufer de entrada es compatible con tensión de 5 V CMOS, 5 V TTL, y señales de voltaje de 3.3 V. El bufer de entrada usa internamente un suministro de potencia de 5 V ( Vccint), para asegurarse que el umbral de entrada permanezca constante y no varie con el voltaje Vccio. la señal de salida se habilita de la siguiente formas: una señal puede ser generada por el termino producto de la macrocelda, cualquiera de las señales globales de OE, o por una señal de tercer estado GTS.


Figura # 9: Bloque I/O


Cada salida tiene un control independiente de "Slew Rate" (Máxima variación del voltaje de salida con respecto al tiempo); este control permite reducir o controlar el ruido en el sistema, con sólo modificar el Tslew.
Figura # 10: Slew Rate


Estos CPLD poseen circuito con memoria EEPROM; que permiten reescribirse muchas veces, dependiendo del fabricante puede ser hasta 10.000 veces, como es el caso del fabricante XILINX, los modelos de la serie XC9500.


Tabla de Datos (Look up Table)

Esta arquitectura se basa en la implementación lógico de bus de interconexión de filas y columnas, estas interconexiones también proveen conexión al bloque de matriz lógicos (LAB). El LAB consiste de varios elementos lógicos (LE); según el modelo pueden ser 10 LE, por cada LAB. Los LE es una pequeña unidad lógica que proveen una eficiente implementación de funciones lógicas del usuario. El Multitrack Interconnect provee una rápida conexión entre los LAB.


Figura # 11: Diagrama de bloque de la arquitectura de tabla de datos

Look-Up Table (LUT), Es un circuito que implementa una función de lógica combinacional para almacenar una lista de valores de salida que correspondan a todas las posibles combinaciones de entradas, es decir un número de elementos almacenados son usados; para resumir una función lógica, almacenando cada función como una tabla de la verdad, esto se ilustra en la figura 12.


Figura # 12: Look-Up Table

Tomando como ejemplo la tabla de la verdad de la figura 12, como comparador A1A0=B1B2 , hace que la salida lógica AEQB = 1 lógico. Una matriz de 16 flip-flops (Q0 hasta Q15), contiene data de todas las posibles combinaciones A1A0B1B0, por cada combinación se necesita un flip-flop. La entrada de cada LUT son decodificada por un decodificador de direcciones, cada salida del decodificador activa una buffer de tres estados, que pasa por un bloque de salida de flip-flop. Cuando se activa un buffer para pasar el contenido del flip-flop, el resto de los buffer permanecen en estado de alta impedancia, de esta manera se bloquea la data de los otros flip-flops. El contenido de los flip-flop son cargados cuando el LUT es programado, con las funciones requeridas. Continuando con el ejemplo de la figura 12, los 16 elementos almacenados en dicha tabla, combinados , para seleccionar una salida combinacional y para interconectar con otras partes del chip, es llamado Elemento Lógico (LE). La función del desempeño del elemento lógico es similar a la de macroceldas en los PLD de suma de producto. La estructura de un elemento lógico se muestra en la figura 13.


Figura # 13: Elemento Lógico

El circuito "Cascade Chain", permite al usuario programar la función boleana, este circuito puede ser de compuertas AND o OR.


Figura # 14: Operación en Cascada

Bloque de Matriz Lógico (LAB), consiste en un número de elementos lógicos e interconectados localmente; el bloque LAB, esta conectado con el resto del dispositivo por medio de una serie de columnas y filas interconectadas, lo cual para este caso el fabricante ALTERA ha llamado FastTrack Interconnect, también se le conoce como Multitrack Interconnect.


Figura # 15: Bloque de Matriz Lógicos

Embedded Array Block (EAB), este bloque es una matriz de 2048 elemento de almacenaje que pueden ser usado eficientemente en la implementación de funciones lógicas complejas.


El FLEX10K es un dispositivo del fabricante ALTERA, tiene una matriz de 6 filas por 24 columnas de bloque de matriz lógico (LAB), es decir que tendrá 144 LAB, que a su ves son 8 x 144LAB= 1152 elementos lógicos, estos elementos también tienen 6 EAB; 6X2048 = 12288 bits de almacenaje de EAB, note que un EAB tiene mas capacidad de almacenaje que un LAB combinado.


Algunos los dispositivos basados en LUT, son de tecnología de memoria de acceso aleatorio estática (SRAM), la ventaja de esta configuración es que este puede ser fabricado en densidades muy altas de celdas de almacenajes y programar rápidamente, comparado con un dispositivo, (suma de producto, SOP), basado en EEPROM. La desventaja es que las celdas SRAM, son volátiles; es decir que deben reconfigurarse cada vez que se reinicia el sistema.


Figura # 16: Diagrama en bloque de un dispositivo de estructura de datos como es el caso del FLEX10K del fabricante ALTERA

El mismo fabricante ALTERA, posee el modelo MAXII, "tabla de datos LUT", tal modelo contiene un bloque de memoria "falsh", dentro del dispositivo. La mayoría de estos almacenajes de memorias flash, son particionadas como un bloque de programación o configuración de memoria flash (CFM); este provee un almacenaje no volátil; la CFM descarga y configura la lógica. Una porción pequeña de la memoria flash es utilizado para la data de usuario, este pequeño bloque de memoria UFM, provee una almacenaje para el usuario de propósito general, en este bloque se provee la conexión del puerto programable para el arreglo lógico de lectura y escritura.


Figura # 17: Diagrama de bloque del modelo MAXII

Figura # 18: Diagrama del bloque de memoria UFM

El bloque UFM, puede ser utilizado como el EEPROM serial, para almacenar información no volátil, este bloque se conecta al bloque de arreglo lógico a través del bus Multitrack interconectado, de esta manera se permite la interface con el bloque de elemento lógico.


Construcción de un CPLD

Las vías están compuesta de 100 porciento metal de aluminio diluido, aquí se identificará como Metal 2, los contactos son 100 porciento metal de aluminio diluido, identificado como Metal 1. 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), el Metal 2, será utilizado para las líneas de programa y de la palabra de dato. El Metal 1 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 19.

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).

Figura # 19: Construcción de un CPLD


Figura # 20: Línea de Productos

Diseño de un CPLD


Es importante tomar en cuenta la densidad de compuertas que se requiere, y para ello es necesario determinar el número de macroceldas que debe poseer el dispositivo; también es importante determinar el número de entradas y de salida, según la ecuación lógica obtenida. los retardos de propagación entre la señal de entrada y de salida se debe de tomar en cuenta cuando se esta trabajando con altas velocidades de procesamiento. hay sistemas que trabajan con diferentes niveles de tensión por lo que es importante conocerlos tomarlo en cuenta en el dispositivo CPLD. estos niveles de tensió pueden oscilar entre 1.5 V a 5 V.


En la metodología modernas de diseños digitales, para sistemas de relativa complejidad, en lugar de utilizar descripciones del comportamiento del sistema en forma de tablas (tablas de la verdad, de transición de estado, etc) se utilizan lenguajes específicos, los lenguajes de descripción de hardware o HDL (Hardware Description Language), que pueden describir tanto el comportamiento como la estructura de un sistema.


Diseño de un decodificador binario de 2 a 4

  1. Se realiza la descripción del sistema, de forma que el entorno de desarrollo pueda generar una representación interna del mismo. se puede optar entre una descripción estructural, con ayuda de un editor gráfica de captura de esquemas, o una descripción del comportamiento con un lenguaje HDL.
  2. Se realiza una compilación funcional, con la que se verifican posibles errores en el diseño (salidas cortocircuitadas, entradas flotantes...) y además se genera una representación interna del sistema, con la que puede efectuarse una simulación funcional del mismo. en esta fase la simulación es sólo funcional y es independiente de la tecnología de implementación, que es la que depende de los retardo que se produzcan.
  3. En el software (compilador) se especifica la tecnología de implementación. Se proyecta el diseño al tipo de celdas lógicas, celdas de entradas y salida, y recurss de conexión del CPLD seleccionado. tras la compilación se obtiene una representación interna del sistema implementado y se genera un fichero informativo donde se detalla el porcentaje de ocupación del dispositivo, las asignaciones de celdas y pines de entrada y salida, y otros.
  4. Se hace una simulación y análisis temporal. con la información detallada de las características técnicas de cada uno de sus componentes de la biblioteca de elementos se puede realizar una nueva simulación mas real y se puede establecer los tiempos de retardos.
  5. Una vez compilado y simulado el circuito; se debe configurar físicamente el CPLD, lo que puede realizarse físicamente con un programador de PLD o en el propio sistema (ISP). Es preferible utilizar este último para reducir los psibles daños mecánicos en los pines del dispositivo, por lo tanto suelen configurarse los CPLD en la propia tarjeta del sistema final, con una programación ISP (In-System Programming), esta opción se utiliza en circuitos borrables eléctricamente EEPROM o configurables con celdas SRAM. Comúnmente se utiliza el protocolo JTAG (joint Test Action Group). que utiliza cuatro lineas para transferir bit a bit entre el computador y la tarjeta del sistema la información de configuración.

Figura # 21: Descripción del decodificador: a) estructural; b) funcional

Figura # 22: Esquema de conexión utilizando el programador CPLD

Figura # 23: Esquema de conexión utilizando un cable de descarga

Fabricantes de un CPLD


  • ALTERA

Ha desarrollado tres familias de la categoría CPLD. MAX5000, MAX7000 y MAX9000. El MAX5000 representa la tecnología mas antigua que ofrecen soluciones de costo efectivo; el MAX7000 ofrece altas capacidades lógicas y mayor desempeño en velocidad; el MAX9000 es similar al MAX7000, excepto que el MAX9000 ofrece una mayor capacidad lógica. El MAX7000 contiene bloques de matrix lógicos LAB, matrix de interconexión programable PIA, esta serie fueron desarrollados en tecnología EPROM y EEPROM, la desventaja de esta serie es que se debe programar fuera del circuito de desarrollo; desde 1996 Altera, desarrollo el modelo MAX7000S, capaz de programarse en línea, es decir en el mismo circuito. Altera FlashLogic CPLDs, anteriormente conocido como Intel`s FlEXlogic, caracterizado por programarse dentro del sistema y provee bloques SRAM en el dispositivo. La configuración de compuertas AND-OR, son por celdas SRAM, respaldadas por celdas EPROM o EEPROM. Al realizar un suministro de potencia las celdas SRAM son cargadas con un copia de la memoria EEPROM o EPROM, pero es la celda SRAM la que controla la configuración del dispositivo.


  • ATMEL

Ofrece el modelo ATF1500A, alto desempeño y alta densidad de compuertas, construido con tecnología FLASH, con un retardo de 7.5 ns de pin a pin.


  • AMD

Ofrece una familia de CPLD con 5 sub-familias llamadas Mach 1 a Mach 5. Cada dispositivo Macth, contiene bloques con múltiplos PAL; Match 1 Y 2 consiste en el modelo 22V16PALs, Match 3 y 4 consiste en el modelo 34V16PALs y el Match 5 ofrece modelos parecidos a los anteriores pero con mayor desempeño en velocidad. Todos los Match están basados en tecnología EEPROM. El rango de capacidad lógicas están cercas de 2000 a 5000 compuertas.


  • CYPRESS SEMICONDUCTOR

Son similares a los dispositivos AMD y Lattice en muchas maneras; el Cypress CPLD, llamado FLASH370, esta basado en tecnología FLASH EEPROM, y ofrece un desempeño en el retardo de velocidad de 8.5 a 15 ns de pin a pin, la desventaja es que no es programable en el sistema.


  • LATTICE SEMICONDUCTOR

Lattice ofrece un completo rango de CPLD; con dos líneas de productos principales: Lattice pLSI que consiste en tres familias de EEPROM de CPLD; y el ispLSI que son los mimos dispositivos pLSI, con la diferencia de los ispLSI son programables en el sistema. Los rangos de capacidades lógicas están cercas de 1200 a 4000 compuertas y el retardo de pin a pin es de 10 ns. El Lattice de la serie 3000 representa su desarrollo mas grande con 5000 compuertas y un retardo de 10 a 15 ns.


  • XILINX

Ofrecen el modelo XC7000 y el XC9500; hay dos familias principales en el XC7000: la serie 7200 y 7300, el 7200 es un dispositivo moderadamente pequeño con 600 a 1500 compuertas; y con un retardo de pin a pin de 25 ns. El 7300 ofrece 3000 compuertas y lo otro que diferencia al 7200 es que el 7300 incluye dos compuertas OR en cada macroceldas. Finalmente el XC9500 ofrece la programación dentro del circuito, con una capacidad de 6200 compuertas y un retardo de 5 ns.


VERILOG

Introducción

Es uno de los lenguajes de descripción de hardware (HDL) más utilizados. 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 y 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.


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 Design Systems en 1990. Cadence ahora tiene todos los derechos sobre los simuladores lógicos de Verilog y Verilog-XL hechos por Gateway.


Con el incremento en el éxito de VHDL, Cadence decidió hacer el lenguaje abierto y disponible para estandarización. Cadence transfirió Verilog al dominio público 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. 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.


El advenimiento de los lenguajes de verificación de alto nivel como OpenVera y el lenguaje E de Verisity, impulsaron el desarrollo de Superlog, por Co-Design Automation Inc. Co-Design fue más tarde comprada por Synopsis. Las bases de Superlog y Vera han sido donadas a Accellera. Todo ello ha sido transformado y actualizado en forma de SystemVerilog, que probablemente se convierta en el próximo estándar de la IEEE. Las últimas versiones del lenguaje incluyen soporte para modelado analógico y de señal mixta. Todos estos están descritos en Verilog-AMS.


Tipo de Programa

Verilog es un lenguaje de descripción de hardware (HDL, del Inglés Hardware Description Language) usado para modelar sistemas electrónicos. El lenguaje, algunas veces llamado Verilog HDL, soporta el diseño, prueba e implementación de circuitos analógicos, digitales y de señal mixta a diferentes niveles de abstracción.


Los diseñadores de Verilog querían un lenguaje con una sintaxis similar a la del lenguaje de programación C, de tal manera que le resultara familiar a los ingenieros y así fuera rápidamente aceptada. El lenguaje tiene un preprocesador como C, y la mayoría de palabras reservadas de control como "if", "while", etc, son similares. El mecanismo de formateo en las rutinas de impresión y en los operadores del lenguaje (y su precedencia) son también similares.


A diferencia del lenguaje C, Verilog usa Begin/End en lugar de llaves para definir un bloque de código. Por otro lado la definición de constantes en Verilog requiere la longitud de bits con su base. Verilog no tiene estructuras, apuntadores o funciones recursivas. Finalmente el concepto de tiempo, muy importante en un HDL, no se encuentra en C.


El lenguaje difiere de los lenguajes de programación convencionales, en que la ejecución de las sentencias no es estrictamente lineal. Un diseño en Verilog consiste de una jerarquía de módulos. Los módulos son definidos con conjuntos de puertos de entrada, salida y bidireccionales. Internamente un módulo contiene una lista de cables y registros. Las sentencias concurrentes y secuenciales definen el comportamiento del módulo, describiendo las relaciones entre los puertos, cables y registros. Las sentencias secuenciales son colocadas dentro de un bloque begin/end y ejecutadas en orden secuencial, pero todas las sentencias concurrentes y todos los bloques begin/end son ejecutadas en paralelo en el diseño. Un módulo puede contener una o más instancias de otro módulo para definir un sub-comportamiento.


Un subconjunto de sentencias en el lenguaje es sintetizable. Si los módulos en un diseño contienen sólo sentencias sintetizables, se puede usar software para convertir o sintetizar el diseño en una lista de nodos que describe los componentes básicos y los conectores que deben implementarse en hardware. La lista de nodos puede entonces ser transformada en una forma describiendo las celdas estándar de un circuito integrado, por ejemplo ASIC, o una cadena de bits para un dispositivo de lógica programable (PLD) como puede ser una FPGA o un CPLD.


Además de las descripciones abstractas permite representaciones en bajo nivel; es decir puede describir sistemas digitales en base a compuertas, e incluso en base a transistores. 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ásicas, 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.


Estructura

Se expondrán las formas de descripción para sistemas combinacionales y secuenciales. La Figura 24 resume las principales etapas del diseño digital.


Figura # 24: Etapas del Diseño Digital

I.- 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 25 representa una red lógica con dos salidas y cuatro entradas. Su descripción puede efectuarse mediante un módulo.

    Figura # 25: Red Lógica 2 OUT / 4 IN

    module bloque(a, b, c, d, f1, f2); //note que termina en punto y coma.
    input a, b, c, d; // comentario de fin de línea
    output f1, f2;
    /*
    Aquí se describen las funciones lógicas mediante compuertas o expresiones.
    */
    endmodule

    Ejemplo 1.
    Se tiene la función de cuatro variables:
    ( , , , ) (0,3,5,12,13) (1,2,15) Z A B C D m d = + ∑ ∑
    Empleando alguna herramienta de minimización 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 ejemplo_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 los algoritmos pueden aumentar su tiempo de ejecución buscando satisfacer los requerimientos de tiempo de las compuertas.

    Ejemplo 2.
    Mux de dos vías a una, implementado mediante compuertas.


    Figura # 26: Ecuación del MUX

    La ecuación del mux de la Figura 26, como suma de productos, puede expresarse según:

    out(c0, x1, x0) = c0 x1 + c0' x0

    El módulo puede escribirse directamente a partir de la ecuación.
    // Multiplexer nivel compuertas. multiplexer 2-1, vías de 1-bit
    // Cuando c0=1, out=x1; y cuando c0=0, out=x0
    module mux21_gt (out, c0, x1, x0);
    output out; // mux output
    input c0, x1, x0; // mux inputs
    wire n1, n0; // nodos internos
    and(n0, x0, ~c0);
    and(n1, x1, c0);
    or(out, n1, n0);
    endmodule

    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 3.
    Descripción de inversor CMOS en nivel de conmutación.

    Figura # 27: Señales empleadas en el módulo

    La Figura 27, 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 27.

    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


    Ejemplo 4.

    Multiplexor basado en compuertas de transmisión.

    La Figura 28 muestra a la izquierda un símbolo para la compuerta de transmisión y, a la derecha, su implementación basada en un par de transistores. Cuando ctrl=0 la salida está en alta impedancia; cuando ctrl=1 la salida es igual a la entrada.
    Figura # 28: Compuerta de Transmisión

    Verilog dispone de un modelo intrínseco para la compuerta de transmisión. Para instanciar una compuerta de transmisión se emplea:
    cmos [nombreinstancia]([output],[input],[nmosgate],[pmosgate])

    La Figura 29 muestra un multiplexor de dos vías a una. Cuando ctrl=1, se tiene que out=in2; y cuando ctrl=0 se tendrá out=in1.
    Figura # 29: Multiplexor de dos vías a una

    La implementación de este multiplexor se logra con el siguiente módulo, en el cual se ha generado la señal ctrl’ a partir de ctrl y un inversor; el cual se instancia según el modelo anterior y con nombre I1. Se definen dos compuertas de transmisión con nombres C1 y C2.
    // Multiplexer nivel conmutación. 1-bit 2-1 multiplexer
    // Cuando ctrl=0, out=in1; y cuando ctrl=1, out=in2
    module mux21_sw (out, ctrl, in1, in2);
    output out; // mux output
    input ctrl, in1, in2; // mux inputs
    wire w; // nodo interno de tipo wire
    inv_sw I1 (w, ctrl); // instancia inversor
    cmos C1 (out, in1, w, ctrl); // instancias switches cmos
    cmos C2 (out, in2, ctrl, w);
    endmodule


II.- Descripción del comportamiento (Behavior)

Cuando son numerosas las ecuaciones de la red puede ser muy laboriosa la descripción de la estructura mediante compuertas. Los lenguajes permiten una descripción más abstracta, y a la vez compacta, de las redes booleanas, 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 de la descripción de la arquitectura del sistema digital. El diseño se puede concentrar en el análisis de arquitecturas alternativas, mediante la simulación, determinando que partes del diseño requieran un estudio mas 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 estas a su vez son mapeadas a los bloques lógicos del dispositivo programable.

Ejemplo 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 1.
module ejemplo_5(input A, B, C, D, output Z);
assign Z= (B& ~C & D) | (~A & ~B) | (A & B & ~C);
endmodule

Ejemplo 6.
Mux mediante expresiones.
El mux visto antes, en el Ejemplo 2, puede describirse así:
//Multiplexer nivel expresiones. 1-bit 2-1 multiplexer
//Cuando c0=1, out=x1; y cuando c0=0, out=x0
module mux21_exp(output out, input c0, x1, x0);
assign out=(c0&x1) | (~c0&x0);
endmodule


¿Cómo diseñar con él?

Existen dos formas de describir un circuito. Por un lado se puede describir un circuito indicando los diferentes componentes que lo forman y su interconexión, de esta manera tenemos especificado un circuito y se sabe como funciona; esta es la forma habitual en que se han venido describiendo circuitos y las herramientas utilizadas para ello han sido las de captura de esquemas y las descripciones netlist.

La segunda forma consiste en describir un circuito indicando lo que hace o como funciona, es decir, describiendo su comportamiento. Naturalmente esta forma de describir un circuito es mucho mejor para un diseñador puesto que lo que realmente lo que interesa es el funcionamiento del circuito más que sus componentes. Por otro lado, al encontrarse lejos de lo que un circuito es realmente puede plantear algunos problemas a la hora de realizar un circuito a partir de la descripción de su comportamiento.


Programas Usados

En un diseño en VHDL tenemos dos partes principales: la entidad es como una caja negra en la que se definen entradas y salidas pero no se tiene acceso al interior, y es lo que usa cuanto se reutiliza un diseño dentro de otro; la arquitectura, que es donde se describe el diseño de la forma que se ha visto antes. Otros elementos del lenguaje son las librerías, paquetes, funciones...


Hola Mundo

use std.textio.all; -- librerías

entity hola is
end entity hola;

architecture Wiki of hola is
constant mensaje: string := "hola mundo"; -- el mensaje
begin
process is -- proceso -> secuencial
variable L: line;
begin
write(L, mensaje);
writeline(output, L); -- escribe todo lo anterior
wait;
end process;
end architecture Wiki;


Multiplexor

Se simula un multiplexor de dos entradas. Es un ejemplo sencillo que muestra como describir un elemento a partir de su funcionamiento.
entity MUX2a1 is
port(a: in std_logic;
b: in std_logic;
sel: in std_logic;
z: out std_logic);
end entity

architecture dataflow of MUX2a1 is
begin
z <= a when sel='0' else b;
end dataflow;

Un ejemplo algo más complejo es el de un multiplexor de cuatro entradas. Este ejemplo trabaja con vectores para controlar la entrada activa a través de la entrada sel.
entity MUX4a1 is
port(a: in std_logic;
b: in std_logic;
c: in std_logic;
d: in std_logic;
z: out std_logic;
sel: in std_logic_vector(1 downto 0));
end entity;
architecture dataflow of MUX4a1 is
begin
process(a,b,c,d,sel) begin
case sel is
when "00" => z <= a;
when "01" => z <= b;
when "10" => z <= c;
when "11" => z <= d;
end case;
end process;
end dataflow;


Contador

Sistema que contará pulsos de un reloj digital (CLK) hasta llegar a 1000 y entonces volverá a empezar. La inicialización se consigue con un reset (RST).
library IEEE; -- librerías
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CONTADOR is
port(RST,CLK: in std_logic; -- entradas
salida: inout std_logic_vector(9 downto 0)); -- salidas
end entity;

architecture contador of contador is
signal aux: std_logic_vector(9 downto 0); -- señal auxiliar
begin
process (CLK,RST) -- programación secuencial
begin
if RST='1' then -- reset -> inicialización
aux<="0000000000";
elsif(clk'event and clk='1') then -- flanco de reloj ascendente
if(salida="1111101000") then -- máxima cuenta
aux<=(others=>'0'); -- vuelvo a comenzar
else
aux<=aux+1; -- cuento uno más
end if;
end if;
salida<=aux; -- saco la salida
end process;
end contador;

Después de compilar este programa habría que indicar a la herramienta encargada del diseño las restricciones oportunas para asignar las señales de entrada y salida a las patillas del chip donde se programará o bien usar este diseño dentro de otro.


Secuencia de diseño

El flujo de diseño de un sistema podría ser:


  • División del diseño principal en módulos separados. La modularidad es uno de los conceptos principales de todo diseño. Normalmente se diferencia entre dos metodologías de diseño: top-down y botton-up. La metodología top-down consiste en que un diseño complejo se divide en diseños más sencillos que se puedan diseñar (o describir) más fácilmente. La metodología botton-up consiste en construir un diseño complejo a partir de módulos, ya diseñados, más simples. En la práctica, un diseño usa generalmente ambas metodologías.

  • Entrada de diseños, pueden usarse diversos métodos tal como VHDL como se vio anteriormente.
  • • Simulación funcional, es decir, comprobaremos que lo escrito en el punto anterior realmente funciona como queremos, si no lo hace tendremos que modificarlo. En este tipo de simulación se comprueba que el código VHDL o Verilog (u otro tipo de lenguaje HDL) ejecuta correctamente lo que se pretende.
  • Síntesis. En este paso se adapta el diseño anterior (que sabemos que funciona) a un hardware en concreto, ya sea una FPGA o un ASIC. Hay sentencias del lenguaje que no son sintetizables, como por ejemplo divisiones o exponenciaciones con números no constantes. El hecho de que no todas las expresiones en VHDL sean sintetizables es que el VHDL es un lenguaje genérico para modelado de sistemas (no sólo para diseño de circuitos digitales), por lo que hay expresiones que no pueden ser transformadas a circuitos digitales. Durante la síntesis se tiene en cuenta la estructura interna del dispositivo, y se definen restricciones, como la asignación de pins. El sintetizador optimiza las expresiones lógicas con objeto de que ocupen menor área, o bien son eliminados las expresiones lógicas que no son usadas por el circuito.
  • Simulación post-síntesis. En este tipo de simulación se comprueba que el sintetizador ha realizado correctamente la síntesis del circuito, al transformar el código HDL en bloques lógicos conectados entre sí. Este paso es necesario ya que, a veces, los sintetizadores producen resultados de síntesis incorrectos, o bien realiza simplificaciones del circuito al optimizarlo.
  • Placement y routing. El proceso de placement consiste en situar los bloques digitales obtenidos en la síntesis de forma óptima, de forma que aquellos bloques que se encuentran muy interconectados entre si se sitúen próximamente. El proceso de routing consiste en rutar adecuadamente los bloques entre si, intentando minimizar retardos de propagación para maximizar la frecuencia máxima de funcionamiento del dispositivo.
  • Back-annotation. Una vez ha sido completado el placement & routing, se extraen los retardos de los bloques y sus interconexiones, con objeto de poder realizar una simulación temporal (también llamada simulación post-layout). Estos retardos son anotados en un fichero SDF (Standart Delay Format) que asocia a cada bloque o interconexión un retardo mínimo/típico/máximo.
  • Simulación temporal. A pesar de la simulación anterior puede que el diseño no funcione cuando se programa, una de las causas puede ser por los retardos internos del chip. Con esta simulación se puede comprobar, y si hay errores se tiene que volver a uno de los anteriores pasos.
  • Programación en el dispositivo. Se implementa el diseño en el dispositivo final y se comprueba el resultado.

1 comentario:

Anónimo dijo...

Merkur Progress Adjustable Safety Razor
Merkur Progress Adjustable Safety Razor. The Merkur Progress is 1xbet korean a timeless 바카라 사이트 classic 메리트 카지노 and offers an elegant, clean and clean design with an elegant

Powered By Blogger