Logo Studenta

Escuela Politécnica Superior _ Universidad Autónom _ Grado en Ingeniería Informática _ asignatura_ DIE _ DIE Practi

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

DIE Practicas/Diapositivas_explicaciones_P2.pdf
Práctica 2
Diapositivas utilizadas en las explicaciones
 
freq_divider 
SyncReset EnableOut 
Clk 
rst_adapt 
ResetIn ResetOut 
Clk 
Reset signal 
to all circuit 
Clock signal 
to all circuit 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
Reset 
counter <10> 
Count (3:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
counter <10> 
Count (3:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
counter <6> 
Count (2:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
display_ctrl 
Reset 
Clk 
Tenths (3:0) 
UpdateDisplay 
Seconds (3:0) 
Tens (2:0) 
ResetX Clk 
StartStop 
Lap 
SetToZero 
stopwatch_fsm 
ClearCount 
Reset 
EnableCountOut 
Clk 
StartStop 
Lap 
SetToZero 
EnableCountI
n 
UpdateDisplay 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
stopwatch 
SClk 
RClk 
Ser 
SClk 
RClk 
Ser 
External port 
Esquema
stopwatch
Base de tiempos = enable
clk
enable
Base de tiempos = enable
clk
enable
D Q
CLK
E
Base de tiempos = enable
clk
enable
D Q
CLK
E
D Q
CLK
SÍ NO
Generics
entity counter is
generic (
COUNT_LENGTH : integer := 100
);
port (
Clk : in std_logic;
...
);
end counter;
i_counter_tenths : counter
generic map (
COUNT_LENGTH => 10
)
port map (
Clk => Clk,
...
);
Diseño síncrono
• Ideal : reloj único para todo el diseño
• Soporte del concepto RTL
• Simplifica el Static Timing Analysis
Situación asíncrona 1: interfaz con el exterior
Chip
(FPGA/ASIC)
Dominio Clk:
Síncrono
Exterior
Entrada 
asíncrona
Situación asíncrona 2: diferentes “dominios de reloj”
Chip
Dominio Clk1:
Síncrono
Dominio Clk2:
Síncrono
CDC
Clock Domain Crossing
Clock Domain Crossing (CDC)
= Transferencia entre 2 dominios de reloj
→ Hay que asegurarse de que se haga de un modo seguro
(No confundir con el otro CDC, tener más de un dominio de reloj puede ser 
una enfermedad, pero también algo normal)
10
Si una señal de un dominio va a dos FFs de otro dominio totalmente 
asíncrono, debido a los diferentes retardos, uno de ellos puede 
considerar la señal antes y el otro después de una transición.
Muestreo múltiple
(situación similar a lo que puede pasar dentro de un dominio si 
no cumplimos la constraint de periodo de reloj)
¡ 1 señal en nuestro RTL, múltiples valores en realidad !
D Q
D Q
D Q
retardo 2
retardo 1
mySignal
11
Mejor si capturamos la señal con un único FF y luego la usamos en 
donde haga falta:
El muestreo ha de ser único
D Q
D Q
D Q
mySignal
D Q
12
• Cuando el dato de entrada cambia “a la vez” que el 
reloj, el FF entra en un estado metaestable.
Metaestabilidad
D Q
tSETUP
13
• La salida del estado metaestable finalmente se produce, pero no 
está acotado cuánto puede tardar.
→ Tiempo de asentamiento: distribución probabilística.
• Si la salida del FF es capturada por otros FFs cuando ya se ha 
estabilizado, no hay un problema en el funcionamiento de la lógica
– Para esto hay que contar con cualquier retardo de lógica e 
interconexión hacia esos FFs destino
Metaestabilidad (2)
D Q
t asentamiento 
aleatorio
0 1
14
• Si la salida del FF metaestable llega a múltiples sitios podría 
causar corrientes elevadas, siendo peligroso.
• Si la señal va a varios destinos, cada uno la puede 
interpretar de una manera con la llegada del flanco de reloj.
¡ 1 señal en nuestro RTL, múltiples valores en realidad !
Metaestabilidad: efectos
15
• Tiempo medio entre fallos:
Metaestabilidad: efectos (2)
MTBF = 
fClk · fIN · Tw
e T/
• fClk : Frecuencia de reloj
• fIN : Frecuencia de transiciones en la entrada
• Tw : Ventana de susceptibilidad del FF
•  : Constante de tiempo de asentamiento del FF
• T : Ventana de asentamiento
Cuanto más tiempo 
haya disponible, antes 
del siguiente flanco de 
reloj, para que la señal 
se asiente, menor 
probabilidad de fallo.
Comportamiento 
exponencial
16
• No podemos evitar la metaestabilidad pero si tolerarla.
• Solución simple: utilizar 2 FFs de sincronismo
Tolerancia a la metaestabilidad
El 2º FF captura la 
salida del primero, 
proveyendo un 
valor estable (y 
único)
D Q D Q
CLK1 CLK2
D Q D Q
D Q
17
– Cuanta menor frecuencia, más fácil será que FF2 capture el 
dato ya estable.
– Cuanto más rápido el camino entre FF1 y FF2, más 
facilitaremos que FF2 capture el dato ya estable.
– Si aumentamos el número de FFs, introducimos un factor 
multiplicativo en el MTBF: interesante si la frecuencia es alta 
(donde “alta” depende de la tecnología utilizada).
Sincronizador de cadena de FFs 
D Q D Q
FF1 FF2
QDQD QDQD Según la circunstancias 
puede ser recomendable 
usar más de 2 FFs
18
entity my_block is
port (
Clk : in std_logic; -- Reloj
DataIn : in std_logic; -- Entrada de dato de otro dominio
...
);
end my_block;
architecture rtl of my_block is
signal dataMeta : std_logic;
signal dataSync : std_logic;
begin
process (Clk)
begin
if rising_edge(Clk) then
dataMeta <= DataIn;
dataSync <= dataMeta;
end if;
end process;
...
end architecture rtl;
Sincronizador en VHDL: 2 FFs
D Q D Q
DataIn dataSync
dataMeta
Barrera de antimetaestabilidad
19
entity sync is
generic (
META_LENGTH : integer := 2 -- Numero de FFs en la cadena (min=2)
);
port (
DataIn : in std_logic; -- Entrada de dato
Clk : in std_logic; -- Reloj con el que sincronizar la salida
DataOut : out std_logic -- Salida de dato
);
end sync;
architecture rtl of sync is
signal dataMeta : std_logic_vector (META_LENGTH-1 downto 0);
begin
process (Clk)
begin
if rising_edge(Clk) then
dataMeta <= dataMeta (META_LENGTH-2 downto 0) & DataIn;
end if;
end process;
DataOut <= dataMeta (META_LENGTH-1);
end architecture rtl;
Sincronizador en VHDL: N FFs
QDQD QDQD
dataMeta[0] dataMeta[1]
dataMeta
[META_LENGTH-1]
DataIn
DataOut
Otros mecanismos de sincronización entre 
dominios de reloj
• En circuitos con más de un dominio de reloj, se aplican diversas técnicas 
para transferir señales entre dominios:
• Cadenas de antimetaestabilidad
• FIFOs
• Código Gray en buses
• Handshaking
• …
ptrWrite
ptrRead
• En el laboratorio de DIE solo 
usaremos 1 dominio interno y solo 
veremos las cadenas de 
antimetaestabilidad.
Ej. FIFO 
entre dos 
dominios 
de reloj
Debouncing de pulsadores
• El pulsado de un botón no produce una señal limpia, hay “rebotes” entre 
0 y 1 hasta que la señal finalmente se estabiliza.
Debouncing de pulsadores
• El pulsado de un botón no produce una señal limpia, hay “rebotes” entre 
0 y 1 hasta que la señal finalmente se estabiliza.
Si muestreamos la entrada del pulsador muy rápidamente, veremos las subidas y bajadas:
……….-0-0-0-0-0-1-0-1-0-1-1-1-1-0-1-1-0-…….-1-1-1-1-1-1-1……
Debouncing de pulsadores
• El pulsado de un botón no produce una señal limpia, hay “rebotes” entre 
0 y 1 hasta que la señal finalmente se estabiliza.
Si espaciamos los muestreos, solo veremos una subida:
… 0 0 1 1 1 … o bien:
… 0 0 0 1 1 …
Bloque debounce
Antimetaestabilidad
Muestreo espaciado del dato 
ya sincronizado
Enable = base de tiempos 0.1 s
25
• Cuando utilizamos un reset para un circuito, este puede venir del exterior o de 
otro dominio de reloj.
• En tal caso, es necesario sincronizarlo.
• Lo importante es sincronizar la “de-aserción”, no la “aserción”:
Nos importa que todo el circuito salga de
reset a la vez.
Sincronización del reset
QDQDResetIn
ResetOut
Clk
ResetIn
Clk
ResetOut
En ASICs es típico un esquema como el siguiente:
Asercíón asíncrona Deasercíón síncrona
Reset
D Q
R
D Q
R
Bloque rst_adapt
QDQDResetIn
ResetOut
Clk
Cadena de longitud 
parametrizable
Detección de botones en la máquina de estados
RUNNING!
STOPPED!
RUNNING!
. . .
StartStop
Necesitamos 
detectar un flanco
Detectar un flanco (p.ej. de subida)
StartStop
Easy-peasy, tenemos 
flip-flops que detectan 
flancos
D Q
CLK
Detectar un flanco (p.ej. de subida)
StartStop
Easy-peasy, tenemos 
flip-flops que detectan 
flancos
D Q
CLK
NO
Detectar un flanco (p.ej. de subida) bien (I)
StartStop
startStopReg
Pasar una señal por un FF es retrasarla un cicloD Q
CLK
Detectar un flanco (p.ej. de subida) bien (II)
StartStop
startStopReg
Tenemos una señal que ocurre un 
solo ciclo por pulsación del botón, 
alineada al flanco de subida de 
StartStop
startStopRise
D Q
CLK Usar ésta en la FSM
FAST_SIMULATION
• Truco para acelerar 
simulaciones mientras 
se depura el circuito.
• Añadimos multiplexor.
1
FAST_SIMULATION
• Truco para acelerar 
simulaciones mientras 
se depura el circuito.
• Añadimos multiplexor.
• En esa posición, 
funcionamiento normal.
1
FAST_SIMULATION
• Truco para acelerar 
simulaciones mientras 
se depura el circuito.
• Añadimos multiplexor.
• En esa posición, 
funcionamiento normal.
• En esa otra posición, el 
tren de pulsos que era 
la base de tiempos es 
ahora un ‘1’ fijo -> el 
contador de décimas de 
segundo se moverá con 
cada ciclo de reloj.
1
FAST_SIMULATION (II)
• Controlamos el multiplexor mediante un generic.
• Su valor por defecto pondrá al multiplexor en funcionamiento normal → Síntesis
• Desde el testbench, un generic map podrá acelerar las simulaciones.
freq_divider
‘1’
resto del circuito
TRUE
FALSE
FAST_SIMULATION
(generic de tipo boolean)
stopwatch
FAST_SIMULATION := false
stopwatch_tb
FAST_SIMULATION => TRUE
(por defecto)
(generic map)
entity stopwatch_tb …
end …
architecture ...
begin
Testbench (I)
No tiene puertos ni generics
Declaraciones:
- component stopwatch --> igual que entity stopwatch 
- Constantes que el enunciado pide definir
(periodo de reloj, tiempo de la fase principal de la simulación)
- Señales:
- Las necesarias para estimular stopwatch y ver sus salidas
- endSimulation, de tipo boolean
architecture ...
…
begin
end …
Testbench (II)
Instancia de stopwatch
• Con generic map para FAST_SIMULATION y señales conectadas
process para el “programa principal” del test:
• Dar valor a entradas de stopwatch (no al reloj)
• Retirar el reset tras N periodos de reloj (wait for)
• Hacer un “pulsado” de StartStop de duración TP
• Esperar el tiempo definido por la constante SIM_TIME
• Activar endSimulation
• wait;
process para generar un reloj con periodo CLK_PERIOD
• En bucle continuo hasta que endSimulation sea TRUE
• Para con un “wait;”
N , TP , SIM_TIME → ver enunciado
estímulos
control fin de 
la simulación
__MACOSX/DIE Practicas/._Diapositivas_explicaciones_P2.pdf
DIE Practicas/Diapositivas_explicaciones_P3.pdf
Práctica 3
Diapositivas utilizadas en las explicaciones
SLICE
OLOGIC
ILOGIC
Output, tri-state 
buffer
(OBUF)
Input buffer
(IBUF)
Pad
Entradas y salidas básicas
STA: Static Timing Analysis – Qué es
Analizar de forma estática (sin una simulación en la que avance el tiempo) si 
el circuito cumple los requisitos de temporización.
• Entradas del proyecto: constraints
• Periodo de reloj.
• Tiempos de propagación de datos fuera de la FPGA.
• Etc.
• Entradas de la tecnología:
• Retardos en los diferentes elementos.
• Requisitos de setup, hold, etc.
• Estructura
• Jitter previsible para el reloj
• Etc.
• Salida:
• Pasa / no pasa = ¿Estamos seguros de que cualquier pieza funcionará?
STA: Static Timing Analysis - Necesidad
Si nos funciona en el laboratorio, ¿funcionará en la aplicación?
 No tiene por qué
• Pueden variar nuestras características de operación
• Proceso -> Por fabricación, salen piezas más rápidas que otras
• Voltaje -> Velocidad a 0.98V de alimentación ≠ velocidad a 1.01V
• Temperatura -> La velocidad también depende de ella
=> Caracterización PVT realizada por el fabricante.
• Pueden variar las circunstancias externas
• P.ej. la velocidad de los chips que nos rodean.
Timing: Setup y hold
• Setup: Los FF no son “perfectos”, necesitan que el dato de entrada 
esté estable un mínimo de tiempo antes:
CLK
D
Q
R
Si este tiempo es menor que tSETUP del FF, 
su salida Q se va a un estado impredecible (‘X’)
• Hold: Mismo concepto, pero el requerimiento es de estabilidad de D
tras el flanco de reloj. También hay que cumplirlo, pero lograrlo es menos problemático, en estas prácticas no le prestaremos atención. 
Slack y frecuencia máxima de operación
• El slack es el tiempo que nos sobra para poder cumplir con los 
requisitos (si es negativo, mal)
Si encogemos más y más el periodo de reloj, el retardo (delay) va a ser el mismo y el tiempo de setup 
también, pero el slack disminuye. Cuando es 0 hemos alcanzado la frecuencia máxima para ese “path”.
CLK
D
Q
R
tSETUP
slack
delay
Camino entre FFs
D Q
C
D Q
C
Clk
A B
Periodo de reloj
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
Camino entre FFs
D Q
C
D Q
C
Clk
A B
Retardo FF (C -> Q)
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
QA
Camino entre FFs
D Q
C
D Q
C
Clk
A B
Retardo de propagación combinacional
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
QA
DB
Camino entre FFs
D Q
C
D Q
C
Clk
A B
Setup
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
QA
DB
Camino entre FFs
D Q
C
D Q
C
Clk
A B
Setup
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
QA
DB
SLACK
Camino entre FFs: análisis máximo-mínimo
D Q
C
D Q
C
Clk
A B
Setup
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
QA
DB
SLACK
Que el reloj tarde lo 
máximo esperable en llegar 
al FF origen
Y lo mínimo 
esperable en llegar 
al FF destino
Clock skew
ClkA
ClkB
D Q
C
D Q
C
A B
Retardos combinacionales 
(LUTs, etc.) + rutado (nets)
Por los distintos caminos que recorre el reloj, el flanco no llegará exactamente a 
la vez a ambos FFs.
Para el análisis de cumplimiento en setup:
• Llega después al destino → a nuestro favor
• Llega antes al destino → en nuestra contra
Skew
Clock pessimism
IBUF
Pad
BUFG
Red de distribución de reloj a los FFs (clock tree)
Hasta ese punto el retardo siempre va a ser igual para cualquier FF que dependa 
de este reloj en las ramas de la derecha (aunque, para todos, dependa de PVT)
Clock pessimism
IBUF
Pad
BUFG
Red de distribución de reloj a los FFs (clock tree)
Hasta ese punto el retardo siempre va a ser igual para cualquier FF que dependa 
de este reloj en las ramas de la derecha (aunque, para todos, dependa de PVT)
• Vivado, cuando verifica los setup, asigna primero un retardo mayor (máx.) 
hasta el FF origen y uno menor (mín.) hasta el FF destino
• Luego corrige la parte que ha de ser igual: clock pessimism
Clock uncertainty
• Realmente los flancos de reloj no son perfectos
• La detección del cambio de 0 a 1 tendrá lugar a un cierto voltaje
• La señal de reloj se ve influida por el ruido de la alimentación y de pistas cercanas
Ideal
Real
Clock jitter
Jitter = Incertidumbre
• Si en una entrada recibimos una señal desde otro chip con el mismo 
reloj, Vivado no puede saber cuánto ha tardado ese chip en proveer 
el nuevo dato desde el flanco de reloj
CHIP FPGA
Clk
• Consideramos el otro chip como un FF y le decimos
a Vivado cuánto 
ha tardado en darnos el dato desde el flanco del reloj en la placa:
set_input_delay -clock reloj tID puerto_de_entrada
tID
Constraint de entrada: set_input_delay
(tID en el datasheet del chip)
• Si damos una salida a otro chip con el mismo reloj, Vivado no puede 
saber cuánto tiempo antes del flanco de reloj necesita ese chip tener 
el dato estable
FPGA
Clk
• Consideramos el otro chip como un FF y le decimos a Vivado que 
nuestra salida tiene un recorrido externo igual al setup especificado 
en la correspondiente entrada del chip:
set_output_delay -clock reloj tOD puerto_de_salida
tOD
Constraint de salida: set_output_delay
CHIP
(tOD en el datasheet del chip)
Regla de diseño: registrar las salidas
Clk
Distintos diseñadores pueden implementar distintos bloques (o “IPs“) de un 
diseño más grande.
¿Qué pasa si varios bloques se conectan en cadena?
• Si varios diseñadores dejan un path combinacional entre entradas y salidas, se 
tendrá un path combinacional más largo -> menor frecuencia máxima
• Si cada diseñador se preocupa de registrar sus salidas, los caminos 
combinacionales quedarán limitados a un bloque.
D Q
C
In
...
...
Out
D Q
C
D Q
C
D Q
C
Clk
D Q
C
In
...
...
Out
D Q
C
D Q
C
D Q
C
Camino combinacional más largo
Seguir esta regla permite que los diseñadores analicen independientemente la 
velocidad de sus bloques tras síntesis (también puede ser tras implementación física)
__MACOSX/DIE Practicas/._Diapositivas_explicaciones_P3.pdf
DIE Practicas/DIE_Practica1-lab1_2021-22.pdf
 
 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2020/2021 v1.0 1/20 
 
 
Práctica 1 
 
Tutorial 
 
Objetivo 
 
Utilizando un diseño especialmente simple, seguir con él un flujo completo con la herramienta. 
 
 
Circuito utilizado 
 
Se trata de una lógica muy simple situada entre los interruptores (SW0-SW3) y los leds (LD0-
LD3) de la placa Zybo. 
 
 
 
 
Guía para la realización 
 
En las siguientes páginas se reproduce un tutorial del programa universitario de Xilinx, adaptado para esta 
asignatura. 
 
Antes de continuar: 
• Crear una carpeta DIE y bajo ella una carpeta P1. Será aquí donde se trabaje para esta práctica. 
• Bajar de Moodle el archivo sources.zip y extraerlo como un subdirectorio sources de P1. 
 
 
LEDs: LD0-LD3 
Switches: SW0-SW3 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 2/20 
 xup@xilinx.com 
 
Vivado Design Flow 
Introduction 
This lab guides you through the process of using Vivado IDE to create a simple HDL design targeting the 
ZYBO board. You will simulate, synthesize, and implement the design with default settings. Finally, you 
will generate the bitstream and download it in to the hardware to verify the design functionality 
Objectives 
After completing this lab, you will be able to: 
• Create a Vivado project sourcing HDL model(s) and targeting a specific FPGA device located on the 
ZYBO board 
• Use the provided Xilinx Design Constraint (XDC) file to constrain the pin locations 
• Simulate the design using the Vivado simulator 
• Synthesize and implement the design 
• Generate the bitstream 
• Configure the FPGA using the generated bitstream and verify the functionality 
Procedure 
This lab is broken into steps that consist of general overview statements providing information on the 
detailed instructions that follow. Follow these detailed instructions to progress through the lab. 
Design Description 
The design takes its inputs from the slide switches, operates on them and outputs the results to the LEDs, 
as shown in Figure 1. 
 
Figure 1. The Completed Design 
 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 3/20 
 xup@xilinx.com 
General Flow 
 
 
 
 
 
 
 
Create a Vivado Project using IDE Step 1 
1-1. Launch Vivado and create a project targeting the XC7Z010CLG400-1 device 
and using the VHDL language. Use the provided lab1.vhd and lab1.xdc files 
from the sources\lab1 directory. 
1-1-1. Open Vivado by double clicking in the Vivado 2020.1 icon. 
1-1-2. Click Create Project to start the wizard. You will see Create A New Vivado Project dialog box. 
Click Next. 
1-1-3. Click the Browse button of the Project location field of the New Project form, browse to [our_ 
location]/P1, and click Select. 
1-1-4. Enter lab1 in the Project name field. Make sure that the Create Project Subdirectory box is 
checked. Click Next. 
 
Figure 2. Project Name and Location entry (do not use the exact location shown) 
Step 5: 
Perform the 
Timing 
Simulation 
Step 6: 
Verify 
Functionality 
in Hardware 
 
 
Step 1: 
Create a 
Vivado 
Project using 
IDE 
Step 2: 
Simulate the 
Design using 
Vivado 
Simulator 
 
Step 3: 
Synthesize 
the Design 
Step 4: 
Implement 
the Design 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 4/20 
 xup@xilinx.com 
1-1-5. Select RTL Project option in the Project Type form, and click Next. 
1-1-6. Using the drop-down buttons, select VHDL as the Target Language and Simulator Language in 
the Add Sources form. 
 
Figure 3. Selecting Target and Simulator language -> Change from Verilog to VHDL 
1-1-7. Click on the Add Files… button, browse to the sources directory, select lab1.vhd, click Ok. 
Select the Copy sources into project option and then click Next to get to the Add Constraints 
form. 
1-1-8. Click on the Add Files… button, browse to the sources directory (if necessary), select lab1.xdc 
and click OK. Make sure Copy constraints files into project is selected and then click Next. 
This Xilinx Design Constraints file assigns the physical IO locations on FPGA to the switches and 
LEDs located on the board. This information can be obtained either through the board’s 
schematic or the board’s user guide. 
1-1-9. In the Default Part form, using the Parts option and various drop-down fields of the Filter section, 
select the XC7Z010CLG400-1 part: use Family=Zynq-7000, Package=clg400, Speed=-1 to 
reduce the list. Click Next. 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 5/20 
 xup@xilinx.com 
 
Figure 4. Part Selection 
 
1-1-10. Click Finish to create the Vivado project. 
Use the file system explorer and look at the [your_drive_and_dir]/P1/lab1 directory. You will 
find that the lab1.srcs directory and the lab1.xpr (Vivado) project file have been created. Two 
directories, constrs_1 and sources_1, are created under the lab1.srcs directory; deep down 
under them, the copied lab1.xdc (constraint) and lab1.vhd (source) files respectively are placed. 
 
Figure 6. Generated directory structure 
 
 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 6/20 
 xup@xilinx.com 
1-2. Open the lab1.vhd source and analyze the content. 
1-2-1. In the Sources pane, double-click the lab1.vhd entry to open the file in text mode. 
 
Figure 7. Opening the source file 
1-2-2. Read and understand the existing, incomplete code. 
1-2-3. Complete the architecture in order to implement the logic shown in Figure 1. 
1-3. Open the lab1.xdc source and analyze the content. 
1-3-1. In the Sources pane, expand the Constraints folder and double-click the lab1.xdc entry to open 
the file in text mode. 
 
Figure 8. Opening the constraint file 
1-3-2. Lines 5-12 define the pin locations of the input switches [3:0] and lines 17-24 define the pin 
locations of the output LEDs [3:0]. 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 7/20 
 xup@xilinx.com 
 
Simulate the Design using the Vivado Simulator Step 2 
2-1. Add the lab1_tb.v testbench file. 
2-1-1. Click Add
Sources under the Project Manager tasks of the Flow Navigator pane. 
 
Figure 10. Add Sources 
2-1-2. Select the Add or Create Simulation Sources option and click Next. 
 
Figure 11. Selecting Simulation Sources option 
2-1-3. In the Add or Create Simulation Sources form, click the Add Files… button. 
2-1-4. Browse to the sources folder, select lab1_tb.vhd and click OK. 
2-1-5. Make sure Copy sources into project is selected and Click Finish. 
2-1-6. Select the Sources tab and expand the Simulation Sources group. 
The lab1_tb.vhd file is added under the Simulation Sources group, and lab1.vhd is automatically 
placed in its hierarchy as a dut instance. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 8/20 
 xup@xilinx.com 
 
Figure 12. Simulation Sources hierarchy 
2-1-7. Using the Windows Explorer, verify that the sim_1 directory is created at the same level as 
constrs_1 and sources_1 directories under the lab1.srcs directory, and that a copy of lab1_tb.vhd 
is placed under lab1.srcs > sim_1 > imports > sources. 
2-1-8. Double-click on the lab1_tb in the Sources pane to view its contents. 
2-1-9. Read and understand the existing, complete code. 
 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 9/20 
 xup@xilinx.com 
 
2-2. Simulate the design for 50 ns using the Vivado simulator. 
2-2-1. Select Settings under the Project Manager tasks of the Flow Navigator pan, then Simulation. 
2-2-2. Select the Simulation tab, and set the Simulation Run Time value to 50 ns and click OK (see 
below). 
 
Figure 14. Setting simulation run time 
2-2-3. Click on Run Simulation under the SIMULATION tasks of the Flow Navigator pane, then click on 
Run Behavioral Simulation. 
The testbench and source files will be compiled and the Vivado simulator will be run (assuming 
no errors). You will see a simulator output similar to the one shown below. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 10/20 
 xup@xilinx.com 
 
 
Figure 15. Simulator output 
You will see four main views: (i) Scope, where the testbench hierarchy is displayed, (ii) Objects, 
where top-level signals are displayed, (iii) the waveform window, and (iv) Tcl Console where the 
simulation activities are displayed. Notice that since the testbench used is self-checking, the 
results are displayed as the simulation is run. 
Notice that the lab1.sim directory is created under the lab1 directory, along with several lower-
level directories. 
 
Figure 16. Directory structure after running behavioral simulation 
 
 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 11/20 
 xup@xilinx.com 
 
2-2-4. Click on the maximize button of the waveform window ( ). Then click on the Zoom Fit button 
( ) to see the entire waveform. 
Notice that the output changes when the input changes. 
You can also float the simulation waveform window by clicking on the Float button on the upper 
right hand side of the view. This will allow you to have a wider window to view the simulation 
waveforms. To reintegrate the floating window back into the GUI, simply click on the Dock 
Window button. 
 
Figure 16. Float Button 
 
Figure 17. Dock Window Button 
2-3. Change display format if desired. 
2-3-1. Select switches[3:0] in the waveform window, right-click, select Radix, and then select Unsigned 
Decimal to view this signal in an integer form. Now, using the shift or control key, select both 
switches[3:0] and leds[3:0] and change the radix to binary as we want to see each output bit. 
2-4. Add more signals to monitor the lower-level signals and continue to run the 
simulation. 
2-4-1. De-maximize the waveform window if necessary. Expand the lab1_tb instance, if necessary, in 
the Scope window and select the dut instance. 
The swt[3:0], led[3:0] and ledSig[3:0] signals will be displayed in the Objects window. 
 
Figure 18. Selecting lower-level signals 
2-4-2. Select swt[3:0] and led[3:0], right-click and select Add to Wave Window to include then into the 
waveform window to monitor those lower-level signals. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 12/20 
 xup@xilinx.com 
 
2-4-3. On the simulator tool buttons ribbon bar (below the main menu bar), type 50 in the simulation run 
time field, click on the drop-down button of the units field and select ns 
( ) to run for another 50 ns (total of 100 ns), and click on the ( ) 
button. 
The simulation will run for an additional 50 ns. Observe the new messages in the Tcl Console 
window. 
Now click on the Run All button ( ). The simulation will run until the simulator has nothing else 
to do, i.e., until our simulation is finished. 
2-4-4. Maximize the waveform window, click on the Zoom Fit button and observe the output. 
 
Figure 19. Running simulation until completion 
Observe the Tcl Console window and see the output is being displayed as the testbench uses the 
report sentence. 
 
Figure 20. Tcl Console output 
2-4-5. Close the simulator by selecting File > Close Simulation. 
2-4-6. Click OK and then click Discard to close it without saving the waveform. 
Synthesize the Design Step 3 
3-1. Synthesize the design with the Vivado synthesis tool and analyze the 
Project Summary output. 
3-1-1. Click on Run Synthesis under the Synthesis tasks of the Flow Navigator pane, then OK. 
The synthesis process will be run on the lab1.vhd file (and all its hierarchical files if they existed). 
When the process is completed a Synthesis Completed dialog box with three options will be 
displayed. 
3-1-2. Select the Open Synthesized Design option and click OK as we want to look at the synthesis 
output before progressing to the implementation stage. 
Click Yes to close the elaborated design if the dialog box is displayed. 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 13/20 
 xup@xilinx.com 
3-1-3. Select the Project Summary tab and understand the various sections. 
If you don’t see the Project Summary tab then select Layout > Default Layout, or click the 
Project Summary icon . 
 
Figure 21. Project Summary view 
3-1-4. Click on the Table tab under the Utilization section. 
Notice that there are an estimated three LUTs and 8 IOs (4 input and 4 output) that are used. 
 
Figure 22. Resource utilization estimation summary 
3-1-5. In The Flow Navigator, under Synthesis (expand Open Synthesized Design if necessary), click on 
Schematic to view the synthesized design in a schematic view. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 14/20 
 xup@xilinx.com 
 
Figure 23. Synthesized design’s schematic view 
Notice that IBUFs and OBUFs are automatically instantiated (added) to the design as the input 
and output are buffered. The logical gates are implemented in LUTs (1 input is listed as LUT1, 2 
input is listed as LUT2, and 3 input is listed as LUT3). You can see that there is not a one to one 
relationship between the basic logic elements we described in our RTL and how the circuit is 
implemented, but the result is the same. 
Using the file system explorer, verify that lab1.runs directory is created under lab1. Under the 
runs directory, synth_1 directory is created which holds several files related to synthesis. 
 
Figure 24. Directory structure after synthesizing the design 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 15/20 
 xup@xilinx.com 
 
Implement the Design Step 4 
4-1. Implement the design with the Vivado Implementation default settings and 
analyze the Project Summary output. 
4-1-1. Click on Run Implementation under the Implementation tasks of the Flow Navigator pane, then 
OK. 
The implementation process will be run on the synthesized design. When the
process is 
completed an Implementation Completed dialog box with three options will be displayed. 
4-1-2. Select Open implemented design and click OK as we want to look at the implemented design in 
a Device view tab. 
4-1-3. Click Yes, if prompted, to close the synthesized design. 
The implemented design will be opened. 
4-1-4. In the Netlist pane, select one of the nets (e.g. swt_IBUF[0]) and notice that the net is displayed in 
the X1Y1 clock region in the Device view tab (you may have to zoom in to see it). 
4-1-5. If it is not displayed, click the Routing Resources icon to show routing resources. Take a look 
to the two end points of the net. 
 
Figure 25. Viewing implemented design 
4-1-6. Close the implemented design view and select the Project Summary tab (you may have to 
change to the Default Layout view) and observe the results. 
Select the Post-Implementation tab of Utilization if not already selected and the Table view. 
Notice that the actual resource utilization is three LUTs and 8 IOs. 
You can also see that there is no Timing information, since no timing constraints were defined for 
this combinational design. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 16/20 
 xup@xilinx.com 
 
Using the file system explorer, verify that impl_1 directory is created at the same level as 
synth_1 under the lab1.runs directory. The impl_1 directory contains several files including the 
implementation report files. 
4-1-7. In Vivado, select the Reports tab in the bottom panel (if not visible, click Window in the menu bar 
and select Reports), and double-click on the utilization report entry under the Place Design 
section. The report will be displayed in the auxiliary view pane showing resource utilization. Note 
that since the design is combinational no registers are used. 
 
 
Figure 27. Viewing utilization report 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 17/20 
 xup@xilinx.com 
 
Perform Timing Simulation Step 5 
5-1. Run a timing simulation. 
5-1-1. Select Run Simulation > Run Post-Implementation Timing Simulation process under the 
Simulation tasks of the Flow Navigator pane. Disregard a possible warning message. 
The Vivado simulator will be launched using the implemented design and lab1_tb as the top-level 
module. 
Using the Windows Explorer, verify that timing directory is created under the lab1.sim > sim_1 > 
impl directory. The timing directory contains generated files to run the timing simulation. 
5-1-2. Click on the Zoom Fit button to see the waveform window from 0 to 50 ns. 
5-1-3. Right-click at 20 ns (where the switches input is set to 2) and select Markers > Add Marker. 
5-1-4. Similarly, right-click and add a marker at the moment where the leds changes to its final value for 
this input, 7. You can also add a marker by clicking on the Add Marker button ( ). 
 
Figure 28. Timing simulation output 
Notice that we monitored the expected led output at 10 ns after the input is changed (see the 
testbench), whereas the actual delay is about 8 ns. 
5-1-5. Close the simulator by selecting File > Close Simulation without saving any changes. 
 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 18/20 
 xup@xilinx.com 
Generate the Bitstream and Verify Functionality Step 6 
6-1. Connect the board and power it ON. Generate the bitstream, open a 
hardware session, and program the FPGA. 
6-1-1. Make sure that the Micro-USB cable is connected to the PROG UART connector (next to the 
power ON/OFF switch). 
6-1-2. Make sure that the JP7 is set to select USB power. Connect the USB cable to the PC. 
 
Figure 29. Board connection 
6-1-3. Power ON the switch on the board. 
6-1-4. Click on the Generate Bitstream entry under the Program and Debug tasks of the Flow 
Navigator pane, then OK. 
The bitstream generation process will be run on the implemented design. When the process is 
completed a Bitstream Generation Completed dialog box with three options will be displayed. 
 
Figure 30. Bitstream generation 
This process will have generated a lab1.bit file under impl_1 directory in the lab1.runs directory. 
 
Lab Workbook Vivado Design Flow 
 
 Based on www.xilinx.com/support/university 19/20 
 xup@xilinx.com 
6-1-5. Select the Open Hardware Manager option and click OK. 
The Hardware Manager window will open indicating “unconnected” status. 
6-1-6. Click on the Open target link, then Auto Connect. 
You can also click on the Open recent target link if the board was already targeted before. 
 
Figure 30. Opening new hardware target 
6-1-7. The Hardware Session status changes from Unconnected to the server name and the FPGA 
device is shown. Also notice that the Status indicates that it is not programmed. 
 
Figure 32. Opened hardware session 
6-1-8. Select the device and verify that the lab1.bit is selected as the programming file in the General 
tab of the Hardware Device Properties pane. 
 
Figure 33. Programming file 
6-1-9. Right-click on the device and select Program Device… or click on the Program device link to 
program the target FPGA device. 
P1: Lab1 Workbook 
 
 Based on www.xilinx.com/support/university 20/20 
 xup@xilinx.com 
 
Figure 34. Selecting to program the FPGA 
6-1-10. Click Program to program the FPGA. 
The DONE light will light when the device is programmed. You may see some other LEDs lit 
depending on switch positions. 
6-1-11. Verify the functionality by flipping switches and observing the output on the LEDs (Refer to the 
earlier logic diagram). 
6-1-12. When satisfied, close the hardware session by selecting File > Close Hardware Manager. 
6-1-13. Power OFF the board. 
6-1-14. Close the Vivado program by selecting File > Exit and click OK. 
Conclusion 
The Vivado software tool can be used to perform a complete design flow. The project was created using 
the supplied source files (HDL model and user constraint file). A behavioral simulation using the provided 
testbench was done to verify the model functionality. The model was then synthesized, implemented, and 
a bitstream was generated. The timing simulation was run on the implemented design using the same 
testbench. The functionality was verified in hardware using the generated bitstream. 
 
__MACOSX/DIE Practicas/._DIE_Practica1-lab1_2021-22.pdf
DIE Practicas/DIE_Practica3_2021-22.pdf
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 1/9 
 
Diseño de Alta Velocidad. Temporización y Segmentación 
(Pipelining) 
 
 
 
Objetivo 
El objetivo de esta práctica es el familiarizarse con la problemática del diseño de alta velocidad y 
utilizar diferentes estrategias de mejora de los resultados de “timing”. Como ejemplo, se usará un 
circuito que computa un checksum (suma de verificación) como el utilizado en las cabeceras de los 
paquetes IP (Internet Protocol), UDP o TCP. Durante el desarrollo de la práctica se verá cómo 
interpretar los reportes de “timing” proporcionados por las herramientas; también se prestará 
atención a los reportes relacionados con el área ocupada por el diseño. 
 
Descripción del Diseño 
El checksum calculado, de 16 bits, es el complemento a uno, de la suma en complemento a uno, de 
todas las palabras de 16 bits de las cabeceras y carga útil de las tramas del protocolo. En este 
circuito simplificaremos el problema al calcular el checksum de 8 palabras de entrada de 16 bits. 
 
Complemento a uno y la operación de Suma. 
 
Un sistema de complemento a uno es un sistema donde los números negativos están representados 
por el inverso de las representaciones binarias de sus correspondientes números positivos. En tal 
sistema, un número es negado (convertido de positivo a negativo
o viceversa) calculando el 
complemento de cada bit. Un número de N bits en complemento a uno sólo puede representar 
enteros en el rango − (2N−1−1) a 2N−1−1 (el complemento a dos puede expresar −2N−1 a 2N−1−1). En 
complemento a uno existe doble representación del cero (000…000 y 111…111). 
La regla empírica para la suma (o resta) es que se debe recircular el bit de acarreo. Por ejemplo, en 
un sistema de representación de 5 bits (números decimales entre -15 y 15), la suma 10dec + -5dec 
(10 dec = 01010 bin; -5 dec = 11010 bin) será: 
0 1 0 1 0 10 dec 
1 1 0 1 0 -5 dec 
(1) 0 0 1 0 0 
+ 1 
0 0 1 0 1 5 dec 
 
NOTA: Una posibilidad para sumar en complemento a uno dos números es hacer dos sumas en complemento a dos, una 
con una entrada de acarreo (carry in) a 0 y la otra con esta entrada a 1. Dependiendo de si hay acarreo de salida (carry 
out), se seleccionaría el resultado de una u otra suma en complemento a dos como el resultado de la suma en 
complemento a uno. Esto puede verse implementado en una función VHDL en el código entregado. 
 
Suma en complemento a uno usando sumadores en complemento a dos. 
 
Una interesante propiedad es que la suma de múltiples números complemento a uno puede hacerse 
con una suma en complemento a dos (suma de enteros), con una posterior reducción complemento a 
uno (recirculando los bits de acarreo). 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 2/9 
 
Ejemplos de suma de 4 valores en 5 bits. Podemos sumar los valores en complemento a 2 y realizar 
la reducción complemento a uno. 
 
0 1 0 1 1 11 1 1 1 1 1 -0 1 1 0 1 1 -4 
 1 0 0 0 1 -14 1 1 1 1 1 -0 1 1 1 0 1 -2 
0 1 1 0 1 13 1 1 1 1 0 -1 0 1 0 1 0 10 
1 1 0 1 1 -4 1 1 1 1 1 -0 1 1 1 0 1 -2 
(1 0) 0 0 1 0 0 (1 1) 1 1 0 1 1 (10) 1 1 1 1 1 
+ 1 0 + 1 1 + 1 0 
( 0) 0 0 1 1 0 6 ( 0) 1 1 1 1 0 -1 ( 1) 0 0 0 0 1 
+ 0 + 0 + 1 
0 0 1 1 0 6 1 1 1 1 0 -1 * 0 0 0 1 0 2 
 
* En este último ejemplo fue necesario el segundo ajuste (recirculación final del bit) 
 
El problema del cálculo de nuestro checksum se simplifica por tanto en realizar 8 sumas de 16 bits y 
la reducción complemento a 1. Una construcción rápida será realizar un árbol de suma de los 8 
elementos como el sugerido en la Figura 1 de abajo, más una reducción complemento a uno final. 
El circuito adicionalmente dispone de una señal SoP (Start of Packet) que señala cuándo capturar 
datos de entrada. La señal ChksumValid señala cuándo es válido el dato a la salida. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 1. Circuito que calcula el checksum, con registros en entrada y salida. 
SoP 
 
 
 
ChksumValid 
 
ChksumOut 
 
 
 
16 bits add 
 
16 bits add 16 bits add 
 
16 bits add 
 
18 bits add 
1´s comp reduc 
17 bits add 17 bits add 
not 
 
16 
 
16 
 
 
PktData0 
 
16 
 
 
16 
 
 
PktData1 
 16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
PktData2 
 PktData3 
 
PktData4 
 PktData5 
 
PktData6 
 PktData7 
 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 3/9 
 
Realización de la práctica 
La práctica consta de 4 ejercicios en los que se analiza el circuito a diferentes frecuencias de 
operación y finalmente se expone la estrategia de pipelining para aumentar su máxima frecuencia. 
 
Preparación del diseño 
Con objeto de favorecer la limpieza y comprensión del diseño se entregan directorios con la 
estructura siguiente, que habrá de mantenerse: 
P3_checksum/ 
rtl/ - Código fuente VHDL para el diseño 
sim/ - Directorio de simulación, que contiene los ficheros del banco de pruebas (testbench). 
vivado/ - Directorio que contendrá el proyecto Vivado; se entrega con un fichero .xdc con las 
restricciones (constraints) de posicionamiento de pines y una restricción inicial para 
el reloj. 
Ejercicio 1: Puesta en Marcha 
En este primer ejercicio se busca comprender el diseño, crear un proyecto Vivado para el mismo y 
realizar un primer análisis, tanto de área ocupada como de temporización: 
1. Crear un nuevo proyecto Vivado “chksum”, con su propio subdirectorio en el directorio 
vivado/. Añadir al proyecto el fichero chksum.vhd (con la casilla Copy sources into project 
desactivada) y, como ficheros de simulación (seleccionar “Simulation only”, ver imagen 
debajo), los archivos de testbench chksum_tb.vhd y package tb_fifo_pkg.vhd. 
 
Agregar también el fichero de constraints (.xdc) proporcionado. Utilizar un dispositivo Zynq 
7z020 con package clg484 y speed grade -1. Se trata de un dispositivo relativamente 
pequeño pero con suficientes pines para las entradas-salidas del diseño 
2. Lo primero es entender el funcionamiento del circuito de cómputo de checksum. 
3. Realizar una simulación funcional del diseño.¿Funciona correctamente? Interpretar los 
resultados. Obsérvese que la simulación tiene una primera zona con pulsos de la entrada SoP 
espaciados, seguida de otra zona con SoP a ‘1’ de forma continua. Comprobar la relación 
temporal entre SoP y ChksumValid (comparar para esto las ondas con el código de 
chksum.vhd). 
 En la tabla de resultados al principio de la Hoja de Respuestas, rellenar la primera celda 
(Latencia para el Ej.1). Se puede obtener la respuesta razonando sobre el código o 
viendo las ondas de la simulación. 
4. Observar el contenido del fichero de restricciones ¿Cuál es la frecuencia objetivo? ¿Qué se 
restringe adicionalmente en este fichero? 
 Anotar frecuencia y periodo objetivo en la hoja de resultados de la práctica. 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 4/9 
 
 
5. Implementar el diseño y observar los resultados post-implementación. 
5.1. Área. 
Podemos obtener datos de área en varios sitios, por ejemplo: 
• En el panel de resumen del proyecto (Project Summary). Si se hubiese cerrado esta 
ventana, puede volver a abrirse en Window-> Project Summary (icono sumatorio de 
la barra). Aquí aparece una visión resumida de la información. 
 
• Una información más completa puede obtenerse abriendo el diseño implementado (Open 
Implemented Design) y allí accediendo al informe de uso (Report Utilization) 
 En la tabla de la Hoja de Respuestas, completar las filas en rojo para la columna “Ej.1.”. 
Han de ser valores tras implementación, no tras síntesis. 
5.2. Timing. 
Podemos obtener un informe de tiempos ejecutando Report Timing Summary (también en el 
panel izquierdo). De nuevo, ha de tenerse cuidado de obtener el informe tras 
implementación, no tras síntesis. En el resumen podemos ver el peor caso para el slack 
(WNS, Worst Negative Slack). Podemos ver los 10 peores caminos en cuanto a margen para 
cumplir el setup en el apartado Intra-Clock Paths/clk/Setup. El camino crítico (el de menor 
slack, ojo, no el de menor retardo) es el primero de la lista. En la tabla podemos ver varios 
valores al respecto, pero haciendo doble clic sobre la línea correspondiente podremos 
acceder a una ventana con más detalles: 
• Resumen de datos del camino: origen, destino, slack, reloj utilizado, etc. (haciendo clic 
sobre los valores en azul se muestra la fórmula utilizada para su cálculo). 
• Source Clock Path: camino que sigue el reloj desde la entrada a la FPGA hasta el pin de 
reloj del flip-flop origen. 
• Data Path: camino de datos entre el flip-flop origen y el flip-flop destino.
• Destination Clock Path: camino que sigue el reloj desde la entrada a la FPGA hasta el 
pin de reloj del flip-flop destino. 
Estudiar este camino crítico. En él veremos diferentes recursos de la FPGA, tanto recursos 
combinacionales como flip-flops, separados por recursos de interconexión (net). Entre los 
elementos combinacionales encontraremos recursos de las slices (p.ej. LUT3, CARRY4), 
buffers de entrada/salida (p.ej. IBUF, OBUF) y buffers de reloj (BUFG). Los flip-flops 
reciben distintos nombres según la configuración utilizada (p.ej. FDRE para un FF tipo D 
configurado para usar patas de Reset síncrono y Enable). 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 5/9 
 
Dos columnas nos muestran el retardo de cada elemento (Incr) y el retardo acumulado en el 
camino (Path). Realmente en la primera columna, además de retardos, aparecen la 
contribución de otros valores temporales asociados al elemento en cuestión (p.ej. el setup de 
un FF), el instante de tiempo relativo en que ocurren los flancos de reloj implicados, y 
valores de ajuste del cálculo (p.ej. clock pessimism, clock uncertainty). 
La forma de comprobar si el path cumple con las restricciones de tiempo es ver si el dato 
llega al FF de destino antes que el reloj. En relación con esto puede observarse lo siguiente: 
• El Data Path sigue acumulando retardos a partir del punto en que termina el Source 
Clock Path, encontrándose como primer elemento del Data Path el tiempo de respuesta 
del FF (entre su reloj y su salida). 
• El Destination Clock Path tiene como punto de partida el siguiente flanco de reloj 
respecto al Source Clock Path. 
• El setup del FF destino contribuye como un valor que restamos del camino del reloj para 
el FF destino (como tenemos que tener el dato listo X tiempo antes del flanco de reloj, a 
la hora de realizar la comparación mencionada arriba es como si el flanco llegase X 
tiempo antes). Aquí se da una circunstancia que despista bastante: el setup del FF en los 
dispositivos de la Serie 7 de Xilinx es negativo, con lo que parece que se suma en vez de 
restarse (y además en la columna Incr aparece como positivo, porque muestra el 
incremento en el path, más que el valor correspondiente al elemento). 
• El pesimismo en el cálculo de los caminos del reloj (clock pessimism) suma al camino 
del reloj hacia el FF destino, es decir, se compensa el pesimismo poniendo más fácil 
cumplir la comparación mencionada arriba. 
• La incertidumbre en los tiempos a considerar para los flancos de reloj (clock uncertainty) 
resta al camino del reloj hacia el FF destino, es decir, pone más difícil cumplir el 
objetivo. 
Tras entender el reporte: 
 En la tabla de la Hoja de Respuestas, completar las filas en azul para la columna “Ej.1.”. 
 Rellenar los valores de la figura de camino crítico de flip-flop a flip-flop que aparece en 
la Hoja de Respuestas. 
 Sobre la ventana de reporte de este peor path, hacer clic con el botón derecho y 
ejecutar “Export Entire Path to Spreadsheet…”; usar el nombre de fichero 
TableEj1.xls (en el directorio vivado/). 
 
RECOMENDACIÓN: 
Crear un archivo comprimido en este momento y al terminar cada uno de los siguientes ejercicios 
(ejercicio 2, 3a, 3b y 4). De esta forma, si se desea, se podrá volver a abrir el proyecto tal como 
estaba en estos puntos. 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 6/9 
 
Ejercicio 2: Tiempos en entradas y salidas 
Para la realización de este ejercicio se tendrán en cuenta las siguientes características del sistema 
del que la FPGA formará parte: 
• Los retardos de la placa de circuito impreso (PCB) se considerarán despreciables (los chips 
están muy cercanos entre sí). 
• La FPGA está situada entre dos chips, el primero entrega los datos sobre los que realizar el 
checksum y el segundo utiliza el valor de checksum que la FPGA calcula. 
• Los tres chips funcionan síncronamente con el flanco positivo de un mismo reloj, el que la 
FPGA recibe en su puerto Clk. Este reloj tiene una frecuencia de 50 MHz. 
• En el datasheet del primer chip puede verse que éste entrega sus salidas 3 ns tras el flanco de 
reloj. Esto es, la FPGA recibe sus datos de entrada (PktData* y SoP) 3 ns tras el flanco de 
reloj. 
• En el datasheet del segundo chip puede verse que éste requiere respetar un tiempo de setup 
de 0.4 ns para los datos que recibe, respecto al flanco positivo del reloj. Esto es, la FPGA 
debe entregar sus salidas (ChksumOut y ChksumValid) con tiempo suficiente para que el 
chip que las recoge las vea estables desde 0.4 ns antes del flanco de reloj. 
 
 
 
 
 
 
 
 
 
 
Figura 2. Condiciones temporales de las entradas y salidas de la FPGA en el sistema 
 
Teniendo en cuenta todo esto: 
• Modificar las restricciones (constraints) de tiempos de entrada/salida que aparecen al final 
del fichero de constraints, set_input_delay y set_output_delay, para que la herramienta 
intente cumplir los requisitos de la FPGA en el sistema. Descomentar las líneas borrando el 
primer carácter (#) y modificar los valores. Entender los argumentos que forman parte de 
estos comandos de constraints (sin necesidad de investigar la sintaxis en detalle). 
• Re-implementar y generar reportes de timing específicos para las entradas y para las salidas. 
Para ello, ejecutar dos veces Reports > Timing > Report Timing…; en un caso especificar 
como Start Points “[all_inputs]” (sin las comillas) y en el otro como End Points 
“[all_outputs]”, dejando en cada caso la casilla contraria en blanco. 
 Estudiar el reporte del camino peor resultante en cada uno de los dos reportes de timing. 
Sobre la ventana de reporte de este peor path, hacer clic con el botón derecho y 
ejecutar “Export Entire Path to Spreadsheet…” Usar el nombre de fichero 
TableEj2in.xls para las entradas y TableEj2out.xls para las salidas (ambos ficheros 
deben quedar en el directorio vivado/). 
 ¿Se cumplen los requisitos? ¿Cuál es el slack para la constraint de las entradas? ¿Y para 
la de las salidas? Responder a estas preguntas en la Hoja de Respuestas. 
 
Reloj del sistema 
t SETUP = 0.4 ns 
t OUT = 3.0 ns 
FPGA CHIP 1 CHIP 2 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 7/9 
 
Ejercicio 3: Cambios en la frecuencia de reloj 
En este ejercicio se introducen requisitos más exigentes para la velocidad del reloj. Los procesos de 
Synthesis, Mapping y Place and Route tratarán de cumplir los requisitos impuestos, tras lo cual 
realizaremos un análisis de tiempos. 
a) 
1. Partiendo del fichero de constraints tal y como lo hemos dejado en el ejercicio anterior, 
asignar ahora un objetivo de periodo de reloj para el diseño de 12 ns (83.333 MHz), 
editando el fichero XDC. Tener en cuenta que en la constraint el reloj debe mantener su 
forma (“-waveform”) con duty cycle del 50%, esto es, primer flanco en t=0 y segundo en 
t=Periodo/2. 
2. Reimplementar y mirar el reporte de Report Timing Summary. 
 ¿Se logra cumplir los requerimientos?¿Qué tipo de camino provoca el peor slack (entrada, 
salida o interno) y cuál es el valor de este slack?. Responder en la Hoja de Respuestas. 
 Anotar los resultados de área y timing en la tabla de la Hoja de Respuestas (“3a”). 
 Exportar el reporte detallado del camino crítico, igual que se ha hecho en otros apartados. 
Utilizar el nombre TableEj3a.xls (de nuevo este fichero debe quedar en el directorio 
vivado/). 
b) 
3. A continuación imaginaremos que la comunicación de la FPGA con los otros chips no es un 
problema (hay técnicas para mejorar el timing en las interfaces que quedan
fuera de los 
objetivos de esta práctica). Nos centraremos en la constraint de reloj. Quitar las restricciones 
de entrada-salida: Volver a comentar, en el fichero XDC resultante del apartado a), las lineas 
set_input_delay… y set_output_delay… (poniendo un carácter ‘#’ al principio de la línea). 
4. Modificar el requisito de periodo de reloj a 8 ns (125 MHz) 
5. Reimplementar y mirar el reporte de Report Timing Summary. 
 ¿Se logra cumplir los requerimientos? ¿Qué slack tenemos? Responder en la Hoja de 
Respuestas. 
 Anotar los resultados de área y timing en la tabla de la Hoja de Respuestas (“3b”). 
 Exportar el reporte detallado del camino crítico, igual que se ha hecho en otros apartados. 
Utilizar el nombre TableEj3b.xls (de nuevo este fichero debe quedar en el directorio 
vivado/). 
 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 8/9 
 
 
Ejercicio 4: Pipeline 
En este ejercicio se realiza una segmentación (pipeline) del circuito, aplicando una cadena de flip-
flops en mitad de la ruta de datos (ver Figura 3 más abajo). Esto aumenta la latencia (retardo de 
entrada a salida), pero produce una mejora significativa en la velocidad de reloj soportada. 
Partir del proyecto tal y como queda al final del ejercicio 3. Esta vez no tocaremos el fichero de 
constraints sino el VHDL. Añadir una etapa de registros intermedios de pipeline en chksum.vhd, tal 
como se muestra en la Figura 3. 
• Simular el circuito, comprobando su corrección tras los cambios. 
• Reimplementar y mirar el reporte de Report Timing Summary. 
 ¿Se logran los requerimientos? ¿Qué slack tenemos? Responder en la Hoja de Respuestas. 
 Anotar los resultados de área y timing en la tabla de la Hoja de Respuestas (“4”). 
 Exportar el reporte detallado del camino crítico, igual que se ha hecho en otros apartados. 
Utilizar el nombre TableEj4.xls (de nuevo este fichero debe quedar en el directorio vivado/). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 3. Checksum segmentado en dos etapas (una etapa de registros intermedia). 
 
SoP 
 
 
 
ChksumValid 
 
ChksumOut 
 
1´s comp reduc 
 
16 
 
17 bits add 17 bits add 
 
not 
16 
 
 
18 bits add 
16 bits add 
 
16 bits add 16 bits add 
 
16 bits add 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
 
16 
 
PktData0 
 PktData1 
 
PktData2 
 PktData3 
 
PktData4 
 PktData5 
 
PktData6 
 PktData7 
 
Laboratorio de Dispositivos Integrados Especializados 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 9/9 
 
Preguntas adicionales para razonar (no se requiere entrega) 
a. Teniendo en cuenta solo la constraint de periodo de reloj, si obtenemos un determinado 
WNS (Worst Negative Slack), ¿cuál sería el mínimo periodo de reloj que podríamos utilizar? 
b. ¿Cómo se relacionan para el camino crítico los conceptos: WNS, Period Requirement, Data 
Path Delay, Clock Path Skew, Tiempo de Setup del FF y Clock Uncertainty? 
c. ¿Tiene sentido que al ser más restrictivo (reducir el período) cambie el uso de recursos 
(cantidad de registros y/o número de slices y LUTs)? 
 
 
Entrega 
Antes de la fecha límite especificada en el calendario del laboratorio deberá entregarse en Moodle 
un único archivo comprimido (zip o rar) con: 
• El directorio P3_checksum completo. Bajo el subdirectorio vivado deberá estar el proyecto 
entero de Vivado y los ficheros Table*.xls cuya generación se solicita en este enunciado. 
 
• La Hoja de Respuestas que se proporciona en Moodle, con las respuestas rellenas y el nombre 
del alumno. Dejar esta hoja directamente bajo el directorio P3_checksum. La hoja puede 
entregarse en formato Word o PDF (en este último caso puede ser el resultado de escanear el 
documento relleno a bolígrafo, mientras se entienda bien). 
 
El archivo comprimido deberá tener la siguiente nomenclatura: 
<<nº de grupo>>_<<nº de alumno (dos dígitos)>>_<<nº de práctica>>.[zip|rar] 
(Ej.: 3311_05_3.zip para el alumno 5 del grupo de DIE de los lunes) 
 
Se recuerda que los alumnos deberán comprender el diseño completo y familiarizarse con él. 
__MACOSX/DIE Practicas/._DIE_Practica3_2021-22.pdf
DIE Practicas/DIE_Practica2_2021-22.pdf
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 1/16 
 
Práctica 2 
 
Completar el diseño de un cronómetro 
Objetivos 
 
- Realizar el flujo de diseño con un ejemplo más complejo que el de la Práctica 1. 
- Practicar la codificación en lenguaje VHDL, desde estructuras simples hasta más 
avanzadas como funciones, generics y packages. 
- Ver un mecanismo para acelerar las primeras simulaciones. 
 
NOTA IMPORTANTE: En esta práctica se trabaja sobre un diseño incompleto, 
entregándose a los alumnos porciones de código ya escritas. Los alumnos deberán 
comprender todo el código. A la hora de evaluar la práctica se podrán hacer preguntas 
sobre cualquier parte del diseño. 
 
Circuito utilizado 
 
En este ejercicio implementaremos sobre la placa Zybo un cronómetro de tres dígitos, con 
segundos (0-59) y décimas. El cronómetro se visualizará sobre los tres displays 7-segmentos 
de la placa de expansión tipo pmod OHO-DY1. Usaremos los pulsadores BTN3 a BTN0 
para lo siguiente: 
- BTN3: Reset asíncrono general del circuito. 
- BTN2: Puesta a cero del cronómetro. 
- BTN1: Parada y rearranque (Start/Stop) de la cuenta. 
- BTN0: Función “Lap” para mostrar el tiempo de una vuelta sin que pare el cronómetro, 
que vuelve a mostrar el tiempo actual al pulsar el botón una segunda vez. 
 
 
 
RESET 
(ResetX) 
ARRANQUE 
/PARADA 
(StartStop) 
PUESTA A 
CERO 
(SetToZero) 
TIEMPO DE 
VUELTA 
(Lap) 
Punto 
decimal 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 2/16 
 
 
La siguiente figura muestra un diagrama de bloques del circuito: 
 
 
freq_divider 
SyncReset EnableOut 
Clk 
rst_adapt 
ResetIn ResetOut 
Clk 
Reset signal 
to all circuit 
Clock signal 
to all circuit 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
Reset 
counter <10> 
Count (3:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
counter <10> 
Count (3:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
counter <6> 
Count (2:0) 
Reset 
EnableOut 
Clk 
SyncReset 
EnableIn 
display_ctrl 
Reset 
Clk 
Tenths (3:0) 
UpdateDisplay 
Seconds (3:0) 
Tens (2:0) 
ResetX Clk 
StartStop 
Lap 
SetToZero 
stopwatch_fsm 
ClearCount 
Reset 
EnableCountOut 
Clk 
StartStop 
Lap 
SetToZero 
EnableCountI
n 
UpdateDisplay 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
debounce 
Reset 
DataOut 
Clk 
EnSample 
DataIn 
stopwatch 
SClk 
RClk 
Ser 
SClk 
RClk 
Ser 
External port 
 
 
Un bloque de división de frecuencia (freq_divider) se encarga de dividir por 12.500.000 el 
reloj de 125 MHz de la placa para dar un pulso de un ciclo cada décima de segundo. A partir 
de esta base de tiempos, tres contadores en cascada (counter) proveen la cifra de décimas de 
segundo (tenths), unidades de segundo (seconds) y decenas de segundo (tens). Los 
contadores son instancias de un contador genérico que puede ser parametrizado para contar 
entre 0 y (N-1). 
Unos bloques de anti-rebote (debounce) se encargan de adaptar la señal de los pulsadores de 
control. Otro bloque (rst_adapt) sincroniza el reset externo que viene del otro pulsador. 
Una máquina de estados (stopwatch_fsm)
recibe las señales de los pulsadores de control y 
permite que se muevan o no los contadores (dejando pasar o no los pulsos generados por 
freq_divider), seleccionando además que se congele o no la cifra visualizada, esto último 
para la funcionalidad “Lap”. 
Finalmente, un bloque de control de los displays (display_ctrl) se encarga de convertir las 
cifras de cada dígito a unas salidas de control del display de tres dígitos 7-segmentos OHO-
DY1. Adicionalmente este bloque tiene un registro a su entrada para permitir, cuando no se 
habilita su carga, “congelar” la visualización mientras el cronómetro corre. Esto último será 
lo que suceda al pulsar el botón “Lap”. 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 3/16 
 
 
El diagrama de la máquina de estados es tal como se muestra en la siguiente figura: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Las señales de entrada de la FSM mostradas en las transiciones de este diagrama en realidad 
no son exactamente las del nombre mostrado, sino que han de corresponderse con señales 
internas a la máquina, la cuales sean ‘1’ cuando las correspondientes entradas del bloque 
stopwatch_fsm (conectadas a las señales de botón filtradas anti-rebote) pasan de ‘0’ a ‘1’. 
Por ejemplo, el StartStop mostrado en el diagrama será una señal interna que sea ‘1’ cuando 
la entrada StartStop del bloque stopwatch_fsm pase de ‘0’ a ‘1’. 
Por otra parte, la señal de salida de la FSM enableCounting también es interna al bloque, y 
se mezclará mediante un and con la señal EnableCountIn para generar EnableCountOut. 
Además, no se muestra en el diagrama la salida ClearCount, que se encargará de poner a 0 
todos los contadores, y que será ‘1’ siempre que llegue SetToZero, siendo por tanto 
independiente del estado y resultando equivalente a utilizar la señal de detección de cambio 
de ‘0’ a ‘1’ de ese pulsador. 
El estado por defecto de la FSM debe ser “IDLE”. 
IDLE 
RUNNING 
SHOWLAP 
STOPPED 
StartStop 
SetToZero 
Lap 
Lap 
StartStop StartStop 
SetToZero 
SetToZero 
StartStop 
0 1 
1 1 
1 0 
0 0 
<state> 
x y 
x = enableCounting 
y = UpdateDisplay 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 4/16 
 
 
Guía para la realización del diseño 
 
Se parte de la siguiente estructura de directorios y ficheros, que se entrega a los alumnos en 
un fichero zip y que habrá que situar bajo el directorio de trabajo: 
 
P2_stopwatch / 
rtl/ 
 counter.vhd -> incompleto 
 debounce.vhd -> completo 
 display_ctrl.vhd -> incompleto (*) 
 freq_divider.vhd -> no se entrega a los alumnos 
 rst_adapt.vhd -> completo 
 stopwatch.vhd -> no se entrega a los alumnos 
 stopwatch_fsm.vhd -> incompleto 
 stopwatch_pkg.vhd -> completo 
 
netlist/ 
 display_ctrl.dcp -> completo (*) 
 display_ctrl.edn -> completo, no se usa (*) 
 display_ctrl.vhd -> completo (*) 
 
 sim/ 
 stopwatch_tb.vhd -> no se entrega a los alumnos 
 runsim.do -> completo (script ModelSim) 
 runsim_netlist.do -> completo (script ModelSim) 
 
 vivado/ 
 stopwatch.xdc -> incompleto (constraints) 
 
Esta estructura de directorios deberá mantenerse. 
Para terminar el diseño será necesario completar los ficheros fuente incompletos y crear 
los no entregados. 
(*) En el caso del bloque display_ctrl, este se entrega incompleto, pero también se entrega 
completo en formato de “netlist” (de forma efectiva es como si fuese una caja negra). Puede 
utilizarse en este formato para tener el diseño completo del cronómetro, siendo de entrega 
opcional (con mayor puntuación) el desarrollar este bloque en VHDL (directorio rtl/). 
 
 
1- Crear un nuevo proyecto y el fichero del top-level del RTL 
 
- Crear con Vivado un nuevo proyecto de nombre stopwatch, creando su propia carpeta, 
bajo la carpeta P2_stopwatch/vivado. Como en la Práctica 1, será un RTL Project para 
la FPGA XC7Z010CLG400-1. Durante la creación pueden añadirse ya los ficheros 
presentes en el directorio rtl/, salvo display_ctrl.vhd, que no deberá añadirse al 
proyecto. Por otra parte NO se deberá utilizar la opción Copy sources into Project. 
De esta manera mantendremos nuestro código en rtl/. 
- Bien con el editor de Vivado o con el editor de texto que uno prefiera, crear el fichero 
VHDL del “top-level” del diseño (stopwatch.vhd). Desde Vivado se puede hacer con 
clic derecho en el panel de fuentes y Add Sources > Add or create design sources > 
Create File. Si se crea externamente luego también se puede añadir al proyecto con Add 
Sources. IMPORTANTE: los ficheros de código fuente RTL utilizados por el proyecto 
Vivado deberán situarse siempre en el directorio rtl/. 
- En este fichero stopwatch.vhd, crear la entidad con sus puertos, a partir del esquema del 
circuito de más arriba (donde los puertos externos vienen identificados por un 
pentágono gris). Crear también inicialmente una arquitectura en blanco. 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 5/16 
 
 
2- Crear un primer sub-bloque desde cero: el divisor de frecuencia 
 
En este apartado haremos un primer ejercicio recordatorio de VHDL: 
o Describiremos un contador, como ejemplo típico de proceso secuencial. 
o Veremos en un mismo código la codificación del reset asíncrono y síncrono. 
o Asignaremos varias señales en un mismo proceso. 
o Al terminar el diseño de este sub-bloque, pasaremos a situarlo en el bloque “top-
level” para recordar cómo se declaraba e instanciaba un componente. 
o Lo que crearemos será un ejemplo de generación de “base de tiempos” para el 
funcionamiento de otros bloques. 
- Bien con el editor de Vivado o con el editor de texto que uno prefiera, procederemos a 
crear el fichero VHDL del divisor de frecuencia (freq_divider.vhd). Desde Vivado se 
puede hacer con clic derecho en el panel de fuentes y Add Sources > Add or create 
design sources > Create File. Si se crea externamente luego también se puede añadir al 
proyecto con Add Sources. IMPORTANTE: los ficheros de código fuente RTL 
deberán situarse siempre en el directorio rtl/. 
- Para editar este fichero y los siguientes: si no se recuerda bien alguna estructura 
sintáctica de VHDL se puede consultar la documentación en Moodle y/o hacer uso de 
Tools > Language Templates, pero conviene memorizar las estructuras básicas del 
lenguaje. 
- Para implementar el divisor de frecuencia crearemos un proceso que haga una cuenta de 
0 a 12.499.999 (este valor deberá definirse como una constant VHDL de tipo integer). 
Para soportar la cuenta usaremos una signal “count” de tipo std_logic_vector que se 
deberá poner a 0: a) cuando llegue el reset asíncrono (activo a nivel alto); b) cuando al 
llegar el flanco de reloj veamos activo (a 1) el reset síncrono del bloque (SyncReset, 
señal que viene de la máquina de estados); y c) cuando al llegar el flanco de reloj la 
cuenta actual sea igual a la constante definida (12.499.999). Si no se cumple ninguna de 
estas condiciones, la cuenta deberá avanzar con la llegada del flanco de reloj. Para 
implementar este proceso partir de la descripción de un flip-flop con reset asíncrono, 
respetando su estructura y rellenando apropiadamente la parte del “if” en la que se ha 
detectado el reset asíncrono y la parte en que se ha detectado la llegada de un flanco 
activo del reloj. 
A la hora de comparar nuestra cuenta con la constante, haremos uso de la función 
conv_integer del package std_logic_unsigned. 
- A continuación, añadiremos en
el mismo proceso la generación de la señal de salida 
EnableOut, la cual estará un ciclo a ‘1’ cada 12.500.000. Es decir, generaremos esta 
señal de forma registrada, como un flip-flop adicional. No se debe olvidar que este flip-
flop adicional también debe resetearse adecuadamente. 
- Finalmente, añadir en el fichero stopwatch.vhd la declaración de este componente y su 
instanciación. En la instanciación conectar el puerto Clk al del “top-level” y crear 
señales internas para los demás puertos (por ejemplo: reset, clearCount, 
enFromFreqDiv u otros nombres con sentido). Declarar estas signals en la parte 
declarativa de la arquitectura. 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 6/16 
 
 
3- Terminar e instanciar el componente counter: 
 
En este apartado volveremos a practicar creando un contador, pero esta vez: 
o Haremos uso de una señal de “clock enable”. 
o Crearemos varias “asignaciones concurrentes” (formato VHDL abreviado de 
procesos) para señales combinacionales. 
o Utilizaremos una señal combinacional interna generada con una de las 
asignaciones concurrentes para indicar al proceso secuencial contador cuándo ha 
llegado al final de cuenta. 
o Veremos un ejemplo de uso de los generic VHDL. 
o Veremos un ejemplo de uso de los packages VHDL. 
 
- Si no se ha hecho ya, añadir al proyecto los ficheros “counter.vhd” y 
“stopwatch_pkg.vhd” (del directorio “rtl/”). Estudiar el contenido de estos ficheros. Se 
trata de un contador cuyo valor máximo de cuenta es parametrizable y de un package de 
utilidad. Observar el uso en el contador del generic, del package “stopwatch_pkg” y de 
la función “log2_ceil” definida en este package. 
- Completar el fichero “counter.vhd”. Tener en cuenta que el contador interno debe 
resetearse asíncronamente con Reset y síncronamente tanto con el final de cuenta como 
con la entrada SyncReset (señal que viene de la máquina de estados). Además, habrá 
que tener en cuenta que el contador sólo debe avanzar (o bien hacer “wrap-around”, 
esto es, volver a 0 desde su valor máximo) cuando lo permita la señal de “enable” de 
entrada. 
- Añadir la declaración del componente de este contador y sus tres instancias a 
“stopwatch.vhd”. 
En cada instancia utilizar un generic map adecuado, para que cada contador cuente 
hasta donde debe. 
- Conectar los puertos de las tres instancias de counter, añadiendo tanto las señales que 
van entre ellos como las que posteriormente conectaremos a las instancias de otros 
componentes. Declarar estas signals que vamos creando, en la parte declarativa de la 
arquitectura. En el último contador su “enable” de salida queda al aire, por lo que 
usaremos, en vez de una signal, la palabra especial open. 
- Añadir en stopwatch.vhd la misma sentencia para uso del package stopwatch_pkg que 
se puede encontrar en counter.vhd (necesaria para utilizar la función log2_ceil). 
 
4- Comprensión de los ficheros que se entregan completos: 
En este apartado veremos dos ejemplos de mecanismos de sincronización: 
o Cadena de anti-metaestabilidad. 
o Sincronización de reset. 
 
- Añadir al proyecto y examinar los ficheros “rst_adapt.vhd” y “debounce.vhd”. 
Comprender su funcionamiento, preguntando al profesor en caso de dudas. 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 7/16 
 
- Añadir sus declaraciones e instanciaciones a “stopwatch.vhd”. Para el caso de 
“rst_adapt” puede obviarse el hacer un generic map, utilizando el valor por defecto del 
generic. Tener en cuenta que, como se muestra más arriba en el diagrama del diseño, el 
reset externo entrante es ResetX y la salida de rst_adapt será la que vaya, con el nombre 
que le hayamos dado, a todos los demás bloques. 
 
5- Completar la máquina de estados: 
En este apartado: 
o Describiremos una máquina de estados (FSM), siguiendo el estilo de 
codificación que divide las FSM en un proceso combinacional y otro secuencial. 
o Ejercitaremos la correcta escritura de un proceso combinacional. 
o Veremos un ejemplo de detección de flancos en señales sin usar éstas como 
reloj. 
 
- Si no se ha hecho ya, añadir al proyecto el fichero “stopwatch_fsm.vhd”. Estudiarlo y 
completarlo, considerando la descripción de la máquina de estados dada más arriba. A 
la hora de describir la parte combinacional se puede tener en cuenta que SetToZero 
produce el mismo efecto en todos los estados, para simplificar el código. 
- No olvidar dedicar el tiempo necesario para comprender la parte del código que ya 
viene escrita. 
- Añadir la declaración e instanciación de este componente a “stopwatch.vhd”. 
 
6- Añadir el bloque de control de los displays 7-segmentos, como una netlist 
En este apartado: 
o Añadiremos a nuestro diseño un bloque del cuál no tenemos su código fuente (como 
una IP -Intelectual Property- que solo tuviéramos disponible en formato de netlist). 
Los tres ficheros presentes en el directorio netlist/ representan la misma netlist (lista de 
células + interconexión), en tres formatos diferentes: VHDL (que podremos usar como 
modelo de simulación del bloque), EDIF (formato de netlist estándar en la industria, 
incluido aquí simplemente como referencia) y DCP (formato propietario de lo que en 
Vivado se llama un “design checkpoint”). Echar un vistazo rápido a los dos primeros con un 
editor de texto. El tercero, fichero DCP, es realmente un archivo comprimido con varios 
ficheros en su interior. 
Utilizar Add Sources para añadir al proyecto el fichero display_ctrl.dcp (ojo, no .vhd) del 
directorio netlist/, como si tratara de un fichero RTL más. Comprobar que anteriormente NO 
se ha añadido al proyecto por error el fichero rtl/display_ctrl.vhd. 
Para poder simular esta “caja negra”, añadir también su modelo de simulación, 
netlist/display_ctrl.vhd. pero en este caso utilizar Add Sources > Add or create simulation 
sources. 
Realizar la declaración e instanciación de este componente en stopwatch. Para esto, téngase 
en cuenta que la declaración de la entidad de display_ctrl se puede encontrar tanto en 
netlist/display_ctrl.vhd como en rtl/display_ctrl.vhd. 
 
Laboratorio de Dispositivos Integrados Especializados 
 
 
Escuela Politécnica Superior - UAM - Curso 2021/2022 v1.0 8/16 
 
 
7- Finalizar el RTL del “top-level” stopwatch.vhd 
En este apartado: 
o Practicaremos la instanciación de bloques y su interconexión mediante signals 
internas declaradas por nosotros (ya habremos ido haciéndolo en los apartados 
anteriores). 
o Practicaremos la aplicación tanto de port map para los puertos como de generic 
map para los generics que parametrizan sub-bloques (también habremos ido 
haciéndolo en los apartados anteriores). 
o Adaptaremos nuestro diseño para que su funcionalidad pueda ser simulada (en 
cierta medida) en un tiempo razonable. 
 
- Terminar de “cablear” el fichero “stopwatch.vhd” si quedaba algo pendiente. 
Comprobar que el chequeo sintáctico es correcto. Corregir los posibles errores y 
“warnings”. 
- Con el fin de “acelerar” el circuito durante las simulaciones de depuración de la 
funcionalidad, hacer lo siguiente: 
o Añadir un generic a “stopwatch” llamado “FAST_SIMULATION”, de tipo 
boolean y valor por defecto FALSE. El objetivo es que este generic haga que el 
cronómetro se acelere cuando sea TRUE, para poder realizar más rápidamente 
las simulaciones. A continuación, veremos cómo hacerlo. 
o Usar una asignación concurrente condicional para sustituir el cable a la salida de 
freq_divider por un ‘1’ cuando “FAST_SIMULATION” sea TRUE. El 
multiplexor introducido deberá mantener en su salida todas las conexiones 
anteriormente

Continuar navegando