Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PH Tellez Vazquez Practica3 PDF
PH Tellez Vazquez Practica3 PDF
CAMPUS MORELIA
PROCESAMIENTO EN HARDWARE
PRÁCTICA 3
MULTIPLICADOR IEEE CORTO CON UART
Docente: Dr. Arturo Méndez Patiño
Alumnos: Grace Saili Vázquez Gaspar
Mario Téllez Jiménez
No Control: 14121144
15120142
El estándar define:
Formatos aritméticos: conjuntos de datos de coma flotante binarios y decimales, que
consisten en números finitos, incluidos los ceros con signo y los números desnormalizados o
subnormales, infinitos y valores especiales "no numéricos" (NaN).
Reglas de redondeo: propiedades que deben satisfacerse al redondear los números durante
las operaciones aritméticas y las conversiones.
Manejo de excepciones: indicaciones de condiciones excepcionales, tales como división
por cero, desbordamiento, etc.
Ahora bien, es necesario que se entienda el formato de los números que serán sumados, el formato es
conocido como IEEE corto.
El estándar del IEEE para aritmética en coma flotante (IEEE 754 o IEEE corto) es la norma o
estándar técnico para computación en coma flotante, establecida en 1985 por el Instituto de Ingenieros
Eléctricos y Electrónicos (IEEE). La norma abordó muchos problemas encontrados en las diversas
implementaciones de coma flotante que las hacían difíciles de usar de forma fiable y portátil. Muchas
unidades de coma flotante de hardware utilizan ahora el estándar IEEE 754.
2.-OBJETIVO
Implementar un multiplicador en formato IEEE corto en VHDL para una implementación
en FPGA en el futuro.
3.-DESARROLLO
En esta práctica se lleva a cabo la implementación de un multiplicador en formato IEEE corto
con lenguaje VHDL.
Primeramente se debe obtener el signo por medio de sus leyes, si los signos de los operandos son
diferentes el signo es negativo, si son iguales es positivo.
Posteriormente se suman los exponentes y se quita el exceso si es posible (Exponente > 127).
El siguiente paso es multiplicar las mantisas y tomar los bits más significativos, verificar acarreos y
concatenar las partes que conforman dicho formato (Signo, Exponente y Mantisa) para su posterior
visualización e interpretación.
De igual forma es importante implementar condiciones donde el resultado sea cero o infinito según
los datos enviados o bits específicos, ya sea en la composición del resultado o de alguna bandera
durante el procesamiento de datos.
Primero al tener los números A y B de 32 bits, se pasa a encontrar su signo, exponente y mantisa.
Después se procede a obtener la mantisa y con esto se hace uso de dos señales para añadirle un 1 que
se omite en la representación antes del punto, y así poder realizar la multiplicación de las mantisas.
Cuando se hace la multiplicación de las mantisas se obtiene un vector de 48 bits, y se debe de verificar
que esté desnormalizado o no, si el bit más significativo es 1 quiere decir que lo está y si está hacer
la suma de una unidad al exponente. Se debe tener en cuenta los casos especiales a los que está sujeto,
como lo son los infinitos, menos infinito, cero, indeterminado. Se tuvo bastante cuidado al representar
estos ya que si existía una condición mal el resultado no es el correcto.
La última parte es la concatenación de cada parte del resultado para almacenarlo en un vector y así
obtener el resultado de 32 bits. El funcionamiento del ÚART para esta práctica es simplemente que
por el RX entra ambos números y cuando la FPGA internamente realice la multiplicación se envía el
número por el transmisor hacia el microcontrolador, y el resultado se puede apreciar la interfaz del
microcontrolador.
4.-RESULTADOS
Se obtuvieron las tablas de tiempos máximas y mínimas que son las de a continuación, solo
se pusieron pocos resultados de la tabla ya que tiene muchos valores. Se consideraron los
tiempos más altos y más bajos en el procesamiento del multiplicador.
Cabe mencionar que tenía pensado implementar en físico con una FPGA Basys 2 pero al
final esta tarjeta no resultó viable debido a que aparecía un mensaje de warning en donde
decía que se estaban utilizando más del 100% de los dispositivos en la tarjeta.
Específicamente en “Number of bonded IOBs”.
Figura 5.- Números muy grandes pero con signo contrario que dan infinito negativo.
Figura 6.- Números muy grandes pero con signo negativo que dan infinito positivo.
.
Figura 7.- Números muy grandes que dan infinito positivo.
Figura 8.- Cero por infinito da un indeterminación pero se dejó estandarizada como 7FC00000 en
el programa (Checar simulación arriba).
Num1 <= x"6E22A160"; --Numeros muy grandes que dan infinito positivo
Num2 <= x"6E22A160"; --1.25829155E+28 y 1.25829155E+28
wait for 100 ns;
Num1 <= x"EE22A160"; --Números muy grandes pero con signo contrario que dan infinito negativo
Num2 <= x"6E22A160"; -- -1.25829155E+28 y 1.25829155E+28
wait for 100 ns;
Num1 <= x"EE22A160"; --Números muy grandes negativos ambos que dan un infinito positivo
Num2 <= x"EE22A160"; -- -1.25829155E+28 y -1.25829155E+28
wait for 100 ns;
Num1 <= x"6E22A160"; --Números anteriores puestos de manera contraria infinito negativo
Num2 <= x"EE22A160"; -- 1.25829155E+28 y -1.25829155E+28
wait for 100 ns;
Num1 <= x"71977617"; --Números grandes positivos, infinito positivo
Num2 <= x"53927c02"; -- 1.49999994E+30 y 1.2582914622E+12
wait for 100 ns;
Num1 <= x"00000000"; --Cero * Infinito
Num2 <= x"7F800000";
wait for 100 ns;
Num1 <= x"7F800000"; --Infinito * Infinito = Infinito
Num2 <= x"7F800000";
wait for 100 ns;
Num1 <= x"FF800000"; --Infinito negativo * Infinito Positivo
Num2 <= x"7F800000";
wait for 100 ns;
Num1 <= x"7F800000"; --Infinito positivo * Infinito negativo
Num2 <= x"FF800000";
wait for 100 ns;
Num1 <= x"FF800000"; --Infinito negativo * Infinito negativo = Infinito Positivo
Num2 <= x"FF800000";
wait for 100 ns;
Num1 <= x"7F800000"; --Infinito * Cero = Indeterminación positiva
Num2 <= x"00000000";
wait for 100 ns;
Num1 <= x"0DF3638F"; --Números muy pequeños que se redondean a cero
Num2 <= x"2BB116BA"; -- 1.49999991E-30 * 1.2582914311E-12 = 0
5.-CÓDIGO MULTIPLICADOR IMPLEMENTADO
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Multiplicador is
Port ( Num1,Num2 : in STD_LOGIC_VECTOR (31 downto 0);
Resultado : out STD_LOGIC_VECTOR (31 downto 0));
end Multiplicador;
end Behavioral;
CÓDIGO IMPLEMENTACIÓN
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--Este bloque recibe los datos provenientes del microcontrolador mediante una máquina de estados.
entity Receiver is
n : in STD_LOGIC;
rx_byte2 : out STD_LOGIC_VECTOR (31 downto 0)); --Salida del byte recibido
end Receiver;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--Este bloque recibe los datos provenientes del microcontrolador mediante una máquina de estados.
entity Receiver is
n : in STD_LOGIC;
rx_byte2 : out STD_LOGIC_VECTOR (31 downto 0)); --Salida del byte recibido
end Receiver;
Muestreo:process(clock)
begin
if rising_edge(clock) then
end if;
end process;
begin
if rising_edge(clock) then
case state is
when mark => --Este estado nos ayuda a la identificación del bit de inicio
baud_count <= 0;
RX_count <=0;
else
end if;
baud_count <= 0;
state <= delay; --Pasa al estado delay que es el que toma los
datos recibidos
else
end if;
else
end if;
when delay => --Estado para capturar los 8 bits de datos del
paquete
else
baud_count <= 0;
else
RX_count <= 0;
--bandera <=bandera+1;
end if;
end if;
when stop =>
else
baud_count <= 0;
end if;
if n='0' then
bandera <=bandera+1;
else
end if;
elsif n='1' then
bandera <=bandera+1;
else
end if;
end if;
end case;
end if;
end process;
end Behavioral;
Figura 12.- Simulación de Multiplicador con comunicación. .
6.-CODIGO MICROCONTROLADOR
#include <msp430fr6989.h>
int rx,tx; //Variables donde se almacena TX y RX
int dato;
int cont=0,conttx=0;
void enviar(char dato);
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
PM5CTL0 &= ~LOCKLPM5;
FRCTL0=FRCTLPW;
CSCTL0 = 0xA500; //Abre candado
CSCTL1 = 0x0040; //Configuración del Reloj General del microcontrolador a 1MHz
CSCTL2 = 0x0033;
CSCTL3 = 0x0000;
CSCTL0_H =0x00; //Cierra Candado*/
//Configuración UART1
UCA1CTLW0=0x00C1;
//ParOff/ParNo/TxLSB/8bits/StopNo/UARTMode/Asynch/SMCLK/CharacterErrNo/IntCherrNo/SleepNo/KeyOpen
UCA1BRW=6; //Baudios selección. *Ver Tabla de Velocidades (USER GUIDE) 9600
BAUDIOS ACTUALMENTE
UCA1MCTLW=0x2081;
UCA1CTLW0&=~1; //Se cierra candado de configuración
UCA1IE=1; //Bandera de interrupción habilitada
P3DIR = 0x08; //Se configura para que sea función UART
P3SEL1 = 0x08; //Configuración para UART en pines
P3SEL0 = 0x30; //Configuración para UART en pines
P3OUT = 0x20; //Configuración para UART en pines
P3REN = 0x20; //Configuración para UART en pines
for(;;){ //Ciclo for infinito para evitar que ingrese el programa a otro
código distinto al del
//Programa actual
}}
//Vector de interrupciones del UART 1
#pragma vector = USCI_A1_VECTOR
__interrupt void UART_ISR(void)
{
UCA1IFG=0; //Limpia la bandera de interrupciones