<center>
# **Proyecto III: Introducción a diseño en HDL**
## Estudiantes
Kender Ortiz Arias 2020039357
Sebastian Cruz Solano 2020042177
David Pérez Calvo 2017090482
</center>
## **Descripción del circuito**
<div class=text-justify>
Una FPGA (_Field Programmable Gate Array_) es un complejo circuito integrado digital programable compuesto por bloques lógicos configurables (CLB) y puertos de entrada/salida (IOB), cuya interconexión y funcionalidad puede ser programada mediante un lenguaje de descripción especializado. En este proyecto se utilizó una FPGA _Xilinx Basys 3 Artix-7_ programada con el lenguaje _Systemverilog_ mediante el software de _Vivado_. El objetivo de este proyecto es crear mediante una FPGA un multiplicador completo de números, haciendo uso de switches, botones, LEDS y un display 7 segmentos.
<center>

**Basys 3 Artix 7**
</center>
**Parámetros de entrada:**
* 16 Switches (1)
* Botón de inicio (2)
* CLK (interno 100 _MHz_)
**Parámetros de salida:**
* 16 LEDS (3)
* Display 7 segmentos (4)
**Funcionamiento general:** Se introducen dos números de 8 bits cada uno en complemeto a dos (2's complement) utilizando los 16 swithces (1) en la FPGA, la lectura de los switches se confirma mediante los LEDS (2), se multiplican y se despliegan en un display de 7 segmentos (4).
**Subsistema de lectura:** Este subsistema recibe dos números de 8 bits cada uno, haciendo uso de los 16 swtiches (1) (8 para el primero y 8 para el segundo) para realizar la operación de multiplicación. La entrada se captura y se sincronica con el sistema por medio de un circuito antirebote de 4 etapas (4 FF en cascada). El circuito iniciará la operación hasta pulsar el botoón, cada bit adquirido se representa mediante un LED (3) próximo al switch.
**Subsistema de Multiplicador de Booth:** Este subsistema recibe los números del bloque anterior, el subsitema de lectura inicia cuando la vandera **valid** es verdadera, el cálculo de multiplicación con signo se realiza de manera iterativa mediante el **Algoritmo de Booth**, este bloque indica al siguiente bloque consecutivo cuando el resultado de la multiplicación está estable para ser muestreado con una señal **done**.
**Subsistema de Binario_BCD:** Este subsitema registra el resultado del bloque anterior (16 bits con signo) y lo convierte en formato BCD.
**Subsistema de despliegue en BCD_7segmentos:** Este subsistema toma el resultado de la multiplicación en BCD y los despliega en el dispositivo 7 segmentos disponible en la FPGA de forma decimal incluyendo el signo**
</div>
## **Diagrama de bloques**
<center>

**Diagrama de bloques de la FSM**
</center>
<div class=text-justify>
**Multiplicador de Booth:** Este bloque hace referencia al módulo con el mismo nombre, por el cual ingresan 2 números de 8 bit en complemento a 2 y se multiplican para formar un número de 16 bits con signo
**Binario_BCD:** Este bloque hace referencia al módulo con el mismo nombre, el cuál transforma el número de 16 bits del bloque anterior a sus respectivas unidades, decenas, centenas, milésimas y diez milésimas.
**BCD_7segmentos:** Este bloque hace referencia al módulo con el mismo nombre, el cuál es el encargado de desplegar el resultado de la multiplicación (con signo) en el display de 7 segmentos.
</div>
## **Diagrama de estados**
<div class=text-justify>
S0: En este estado se realiza la lecutra de los 16 switches.
S1: En este estado se representa la lectura de los switches en los 16 LEDS.
S2: En este estado se realiza la multiplicación de los dos números en complemento a dos por medio del **Algoritmo de Booth**
S3: En este estado se despliega el resultado de la multiplicación en el display de 7 segmentos.
</div>
<center>

**Diagrama de estados de la FSM**
</center>
## **Simulaciones**
<div class=text-justify>
Como se observa en la simulación, el reloj cambia entre 1 y 0, en el momento que se introduce mediante los switches los dos números en complemento a 2 de 8 bits cada uno, pasan por 4 FF y se pasan a la siguiente parte del códgio hasta pulsar el botón, luego de esto se realiza la multiplicación de ambos números, el resultado es un número de 16 bits con signo, luego se despliega en sus unidades, decenas, centenas, milésimas y diez milésimas, para luego ser desplegado en el display de 7 segmentos.
</div>
<center>

**Simulación obtenida con el software Vivado**
</center>
## **Análisis de potencia en la FPGA**
<div class=text-justify>
Utilizando la herramienta de _Report Power_ del software de Vivado, se genera una estimación del consumo de FPGA Basys 3 Artix-7. Como se puede observar, el consumo de potencia total de la FPGA es de 0.087W, los cuales se reparten en: 18% en potencia dinámica y un 82% en potencia estática, de la cuál un 82% es consumida por Input/Output.
</div>
<center>

**Consumo de potencia que reporta la herramienta Vivado**
</center>
## **Reporte de velocidades**
<div class=text-justify>
Se logró implementar una velocidad de reloj (CLk) de 100 _MHz_ en la FPGA, superando el mínimo propuesto de 50 _MHz_.
</div>
## **Problemas encontrados**
<div class=text-justify>
Durante la realización del proyecto, se encontraron diversas dificultades, tales como:
</div>
<center>
| Problemas encontrados | Solución |
| -------- | -------- |
| Vivado|Se hizo una busqueda de guías y tutoriales sobre el manejo del sofware, tal como abrir archivos, escoger el lenguaje del código, realizar testbench, etc.|
|Problemas con el reloj|Al principio se utilizó la velocidad de reloj mínima, la cuál reportó problemas al momento de implementarla, por lo que se cambió al reloj de base de la FPGA Basys 3, obteniendo como resultado un buen funcionamiento del código en la FPGA.|
|Problemas con el -128|El problema del multiplicador de Booth era multiplicar el número -128 (multiplicando) por cualquier otro número, por lo que la solución fue un mux el cuál intercambiaba la posición de los números en caso de que el mutiplicando fuese igual a -128.|
|Problemas con los el display de 7 segmentos|Se utilizó el código del proyecto anterior añadiendole diversos muxes para lograr desplegar de manera satisfactoria el número de 5 dígitos más el signo.|
</center>