miércoles, 8 de septiembre de 2010

Funcionamiento de los displays de siete segmentos

En el display ánodo común son con los que cuenta la tarjeta, todos los ánodos de los diodos LED unidos y conectados entre si, existe la posibilidad de que cada display se programe y solamente se pueda visualizar los resultados en uno, pero en esta ocasión trabajaremos con todos y observaremos como es su programación y funcionamiento.
Primeramente para programarlos necesitamos tener un arreglo de entrada de 4 bits (estos serán los switches para poder ir ingresando los números y otro arreglo de salida de 7 bits los cuales serán los leds de cada display. A continuación se muestra la manera de como están numerados para que cuando se desee programar el número que encenderá conozcas los leds que debes encender.
Es importante mencionar que encienden en bajo, y el código se realizará en un proceso y dentro de este un "case" con "when" y la salida se realizara con con los bits agregados comenzado como se muestra en el ejemplo de código:

case entrada is
when "0000" => salida <= "1000000"; --(N16)(F13)(R16)(P15)(N15)(G13)(E14) es el orden
when "0001" => salida <= "1111001";
........
end case;
end process;
Una vez que se ha introducido el código y compilado de una manera correcta, se escribirán las salidas y entradas y se generará el archivo .bit para poder cargar a la tarjeta y funcione.

Implementar un sumador, decodificador y multiplexor.

Lo primero que tenemos que entender es la forma binaria de hacer las sumatorias, para ello se muestra el siguiente diagrama:

Se muestran tres diferentes variables X, Y y Z, las compuertas OR servirán para hacer las sumas, mientras que en la AND se llevará el carry, el diagrama es una sumatoria completa.
El sumador consiste en ir sumando bit por bit (el menos significativo con el menos significativo) e ir guardando el carry que pueda producir para sumarlo al resultado de la suma de los bits siguientes. El resultado se va guardando en variables de salida diferentes, mientras que el carry se va arrastrando en una variable temporal hasta que se asigna a un carry de salida final al termino de la suma. Como se muestra el la siguiente figura:

En el lenguaje VHDL para poder programar en la tarjeta Spartan3 necesitaremos asignar las diferentes entradas, proponemos (A, B, C, D, W, X, Y, ), y salidadas (S1,S2,S3,S4). Posteriormente comenzaremos la sumatoria de los bits, primeramente (D xor Z) y se realizará después de 10ns, si existiese un carry agregaremos una variable adicional que irá acumulando los distintos carry´s. para sumar S2 se agrega (C xor Y xor variable del primer carry) después de 10ns, para el segundo carry se agregará la variable igualada a ((C and Y) or (C and variable 1er. carry) or (Y and varible 1er. carry)) después de 10 segundos. Y con esta metodología se relizarán las siguientes sumatorias (B xor X) y (A xor W). De esta manera se podrán obtener los resultados a la suma, recomendamos que se muestren en los led´s de la tarjeta y que la entrada de datos sea por medio de los switches.

Un decodificador es un circuito lógico que acepta un conjunto de entradas que representan números binarios y que activan solamente la salida que corresponde a dicho dato de entrada. En otras palabras, un decodificador mira a sus entradas, determina qué número binario está presente y activa la salida correspondiente a dicho número. Todas las otras salidas permanecerán inactivas. Un decodificador modelo tiene N entradas y M salidas. Debido a que cada una de las N entradas puede ser 0 o 1, hay 2N posibles combinaciones o códigos de entrada. Para cada una de estas combinaciones de entrada sólo una de las M salidas estará activa, y todas las otras estarán inactivas.

En este caso aplicaremos uno de 3x8 declarando tres entradas y 8 salidas, se realizará un "process" en el código y dentro de este un "case". Con un "when" pondremos la entrada y con signos de igualación, menor y mayor que mostraremos el número binario que saldrá del decodificador. Como se muestra en el siguiente ejemplo:

case entrada is

when "000" => salida <= "10000000";

(siguen los diferentes casos)...

end case;

end process;

Finalmente los datos de entrada se entregarán por medio de los switches y las salidas se observaran en los leds de la tarjeta Spartan 3.

Un multiplexor tiene de 4 a 1 tiene cuatro entradas y dos entradas de selección que son las que eligen cual de los cuatros bits de entrada salen en la única salida. Utiliza una estructura muy similar en código a la del decodificador, a base de "case". El valor de la variable tomaba un caso específico y la salida el valor de bit de entrada en esa posición, por ejemplo:

case selec is

when "00" => salida <= a;

(se sigue en los diferentes casos)....

Los datos se entregarán por medio de los switches y la salida por led.

lunes, 6 de septiembre de 2010

Realización de una ALU de 2 bits

Una Unidad Aritmética Lógica es un circuito digital que realiza operaciones aritméticas (suma, resta, multiplicación, división) y operaciones lógicas (AND, OR, NOT) así como muchos otros tipos de operaciones.
Para que la ALU funcione de una manera eficaz sugerimos agregar un decodificador con el cual se seleccionaran las operaciones que desea realizar el usuario en la ALU. Los datos ingresados se procesan de tal manera que pueda obtener el resultado de la operación asignada, incluyendo carry´s.
Uno de los primeros programas de prueba que podemos realizar es la configuración de una ALU en la tarjeta, para lo cual necesitaremos asignar variables, nosotros recomendamos las siguientes: para los datos de entrada X1, X2, Y1, y Y2, además de un arreglo de 3bits que serán la selección de operación; para los datos de salida un arreglo de cuatro bits (ya que habrá operaciones que utilizarán todos).
En un "case" se recibirá la variable de selección, para el not solo se negará la entrada, para las demás operaciones lógicas se utlizará el bit número de uno de la variable X y Y.
Para la suma se utiliza tal cual el código como se explica en este blog en la publicación de "Implementar un sumador...", la multiplicación la realizamos siguiendo el siguiente esquema a base de and´s y sumas.
La operación AND de X1 con Y1 se pone tal cual como una salida cero, después se suma el AND de X2 con Y2 junto con el AND de X2 con Y1, si existe un carry se agrega a la siguiente suma y de esta manera se va realizando la multiplicación, básicamente son AND´s y Sumas.
Para agregar los corrimientos de bits ya sea a la izquierda o a la derecha, solamente es una sustitución de valores.

when "101" => salida <= "0000"; --x>>y
salida(0) <= x(1);
salida(1) <= y(0);

Al tener todo el programa escrito en un "case" con los diversos "when" se podrá cumplir el objetivo que tiene una ALU y se podrán hacer las operaciones aritméticas de dos bits.

miércoles, 1 de septiembre de 2010

¿Cómo compilo y hago que funcione el código en la tarjeta?

Una vez que hemos escrito el programa, tenemos que asegurar que no exista ningún tipo de error, para ello sirve la compilación. Esta se realiza dando clic al icono de play en color verde arriba del código.
Al dar clic empezará a correr todos los procesos de verificación y armado de código, todo se estará detallando en la barra que se encuentra en la parte inferior de la pantalla.
Una vez completada la verificación del código si no existe ningún tipo de error debemos dar clic en "I/O Pin Planning (PlanAhead)-Pre-synthesis" que se localiza en el menú processes en la parte izquierda de la pantalla en medio.
Al dar clic en este diálogo se abrirá una nueva ventana (tarda un poco en cargar, no dar varias veces clic), aquí escribiremos el nombre de los puertos de entrada y salida según estas escritos en letra blanca y entre paréntesis en la tarjeta (son una letra y dos dígitos).
En esta pantalla damos clic en IO/Ports y se desplegara la lista de todos los que utilizaremos (según fue nuestra programación) y en la pantalla inferior "IO/Ports properties" escribiremos en la caja de texto "site" el número y letra asignada, al terminar con cada una daremos clic en "apply", y al terminar todas clic en Finish, para terminar guardamos lo cambios realizados.
Al terminar con esta pantalla damos clic en la anterior "Implement Design" y "Generate programming file" para que guarde en la misma dirección que dimos en un principio un archivo .bit y este es que que cargamos a nuestra tarjeta utilizando el controlador del cable Adept (se explica en el primer block).