Práctica Creación del proyecto y copiado del código VHDL original
Enviado por javieulate • 16 de Mayo de 2018 • Apuntes • 1.402 Palabras (6 Páginas) • 88 Visitas
DISEÑO DE UN CONTADOR CON VHDL Y CPLD
AYUDA A LA PRÁCTICA 10, 2013-2014
Índice:
1-3. Creación del proyecto y copiado del código VHDL original
4-7. Explicación del código.
8. Implementación del sistema en la FPGA Spartan3 XC3S200 FT 256
9. Actividades del alumno para conseguir el punto de la práctica.
10. Código completo seguido con restricciones incluidas.
Esta Práctica 10 es idéntica a la práctica 7, solo que ahora vamos a implementar un contador. Los primeros pasos coinciden con los de la Práctica 6, si quieres puedes/debes cambiar el nombre del proyecto.
1. Para empezar debes crear un proyecto siguiendo los pasos de la práctica 7. TEN CUIDADO CON LAS NUEVAS VERSIONES LAS PANTALLAS CAMBIAN, LO SIENTO.
[pic 1]
2. Crear el fichero con el código en VHDL.
[pic 2]
3. Aquí tienes el código que debes “pegar” en tu proyecto. A continuación explicaremos cada parte por separado para que puedas completar la tarea de la práctica.
ATENCIÓN: La versión 14 del ISE de Xilinx no añade por sí sola las siguientes declaraciones (no sé por qué), hazlo tú a mano:
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Entradas y salidas:
port(
clk: in std_logic;
reset: in std_logic;
enable_seg: out std_logic_vector (3 downto 0);
siete_seg: out std_logic_vector (6 downto 0)
);
Signals (Aquello no es ni entrada ni salida, pero que hace falta en el programa. Aquello que sale de un bloque/process y va a otro). Va entre architecture y begin: NO EN OTRO SITIO
signal cont_aux_base: integer range 0 to 50000000;
signal cont_segundos: integer range 0 to 9;
4. Código VHDL, Programa que describe al contador.
Tiene dos partes: en la primera contamos hasta 50 millones porque el reloj interno de la FPGA va a 50 MHz (bienvenidos al mundo de lo súper-rápido). La segunda parte es un contador que suma 1, cada vez que pasa un segundo, es decir, cada vez que el otro contador ha llegado a 50 millones.
FÍJATE EN LA DIFERENCIA DE USAR ENTEROS (INTEGER en las SIGNALS)
[pic 3]
5. Contador base del reloj para generar segundos
process(clk, reset)—contador de 50 millones de flancos
begin
if reset='1' then
cont_aux_base<=0;
elsif clk='1' and clk'event then
if cont_aux_base=50000000 then -- comparar con 50 millones
cont_aux_base<=0;
else
cont_aux_base<=cont_aux_base+1;
end if;
end if;
end process;
[pic 4]
6. Contador de segundos
process(clk, reset) – contador de seg, suma 1 por cada 50 millones del otro
begin
if reset='1' then
cont_segundos<=0;
elsif clk='1' and clk'event then
if cont_aux_base=50000000 then
if cont_segundos=9 then -- comparar con nueve
cont_segundos<=0;
else
cont_segundos<=cont_segundos+1;
end if;
end if;
end if;
end process;
[pic 5]
7. Decodificación sobre el siete segmentos
Y luego viene la decodificación, como siempre. En este caso destaca que voy a apagar tres de los 7-segmentos para encender uno solo, el de la derecha del todo (creo). FÍJATE EN LA DIFERENCIA DE USAR ENTEROS (INTEGER en las SIGNALS)
process(cont_segundos)--¿hay errores en el BCD-7 segmentos?
begin
case cont_segundos is
when 0 => siete_seg<="0000001";
when 1 => siete_seg<="1001111";
when 2 => siete_seg<="0011001";
when 3 => siete_seg<="0000101";
when 4 => siete_seg<="1001100";
when 5 => siete_seg<="0100100";
when 6 => siete_seg<="1100000";
when 7 => siete_seg<="0001110";
when 8 => siete_seg<="1111111";
when 9 => siete_seg<="0001100";
when others => siete_seg<="1111111";
end case;
end process;
enable_seg<="1110"; --apagamos tres y encendemos un 7-segmentos
8. Asignación de pines de la FPGA a las entradas y salidas
Ahora viene las asignaciones de pines a cada entrada y salida, o sea el fichero UCF. Hay que copiar y adaptar esta parte. Y ACUÉRDATE DE QUE NO HACE CASO A LA PRIMERA.
#PACE: Start of Constraints generated by PACE
#PACE: Start of PACE I/O Pin Assignments
NET "enable_seg<0>" LOC = "D14" ;
NET "enable_seg<1>" LOC = "G14" ;
NET "enable_seg<2>" LOC = "F14" ;
NET "enable_seg<3>" LOC = "E13" ;
#anodo comun activo por nivel bajo
NET "reset" LOC = "M13" ;
NET "clk" LOC = "T9" ;
#Frecuencia de 50 MHz
NET "siete_seg<6>" LOC = "E14" ;
...