sábado, 5 de septiembre de 2015

                                                       
                                                                   LABORATORIO 4


GRUPO:
Jair Andres Ramirez cod: 35889
Julio Cristian Camilo sierra  cod: 31406
Fredy Garcia

El objetivo de este laboratorio es realizar una  práctica que sirva de introducción al manejo y programación de un FPGA, para ello disponemos de un display de 16 segmentos, donde mostraremos las letras correspondientes a los nombres de cada integrante . Estas letras las almacenamos en los campos de una memoria para que puedan ser codificadas mediante un contador , será el código que desarrollaremos el encargado de iluminar los leds del display.

Una cosa a tener en cuenta es que tanto el reset, los botones y los leds del display están en lógica negativa, normalmente para nosotros el 1 simboliza encendido y el 0 apagado, con esta lógica el 1 es apagado y el 0 encendido. Una vez codifiquemos las letras que queremos mostrar, mediante VHDL leeremos esos 4 bits para después, por unos puertos de expansión conectados al display que se encuentra en una protoboard, codificar la salida de 16 bits para que el display muestre la letra de acuerdo al nombre.

                        
                                                           LABORATORIO 3


GRUPO:
                                           Julio Cristian Camilo Sierra            cod: 31406        
                         Jair Andres Ramirez              cod:35889
   Fredy Garcia


Básicamente hay dos formas de que una memoria ROM sea implementada en un FPGA a partir del código VHDL:
- Deduciendo la memoria desde el código VHDL. Comúnmente conocido como Inferir.

Por portabilidad y code-resuse el primer método, inferir, es el mas aconsejado. Pero por supuesto tambien se puede recurrir a los IPs del FPGA (segundo caso).
A su vez dentro del metodo de inferir hay diferentes opciones para el modo de 'cargar' la ROM:
1- declarando un tipo (type), luego una señal de ese tipo y asignarle a la señal valores constantes (datos de la ROM)
2- declarando los datos de la ROM en un archivo (data file) y usar instrucciones de apertura y lectura de archivos  para leer los datos.
3- usando instrucción 'case'.

Analizando las distintas opciones en generaral podemos decir el caso 3 se usa cdo la memoria es pequeña, de lo contrario queda un 'case' tremendamente largo y un poco anti-estético. El caso 2 depende del entorno del proyecto- hay empresas en las que no les gusta o no están de acuerdo con el acceso a disco para leer/escribir datos, otras que directamente lo prohíben y otras que lo estimulan. Por lo dicho entonces, detallaré la metodología de la opción 1 que es la mas generalizada.

El primer paso es la declaración del arreglo bi-dimensional que fija el tamaño de la memoria. Pero, antes de detallar esta declaración es conveniente declarar también dos constantes: una constante relacionada con el ancho del bus de direcciones de la memoria, y otra constante relacionada con el ancho del bus de datos de la memoria. Conviene que estas declaraciones sean realizadas como generics dentro del componente, así es más fácil la modificación del tamaño de la misma.
De acuerdo a lo descrito, la primera parte del código de la memoria ROM quedaría:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
4
entity sync_rom is
 generic (data_width  : natural := 16;
          addr_length : natural := 10);
 port (
  clk     :in  std_logic;
10  address :in  std_logic_vector(addr_length-1 downto 0);
11  data_out:out std_logic_vector(data_width-1  downto 0)
12     );
13 end sync_rom;

LABORATORIO 2




GRUPO:
Julio Cristian Camilo Sierra cod: 31406
Jair Andres Ramirez             cod: 35889
Fredy Garcia
                      
Para poder realizar la complementación de este circuito nos basaremos en el mismo principio empleado en el diseño de un conversor BCD a segmentos realizando la tabla de verdad con las funciones necesarias para el display de 16 segmentos el cual esta configurado de la siguiente forma:

 Configuración de segmentos



Esta configuración nos ofrece las nociones necesarias para realizar la tabla de verdad para las funciones que iluminaran nuestros segmentos, en nuestro caso en particular serán los números del 0 al 9 y las letras del abecedario.

Tabla de funciones

A partir de esta tabla podríamos generar las mapas de karnaugh para realizar la simplificación del circuito. Sin embargo existe una herramienta la cual nos hará mas productivos a la hora de realizar nuestros diseños.

Esta herramienta es un software llamado Boole Dusto el cual es gratis y se puede descargar desde la plataforma edmodo del grupo , este software nos brinda la posibilidad de ingresar nuestra tabla de verdad generando las ecuaciones de cada función e incluso podremos genera el código VHDL para poder implementarlo con nuestro diseño.