Hola. Vamos a hacer un circuito contador de bits con otro ejemplo. Pero en este ejemplo vamos a introducir un par de conceptos interesantes. Para eso vamos a hablar de estructura más general de un sistema digital. Ya aprendimos a diseñar diferentes bloques: flip-flops, contadores, registros, multiplexores y sumadores; y en este capítulo, en el capítulo 10, estamos aprendiendo ejemplos de circuitos más complejos y aprendimos cosas como un "bus", un "tri-state buffer", una memoria RAM, que son bloques importantes dentro de un sistema digital. Pero no hemos aprendido más de la estructura en general. La estructura en general es que un circuito, un sistema digital se compone de 2 partes importantes. Está primero el camino de la señal, el camino de la información, "datapath", que guarda, manipula y transfiere datos entre diferentes partes. No es que sea un circuito de algo distribuido en un circuito grande y que recibe datos, procesa datos. Y después tenemos un circuito de control, que es una máquina de estados finitos que controla la operación del "datapath". Vamos a aprender estos dos conceptos con un ejemplo con un circuito que cuenta bits. Las FSM, en general, se llaman de otra forma aquí, o más bien se analizan de otra forma de la que estamos acostumbrados. La analizamos como un "Algorithmic State Machine" o ASM, que no tiene nada que ver con "assembly", aunque por esas letras pareciera. Estos ASM son diagramas de flujo que permiten describir el comportamiento de una "Finite-state machine". En vez de hacerlo con diagramas de Mealy y diagramas de Moore, en este caso vamos a hacerlo con estos diagramas de flujo, que nos dicen cómo opera esta máquina algorítmica. Y esta es una forma de expresarlos, tal vez, de manera más sencilla. Internamente uno lo procesa y lo entiende como una FSM, pero lo miramos más desde afuera, como una máquina de estados algorítmica. Sus bloques incluyen estado, decisión y salidas condicionales, y aquí, los símbolos que se usan son estándar. No inventen símbolos, no hagan cajitas con formas distintas. Si tienen una caja cuadrada o rectangular eso es un estado. Y tiene una entrada de estado y tiene una salida de opciones. Es tipo Moore, porque la salida está asociada al estado. Después tenemos otra que es de decisión y las decisiones son rombos o diamantes. Fíjense bien, no inventen símbolos. El rombo es para decisiones. El rombo es: si ocurre algo, vaya para allá; si ocurre lo contrario, vaya para allá. Eso es todo. Y después, están salidas condicionales, opciones, en este caso del tipo Mealy, porque las salidas dependen de el estado y de la entrada. A diferencia de otros diagramas de flujo, una ASM implica temporalidad. ¿Cómo contamos bits? La idea es contar bits en una palabra. Hay que contar cuántos bits de una palabra son 1. Algo sencillo. ¿Para qué sirve eso? Para poner un ejemplo en este curso. Para algo va a servir en algún momento, pero, por ejemplo, podría servir para un decodificador. Pero no importa, vamos a asumir que alguien nos pidió hacer este circuito. Supongamos que queremos contar los bits que valen 1 en un registro A, que puede ser un registro muy grande, de muchos bits. Insisto, esto es un decodificador de Wallace, pero da lo mismo. Podríamos hacer un decodificador de Wallace en forma combinacional, aquí lo queremos hacer en forma secuencial. Podemos empezar planteando un pseudocódigo del algoritmo. Este pseudocódigo no es un lenguaje de programación en particular, sino que más bien como si lo quisiéramos expresar en un lenguaje programación. Entonces, partimos diciendo B igual cero. Después, mientras A sea distinto a 0, haga lo que está aquí. Si a_0 vale 1, entonces súmele 1 a B. En B vaya acumulando cuantos bits son 1, y A es el registro donde queremos contar unos. Y después "right-ship" de A; por lo tanto, siempre mi bit 0 va a estar en a_0, el bit que quiero sumar. Y si terminé, entonces, todos los A van a ser 0. Perfecto. El resultado, como dije, queda almacenado en el registro B y el algoritmo finaliza cuando ya no hay unos para contar. Esto de aquí sería un diagrama de flujo, este ASM. El bloque S1 especifica que el registro B se inicializa en 0. Entonces, este bloque de aquí dice que el registro B parte en 0. Cuando hay un "reset" esto parte en 0. Las flechas indican el tiempo, o más bien, entrada/salida, pero eso tiene alguna implicancia de tiempo, porque primero ocurre esto, luego ocurre eso. La señal de entrada S indica si la información a procesar ya ha sido cargada en el registro A. Esa es la señal de entrada S y esa señal de entrada S me dice si es que es 0, cargue A; si es que es 1, es porque ya cargué A y siga adelante. Y siga adelante es hacer exactamente lo que está en este pseudocódigo. La señal de salida "Done" se activa cuando se finaliza el algoritmo. Aquí activo Done, cuando el algoritmo está terminado, fíjense una máquina de estados de Moore, en este caso. Cuando terminó, la salida es entregada. ¿Qué más? Los cambios ocurren en forma síncrona: con una señal de reloj, todos los flip-flops de esta máquina cambian al mismo tiempo. ¿Qué requiere esta ASM? Va a requerir un "shift register" para A aquí, porque A voy a estar moviéndolo para dejar siempre el bit correspondiente en el bit 0, entonces necesito un "shift register" con carga paralela, porque estoy cargándolos desde aquí y con una entrada "enable", ya que solo opera en S2. Después, tenemos un contador para B con carga paralela. ¿Un contador? Sí, en vez de estar sumando vamos a estar contando. Y lo inicializamos a 0 en S1 y el "reset" va a cumplir la función de partir y recuperar. Y a partir de estas consideraciones podemos bosquejar el "datapath". Aquí está el "datapath". Desde la ASM hacemos el "datapath" o camino de los datos. Podemos inferir algunos bloques, como dijimos antes, hay un "shift register" mientras los datos, y luego tenemos un contador aquí que va a ir contando para B. Entonces, aquí metemos A y aquí sale B. El "shift register" debe tener la función de carga paralela, que es esta, y de "enable", que es esta. El contador va a contar, también, con la función de carga paralela. Perfecto. Vamos a estar habilitando de alguna forma y este es el "reset". Perfecto. Estos son grupos de datos. ¿Qué pasa con el circuito de control para la ASM? La ASM del circuito control hace que en S1 se active la señal LB. Entonces, aquí uno mira. Esta ASM se parece un poco a ésta, pero... Sí, aquí estamos fijándonos en las señales de control. Se activa la señal LB para cargar en paralelo un 0 de n bits en el contador, que es este 0 que estamos cargando aquí. En S2 la señal EA se activa para habilitar la operación del "shift register". La cuenta del contador solo se habilita cuando a_0 vale 1 y la señal Z toma el valor de 1 cuando A vale 0, y esto describe completamente esta máquina. De ahí, entendiéndola bien, podemos pasar al Verilog. El primer bloque "always" describe las transiciones de estado; el segundo bloque "always" representa los estados de los flip-flops; el tercer bloque "always" define las salidas de cada estado y el último, define al contador que guarda la cuenta. Pueden revisarlo en detalle y es un buen ejercicio para hacer, para sintetizar, para ver si funciona y para entender bien como funciona. ¿Qué aprendimos hoy? Aprendimos un circuito que cuenta bits. Aprendimos, dentro de este ejemplo, el concepto de ASM, de "datapath", de circuito control, en este caso, para el ASM y vimos el diseño en Verilog. Gracias por ver esta clase.