Hola. Este es mi computador Atari, está viejito ya, está quemado por el sol y un montón de cosas. Este fue mi computador en los 80. Con él yo aprendí a programar, aprendí algo de electrónica también. ¿Por qué tengo aquí este computador? Solo para mostrarles un par de detalles. Este computador tenía 64 kilos de RAM, ni comparado con los no megas, gigas, estamos hablando de millón de veces más RAM hoy día que en ese tiempo. Es impresionante como han cambiado las cosas, pero no vengo a hablar de eso. Vengo a hablar de otra cosa. Cuando diseñaban y fabricaban computadores en los 80, lo que hacían era usar un procesador comercial, microprocesador comercial, ponían un microprocesador... Voy a ponerle micro. Esa "μ" designa a "micro" y "p", "procesador". Y eso lo conectaban con un montón de compuertas lógicas para hacer diferentes periféricos, entonces iba a diferentes compuertas. Y estas compuertas eran lo que le llamamos "Glue logic", que es lógica necesaria para comunicarse con otras cosas. Y ese "Glue logic" que usaban en los 80 eran compuertas lógicas en chips, eran TTL como estos que les mostré en otra clase, eran compuertas lógicas hechas con este tipo de chips. Se ponían en una tarjeta, se soldaban y las compuertas lógicas en el fondo tenían AND, tenían OR, tenían inversores y lograban fabricar circuitos usando compuertas interconectadas entre sí. Hoy día ya no se hace eso, se hace muy poco. Hoy día lo que hacemos es esto, un FPGA. Lo he mostrado antes, pero les comento, este chip que está aquí es un FPGA y ese chip lo que hace es tener muchas compuertas, un mar de compuertas, y muchos interruptores o switch que son comandados eléctricamente. Lo que hacemos nosotros no es conectar esas compuertas así, con cablecitos chicos, sino que lo que hacemos es decirle a través de un software: "Conéctame esta compuerta con esta otra" y el FPGA va a conectar esas compuertas y va a crear un circuito que nosotros queramos, el circuito que nosotros le digamos que queremos hacer. Esa es la forma en que funciona hoy día el diseño lógico; o lo hacemos en una FPGA o lo mandamos a fabricar directamente a un chip. Y hay varias formas de hacerlo. Para hacer chips, por ejemplo, existen chips con... Esto lo vamos a hablar después, pero hay varias tecnologías, un mar de compuertas y donde uno simplemente las capas de arriba son las que conecta. Da lo mismo, hay muchas formas, pero lo importante aquí es que, hoy día, nosotros describimos el hardware en un código y luego un software se encarga de implementar en hardware la descripción del hardware que nosotros describimos en código. Hoy día vamos a hablar de Verilog, ¿qué tiene que ver con esto? Verilog es un programa, es un lenguaje de descripción de hardware. Está dentro de los que denominan HDL por "Hardware Description Language". Fue producido en los 80. Fue de dominio público en los 90 y originalmente fue diseñado para lo que es simulación y verificación, pero después le agregaron cosas como síntesis y de ahí uno puede diseñar con Verilog. Como software, es un lenguaje relativamente complicado, sin embargo nosotros podemos hacer un montón de cosas sabiendo lo básico y en este módulo que iniciamos con esta videolección, vamos a aprender lo básico de Verilog. Verilog es texto plano. Ustedes pueden escribirlo en cualquier editor de texto y es parecido a C, tiene varias cosas similares a C. Vamos a tratar de aprender Verilog aplicando lo que hemos visto hasta ahora en el curso, pero ojo; este video, este módulo va a ser una introducción a Verilog y probablemente hay un montón de cosas que ustedes todavía no van a saber de sistemas digitales, estamos recién aprendiendo, como para entender todo Verilog. Probablemente, van a tener que volver atrás varias veces. Lo que vamos a ver a partir de hoy va a servirles de referencia, ustedes van a poder venir atrás, mirar y seguir adelante. Usen esto como una referencia y como saber qué tipo de cosas se pueden hacer. Con eso ustedes van a poder seguir adelante con el resto del curso. La idea es que a partir del capítulo 3 veamos cosas más avanzadas y podamos ponerle pequeños códigos de Verilog entremedio gracias a que hoy día estamos aprendiendo en este capítulo 2, en este módulo 2, Verilog. Insisto, no es profundo lo que vamos a aprender, pero va a servirles para ver el resto del curso. Verilog nos sirve para describir hardware. Hay 2 estilos principales para describir hardware. Hay gente que habla de 3 estilos, pero vamos a ser más binarios con esto. Está el estilo "estructural" y el estilo "de comportamiento" y los vamos a ver a continuación. El estructural define directamente la estructura del circuito, conexiones entre módulos. Por ejemplo, yo defino aquí una compuerta "and", aquí defino una compuerta "or". Esta es una compuerta or, una and y yo digo: "Esta salida de esta and va conectada a la entrada de este or" y esa es una descripción de un hardware. Luego, "Esta and tiene una salida conectada a esta or" y así. Este es un ejemplo: módulo ejemplo 1. Aquí uno escribe "módulo" para decir esto que viene a continuación, es un módulo que yo estoy describiendo. Ejemplo 1 y tiene estas conexiones. Aquí no decimos cuáles son entradas y cuál es salida, decimos: "Estas son las conexiones que hay, x1, x2, x3, f" donde x1 está aquí, x2 está aquí, x3 está aquí y f está aquí. Luego, dentro del módulo, con indentación para entenderlo bien, en la línea 2 decimos "entradas"; x1, x2, x3 son entradas; "salida", f. Perfecto, nada nuevo por aquí. Luego le decimos: "Haga un and" donde la salida es g. Esta es g y esta x1 y x2. Aquí está x1, x2. Después, decimos "Haga un not" donde la salida es k y la entrada es x2. Después "Haga un and" donde la salida es h y la entrada es k y la otra entrada es x3 y luego "Haga un or" donde las entradas son g y h y la salida es f. Y listo, ahí se acaba el módulo. Describimos con compuertas un "pedazo" de hardware. Podemos usar lo que llaman, "Primitivas de Verilog", por ejemplo, esta compuerta lógica. No es la única forma de hacerlo. Y los circuitos son modulares, están descritos en módulos, esto es un ejemplo de módulo, yo después puedo agarrar este módulo y usarlo en diferentes partes o como quiera. Cada módulo tiene puertos de entrada y salida, estos se llaman "Ports". Estos son los puertos de entrada, este es el de salida, ya definimos aquí, declaramos al principio. El módulo finaliza con esta palabra "endmodule" y luego podemos instanciar, es decir, podemos crear copias o réplicas de este módulo en diferentes partes del circuito. Cada vez que yo quiera poner este módulo en cualquier parte, simplemente, lo llamo y lo creo. Esto permite instanciar y, por lo tanto, tenemos un sistema digital jerárquico, que funciona por jerarquía, vamos a hablar más de eso después. Este es un ejemplo de código con Verilog y aquí tenemos un circuito arbitrario que tiene 4 entradas y 3 salidas. Aquí tenemos la ecuación que describe cada una de las salidas en función de las entradas y eso es algo que ustedes ya pueden leer, pueden entender bien, x1 x3 más x2 x4, etcétera. Luego aquí tenemos el segundo ejemplo, donde están todos los puertos, están las entradas, las salidas, están todas las interconexiones. Hay algunas señales intermedias. Aquí hay esta salida z1 y z2, estas son señales intermedias; estas que están acá, que aparecen entremedio. Y se termina el módulo. Muy bien, no hay mucho al respecto. Ya vimos estilo estructural, ahora vamos a hablar de la especificación de comportamiento, esto es distinto a lo que vimos recién. En la especificación de comportamiento, describimos el comportamiento que queremos que tenga el circuito. No le decimos "Aquí conecta un and, aquí conecta un or", sino que le decimos "Quiero que el resultado sea esto, tú encárgate de hacer las conexiones para que yo tenga el resultado correcto". El compilador se encarga de definir la estructura y para eso usamos varias cosas. Por ejemplo, usamos este símbolo, ampersand, para "AND"; usamos esta barra vertical para "OR" y usamos esta cola de chancho para definir un "NOT". Lo que le decimos es "f es x1x2 más x2 negado x3". Lo hacemos de esta forma. De nuevo, módulo ejemplo 3, todos los puertos, entradas, salida y decimos, aquí hay una palabra clave, "assign". Asignamos a f, que es la salida, esta ecuación y esa ecuación describe exactamente lo que yo quería. Luego, Verilog se encargará de hacer una síntesis. No Verilog en sí, sino el sintetizador; va a tomar el código de Verilog y va a generar una interconexión de compuertas que yo, probablemente, no voy a saber cuál es, pero hace exactamente lo que yo quiero. La palabra "assign" realiza una asignación continua y concurrente de la salida, lo cual significa que cuando hago esto, no es que yo esté leyendo un programa así: "Estas son las entradas y aquí en esta línea voy a asignar". No. Eso, lo que significa es, voy hacer una conexión permanente hasta que yo apague el FPGA o en el caso de un chip permanente, para siempre, de esta ecuación. Y esa ecuación va a estar siendo evaluada todo el tiempo mientras el chip esté encendido. Entonces es interesante. No es programar. ¿Entienden que no es programar? Esto es describir hardware. Esto es describir, "Quiero estas conexiones". Y con esto, al pasar por esta línea, no es que justo ocurra su asignación. Esta asignación es lo que va embebido en el hardware, en las conexiones mismas entre las compuertas y luego queda así para siempre. Es una conexión interna permanente. Vamos a ver este otro ejemplo, un ejemplo un poco más complicado, donde tenemos, de nuevo, definición de puertos, tenemos la entrada y la salida y luego las asignaciones correspondientes. Muy sencillo. Son 2 estilos distintos. Cómo NO ESCRIBIR código en Verilog. Esta lámina es importante y debieran guardarla muy bien en sus cabezas. Con los procedimientos, nos vemos a veces tentados en escribir código Verilog como si fuera un programa: línea 1, línea 2, línea 3, pero así no funciona. Verilog no es un lenguaje de programación, Verilog es un lenguaje de descripción de hardware. Por lo tanto, hay que evitar tener variables internas que ocuparían más recursos del FPGA. A veces es difícil predecir cómo se va a compilar un código, si es que el sintetizador no sabe qué es lo que quisimos hacer. Entonces, lo que se sugiere es en lo posible, tomar los ejemplos del curso y mejorarlo. La regla de oro: si al diseñador no le es fácil determinar qué circuito es descrito por el código, entonces es improbable que la síntesis lo vaya a entender. Uno tiene que describir código para que el sintetizador lo entienda bien. Hablemos de jerarquía. Ya lo anunciamos hace algunas láminas atrás. En Verilog usamos jerarquía para describir circuitos. ¿Qué significa esto? Significa que definimos un módulo, cualquier módulo, que tiene puertos de entrada y tiene salida. Y luego podemos instanciar este mismo módulo, que le vamos a llamar módulo 1, varias veces en el circuito. Y cuando lo instanciamos, creamos copias de ese módulo. Y luego si yo voy a la definición del módulo y le cambio algo, en todas las copias de ese módulo van a ocurrir esos cambios inmediatamente. Esto nos permite hacer circuito donde hacemos doble clic en un módulo y entramos y vemos la descripción y ese módulo a su vez tiene otros módulos internos y así sucesivamente. Entonces uno puede trabajar con circuitos muy complejos. ¿Qué aprendimos hoy? Aprendimos una breve introducción al lenguaje Verilog, muy corta, muy poco profunda, pero para que tengan una idea de qué se trata. Aprendimos la diferencia entre especificación a nivel estructural y a nivel de comportamiento. Aprendimos la jerarquía, lo más básico de jerarquía. Vimos cómo no escribir código en Verilog y además vimos muchos ejemplos. Gracias por ver esta clase.