[MÚSICA] Hola. En las próximas sesiones nos dedicaremos a hacer una introducción a los lenguajes de descripción y modelado de hardware. Los llamados hardware description languages o HDLs. En especial veremos el VHDL y en esta primera sesión introduciremos el léxico, la sintaxis y la estructura de base de este lenguaje. Antes de entrar en materia veamos qué son y para qué se utilizan estos lenguajes de descripción de hardware. Son lenguajes estructurados, de alto nivel de abstracción, y orientados a describir y modelar el funcionamiento del hardware. Tienen una sintaxis y una semántica formales para evitar las ambigüedades de los lenguajes naturales y de los dibujos de bloques que acompañan las especificaciones escritas por y para los humanos. Son fáciles de entender tanto para los ordenadores como para las personas y como veremos se parecen a, o incluso se derivan de, los lenguajes de programación de software como pueden ser el C, el C++, Ada, etc. Pero incorporan particularidades para modelar el hardware, especialmente la gestión del tiempo y la concurrencia inherentes al hardware. ¿Para qué se utilizan? Bueno básicamente se utilizan con 3 objetivos, modelado del funcionamiento del hardware sin fijar su implementación tecnológica, esto es el modelado independiente de la tecnología e incluso de la estructura final a implementar. También se utilizan para simular los modelos desarrollados frente a las especificaciones de funcionamiento esperadas a fin de validar que el modelo HDL realizado cumple dichas especificaciones y por lo tanto es correcto. Y por último también se utilizan para sintetizar dichos modelos mediante la tecnología de implementación escogida. Un mismo modelo HDL se puede materializar mediante herramientas de síntesis automática con distintas tecnologías FPGAs, ASICS u otras. ¿Cuáles son los principales lenguajes de descripción de hardware? Básicamente dos, el VHDL y el Verilog, aunque hay otros. El VHDL es el Very High Speeding Integrated Circuit Hardware Description Language. Es un estándar del IEEE, el estándar 1076 que se creó o se estandarizó en el 1987. Y el Verilog es un lenguaje que nació como lenaguaje de simulación de Cadence en 1985 y que posteriormente se convirtió en un lenguaje de dominio público y se estandarizó, también por parte del IEEE, con el estándar 1364 en 1995. Hay otros lenguajes como el C, el C++, el SystemC o el SystemVerilog que son lenguajes de un mayor nivel de abstracción y orientados a especificar sistemas complejos, hardware-software a nivel funcional. En esta figura se recogen los conceptos principales entorno a los lenguajes de descripción de hardware a la vez que se hace una breve comparativa con los lenguajes de desarrollo de software. En ambos casos se pretenden hacer descripciones funcionales de alto nivel de abstracción, que serán independientes del procesador que los ejecute o de la tecnología en la que vayan a materializarse. Así pues vemos que desarrollamos programas software mediante lenguajes estructurados de alto nivel que una vez compilados se convierten en programas de código máquina ejecutables por microprocesadores específicos. En el caso del hardware, vemos que también se trata de lenguajes estructurados de alto nivel que nos permiten generar modelos HDL a partir de los cuales podemos realizar o bien procesos de simulación o bien procesos de síntesis para ir a una determinada materialización de ese modelo, o bien procesos de verificación por simulación presíntesis y post síntesis con comparación posterior de resultados. Obsérvese que mientras el software el objetivo final es un programa ejecutándose en un determinado procesador, en hardware el objetivo final puede ser doble, o bien la simulación de nuestros modelos para comprobar su correcto funcionamiento o bien la síntesis de dichos modelos para proceder a su materialización física en hardware real. Bien, después de esta breve presentación de los HDLs, de los lenguajes de descripción de hardware, vamos ya a adentrarnos en el VHDL y para ello abordaremos la agenda siguiente. Veremos en primer lugar el léxico y la sintaxis de este lenguaje, luego detallaremos brevemente cómo el VHDL se estructura en en unidades de diseño, y a continuación seleccionaremos y presentaremos un subconjunto de las sentencias VHDL, tanto las sentencias secuenciales como de las sentencias concurrentes. Y por último introduciremos muy brevemente el flujo de diseño basado en VHDL que aborda las fases de modelado, simulación y síntesis, y concluiremos como de costumbre con un resumen. Empecemos pues por los elementos léxicos de este lenguaje que resumimos en palabras reservadas, identificadores, símbolos y literales. Palabras reservadas del propio lenguaje son todas aquellas que el lenguaje utiliza para fijar la sintaxis y sus distintas estructuras y sentencias. Los identificadores sirven para dar nombre a los distintos elementos, estructuras y objetos que este lenguaje puede crear y manejar. Estos identificadores tienen unas determinadas reglas como estar formados por caracteres alfanuméricos, el primer carácter tiene que ser alfabético, mayúsculas y minúsculas son indiferentes y las palabras reservadas no no se pueden utilizar como identificadores. Y aquí tenemos algunos ejemplos. Los símbolos son conjuntos de 1 o 2 caracteres que tienen un significado especial dentro del lenguaje, como por ejemplo operadores aritméticos, signos de puntuación, símbolos que forman parte de sentencias o expresiones o símbolos como este de aquí que es el símbolo de comentario. También tenemos valores literales que son valores explícitos de cualquier tipo de datos que se pueden expresar de distintas formas como las que vemos aquí. Aquí tenemos un valor expresado mediante la indicación de su base y su magnitud, su valor, otro con base hexadecimal, unos dígitos hexadecimales, o cadenas de caracteres o caracteres individuales, valores de magnitudes físicas, etcétera. A lo largo de esta introducción y en su posterior uso en el curso, iremos aprendiendo a manejarnos con este léxico de forma sencilla e intuitiva. Como todos los lenguajes, el VHDL dispone y maneja objetos que pueden contener y contienen valores. Estos objetos son las constantes variables, señales y ficheros. Para declarar o definir un objeto esta es la sintaxis, se define el tipo de objeto, se le asocia un identificador, un nombre a ese objeto, se indica de qué tipo de datos es ese objeto y por último y opcionalmente se puede dar un valor inicial de ese objeto. Así pues vemos declaraciones de constantes o constantes declaradas en función de constantes previamente definidas como era el caso de "TotBits", este que tenemos aquí. Vemos también declaraciones de variables y uso de variables en expresiones, una expresión que asigna un valor constante a una variable o bien una expresión que asigna el resultado de una operación a una variable. También tenemos señales, aquí tenemos la declaración de una señal y aquí tenemos la asignación de un valor a una señal. Observemos que cuando asignamos a las señales utilizamos el símbolo de implicación hacia la izquierda (<=) mientras que en la asignación a constantes o a variables utilizamos el dos-puntos-igual (:=). Esta sería la forma de definir ficheros pero no entraremos en detalle porque aquí no los vamos a utilizar. El VHDL es un lenguaje fuertemente tipado, cada objeto debe pertenecer a un único tipo de datos y solo puede recibir y contener valores de dichos tipos de datos. Asimismo todos los objetos tienen un valor inicial predeterminado que corresponde al menor valor del tipo de datos al que pertenece cada objeto. Dicho valor inicial puede modificarse en el momento de de declarar el objeto como hemos visto hace un momento. En este árbol podéis ver los tipos de datos con los que trabaja el VHDL. Aunque nosotros en este curso trabajaremos solo con un subconjunto de ellos, los integer, boolean, bit, character, bit_vector, string, real y time. Todo tipo de datos define un conjunto de valores fijos y estáticos que no cambiarán a lo largo del tiempo. Además de los tipos de datos predefinidos por el propio lenguaje, el usuario puede definir otros tipos de datos: enumerados, sub-rangos de los previamente definidos, tipos compuestos, tipos récord, etcétera. Estos tipos de datos vienen predefinidos en packages que son unidades de diseño del VHDL, para facilitar la reutilización del código allí definido en otros módulos o unidades de diseño del VHDL. Y aquí tenemos los tipos de datos predefinidos por el lenguaje en el paquete "standard package". Vemos tipos de datos boolean, tipo bit, el tipo character, los integer, real, y así sucesivamente. Estos son los tipos de datos por defecto del lenguaje VHDL. Dentro de los llamados tipos de datos físicos, tenemos como predefinido el tipo time, que en este caso tiene una relevancia especial porque es el tipo de datos que nos permitirá expresar y manejar valores temporales, y manejar el tiempo dentro de nuestros modelos y de nuestras simulaciones. Esta es la forma de definir este tipo. La unidad mínima de tiempo es femtosegundo, y a continuación se van definiendo las unidades superiores picosegundo, nanosegundo, microsegundo, y así sucesivamente hasta la hora, siempre en función de la unidad inmediata anterior. A partir de estos tipos de datos básicos, el usuario diseñador podrá definir sus propios tipos de datos, así como operaciones o funciones entre todos ellos. Veamos ahora los operadores y expresiones que podemos utilizar en VHDL para describir ya sea funciones, ecuaciones, o condiciones. Los operadores son símbolos que identifican operaciones específicas. Los tipos de operaciones más habituales son las relacionales, lógicas, aritméticas o de concatenación, con los operadores que aquí se muestran para cada uno de estos tipos de operaciones. Los operadores y funciones junto con los literales y objetos, constantes, variables o señales, se combinan entre sí para dar lugar a distintos tipos de expresiones como son las siguientes, de tipo aritmético como ésta que tenemos aquí donde aparece una función sqrt y distintos operadores aritméticos; de tipo relacional donde se establecen comparaciones cuyo resultado será de tipo booleano "true" o "false" (verdad o falso) U operadores de tipo lógico, o bien de concatenación de cadenas de bits o cadenas de caracteres. Las expresiones se pueden utilizar en cláusulas condicionales para evaluar una determinada condición y obrar en consecuencia; o a la derecha de una o a la derecha de una asignación a constante, variable o señal como vemos aquí.