Hola. En esta video lección vamos a hablar de memoria RAM estática o SRAM, esto es por Static Random Access Memory o memoria de acceso aleatorio estática. Y estática, en contraposición a dinámica, que es otro tipo de memoria que no vamos a estudiar. La dinámica, aunque no la vamos a estudiar, es bueno mencionarlo, requiere que vayamos refrescando el valor guardado en memoria porque se le empieza a olvidar. Por eso es dinámica, porque requiere que, dinámicamente, uno refresque la memoria. En cambio, la memoria estática uno no necesita refrescarla mientras el circuito esté encendido. Es una memoria volátil, en un sentido que si yo apago el circuito, la memoria pierde sus datos, y la memoria RAM estática es muy rápida y funciona muy bien. Nosotros podríamos guardar todo en flip-flops, y los flip-flops ocupan dos latches, y los latches ocupan un montón de compuertas lógicas. Qué tal si mejor hacemos circuitos que utilicen una memoria que esté diseñada para guardar muchos datos en vez de usar registros o flip-flops, que al final un registro es un conjunto de flip-flops para guardar poquitos datos. Cuando se quiere guardar muchos datos, información muy grande, los flip-flops no son prácticos porque requieren mucho espacio y requieren muchos circuitos para decir cuál flip-flop quiero leer y cuál quiero escribir. Mejor que eso, usar un bloque de memoria SRAM. En este caso, es un arreglo bidimensional de celdas de memoria m por n, donde m puede ser el número de celdas y n puede ser el número de bits de cada celda. Siempre especificamos como una matriz o como un arreglo bidimensional de memoria, como dije antes, volátil, si yo apago el circuito la memoria desaparece. Cada una de estas celdas puede guardar un bit. Y aquí tenemos un ejemplo de estas celdas de memoria. Aquí hay un inversor y aquí hay otro inversor. Este inversor, por ejemplo, si tiene una entrada 0, esta va a aparecer en 1. Si esta tiene un 1, este va a aparecer en 0. Este 0... Ya estamos guardando un dato porque se va a quedar ahí, se va a quedar estable este 0 y este 1. Si al revés, este fuera un 1, aquí aparece un 0. Si aquí hay un 0, aquí aparece un 1, se queda estable. ¿Cómo guardamos ese dato? Ese dato lo guardamos aquí, con este valor. Yo selecciono este bit, y al seleccionar este bit obligo a que el dato sea lo que viene desde afuera, y con eso puedo guardar un dato en memoria SRAM. Solo necesitamos seleccionar para guardar un dato. Se denomina razón de aspecto a las dimensiones m por n, donde m es el número de palabras y n es el número de bit por palabra; ya a lo habíamos mencionado. Este segundo transistor que aparece aquí es más pequeño. Es más pequeño porque en realidad no es necesario hacerlo del mismo tamaño que este. De hecho, al ser más pequeño, este circuito igual funciona bien. Este circuito no tiene problema en mantener el valor. Al ser más pequeño este dato no pelea con este con tanta fuerza, por ejemplo. Como dije antes, para guardar información en esta celda, "Sel" o selección debe estar en 1. Después de una pausa en que el valor guardado se propaga a través del camino de la realimentación, la señal en "Sel" puede ser puesta en 0, y al ponerla en 0, este se desconecta, este se desconecta y esto queda solito, como una celda de 4 transistores. Aquí hay 2 transistores en un inversor. Otros 2 en un inversor. Y necesitamos otro transistor aquí y otro transistor aquí, o sea, típicamente, las SRAM tienen 6 transistores. Uno podría prescindir de este y tal vez dejarlo en 5. Sí, hay implementaciones con menos transistores, pero en general la SRAM típica tiene 6 transistores. Para que la celda pueda recibir unos valores de data hay que dejar este inversor más débil. Con eso no tenemos problema con que este vaya peleando con data, y en ese caso podemos hacer algo con 5 transistores, por ejemplo. Para leer el valor, también hacemos "Sel" igual 1. Al hacer "Sel" igual 1, y dejando este en alta impedancia, yo puedo sacar estos valores hacia afuera. Yo puedo usar las mismas líneas que uso para escribir la celda para leer las celdas. Eso es interesante. Necesito algún tipo de circuito que coordine todo esto y, ¿cómo voy a hacerlo con tantas celdas? Si m por n, al final, es un número grande, puede ser de varios kilos, varios megas. ¿Cómo se hace? Se hace en un arreglo. Aquí un ejemplo de un arreglo de 2 por 2. Esto es una palabra de 2 bits, y aquí tenemos 2 palabras en total en esta RAM. Vemos que data es compartido. Ustedes ya se imaginan la capacitancia que va a tener ese valor de data. En este caso, estamos prescindiendo del sexto transistor, estamos haciendo estos transistores más pequeños, con lo cual podemos prescindir del sexto transistor, esta memoria RAM estática es de 5 transistores por celda, que es un número bastante pequeño. Les adelanto, o más bien les cuento, las RAM dinámicas tienen un transistor y un capacitor por celda, lo cual es incluso más pequeño, pero las SRAM son más rápidas aunque ocupan más espacio que la de DRAM, por lo tanto, la SRAM es lo preferido en el caso de FPGA. Cada palabra, esta palabra, esta palabra, todas las palabras de la RAM, las m palabras tienen una dirección que va entre 0 y m menos 1. Y cada columna del arreglo del nodo data, esta columna, está conectada a cada celda. Cada fila posee su propia entrada del selector. Este selector selecciona esta fila, este selector selecciona esta fila, y así. Hay un montón de selecciones. Esa es la selección a la fila o palabra. Y esta data es para cada bit. Interesante. Data, entonces, es un bus al que van conectadas todas las celdas de la memoria. Ya vimos buses en la clase pasada. Aquí tenemos como la estructura más global. Hay un codificador de dirección que toma la dirección y con one-hot, selecciona cuál es la celda a la que quiero dirigirme. Y luego tenemos este otro, que escribe con tri-state Buffers, que ya los vimos también. Este puede escribir, o cuando no queremos escribir se apaga el tri-state buffer, y las mismas celdas de memoria entregan la salida al registro que queramos leer. Este es un arreglo de 2 a la m por n. En este caso son m bits de dirección, por lo tanto, tenemos 2 a la m, en total, celdas de memoria, o más bien 2 a la m palabras, donde cada palabra tiene n celdas de memoria. Como dije antes, para habilitar el acceso hay que tener un selector que entrega una salida en one-hot y las entradas Read y Write activas en los tri-state buffers. Por supuesto, yo no puedo leer y escribir al mismo tiempo, esto es una memoria de un puerto de escritura o un puerto de lectura. Existen otras memorias de dos puertos en que yo puedo leer y escribir al mismo tiempo. ¿Cómo se hace en Verilog? En Verilog usamos un concepto que se llama Block RAM. Vivado tiene un generador de Block Ram o BRAM que aprovecha mejor los recursos del FPGA, y es posible usarlo a través de la IP Catalog. Entonces, ustedes se meten a la IP Catalog y ahí crean un bloque de memoria. Ahí les pregunta el tamaño, y uno puede hacerlo de dos puertos, entonces, al hacerlo de dos puertos, uno puede escribir y leer al mismo tiempo. Es posible instanciar BRAMs de dos puertos, como dije antes, y eso es aprovechar las potencialidades del hardware. Típicamente, estas de aquí se llaman word lines o líneas de palabra, porque elige la palabra, y estas otras son las bit lines porque eligen el bit en el word. ¿Qué aprendimos hoy? Aprendimos una estructura general de la RAM estática en un chip. Estas RAM se componen de celdas de memoria muy pequeñas de 5 transistores o de 6 transistores por celda. Cada columna tiene entrada y salida de datos. Cada fila requiere un selector de esa palabra, word line, y se pueden accesar para leer y escribir. Gracias por ver esta clase.