2. Planteamiento del problema
Deberán diseñar una unidad aritmética-lógica (ALU) que procese números enteros y
muestre el resultado de las operaciones en los dispositivos de salida del tablero Nexys 2, utilizando
la técnica de diseño estructural (mediante componentes).
La ALU deberá tener como entradas un vector de selección de 3 bits que indicara la
operación a realizar, y dos operandos que estarán representados por vectores de 3 bits. La
codificación para el control de las operaciones se muestra en la Tabla 1 y la estructura general del
sistema se muestra en la Figura 1.
Figura 1.
En los displays D1, D0 se mostrará el resultado de las operaciones aritméticas adición (+).
Sustracción (-), multiplicación (*) y división (/). En el display D2 se mostrará el dígito
correspondiente a la operación que se selecciono. El led LED4 mostrara el bit de acarreo, el led
LED3 mostrara la salida de la operación 7 (comp) donde se compararán las dos entradas y la salida
será 1 únicamente si A y B son iguales. Los leds LED2, LED1 y LED0 mostrarán las salidas de las
operaciones lógicas and, or y xor.
Restricciones:
1. La operación división de la forma A/B donde A>B, el cociente se mostrara en el display
D1 y el residuo en el display D0.
2. La operación división de la forma A/B donde A<B, el cociente será 0 y se mostrara en el
display D1 y el residuo será A y se mostrara en el display D0.
3. La división entre 0 (cero) deberá generar un mensaje de error (letra E mostrada en los
displays D1 y D0).
3. DESARROLLO
El diagrama de la estructura desarrollada es el mostrado en la figura siguiente.
Figura 2. Estructura complete del ALU.
Las señales de entrada y salida de mayor de mayor jerarquía son las mostradas dentro de
los recuadros azules en la figura 2.
Se hicieron cuatro programas diferentes, los cuales se utilizaron como instancias en
nuestra estructura de mayor jerarquía, estos programas son:
1. Un codificador de operaciones (codificador_de_operaciones1): Esta básicamente cumple
las funciones de la tabla mostrada en la figura 1.
Figura 3.
Sus entradas son:
- A[2:0] y B[2:0]: Las entradas son los números binarios de 3 bits.
- SEL[2:0]: Una entrada SEL[2:0] de 3 bits con el cual se determina la operación a
realizar.
Sus salidas son:
- SAL_DISP[6:0]: Una cadena de de 7 bits, el cual representa el resultado de las
operaciones aritméticas que se realizan.
Consideraciones a tomar para la longitud de bits de esta salida:
El resultado más alto que puede salir de las operaciones es el 49 (Puede ser
representado en forma binaria con 6 bits), el cual surge de la multiplicación de 7 x
7 y este número tiene que ser separado en decenas y unidades (proceso realizado
por el programa o instancia “LOGICTOINTEGERTOHEX”, el cual esta explicado a
continuación) y tienen que ser representado en los displays D1 y D0
respetivamente, esto sucede en la multiplicación.
En el caso de la división, se obtiene un cociente (Máximo cociente puede ser 7, el
cual surge de la división de 7 / 1 y el mínimo es 0) y un residuo (Máximo residuo
puede ser 3, el cual surge de la división de 7 / 4 y el mínimo puede ser 0), y ambos
números son unidades, debido a que solo se tiene las salida SAL_DISP[6:0] para
representar la salida, entonces transformamos el cociente en decena y el residuo
en unidad y las sumamos y así obtenemos nuestra única salida el cual será
procesada después por nuestro programa o instancia “LOGICTOINTEGERTOHEX”,
el cual hará el proceso inverso, hay que tomar en cuenta que el numero mayor
4. que puede salir seria el 70 (7 de cociente y 0 de residuo) el cual puede ser
representado en forma binaria con 7 bits, los cuales se representaran en D1 y D0
respectivamente.
- LED[4:0]: Una cadena de 5 bits, los cuales representan los resultados de las
operaciones lógicas y son mostrados en los leds de la figura 1.
o LED[2:0]: Representan el resultado de las operaciones and, or y xor.
o LED[3]: Determina si los números A y B son iguales (Encendido = iguales y
Apagado = diferentes).
o LED[4]: Representa el bit de acarreo, esta se activa o se enciende cada que la
suma de los dos número supera el valor de 7(entero) o 111(binario).
- SAL_SIGNO: Una salida de un 1 bit, con el cual se determina si el número obtenidos de
las operaciones aritméticas son positivas o negativas, esto en realidad solo aplica para
el caso de la resta de las dos señales de entrada.
- CODIGO [2:0]: Una cadena de 7 bits, este representa el Código de la operación a
realizar, esta señal se ingresara a un convertidor hexadecimal a siete segmentos
(Instancia “HEXADECIMAL_A_7_SEGMENTOS”), para después ser multiplexado
(Instancia o programa “MULTIPLEXOR_DISPLAYS”) a el display D2.
-
2. Convertidor lógico a hexadecimal: Este transforma la señal lógica (resultado de las
operaciones aritméticas) a numero entero, el cual después se separa en dos dígitos y
posteriormente se les aplica la conversión inversa para que de esta manera se obtengan
dos señales hexadecimales.
Figura 4.
Sus entradas son:
- Logicvect[6:0]: Entrada lógica de 7 bits (Resultado de las operaciones aritméticas
realizadas en el codificador de operaciones).
- in_signo: Una entrada lógica de 1 bit para determinar el signo del número.
Sus salidas son:
- to_hex[3:0] y to_hex2[3:2]: Dos salidas hexadecimales que representan los dos dígitos
correspondientes a la decena y unidad del resultado obtenido del codificador de
operaciones.
o Para separa el numero en decena y unidad, lo que se hace es determinar entre
que rango se encuentra de valores se encuentra, por ejemplo:
Si la entrada logicvect es igual a 70(entero) o 1000110(binario), entonces
se encuentra en el rango de de 70 a 79, entonces, sabemos que tiene
como decena el numero 7, entonces sabiendo esto. le restamos 70 al
número de entrada y el residuo será la unidad que en este caso es 0 (cero)
y de esta manera podremos obtener dos salidas hexadecimales, una para
la decena y otra para los unidades, los cuales se conectaran a un
5. convertidos hexadecimal a siete segmentos (instancia
“HEXADECIMAL_A_7_SEGMENTOS”).
o
3. Tres Convertidores Hexadecimales a siete segmentos: Dos de estos son usados para
representar el resultado de las operaciones aritméticas y uno de estos utilizado para
mostrar el código de la operación realizada con las entradas A y B.
Figura 5.
Sus entradas son:
- Hex[3:0]: Una entrada hexadecimal de 4 bits.
Sus salidas son:
- Sseg[6:0]: Una salida de 7 bits, los cuales representaran cada uno de los segmentos de
los displays.
4. 1 Multiplexor de displays en el tiempo
Figura 6.
Sus entradas son:
- D0[6:0], D1[6:0] y D2[6:0]: Tres entradas de 7 bits, los cuales representan la decena y
la unidad del resultado obtenido del codificador de operaciones (instancia o programa
“Codificacion_de_operaciones”).
- clk: Una señal de reloj, utilizado para multiplexar un display a la vez en cada flanco de
subida.
- rst1: utilizado para borrar todo de los displays.
Sus salidas son:
- sseg1[6:0]: Una salida de 7 bits, los cuales activaran los segmentos de los displays,
dependiendo de la entrada que se le m
- an[2:0]: Una salida de 3 bits utilizada para activar el display correspondiente con cada
digito (Código y resultado de la operación en forma de números enteros).
El multiplexado se realizara utilizando un contador de 2 bits, los bits 00, 01, 10, 11
activaran D0, D1, D2, D3, además de que también determinara que entrada
asignarle a la salida. El contador será controlado por medio de una señal de reloj,
este contador aumentara una unidad cada flanco de subida.
6. CONFIGURACION DE LAS CONEXIONES REALIZADAS
Figura 7.
LED4 LED3 LED2 LED1 LED0
SEL2 SEL1 SEL0 B2 B1 B0 A2 A1 A0
D2 D1 D0
7. LA ASIGNACION DE PINES ES LA SIGUIENTE:
Figura 8.
# PlanAhead Generated physical constraints
NET "A[0]" LOC = H13;
NET "A[1]" LOC = G18;
NET "A[2]" LOC = H18;
NET "an_out[0]" LOC = F17;
NET "an_out[1]" LOC = H17;
NET "an_out[2]" LOC = C18;
NET "an_out[3]" LOC = F15;
NET "B[0]" LOC = K18;
NET "B[1]" LOC = K17;
NET "B[2]" LOC = L14;
NET "LED1[0]" LOC = J14;
NET "LED1[1]" LOC = J15;
NET "LED1[2]" LOC = K15;
NET "LED1[3]" LOC = K14;
NET "LED1[4]" LOC = R4;
NET "SEL[0]" LOC = L13;
NET "SEL[1]" LOC = N17;
NET "SEL[2]" LOC = R17;
NET "sseg_out[0]" LOC = H14;
NET "sseg_out[1]" LOC = J17;
8. NET "sseg_out[2]" LOC = G14;
NET "sseg_out[3]" LOC = D16;
NET "sseg_out[4]" LOC = D17;
NET "sseg_out[5]" LOC = F18;
NET "sseg_out[6]" LOC = L18;
NET "clk" LOC = B8;
NET "rst" LOC = B18;
EVIDENCIA FOTOGRAFICA
En la operación de suma, cuando el resultado supera el valor de 111 se enciende el bit de
acarro, que es básicamente lo que se muestra en las figuras 9(a) y 9(b).
Figura 9 a. SEL <= “000”(Adición), A <= “111”(Entrada 1) y B <= “111”(Entrada 2), LED <=”10000”(Salida) con el bit de
acarreo(Led verde encendido).
Figura 9 b. SEL <= “000”(Adición), A <= “010” y B <= “110”, LED <= “10000”con el bit de acarreo(Led verde encendido),
porque supero el valor de 7.
9. Figura 10 a. SEL <= “001”(Sustracción), A <= “111” y B <= “100”, con salida igual a 3(Representada en display DO).
Figura 10 b. SEL <= “001”(Sustracción), A <= “010” y B <= “111”, con salida igual a -5, el signo negativo está representado
en D1 y el 5 en D0.
Figura 11. SEL <= “010”(Multiplicación), A <= “111” y B <= “111”, el resultado es 49, el cual es representado en D1 y D0
respectivamente.
10. Figura 12 a. SEL <= “011”(Division), A <= “110” y B <= “111”, el resultado es 6, representado en D0.
Figura 12 b. SEL <= “011”(Division), A <= “100” y B <= “000”
Figura 13. SEL <= “100”(and), A <= “110” y B <= “110”, LED <= “00110” (Salida)
11. Figura 14. SEL <= “101”(or), A <= “100” y B <= “010”, LED <= “00110” (Salida)
Figura 15. SEL <= “110”(xor), A <= “010” y B <= “001”, LED <= “00011” (Salida)
Figura 16 a. SEL <= “111”(comp), A <= “010” y B <= “001”, LED <= “00000” (Salida), LED[3] no está
encendido por que los números no son iguales.
12. Figura 16 b. SEL <= “111”(comp), A <= “010” y B <= “010”, LED <= “01000” (Salida), LED[3] está
encendido por que los números son iguales.