Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
1. IDENTIFICACIÓN DE LA GUÍA
2. FUNDAMENTO TEÓRICO
La implementación de un sistema digital sobre una FPGA (Field Programmable Gate Array)
debe realizarse a través de una metodología de diseño que, de acuerdo a lo sugerido por la
compañía Xilinx [1], consiste de las siguientes fases:
3. Implementación.
Página 1 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
Los componentes con los puertos de entrada salida deben estar en el nivel superior de la
jerarquía. Esto mejora la legibilidad del diseño.
Las señales de reloj del sistema también deben estar en el nivel superior de la jerarquía.
De esta forma se facilita compartir estas señales entre módulos optimizando los recursos,
el desempeño y la disipación de potencia.
Usar registros de almacenamiento para las señales de entrada y salida de los módulos. De
esta forma es posible mantener las rutas críticas dentro de un límite lógico, lo que ayuda
a mantener la trazabilidad a la hora de depurar el código.
Señales que estén relacionadas deben mantenerse dentro del mismo nivel jerárquico, ya
que permite que sean probadas y modicadas con cierta facilidad, lo que mejora el proceso
de depuración.
En lugar de que los atributos se apliquen a nivel de señal, el diseñador debe aplicarlos a
nivel de módulo. De esta forma el código se mantiene más ordenado y escalable, ya que
el atributo se puede propagar a través de todas las señales dentro de la misma jerarquía.
Página 2 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
En este punto el diseñador pasa a la etapa en la cual debe comprender cómo su diseño
se mapeo sobre los recursos de la FPGA, y de esta manera adelantarse a futuros problemas
o contar con mayor información a la hora de tomar ciertas decisiones. Esta fase es de nivel
avanzado y no la realizaremos durante este curso.
Página 3 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
Implementación
La implementación es el siguiente paso luego de la selección del dispositivo, la conguración
de los IPs, la especicación del sistema y la denición de las restricciones. Implementar consiste
en compilar el diseño a través de la síntesis, y ubicar dentro del dispositivo los recursos a usar
y enrutar los paths de datos para luego generar el archivo con el que se programará la FPGA.
Este proceso puede ser iterativo.
Sintetizando
Durante el proceso de síntesis Vivado toma la descripción y las restricciones temporales del
sistema y genera un netlist optimizado que es funcionalmente equivalente a la descripción HDL.
Esto signica que a partir de cualquier descripción HDL Vivado puede crear la lógica necesaria
que lo implemente. Por supuesto, se requieren restricciones temporales realistas.
Hay dos formas en las cuales Vivado corre la síntesis: globalmente o fuera de contexto. En
este curso siempre sintetizaremos el diseño completo, síntesis global, lo que permite maximizar la
optimización y facilitar el análisis. En la síntesis fuera de contexto ciertos niveles de la jerarquía
estructural del sistema se sintetizan en forma separada lo que reduce el tiempo de compilación
y asegura la estabilidad cuando se realizan cambios en el diseño.
Implementando el diseño
La implementación incluye todos los pasos necesarios para ubicar y enrutar el netlist den-
tro de los recursos del dispositivo, mientras se cumplen las restricciones lógicas, físicas y de
tiempo. Este proceso puede ser incremental con el n de reutilizar ubicaciones de recursos y
enrutamientos existentes.
La optimización lógica consiste en remover celdas sin carga, la propagación de las entradas
constantes y la optimización de la potencia de los bloques de memoria RAM. Así mismo, vuelve
a mapear con el n de disminuir la profundidad del path de datos combinando LUTs (Look Up
Table) en serie.
El motor de ubicación de Vivado posiciona las celdas del netlist en lugares especícos del
dispositivo y analiza los tiempos de holgura negativos (retardo en las señales mayores a un ciclo
de reloj) con el n de corregir restricciones o volver a enrutar la implementación. Opcional-
mente es posible corregir los paths con tiempo de holgura negativo realizando un proceso de
optimización física.
Página 4 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
/ŶŝĐŝŽ
ŝǀŝĚŝƌĞŶ
ũĞƌĄƌƋƵŝĐĂŵĞŶƚĞ ĚĞƐĂĐŽƉůĂƌůŽƐ
/ŵƉůĞŵĞŶƚĂƌ
ĞƐĐƌŝďŝƌ
ĨƵŶĐŝŽŶĂůŝĚĂĚĐŽŶ
ĐŽŵƉŽŶĞŶƚĞƐ
s,>ŽsĞƌŝůŽŐ
ĐŽŶ,>
EŽ /ŶƐƚĂŶĐŝĂƌƚŽĚŽƐ ůŽƐ
ĐŽŵƉŽŶĞ ŶƚĞƐĞ
ŝŶƚĞƌĐŽŶĞ ĐƚĂƌůŽƐ
&ŝŶ
ĐŽŵƉŽŶĞ ŶƚĞ͍
^ş
ƌĞĂƌĂƌĐŚŝǀŽLJ
ĐŽŶĨŝŐƵƌĂƌ͘ZĞǀŝƐ Ăƌ
/ŶƚĞŐƌĂƌ ĞƐƋƵĞŵĄƚŝĐŽ
ĐŽŵƉŽŶĞŶƚĞƐ
WƵĞƌƚŽƐ ĐŽŶƉŝŶĞƐLJ
ŶŝǀĞůĞƐĚĞǀŽůƚĂũĞ
^ŝŵƵůĂƌ
ZĞǀŝƐ Ăƌ
ĞƐƋƵĞŵĄƚŝĐŽĚĞ &ŝŶ
ĞĨŝŶŝƌƌĞƐƚƌŝĐĐŝŽŶĞƐ
ƌĞĐƵƌƐŽƐ
^ŝŶƚĞƚŝnjĂƌ͕ WƌŽŐƌĂŵĂƌ&W'LJ
ŝŵƉůĞŵĞŶƚĂƌLJ ǀĞƌŝĨŝĐĂƌ
ŐĞŶĞƌĂƌďŝƚƐƚƌĞĂŵ ĨƵŶĐŝŽŶĂŵŝĞŶƚŽ
Ejemplo
El multiplexor es un circuito digital combinacional utilizado en variadas aplicaciones, como
lectores de códigos de barra, transmisores de presión y temperatura, lectores biométricos, siste-
mas de comunicación por video, etc. [5]. En este ejemplo vamos a implementar un multiplexor
Página 5 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
4 a 1, esto es, un circuito que tiene 4 entradas tipo bit y una salida tipo bit y a partir de dos
líneas de selección, también tipo bit, se determina cuál de las entradas pasará a la salida (véase
Figura 2).
X3
X2 Y
Mux4 a 1
X1
X0
S1 S0
Los datos de entrada de este circuito son X3 X2 X1 X0 (trazo azul), las líneas de selección
son S1 S0 (trazo rojo), y la salida es Y (trazo verde). La combinación de las líneas de selección
determina cuál de las cuatro entradas pasará a la salida.
En VHDL la descripción de un circuito digital consta de dos partes, la declaración de los
puertos de entrada/salida, denominada entidad (entity ), y la descripción de la funcionalidad,
denominada arquitectura (architecture ).
El multiplexor 4 a 1 tiene seis entradas, que las podemos denominar X y S, donde X es de
4 bits y S es de 2 bits, y tiene una salida, Y, de 1 bit. En VHDL la declaración de la entidad
describe un módulo desde un punto de vista externo (véase líneas 4-9 del Código 2.1). Allí se
especica la interfaz que permite que el módulo sea utilizado en un sistema e incluye el nombre
del módulo (línea 4 ) y la declaración de los puertos de entrada/salida (líneas 5-8 ). En este caso
el módulo se llama Mux4To1 y los puertos de entrada son X y S, de 4 y 2 bits respectivamente,
y el puerto de salida es Y, de 1 bit, todos del tipo std_logic. En los puertos con múltiples bits
se debe establecer el peso de estos, por ejemplo, 3 downto 0 signica que el bit de mayor peso
(MSB - Most Signicant Bit) está en la posición 3, y el bit menos signicativo (LSB - Least
Signicant Bit) en la posición 0. También se puede establecer el orden inverso, 0 to 3, con el
MSB en la posición 0 y el LSB en la posición 3. VHDL no es sensible al caso, esto quiere decir
que entity y ENTITY son equivalentes, además casi todas las sentencias nalizan con punto
y coma (;), y los comentarios de una sola línea inician con un doble guión (- -).
La arquitectura especica la operación del módulo (véase líneas 11-22 del Código 2.1),
describiendo su comportamiento o estructura. Una arquitectura debe tener un nombre, en
este caso rtl, y siempre debe estar asociada con una declaración de entidad, en este caso con
Mux4To1 (línea 11 ), y de esta manera poder acceder a los puertos denidos allí. La zona
de declaraciones de la arquitectura es el área entre las palabras reservadas architecture y
begin, y es donde se declaran las señales que no son puertos, pero que sirven para interconectar
elementos como compuertas o módulos, y los componentes, que se utilizan en el modelado
estructural. La descripción del sistema se realiza entre las palabras reservadas begin y end
architecture, líneas 16-22, y para ello se pueden utilizar sentencias concurrentes, procesos e
instancias de componentes, lo cual está directamente relacionado con el modelado por ujo de
datos, comportamental y estructural, respectivamente.
Para describir un circuito se requiere conocer su estructura interna o su comportamiento.
En este caso, el multiplexor 4 a 1 es un circuito que selecciona una de sus entradas para pasarla
a la salida (véase Figura 3).
El funcionamiento de la estructura interna del multiplexor 4 a 1 puede representarse por
medio de una tabla de verdad (véase Tabla 1), en la cual se evidencia que el bit de salida Y
será uno de los bit de la entrada X, el cual se escogerá a partir de las líneas de selección S.
En VHDL existe fundamentalmente dos tipos de instrucciones: concurrentes y secuenciales.
Página 6 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 entity Mux4To1 is
5 port (
6 X : in std_logic_vector(3 downto 0);
7 S : in std_logic_vector(1 downto 0);
8 Y : out std_logic);
9 end Mux4To1;
10
11 architecture rtl of Mux4To1 is
12
13 -- Zona de declaracciones de
14 -- arquitectura
15
16 begin
17 with S select Y <=
18 X(0) when "00",
19 X(1) when "01",
20 X(2) when "10",
21 X(3) when others;
22 end architecture;
X3 Mux4 a 1
X2 Y
X1
X0
S1 S0
El código concurrente está destinado para el diseño de circuitos combinacionales (sin memo-
ria), como el multiplexor 4 a 1, mientras que el código secuencial se usa tanto para circuitos
combinacionales como secuenciales (circuitos con memoria).
EN VHDL la instrucción with-select-when permite seleccionar de un grupo de señales
de entrada, cual de ellas se asignará a la señal de salida (véase líneas 17-21 del Código 2.1).
Cuando S = 00 a la salida Y se le asigna el bit X(0), cuando S = 01 a Y se le asigna el bit
X(1), cuando S = 10 se le asigna a Y el bit X(2) y en cualquier otro caso de S la salida Y será
igual al bit X(3).
Para vericar el funcionamiento del sistema se debe crear un archivo de simulación, común-
mente conocido como testbench, el cual es un código que aplica algunos estímulos al modelo
y verica la respuesta con el n de establecer el correcto funcionamiento del circuito. De esta
manera, se puede establecer si el código sintetizable cumple o no con lo especicado. El test-
Página 7 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
bench es una entidad en VHDL sin puertos, que reproduce las condiciones de operación real
del dispositivo bajo prueba (DUT - Device Under Test ) y verica que para cada estímulo de
entrada el diseño satisface los requerimientos. Si por lo menos para una combinación de las
señales de entrada el sistema no produce la salida esperada, se considera que la prueba falló y,
por lo tanto, el dispositivo no fue creado correctamente.
El testbench generalmente consta de tres partes: el generador de estímulos, la declaración
e instancia del DUT y el vericador de salida. En VHDL se debe declarar e instanciar el
componente a probar y el generador de estímulos se puede implementar con un process. De
manera opcional se puede incluir en el proceso un vericador de la respuesta del DUT a cada
una de las diferentes combinaciones de las señales de entrada. El generador de estímulos puede
incluirse todas las combinaciones de las señales de entrada o, si son demasiadas, solo algunas.
Además, se debe dar un intervalo de tiempo para el cambio en los estímulos y con este intervalo
denir la duración del proceso de simulación.
EL Código 2.2 es el testbench en VHDL para el multiplexor 4 a 1. La entidad en este archivo
no tiene puertos declarados, lineas 4-6, la declaración del DUT se ve en las líneas 10-15 y la
instacia en la línea 22, y el generador de estímulos es el proceso denido en las líneas 24-43.
En el Código 2.2 podemos destacar lo siguiente: las señales x_tb, s_tb y y_tb, declaradas
en las líneas 16-18, se utilizan para estimular y obtener la respuesta del DUT ; la constante
delay, declarada en la línea 19, es el intervalo de tiempo entre estímulos (20 ns), establecido en
el generador de estímulos con la instrucción wait for delay ; el valor asignado a la señal x_tb
está en hexadecimal, mientras que el valor de la señal s_tb está en binario, por ejemplo, en la
línea 32 a x_tb se le asignó el valor hexadecimal F (prejo x), esto es, el 15 en decimal o el
1111 en binario, mientras que a la señal s_tb se le asigna el binario 11 (sin prejo) o sea el 3
en decimal; como el proceso no tiene una lista de sensibilidad se ejecuta indenidamente, sin
embargo la instrucción wait de la línea 42 detiene su ejecución, por lo tanto dicho proceso solo
se ejecuta una vez.
La implementación de un sistema digital de mediana o alta complejidad puede requerir la
especicación de múltiples restricciones, por ejemplo, restricciones para las señales de voltaje,
la asignación de pines y la temporización. Algunas de ellas se hacen antes de la síntesis, otras
deben ser postsíntesis. Para este caso en particular solo consideraremos la asignación de puertos
del sistema a pines de entrada/salida de la FPGA, y la indicación de que estos pines son CMOS
de 3,3 V .
Cuando la simulación dio los resultados esperados y los pines fueron asignados se continua
con la síntesis, la implementación y la generación del bitstream. Estos tres pasos son en cadena,
y si alguno falla no se puede continuar. Después de la síntesis es interesante revisar el esque-
mático de los recursos que la FPGA destiná para la implementación y, si es necesario, denir
restricciones de temporización en sistemas secuenciales síncronos.
Finalmente, para programar la FPGA y vericar el funcionamiento se debe abrir el admi-
nistrador de hardware con el n de que la tarjeta sea detectada, y programar la FPGA con el
archivo de extensión bit que genera el proyecto.
Página 8 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
3
4 entity Mux4To1_tb is
5 -- Port ( );
6 end Mux4To1_tb;
7
8 architecture Behavioral of Mux4To1_tb is
9 -- Declaración del componente a simular.
10 component Mux4To1 is
11 port (
12 X : in std_logic_vector(3 downto 0);
13 S : in std_logic_vector(1 downto 0);
14 Y : out std_logic);
15 end component Mux4To1;
16 signal x_tb : std_logic_vector(3 downto 0);
17 signal s_tb : std_logic_vector(1 downto 0);
18 signal y_tb : std_logic;
19 constant delay : time := 20 ns; -- retardo entre estímulos.
20 begin
21 -- Instancia del componente a simular
22 mux_0:Mux4To1 port map(X => x_tb, S => s_tb, Y => y_tb);
23 -- Proceso a ejecutar indefinidamente.
24 process
25 begin
26 x_tb <= x"2"; s_tb <= "00";
27 wait for delay;
28 x_tb <= x"9"; s_tb <= "01";
29 wait for delay;
30 x_tb <= x"5"; s_tb <= "10";
31 wait for delay;
32 x_tb <= x"F"; s_tb <= "11";
33 wait for delay;
34 x_tb <= x"3"; s_tb <= "00";
35 wait for delay;
36 x_tb <= x"6"; s_tb <= "01";
37 wait for delay;
38 x_tb <= x"5"; s_tb <= "10";
39 wait for delay;
40 x_tb <= x"0"; s_tb <= "11";
41 wait for delay;
42 wait; -- detiene la ejecución del proceso.
43 end process;
44 end Behavioral;
Página 9 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
3. OBJETIVO(S)
Utilizar Vivado para realizar el ujo de diseño completo de un sistema digital básico
utilizando un modelo basado en HDL y un conjunto de restricciones.
Utilizar Vivado para realizar, sobre un sistema digital básico, los procesos de simulación,
síntesis, implementación y generación del bitstream con el n de vericar su funcionalidad
sobre un sistema de desarrollo basado en FPGA.
4. RECURSOS REQUERÍDOS
Estación de trabajo o equipo de cómputo con Vivado.
El estudiante debe estar en capacidad de sustentar ante el docente los siguientes aspectos
utilizando Vivado:
Crear proyectos.
Congurar la simulación.
Simular el sistema e interpretar los resultados: en este paso los estudiantes deben crear
un archivo de simulación con por lo menos ocho combinaciones diferentes de las señales
de entrada (véase Código 2.1).
Página 10 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
Consultar el esquemático con los recursos utilizados por la FPGA para su implementación.
2. IC 2: SN54LS138-SP decodicador de 3 a 8.
6. IC 6: SN74HC151-Q1 multiplexor de 8 a 1.
7. DISPOSICIÓN DE RESIDUOS
Esta práctica no genera residuos.
Referencias
[1] Xilinx, UltraFast Design Methodology Guide for the Vivado Design Suite, tech. rep.,
Xilinx, Inc., San Jose, CA, 2020.
[2] Digilent, Nexys 4 FPGA Board Reference Manual, tech. rep., Digilent, Inc., Pullman, WA,
2016.
[3] Digilent, Nexys A7 FPGA Board Reference Manual, tech. rep., Digilent, Inc., Pullman,
WA, 2019.
[4] Xilinx, Vivado Design Suite User Guide: Designing with IP, tech. rep., Xilinx, Inc., San
Jose, CA, 2020.
[5] Texas Instruments Inc., SN74LVC2G157 Single 2-Line to 1-Line data selector multiplexer,
tech. rep., Texas Instruments, Inc., Dallas, TX, 1999.
Página 11 de 12
GUÍA DE TRABAJO PRÁCTICO - Código FGL 029
EXPERIMENTAL Versión 02
Talleres y Laboratorios de Docencia ITM Fecha 08-10-2018
Versión: 5.1
Página 12 de 12