Está en la página 1de 270

DiseodesistemasdigitalesconVHDL

FelipeMachado,SusanaBorromeo,CristinaRodrguez
Versin1.00creadael28deoctubrede2011



EstaversindigitaldeDiseodesistemasdigitalesconVHDLhasidocreadaylicenciadapor
FelipeMachadoSnchez,SusanaBorromeoLpezyCristinaRodrguezSnchezconuna
licenciadeCreativeCommons.Estalicenciapermitelosusosnocomercialesdeestaobra
entantoencuantoseatribuyaautoraoriginal.Estalicencianopermitealterar,
transformarogenerarunaobraderivadaapartirdeestaobra

Conestalicenciaereslibredecopiar,distribuirycomunicarpblicamente
estaobrabajolascondicionessiguientes:
Reconocimiento:debesreconocerycitaralosautoresdeestaobra
Nocomercial:nopuedesutilizarestaobraparafinescomerciales
Sinobrasderivadas:nopuedesalterar,transformarogenerarunaobra
derivadaapartirdeestaobra

Paramsinformacinsobrelalicencia,visitaelsiguienteenlace:
http://creativecommons.org/licenses/byncnd/3.0/

EstaobraestdisponibleenelarchivoabiertodelaUniversidadReyJuanCarlos:
http://eciencia.urjc.es/dspace/handle/10115/5700
http://hdl.handle.net/10115/5700

Paramsinformacinsobrelosautores:
http://gtebim.es/
http://gtebim.es/~fmachado

2
Diseo de sistemas digitales con VHDL
Versin1.00creadael28deoctubrede2011

FelipeMachadoSnchez
SusanaBorromeoLpez
CristinaRodrguezSnchez
DepartamentodeTecnologaElectrnica
UniversidadReyJuanCarlos
Mstoles,Madrid,Espaa
http://gtebim.es/

Agradecimientos

QueremosagradeceralDepartamentodeTecnologaElectrnicadelaUniversidadReyJuanCarlos
porfomentarladocenciadecalidadysuapoyoconstanteennuestraslaboresdocentes.
TambinqueremosagradeceralosalumnosdeIngenieradeTelecomunicacindelaUniversidad
ReyJuanCarlosporsuintersgeneralizadoenaprenderysuscomentariossobrenuestradocencia
yprcticas

LosAutores

DiseodesistemasdigitalesconVHDL
ndice
ndice ............................................................................................................................................. 1
Lista de acrnimos ........................................................................................................................ 5
ndice de figuras ............................................................................................................................ 7
ndice de cdigo VHDL................................................................................................................ 11
ndice de tablas ........................................................................................................................... 14
1. Introduccin ............................................................................................................................. 15
2. Repaso de VHDL para sntesis ............................................................................................... 19
2.1. Puerta AND ..................................................................................................................................... 20
2.2. Varias puertas ................................................................................................................................. 21
2.3. Multiplexor ....................................................................................................................................... 22
2.4. Multiplexor de 2 bits de seleccin.................................................................................................... 23
2.5. Elementos de memoria: latch .......................................................................................................... 23
2.6. Elementos de memoria: biestables activos por flanco..................................................................... 24
2.7. Actualizacin de los valores de las seales .................................................................................... 25
2.8. Contadores...................................................................................................................................... 27
2.9. Registros de desplazamiento .......................................................................................................... 28
2.10. VHDL estructural ........................................................................................................................... 28
3. Funcionamiento bsico de las tarjetas electrnicas ............................................................... 33
3.1. Tarjetas XUPV2P y Nexys2............................................................................................................. 33
3.1.1. La tarjeta XUPV2P ...................................................................................................................................... 33
3.1.2. La tarjeta Nexys2......................................................................................................................................... 35
3.2. Encender los leds ............................................................................................................................ 37
3.2.1. Implementacin en la tarjeta XUPV2P ........................................................................................................ 46
3.2.2. Implementacin en la tarjeta Nexys2 .......................................................................................................... 50
3.3. Cambiar el tipo de FPGA de un proyecto ........................................................................................ 53
3.4. Las restricciones del circuito ........................................................................................................... 54
4. Utilizacin del reloj y circuitos secuenciales ........................................................................... 57
4.1. Segundero (primera versin) ........................................................................................................... 57
4.2. Segundero (segunda versin) ......................................................................................................... 60
5. Simulacin con Modelsim........................................................................................................ 63
6. Constantes, genricos y paquetes.......................................................................................... 71
6.1. Uso de constantes........................................................................................................................... 71
6.2. Uso de genricos............................................................................................................................. 72
6.3. Uso de paquetes ............................................................................................................................. 73
7. Transmisin en serie por RS-232............................................................................................ 77
7.1. Desarrollo de la prctica.................................................................................................................. 77
7.2. Consideraciones para el diseo de un circuito ................................................................................ 78
7.3. Funcionamiento de una UART ........................................................................................................ 78
7.4. Diseo del transmisor...................................................................................................................... 80
7.4.1. Divisor de frecuencia ................................................................................................................................... 82
7.4.1.1. Uso de funciones ........................................................................................................................................................ 85
7.4.1.2. Operaciones con constantes y con seales en VHDL................................................................................................. 87
7.4.1.3. Uso de funciones dentro del mismo paquete .............................................................................................................. 88
7.4.1.4. Ms funciones .......................................................................................................................................................... 89
7.4.2. Bloque de control......................................................................................................................................... 90
7.4.3. Registro de desplazamiento y multiplexor................................................................................................... 92
7.5. Simulacin del transmisor ............................................................................................................... 93
7.5.1. Proceso que modela la orden de enviar un dato......................................................................................... 94
7.5.2. Comprobacin de la simulacin .................................................................................................................. 96
7.5.3. Proceso que modela las rdenes de enviar varios datos.......................................................................... 102
7.5.4. Autocomprobacin en el banco de pruebas .............................................................................................. 105
7.5.5. Bancos de pruebas que terminan por s mismos ................................................................................... 111
7.6. Implementacin en la FPGA: diseo estructural ........................................................................... 113
7.6.1. Diseo del interfaz con los pulsadores...................................................................................................... 114
7.6.2. Banco de pruebas del interfaz con los pulsadores.................................................................................... 116
7.6.3. Diseo estructural: unidad de ms alto nivel............................................................................................. 117
7.6.4. Cuando la sntesis no funciona ............................................................................................................... 121
7.6.4.1. Comprueba que todo est bien conectado................................................................................................................ 121

Departamento de Tecnologa Electrnica 1


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

7.6.4.2. Comprueba el fichero .ucf ...................................................................................................................................... 121


7.6.4.3. Comprueba el reset del circuito................................................................................................................................. 122
7.6.4.4. Simula el circuito completo........................................................................................................................................ 122
7.6.4.5. Revisa las advertencias del sintetizador.................................................................................................................... 122
7.6.4.6. Muestra informacin del circuito por los leds............................................................................................................. 129
7.6.4.7. Crea un nuevo proyecto en el ISE............................................................................................................................. 129
7.7. Diseo del receptor de la UART.................................................................................................... 129
7.7.1. Registro de desplazamiento ...................................................................................................................... 131
7.7.2. Registro de entrada ................................................................................................................................... 131
7.7.3. Divisor de frecuencia ................................................................................................................................. 131
7.7.4. Bloque de control ....................................................................................................................................... 132
7.8. Banco de pruebas del receptor de la UART.................................................................................. 132
7.9. Implementacin de la UART completa.......................................................................................... 133
8. Circuitos aritmticos .............................................................................................................. 135
8.1. Paquetes matemticos.................................................................................................................. 136
8.2. Tipos unsigned y signed ............................................................................................................... 136
8.3. Conversin de tipos numricos ..................................................................................................... 137
8.3.1. Asignacin de bits...................................................................................................................................... 137
8.3.2. Conversiones ............................................................................................................................................. 138
8.4. Uso de constantes numricas ....................................................................................................... 139
8.5. Suma de nmeros positivos.......................................................................................................... 139
8.5.1. Informe de sntesis..................................................................................................................................... 140
8.5.2. Esquema RTL ............................................................................................................................................ 141
8.6. Resta de nmeros positivos.......................................................................................................... 143
8.7. Suma y resta de nmeros enteros ................................................................................................ 143
8.7.1. Aumento del rango de la suma en complemento a dos............................................................................. 144
8.7.2. Aumento del rango usando funciones y atributos * ................................................................................... 145
8.7.3. Breve repaso del complemento a dos * ..................................................................................................... 146
8.8. Multiplicacin ................................................................................................................................ 147
8.8.1. Algoritmo de la multiplicacin .................................................................................................................... 148
8.8.2. Implementacin de un multiplicador combinacional .................................................................................. 149
8.8.3. Implementacin de un multiplicador combinacional genrico * ................................................................. 150
8.8.3.1. La sentencia generate * ......................................................................................................................................... 151
8.8.3.2. Multiplicacin con sentencia generate * ................................................................................................................. 151
8.8.3.3. Banco de pruebas para el multiplicador genrico *.................................................................................................... 152
8.8.4. Implementacin de un multiplicador estructural * ...................................................................................... 153
8.8.5. Implementacin del multiplicador estructural genrico *............................................................................ 155
8.9. Diseo considerando las prestaciones.......................................................................................... 156
8.9.1. Anlisis de las prestaciones....................................................................................................................... 156
8.9.1.1. Paralelizacin............................................................................................................................................................ 158
8.9.1.2. Segmentacin ........................................................................................................................................................... 158
8.9.1.3. Compartir recursos.................................................................................................................................................... 159
8.9.1.4. Diseo secuencial ..................................................................................................................................................... 160
8.9.2. Anlisis del multiplicador combinacional.................................................................................................... 161
8.9.3. Multiplicador segmentado .......................................................................................................................... 163
8.9.4. Implementacin del multiplicador secuencial............................................................................................. 166
8.9.5. Comparacin de los multiplicadores .......................................................................................................... 169
8.10. Divisin ....................................................................................................................................... 171
9. Controlador de pantalla VGA ................................................................................................ 175
9.1. Funcionamiento del estndar VGA ............................................................................................... 175
9.2. Conversores digital-analgico para VGA ...................................................................................... 177
9.2.1. Conversor VGA de la XUPV2P.................................................................................................................. 178
9.2.2. Conversor VGA de la Nexys2 .................................................................................................................... 178
9.3. Mdulo de sincronizacin.............................................................................................................. 179
9.4. Implementacin de un controlador VGA sencillo .......................................................................... 183
10. Videojuego de tenis ............................................................................................................. 187
10.1. Control de los jugadores ............................................................................................................. 188
10.2. Pelota que rebota........................................................................................................................ 190
10.3. Videojuego .................................................................................................................................. 191
11. Puerto PS/2 ......................................................................................................................... 193
11.1. Teclado PS/2............................................................................................................................... 193
11.1.1. Cdigos scan ........................................................................................................................................... 195
11.2. Ratn PS/2.................................................................................................................................. 196
11.2.1. Funcionamiento del ratn ........................................................................................................................ 196
11.2.2. Protocolo PS/2 para transmitir desde la computadora ............................................................................ 198
11.2.3. Puertos bidireccionales............................................................................................................................ 200
11.2.4. Puertos bidireccionales en VHDL ............................................................................................................ 201
12. Memorias............................................................................................................................. 203
12.1. Bloques de memoria RAM (BRAM)............................................................................................. 203
12.2. Dibujar una imagen guardada en una ROM................................................................................ 205

2 Universidad Rey Juan Carlos


12.2.1. Memoria ROM de un bit de ancho de palabra......................................................................................... 206
12.2.2. Circuito que dibuja la imagen de la ROM de un bit de ancho ................................................................. 207
12.2.3. Mejoras y variantes del circuito que dibuja la imagen de la ROM........................................................... 210
12.2.3.1. Retraso de las salidas de la VGA............................................................................................................................ 210
12.2.3.2. Clculo de las direcciones sin multiplicador ............................................................................................................ 212
12.2.3.3. Dibujar la imagen en otro lugar de la pantalla ......................................................................................................... 212
12.2.3.4. Repeticin de la imagen.......................................................................................................................................... 212
12.2.3.5. Ampliacin por dos.................................................................................................................................................. 213
12.2.3.6. Uso de las potencias de dos ................................................................................................................................... 214
12.2.4. Memoria ROM de varios bits de ancho de palabra ................................................................................. 215
12.2.5. Memoria ROM para imagen con mayor profundidad de color................................................................. 218
12.2.6. Memorias ROM grandes: convertir imgenes ......................................................................................... 220
12.3. Memorias RAM............................................................................................................................ 220
12.4. Uso de memorias usando el Coregen *....................................................................................... 222
12.5. Guardar y mostrar una imagen que llega por el puerto serie ...................................................... 224
12.5.1. Conversin de la imagen......................................................................................................................... 225
12.5.2. Envo de la imagen.................................................................................................................................. 226
13. Mostrar caracteres por pantalla........................................................................................... 227
13.1. Memoria ROM ............................................................................................................................. 228
13.2. Memoria RAM.............................................................................................................................. 229
13.3. Control del texto .......................................................................................................................... 229
13.4. Bloque que escribe los caracteres en la pantalla ........................................................................ 230
14. Procesamiento digital de imgenes .................................................................................... 235
14.1. Procesamiento de imgenes ....................................................................................................... 235
14.2. Circuito que procesa una imagen guardada en una ROM........................................................... 236
14.3. Circuito que procesa una imagen que llega por la UART............................................................ 239
14.4. Acelerar el procesamiento........................................................................................................... 239
14.4.1. Disminuir los accesos a memoria............................................................................................................ 240
14.4.2. Procesamiento "al vuelo"......................................................................................................................... 240
14.4.3. Uso de un bfer circular .......................................................................................................................... 243
15. Videojuego Pac-Man ........................................................................................................... 247
15.1. Videojuego Pac-Man ................................................................................................................... 247
15.2. El campo de juego....................................................................................................................... 248
15.3. El jugador sin rostro..................................................................................................................... 249
15.4. El pac-man .................................................................................................................................. 250
15.5. El laberinto .................................................................................................................................. 252
15.6. Recorrer el laberinto .................................................................................................................... 253
15.7. Control del movimiento del pac-man *......................................................................................... 254
15.8. La comida y los puntos................................................................................................................ 254
15.9. Las paredes del laberinto *.......................................................................................................... 255
15.10. El tamao del pac-man * ........................................................................................................... 258
15.11. Movimiento continuo del pac-man *........................................................................................... 259
15.12. El pac-man comiendo * ............................................................................................................. 260
15.13. Los fantasmas ........................................................................................................................... 261
15.14. Otras mejoras *.......................................................................................................................... 261
15.15. Conclusiones ............................................................................................................................. 262
Referencias ............................................................................................................................... 263

Departamento de Tecnologa Electrnica 3


Departamento de Tecnologa Electrnica

Lista de acrnimos
ALU ArithmeticLogicUnit
UnidadAritmticoLgica
BRAM BlockRAM
BloquedememoriaconfigurabledelasFPGAsdeXilinx
CAD ComputerAidedDesgin
Diseoasistidoporordenador
CLB ConfigurableLogicBlock
Bloquelgicoconfigurable:sonlosbloquesprincipalesdeunaFPGAdondese
implementauncircuito
CPLD ComplexProgrammableLogicDevice
Dispositivodelgicaprogramablecomplejo
DCSE DiseodeCircuitosySistemasElectrnicos
AsignaturadelatitulacindeIngenieradeTelecomunicacindelaURJC
DTE DepartamentodeTecnologaElectrnica
ED1 ElectrnicaDigitalI
AsignaturadelatitulacindeIngenieradeTelecomunicacindelaURJC
ED2 ElectrnicaDigitalII
AsignaturadelatitulacindeIngenieradeTelecomunicacindelaURJC
ETSIT EscuelaTcnicaSuperiordeIngenieradeTelecomunicacin
EscueladelaUniversidadReyJuanCarlos
FIFO FirstInFirstOut
Tipodepilaenlaqueelprimerelementoquehaentradoeselprimeroensalir
FPGA FieldProgramableGateArray
Dispositivodelgicaprogramable,demayoresprestacionesquelosCPLD
FSM FiniteStateMachine
Mquinadeestadosfinitos
IEEE InstituteofElectricalandElectronicsEngineers
InstitutodeIngenierosElctricosyElectrnicos
ISE IntegratedSoftwareEnvironment
EntornodediseoelectrnicodeXilinx.Estelibrousalaversin9.2.
JTAG JointTestActionGroup
NombrecomnutilizadoparadesignarlanormaIEEE1149.1tituladaStandardTest
AccessPortandBoundaryScanArchitecture
LED LightEmittingDiode
Diodoemisordeluz.Estapalabrasehalexicalizadoenespaolyseusaenminsculas.
Aunqueelplurarcorrectoseraledes,enestelibroseemplearleds.
LSB LeastSignificantBit
Bitmenossignificativo
LUT LookUpTable

Departamento de Tecnologa Electrnica 5


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Tabladeconsulta,enelcasodelasFPGAseutilizanparaimplementarfunciones
lgicasyseconstruyenenhardwareconmultiplexoresyelementosdememoria
MSB MostSignificantBit
Bitmssignificativo
PISO ParallelInSerialOut
Registrodedesplazamientoenelquelosdatosentranenparaleloysalenenserie
PWM PulseWidthModulation
Modulacinporanchodepulso
RAM RandomAccessMemory
Memoriadeaccesoaleatorio.EngeneralseconsideranRAMalasmemoriasvoltiles
RGB RedGreenBlue
Rojo,verdeyazul.Sistemadecodificacindelcolorbasadoenlamezcladeestostres
colores
ROM ReadOnlyMemory
Memoriadeslolectura.
RTL RegisterTransferLevel
Nivel(deabstraccin)detransferenciaderegistros(otransferenciaentreregistros)
SIPO SerialInParallelOut
Registrodedesplazamientoenelquelosdatosentranenserieysalenenparalelo
UART UniversalAsynchronousReceiverTransmitter
TransmisorReceptorAsncronoUniversal
URJC UniversidadReyJuanCarlos
UniversidadpblicadeMadrid,Espaa
UUT UnitUnderTest
Unidadbajoprueba
VHDL VHSICHardwareDescriptionLanguage
Untipodelenguajededescripcindehardware
VHSIC VeryHighSpeedIntegratedCircuit
Circuitointegradodemuyaltavelocidad

6 Universidad Rey Juan Carlos


Departamento de Tecnologa Electrnica

ndice de figuras
Figura2.1:ListadepalabrasreservadasdelVHDL............................................................................................................................19
Figura2.2:RepresentacindelaentidadVHDL .................................................................................................................................20
Figura2.3:RepresentacindelaarquitecturaVHDL.........................................................................................................................21
Figura2.4:RepresentacindelaarquitecturaVHDL.........................................................................................................................21
Figura2.5:RepresentacindelaarquitecturaVHDL.........................................................................................................................21
Figura2.6:RepresentacindelaarquitecturaVHDL.........................................................................................................................22
Figura2.7:Representacindelmultiplexor..........................................................................................................................................23
Figura2.8:LatchdetipoD ......................................................................................................................................................................24
Figura2.9:LatchdetipoDconreset .....................................................................................................................................................24
Figura2.10:BiestabledetipoDconreset .............................................................................................................................................25
Figura2.11:Dosbiestablesencascada ..................................................................................................................................................25
Figura2.12:Esquemadeldiseodelcdigo2.16 ................................................................................................................................27
Figura2.13:Cronogramadeldiseodelcdigo2.16..........................................................................................................................27
Figura2.14:Esquemadelcircuitoestructural......................................................................................................................................29
Figura3.1:PlacaXUPVirtexIIPro(XUPV2P)utilizadaenlaasignatura ......................................................................................34
Figura3.2:Conexionesdelospulsadores,interruptoresyLEDdepropsitogeneralenlaplacaXUPV2P ............................35
Figura3.3:PlacaNexys2conlaquedemaneraalternativasepuedeseguirestemanual ...........................................................36
Figura3.4:Conexionesdelospulsadores,interruptoresyLEDdepropsitogeneralenlaplacaNexys2 ..............................36
Figura3.5:Ventanaparacrearunnuevoproyecto .............................................................................................................................38
Figura3.6:InterpretacindeltextodelencapsuladodelaFPGAdelaXUPV2P ..........................................................................38
Figura3.7:InterpretacindeltextodelencapsuladodelaFPGAdelaNexys2 ............................................................................38
Figura3.8:Ventanaparalaseleccindeldispositivodelnuevoproyecto .....................................................................................39
Figura3.9:Seleccindeltipodelanuevafuentequevamosacrear ...............................................................................................39
Figura3.10:Definicindelospuertos ...................................................................................................................................................40
Figura3.11:Aparienciadelaherramientaalaadirlanuevafuenteled1.vhd .............................................................................41
Figura3.12:Aparienciadelaherramientaalaadirlanuevafuenteled1.vhd .............................................................................42
Figura3.13:EsquemadelaentidadparalaXUPV2P .........................................................................................................................43
Figura3.14:EsquemadelaentidadparalaNexys2 ...........................................................................................................................43
Figura3.15:Comprobarlasintaxis:SynthesizeXSTCheckSyntax ............................................................................................44
Figura3.16:HerramientaPACE .............................................................................................................................................................45
Figura3.17:AsignacindelospinesenlaherramientaPACEparalaXUPV2P ...........................................................................46
Figura3.18:AsignacindelospinesenlaherramientaPACEparalaNexys2 .............................................................................46
Figura3.19:LlamadaalaherramientaiMPACTparaprogramarlaFPGAdelaXUPV2P .........................................................47
Figura3.20:ConfigurandoelcableUSBparaprogramarlaFPGAdelaXUPV2P........................................................................48
Figura3.21:DispositivosJTAGidentificadosenlaXUPV2P ............................................................................................................48
Figura3.22:ProgramacindelaFPGAdelaXUPV2P.......................................................................................................................49
Figura3.23:ProgramacinexitosadelaFPGA....................................................................................................................................50
Figura3.24:ProgramacinfallidadelaFPGA.....................................................................................................................................50
Figura3.25:PantallainicialdelAdept,sindispositivosconectados................................................................................................51
Figura3.26:PantalladelAdeptquehadetectadoalgndispositivoconectado............................................................................52
Figura3.27:PantalladelAdeptquehadetectadolacadenaJTAGdedispositivos(FPGAyPROM) .......................................52
Figura3.28:ProcedimientoparacambiarlascaractersticasdelaFPGA........................................................................................53
Figura3.29:Edicindelficheroderestricciones .................................................................................................................................54
Figura4.1:EsquemadelsegunderoparalaXUPV2P .........................................................................................................................58
Figura4.2:EsquemadelsegunderoparalaNexys2 ...........................................................................................................................58
Figura4.3:XilinxConstraintsEditor .....................................................................................................................................................59
Figura5.1:Creacindeunnuevobancodepruebas ..........................................................................................................................63
Figura5.2:Estructuradelbancodepruebas ........................................................................................................................................64
Figura5.3:AadiendoficherosalproyectodeModelsim .................................................................................................................66
Figura5.4:CompilandolosficherosdelproyectodeModelsim .......................................................................................................67
Figura5.5:Comienzodelasimulacinyseleccindelficherodelbancodepruebasparasimular ..........................................67
Figura5.6:Aadiendolaventanadelasformasdeonda(Wave)....................................................................................................68
Figura5.7:Aadiendolassealesdeuncomponente........................................................................................................................68
Figura5.8:Indicacindeltiempodesimulacinyordenparaempezarlasimulacin................................................................69
Figura5.9:Resultadodelasimulacin..................................................................................................................................................69
Figura6.1:Cmoverelpaqueteincluidoenelproyecto...................................................................................................................74
Figura7.1:EsquemadelaconexinRS232 ..........................................................................................................................................79
Figura7.2:ConectorDB9hembradelaplacaylospinesutilizados ...............................................................................................79

Departamento de Tecnologa Electrnica 7


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Figura7.3:TramadeunenvoenRS232con8bits,bitdeparidadyunbitdefin....................................................................... 80
Figura7.4:Entradasysalidasdeltransmisor...................................................................................................................................... 80
Figura7.5:DiagramadebloquespreliminardeltransmisordelaUART ..................................................................................... 82
Figura7.6:Divisordefrecuenciade100MHza9600Hz.................................................................................................................. 83
Figura7.7:Cronogramadelcontadordeldivisordefrecuenciaenelfinaldelacuenta............................................................. 84
Figura7.8:Cronogramaenlatransicinacero .................................................................................................................................. 84
Figura7.9:Usodelvalordevueltoporlafuncinlog2iparalaobtencindelrangodeunnaturalyununsigned ........... 86
Figura7.10:DiagramadeestadospreliminardeltransmisordelaUART .................................................................................... 90
Figura7.11:Diagramadeestadosconlaindicacindelassealesquehacencambiardeestado ............................................ 91
Figura7.12:Diagramadebloquesdefinitivodeltransmisor ........................................................................................................... 91
Figura7.13:Capturadeeventosdelresetbasadosentiemposoeneventos.ReferenciadoalaXUPV2P ............................... 95
Figura7.14:SimulacinpordefectoenelISE ..................................................................................................................................... 96
Figura7.15:AadirsealesenelISESimulator ................................................................................................................................. 97
Figura7.16:Simulacindeltransmisorconsealesinternasdurante88s.................................................................................. 97
Figura7.17:Formadeondadelasealfpga_txdespusdesimular88s................................................................................ 98
Figura7.18:Formasdeondaparalatransicinalosbitsdedatos ................................................................................................. 99
Figura7.19:Formasdeondaparalatransicinalbitdefin........................................................................................................... 100
Figura7.20:Esperarportiemposyluegoporeventospuedeproducirsealesdeanchomuyinferioralciclodereloj ..... 104
Figura7.21:Solucinalaesperaportiemposseguidadeesperaporeventos(figura7.20) ..................................................... 105
Figura7.22:Esquemadelbancodepruebasdeltransmisorqueincluyeunprocesoquemodelaelreceptordescritoa
altonivelyverificaqueelenvoescorrecto ................................................................................................................ 107
Figura7.23:Esperaparasituarnosenmediodelbitdeinicio........................................................................................................ 107
Figura7.24:Esperaparasituarnosenmediodelbit0deldato ..................................................................................................... 108
Figura7.25:AvisosdelosassertenModelsim ............................................................................................................................. 110
Figura7.26:EsquemaestructuraldeltransmisordelaUARTqueimplementaremosenlaFPGA......................................... 113
Figura7.27:Esquemainternodeinterfazconlospulsadores ........................................................................................................ 115
Figura7.28:Cmoindicarelmdulodemayornivel ..................................................................................................................... 116
Figura7.29:Representacinesquemticadelaentidaddemsaltonivel .................................................................................. 117
Figura7.30:Representacinesquemticadelaarquitecturaestructural,conloscomponentesreferenciadosysus
conexiones ......................................................................................................................................................................... 118
Figura7.31:ExplicacindelareferenciaoinstanciadeuncomponenteenVHDL ................................................................... 119
Figura7.32:Nuevaconexindelhiperterminal ............................................................................................................................... 120
Figura7.33:Conexinalpuertoserie ................................................................................................................................................. 121
Figura7.34:Caractersticasdelaconexin ........................................................................................................................................ 121
Figura7.35:ResumendeldiseoenelISE ........................................................................................................................................ 122
Figura7.36:Asignacindelasealdato_tx_rg............................................................................................................................ 123
Figura7.37:Asignacindelpuertodesalidacaracter................................................................................................................ 124
Figura7.38:Esquemadeuncircuitoconunasealquenodavalor ............................................................................................ 125
Figura7.39:Esquemadeuncircuitoconunasealquenoharecibidovalor............................................................................. 125
Figura7.40:EsquemadeuncircuitoconlazocombinacionalyelcdigoVHDLqueloforma............................................... 126
Figura7.41:Esquemaquemuestracmosepuederomperellazocombinacionaldelafigura7.40 ...................................... 126
Figura7.42:Esquemadeejemplodecircuitoestructuralparamostrarlazoscombinacionalesentremdulos.................... 127
Figura7.43:Procesosenmdulosdistintosqueformanunlazocombinacionalconlassealestransmitey
tranmitiendo. ............................................................................................................................................................... 127
Figura7.44:ElprocesodeltransmisorcomomquinadeMoorepararomperellazocombinacional................................... 128
Figura7.45:Entradasysalidasdelreceptor ...................................................................................................................................... 130
Figura7.46:Cronogramadesalidasdelreceptoralterminarlarecepcinyelcomienzodeunanueva ............................... 130
Figura7.47:Diagramadebloquespreliminardelreceptor ............................................................................................................ 131
Figura7.48:Cronogramadeldivisordefrecuencia ......................................................................................................................... 132
Figura7.49:Esquemadelbancodepruebasdelreceptor,queincluyeunprocesoquemodelaeltransmisordescritoa
altonivel............................................................................................................................................................................. 132
Figura7.50:Esquemadelbancodepruebasdelreceptor,queincluyeeltransmisorsintetizable........................................... 133
Figura7.51:CircuitoquetransmiteloquerecibeconprotocoloRS232 ...................................................................................... 134
Figura8.1:Desbordamientoenlasumadenmerossinsigno...................................................................................................... 140
Figura8.2:Informedesntesis ............................................................................................................................................................. 141
Figura8.3:EsquemaRTL...................................................................................................................................................................... 142
Figura8.4:EsquemaRTLdelsumador .............................................................................................................................................. 142
Figura8.5:Ejemplosdeloscasosdedesbordamientoenlasumaencomplementoados ....................................................... 147
Figura8.6:Ejemplosdemultiplicacinenteraendecimalyenbinario ....................................................................................... 148
Figura8.7:Esquemadelmultiplicadorcombinacional ................................................................................................................... 149
Figura8.8:Sumasparcialesparalamultiplicacin .......................................................................................................................... 150
Figura8.9:Componentebsicodelmultiplicador ........................................................................................................................... 154
Figura8.10:Curvasdeprestacionesreatiempoparaalgoritmos ............................................................................................... 158
Figura8.11:Paralelizacin.................................................................................................................................................................... 158

8 Universidad Rey Juan Carlos


ndice de figuras

Figura8.12:Segmentacin.....................................................................................................................................................................159
Figura8.13:Compartirrecursos ...........................................................................................................................................................160
Figura8.14:Tresopcionesdediseo.A:combinacional.B:Segmentado.C:Secuencial ...........................................................160
Figura8.15:Algortimoparacalcularunmultiplicadorde4x4apartirde4multiplicadoresde2x2........................................163
Figura8.16:Esquemadelmultiplicadorsegmentado ......................................................................................................................164
Figura8.17:Esquemticodelmultiplicadorsecuencialde4bits ...................................................................................................167
Figura8.18:UtilizacindereadelaNexys2paraimplementarlosdistintosmultiplicadoresrespectoalnmerode
bitsdelmultiplicador .......................................................................................................................................................170
Figura8.19:FrecuenciamximadelaNexys2paralosdistintosmultiplicadoresrespectoalnmerodebitsdel
multiplicador......................................................................................................................................................................170
Figura8.20:Ejemplodedivisinenteraendecimalyenbinario ...................................................................................................171
Figura8.21:Paso1deladivisin:clculodeldesplazamientoinicial...........................................................................................172
Figura8.22:Paso2deladivisin .........................................................................................................................................................172
Figura8.23:Paso3deladivisin .........................................................................................................................................................172
Figura8.24:Paso4deladivisin .........................................................................................................................................................172
Figura8.25:Paso5deladivisin .........................................................................................................................................................173
Figura8.26:Paso6deladivisin .........................................................................................................................................................173
Figura9.1:ConectorVGA .....................................................................................................................................................................175
Figura9.2:Pxelesenunapantallaconresolucinde640x480 .......................................................................................................176
Figura9.3:Sealesdesincronismoparaunafrecuenciaderefrescode60Hzy640x480pxeles.............................................176
Figura9.4:Cronogramadeunalneaenpxeles ...............................................................................................................................177
Figura9.5:Entradasysalidasdelsincronizador ...............................................................................................................................179
Figura9.6:Esquemadelsincronizador ...............................................................................................................................................180
Figura9.7:CronogramadelcontadordeciclosderelojparalaXUPV2P(100MHz) .................................................................181
Figura9.8:CronogramadelcontadordeciclosderelojparalaNexys2(50MHz) .....................................................................181
Figura9.9:Cronogramadelacuentadepxelescomenzandodesdelospxelesvisibles ..........................................................183
Figura9.10:EsquemadebloquesdelcontroladorVGAsencillo....................................................................................................184
Figura9.11:CartadeajustequedebemostrarseporpantallaparalaXUPV2P...........................................................................186
Figura10.1:Campodejuego ................................................................................................................................................................187
Figura10.2:Esquemadebloquesdeljuegodeteniscontroladoporlospulsadores ..................................................................188
Figura10.3:Coordenadasymedidasdeljugadorizquierdoenelcampo ....................................................................................189
Figura10.4:cuatrodireccionesdelapelota .......................................................................................................................................191
Figura10.5:Ejemplosdecambiosdetrayectoriadelapelotaalchocarconlasparedes ...........................................................191
Figura11.1:ConectorPS/2.....................................................................................................................................................................193
Figura11.2:CronogramageneraldelatransmisindelpuertoPS/2.............................................................................................194
Figura11.3:Ejemplodelcronogramaparaunatransmisindelteclado ......................................................................................194
Figura11.4:Entradasysalidasdelreceptordelteclado ..................................................................................................................195
Figura11.5:Cdigosscandeuntecladoinglsnorteamericano ....................................................................................................195
Figura11.6:Contenidodelostresbytesdeinformacinenviadosporelratn ..........................................................................197
Figura11.7:CronogramadelatransmisindedatosentrelacomputadoraoFPGA(rojo)yelratn(azul).........................199
Figura11.8:Cronogramasseparadosdelatransmisindedatosdesdelacomputadorahaciaelratn ................................199
Figura11.9:EsquemasimplificadodelaconexinendrenadorabiertodelPS/2 ........................................................................200
Figura11.10:Funcionamientodeuntransistorendrenadorabiertoconresistenciadepullup ..............................................201
Figura11.11:Funcionamientodedostransistoresconectadosendrenadorabiertoconresistenciadepullup....................201
Figura11.12:Buffertriestado ..............................................................................................................................................................202
Figura11.13:Separacindeunpuertodeentradaysalidaenseales..........................................................................................202
Figura12.1:BloquedememoriaRAMdedoblepuerto...................................................................................................................205
Figura12.2:EsquemadebloquesdelcircuitoquepintaenlapantallaunaimagenguardadaenunaROM.........................206
Figura12.3:ImagendelaROMdelcdigo12.1 ................................................................................................................................208
Figura12.4:ClculodeladireccindememoriaatravsdelnmerodepxelynmerodelneadelaVGA .....................209
Figura12.5:EsquemadebloquesdelcircuitoquepintaenlapantallaunaimagenguardadaenunaROMretrasando
lassealesdelaVGA........................................................................................................................................................211
Figura12.6:Eliminacindetransicionesespuriasconunbiestable...............................................................................................212
Figura12.7:Clculodeladireccindememoriaparapintarunaimageneldobledegrande .................................................214
Figura12.8:Esquemadelclculodeladireccindememoriaparaimgenesde16x16............................................................215
Figura12.9:Clculodeladireccindememoriaaprovechandoquelaimagentieneunnmerodecolumnaspotencia
dedos ..................................................................................................................................................................................215
Figura12.10:Clculodeladireccindememoriaydelndicedelpxelenmemoriasqueguardantodalafilaenuna
direccin..............................................................................................................................................................................217
Figura12.11:CreacindeunIP............................................................................................................................................................222
Figura12.12:SeleccindeBlockMemoryGenerator .......................................................................................................................222
Figura12.13:Seleccindeopcionesdelamemoria(I) .....................................................................................................................223
Figura12.14:Seleccindeopcionesdelamemoria(II)....................................................................................................................223
Figura12.15:Seleccindeopcionesdelamemoria(III)...................................................................................................................223

Departamento de Tecnologa Electrnica 9


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Figura12.16:CronogramadeconlalecturayescrituradelaBRAM(modowritefirst)........................................................... 224
Figura12.17:CronogramadeconlalecturayescrituradelaBRAM(modoreadfirst) ............................................................ 224
Figura12.18:Diagramadebloquesdelaprctica ............................................................................................................................ 224
Figura12.19:Primeraversindelcircuito ......................................................................................................................................... 225
Figura13.1:MapadebitsdelaA,laBylai............................................................................................................................. 227
Figura13.2:Diagramadebloquesdelcircuitoqueescribeloscaracteresporpantalla ............................................................. 228
Figura13.3:ConfiguracindelaROMparaguardarlainformacindelospxelesdelos128caracteresASCII ................. 229
Figura13.4:Divisindelapantallaencuadrculasynumeracindelascuadrculas ............................................................... 231
Figura13.5:ClculodelafilaycolumnadelacuadrculaapartirdelafilaycolumnadelaVGA ....................................... 232
Figura13.6:Esquemadelosclculosdelasdireccionesdememoriaparalaobtencindelcolordelpxel.......................... 233
Figura14.1:Distintosoperadoresdeconvolucin ........................................................................................................................... 235
Figura14.2:AplicacindeloperadorhorizontaldePrewittalpxel(1,1).................................................................................... 235
Figura14.3:Numeracindelospxelesdelaventana..................................................................................................................... 236
Figura14.4:DiagramadebloquesdelcircuitoqueprocesaymuestraunaimagenguardadaenunaROM ........................ 236
Figura14.5:EntradasysalidasdelmduloProcVentanaquerealizalaconvolucindeventana3x3 ............................... 238
Figura14.6:Esquemadelasoperacionesdelaconvolucin3x3dePrewitt ............................................................................... 238
Figura14.7:DiagramadebloquesdelcircuitoqueprocesaymuestraunaimagenrecibidaporlaUART ........................... 239
Figura14.8:Pxelesrepetidosenelclculodelaconvolucin3x3paraelprocesamientodedospxelesconsecutivos ..... 240
Figura14.9:Registrosqueguardantresfilasdelaimagen............................................................................................................. 241
Figura14.10:DesplazamientodelosregistrosalrecibirunnuevopxeldelaUART ............................................................... 241
Figura14.11:Desplazamientodelosregistros:llegadadeunpxeldelborde............................................................................ 242
Figura14.12:Desplazamientodelosregistros:salidadeunpxeldelborde .............................................................................. 242
Figura14.13:Diagramadebloquessimplificadodelmdulodelosregistrosdedesplazamiento ......................................... 243
Figura14.14:Esquemadelaescrituradetreselementosenelbfercircular.............................................................................. 243
Figura14.15:Llenadodelbfercircularyescrituraconelbferlleno......................................................................................... 244
Figura14.16:Bfercircularconunnicopuntero ........................................................................................................................... 244
Figura14.17:Funcionamientodelbfercircularconunnicopunterocuandoestlleno ...................................................... 245
Figura14.18:Variantedelcircuitodelafigura14.9implementadoconbferes ........................................................................ 245
Figura14.19:DiagramadebloquesdelaFIFO ................................................................................................................................. 246
Figura15.1:VideojuegoPacMan........................................................................................................................................................ 247
Figura15.2:VersindelPacManparaAtari .................................................................................................................................... 247
Figura15.3:Cuadrculadelcampodejuegoysurelacinconlapantallade640x480.............................................................. 248
Figura15.4:Paredesrellenasconunslocolor ................................................................................................................................ 256
Figura15.5:Paredesrellenascondibujos .......................................................................................................................................... 256
Figura15.6:Tiposdeceldasparapintarlasparedesdellaberinto................................................................................................ 256
Figura15.7:Obtencindeltipodeceldaparapintarlasparedesapartirdelasceldasadyacentes ....................................... 257
Figura15.8:Tamaodelpacmancomparadoconelantiguoyelnuevopasillo ....................................................................... 258
Figura15.9:Pacmanampliadoparaqueocupelamayorpartedelpasillo ................................................................................ 258
Figura15.10:Coordenadasdelpacmanampliado.......................................................................................................................... 259
Figura15.11:Movimientodelpacmanpxelapxelhastallegaralaposicinfinal ................................................................. 260

10 Universidad Rey Juan Carlos


ndice de cdigo VHDL
Cdigo2.1:EntidadenVHDL................................................................................................................................................................20
Cdigo2.2:ArquitecturaenVHDL .......................................................................................................................................................21
Cdigo2.3:ArquitecturaenVHDL .......................................................................................................................................................21
Cdigo2.4:ArquitecturaenVHDL .......................................................................................................................................................21
Cdigo2.5:Arquitecturaequivalentealadelcdigo2.4 ..................................................................................................................21
Cdigo2.6:ArquitecturadeunmultiplexorenVHDL......................................................................................................................22
Cdigo2.7:ArquitecturaequivalentedeunmultiplexorenVHDL ................................................................................................22
Cdigo2.8:Descripcindelmultiplexorequivalentealadelcdigo2.7utilizandolasentenciacase......................................22
Cdigo2.9:Multiplexorde2bitsdeseleccin.....................................................................................................................................23
Cdigo2.10:Procesoequivalenteparaelmultiplexorde2bitsdeseleccindelcdigo2.9 .......................................................23
Cdigo2.11:LatchdetipoDactivopornivelalto ..............................................................................................................................24
Cdigo2.12:LatchdetipoDactivopornivelaltoconreset .............................................................................................................24
Cdigo2.13:BiestabledetipoDactivoporflancodesubida ...........................................................................................................25
Cdigo2.14:Dosbiestablesencascada.................................................................................................................................................25
Cdigo2.15:Diseoequivalentealcdigo2.14...................................................................................................................................26
Cdigo2.16:Circuitodetectordeflanco...............................................................................................................................................26
Cdigo2.17:Contadormdulo8 ...........................................................................................................................................................27
Cdigo2.18:Registrodecargaparaleloysalidaserie........................................................................................................................28
Cdigo2.19:Ejemplodediseoestructural .........................................................................................................................................31
Cdigo3.1:PaquetespordefectoqueponeelISE ..............................................................................................................................42
Cdigo3.2:Paquetesrecomendados .....................................................................................................................................................42
Cdigo3.3:CdigodelaentidadparalaXUPV2P.............................................................................................................................43
Cdigo3.4:CdigodelaentidadparalaNexys2 ...............................................................................................................................43
Cdigo3.5:Cdigodelaarquitecturadeled1.vhdenlaXUPV2P ..................................................................................................43
Cdigo3.6:Cdigodelaarquitecturadeled1.vhdenlaNexys2.....................................................................................................43
Cdigo4.1:Cdigodelaprimeraversin(confallos)delsegunderoparalaXUPV2P ..............................................................58
Cdigo4.2:Cdigodelaprimeraversin(confallos)delsegunderoparalaNexys2 ................................................................59
Cdigo4.3:declaracindeunrangoincorrectaparasntesis .......................................................................................................61
Cdigo4.4:declaracionescorrectadeunrango ..................................................................................................................................61
Cdigo4.5:ladeclaracindeunasealsinrangoimplementaunasealde32bits ...................................................................61
Cdigo4.6:Declaracindesealunsigned .......................................................................................................................................61
Cdigo4.7:EntidaddelasegundaversindelsegunderoparalaXUPV2P..................................................................................61
Cdigo4.8:EntidaddelasegundaversindelsegunderoparalaNexys2....................................................................................61
Cdigo4.9:Declaracindelassealesusadasparacontar ...............................................................................................................61
Cdigo5.1:ProcesoquesimulaelrelojdelaXUPV2P ......................................................................................................................65
Cdigo5.2:ProcesoquesimulaelrelojdelaNexys2.........................................................................................................................65
Cdigo5.3:ProcesoquesimulalasealderesetparalaXUPV2P ..................................................................................................65
Cdigo5.4:ProcesoquesimulalasealderesetparalaNexys2.....................................................................................................65
Cdigo6.1:Sentenciaconlgicadirecta ...............................................................................................................................................71
Cdigo6.2:Sentenciaequivalentealcdigo6.1peroconlgicainversa........................................................................................71
Cdigo6.3:Aadiendo_nalassealesqueusanlgicainversa ...................................................................................................72
Cdigo6.4:Invirtiendolospuertosquetrabajanconlgicainversa ...............................................................................................72
Cdigo6.5:Usandoconstantesparaindependizarelcircuitodeltipodelgicadelasentradas...............................................72
Cdigo6.6:Declaracinyusodegenricos .........................................................................................................................................72
Cdigo6.7:Ejemplodelatransmisindelosgenricosenunareferenciaacomponente ..........................................................73
Cdigo6.8:InclusindelpaqueteSTD_LOGIC_1164delabibliotecaIEEE .................................................................................73
Cdigo6.9:Paqueteconladefinicindelasconstantes ....................................................................................................................73
Cdigo6.10:Entidadyarquitecturaqueusanelpaquetedelcdigo6.9 .......................................................................................74
Cdigo7.1:Paqueteconladeclaracindeconstantes........................................................................................................................81
Cdigo7.2:ConstanteparaelclculodelfindecuentadedivisordefrecuenciadelaUART...................................................84
Cdigo7.3:Rangodelasealcuentabasadoenlaconstantedefindecuenta .............................................................................84
Cdigo7.4:Declaracindeunafuncinparaelclculodellogaritmo ...........................................................................................85
Cdigo7.5:CuerpodelpaqueteUART_PKGycuerpodelafuncinlog2i ..................................................................................86
Cdigo7.6:Ejemplodelautilizacindelresultadodelafuncinlog2iparalosrangosdelasseales.................................86
Cdigo7.7:Constantequerepresentaelnmerodebitsmenosunodelcontadordeldivisordefrecuencia .........................87
Cdigo7.8:Declaracindelasea,paraelcasodetipounsigned,quecuentaconelrangodeterminadoporla
constantecalculada .............................................................................................................................................................87
Cdigo7.9:Declaracindelaseal,paraelcasodetiponatural,conelrangodeterminadoporlaconstantecalculada......87

Departamento de Tecnologa Electrnica 11


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Cdigo7.10:ProcesodeldivisordefrecuenciadeltransmisordelaUART.................................................................................. 87
Cdigo7.11:Elusodefuncionesdentrodelmismopaquetedaproblemasenalgunasherramientas .................................... 88
Cdigo7.12:Usodeconstantesdiferidasparaevitarproblemasporusarfuncionesdentrodelmismopaquete(cdigo
7.11).NovaleparaelISE................................................................................................................................................... 89
Cdigo7.13:Funcinparaelredondeo ............................................................................................................................................... 90
Cdigo7.14:Constanteconelperiododelrelojennanosegundos ................................................................................................. 93
Cdigo7.15:Modificacindelprocesodelrelojparaquesufrecuenciadependadeconstantes .............................................. 94
Cdigo7.16:Esperaraquehayaunflancodesubidadelreloj......................................................................................................... 95
Cdigo7.17:Nombredelanuevaentidadparaelbancodepruebas........................................................................................... 102
Cdigo7.18:Declaracindeuntipodedatosqueesunvectordestd_logic_vector(slv)ylaconstanteconlos
datosaprobar ................................................................................................................................................................... 102
Cdigo7.19:Asignacindelvalordelndicecerodelaconstante................................................................................................ 102
Cdigo7.20:Negamoslosbitsdelsegundoenvo ........................................................................................................................... 103
Cdigo7.21:Tiempoquetranscurreenenviarunbit ..................................................................................................................... 104
Cdigo7.22:Esperaalflancodebajadadelasealfpga_tx ....................................................................................................... 107
Cdigo7.23:Ejemplodeunasentenciaassert .............................................................................................................................. 108
Cdigo7.24:Sentenciaassertparaelbit0delprimerenvo ...................................................................................................... 109
Cdigo7.25:Bucleforparacomprobartodoslosbitsdeldato.................................................................................................... 109
Cdigo7.26:Modificacindelcdigo7.25paraquecomparelosbitssegnelnmerodeenvo .......................................... 110
Cdigo7.27:DeclaracindelavariablenumenviodentrodelprocesoP_Receptor ............................................................. 111
Cdigo7.28:Incrementodelavariablenumenvio.......................................................................................................................... 111
Cdigo7.29:Modificacindelprocesodelreceptordelbancodepruebasparaquesedetengaenlaltimarecepciny
generelasealdeavisodelfindelasimulacin ........................................................................................................ 112
Cdigo7.30:Modificacindelprocesodelrelojparadetenerlasimulacin............................................................................... 112
Cdigo7.31:Asignacindeunhexadecimalaunvectorde8bits................................................................................................ 115
Cdigo7.32:Declaracindeentidadydiferenciasconladeclaracindecomponente............................................................. 118
Cdigo7.33:Declaracindecomponenteydiferenciasconladeclaracindeentidad............................................................. 118
Cdigo8.1:Llamadaalpaquetenumeric_std,recomendado.................................................................................................... 136
Cdigo8.2:Llamadaalospaquetesstd_logic_arithystd_logic_unsigned,norecomendado,usaremosel
delcdigo8.1 .................................................................................................................................................................... 136
Cdigo8.3:Comparacinentretiposunsigned,signedystd_logic_vector ................................................................. 137
Cdigo8.4:Conversindirectaentreelementos(bits)devectoresyconstd_logic ............................................................. 137
Cdigo8.5:Conversincastentresignedyunsignedconstd_logic_vector(delmismorango) .............................. 138
Cdigo8.6:Funcionesdeconversinentresignedyunsignedainteger,usandoelpaquetenumeric_std............. 138
Cdigo8.7:Conversinentreintegerystd_logic_vector.................................................................................................. 139
Cdigo8.8:Asignacindeconstantesaununsignedyusodeconstantesenoperaciones ................................................... 139
Cdigo8.9:Sumadetiposunsigned sinconsiderarelacarreo.................................................................................................. 139
Cdigo8.10:Sumadetiposunsigned considerandoelacarreodemaneraerrnea.............................................................. 140
Cdigo8.11:Sumaconsiderandoelacarreodetiposunsigned .................................................................................................. 140
Cdigo8.12:Sumadeunsignedconavisodedesbordamiento .................................................................................................. 140
Cdigo8.13:Restadenmerospositivos .......................................................................................................................................... 143
Cdigo8.14:Sumadenmerosenteros ............................................................................................................................................. 144
Cdigo8.15:Restadenmerosenteros ............................................................................................................................................. 144
Cdigo8.16:Sumadetipossignedconsiderandoelacarreo....................................................................................................... 145
Cdigo8.17:Sumadetipossignedconsiderandoelacarreoyutilizandolafuncinresize.............................................. 145
Cdigo8.18:Sumadetipossignedconsiderandoelacarreoyutilizandolafuncinresizeconelatributolength.... 145
Cdigo8.19:Productodedosunsignedproduceununsignedconunnmerodebitsresultadodelasumadel
nmerodebitsdelosfactores........................................................................................................................................ 147
Cdigo8.20:Productoporunaconstantederangomayor.Errneo............................................................................................ 148
Cdigo8.21:Productoporunaconstantederangomayor.Correcto........................................................................................... 148
Cdigo8.22:Multiplicacincombinacionalconsentenciasconcurrentes.................................................................................... 150
Cdigo8.23:Asignacininvirtiendoelordendelosbits................................................................................................................ 151
Cdigo8.24:Asignacininvirtiendoelordendelosbitsusandolasentenciagenerate ....................................................... 151
Cdigo8.25:Multiplicadorcombinacionalgenrico ....................................................................................................................... 152
Cdigo8.26:Bancodepruebasparaelmultiplicadorcombinacionalgenrico.......................................................................... 153
Cdigo8.27:Multiplicadorestructural .............................................................................................................................................. 155
Cdigo8.28:Multiplicadorestructuralgenrico .............................................................................................................................. 156
Cdigo8.29:Multiplicadorsegmentadogenrico............................................................................................................................ 165
Cdigo8.30:Multiplicadorsecuencialgenrico ............................................................................................................................... 169
Cdigo9.1:PaqueteconladefinicindelasconstantesdelcontroladorVGA........................................................................... 182
Cdigo9.2:Procesoqueasignacoloressegnelpxel .................................................................................................................... 185
Cdigo12.1:MemoriaROMde256posicionesyunbitdeanchodepalabra ............................................................................ 207
Cdigo12.2:Clculodeladireccindememoriaconmultiplicacin .......................................................................................... 210
Cdigo12.3:Dibujarlaimagendemanerarepetida........................................................................................................................ 213

12 Universidad Rey Juan Carlos


Cdigo12.4:MemoriaROMde16posicionesy16bitsdeanchodepalabra ..............................................................................216
Cdigo12.5:MemoriaROMde10x10y256coloresgrises .............................................................................................................218
Cdigo12.6:Asignacindelvalordeldatodelamemoriade8bitsdegrisaloscoloresdelaXUP ......................................219
Cdigo12.7:Asignacindelvalordeldatodelamemoriade8bitsdegrisaloscoloresdelaNexys2 .................................219
Cdigo12.8:MemoriaROMde10x10y256colores.........................................................................................................................219
Cdigo12.9:Asignacindelvalordeldatodelamemoriade8bitsdecoloraloscoloresdelaXUP(enproceso
secuencial) ..........................................................................................................................................................................220
Cdigo12.10:Asignacindelvalordeldatodelamemoriade8bitsdecoloraloscoloresdelaNexys2.............................220
Cdigo12.11:MemoriaRAMdedoblepuerto,unodeescrituraylectura(modowritefirst)yelotrodeslolectura.......221
Cdigo12.12:ProcesodelamemoriaRAMdedoblepuerto,unodeescrituraylectura(modoreadfirst)yelotrode
slolectura .........................................................................................................................................................................221
Cdigo15.1:ConstantedelaROMparadibujarelpacmanadoscolores ..................................................................................251
Cdigo15.2:ConstantedelaROMparadibujarellaberinto(mitad)............................................................................................252

Departamento de Tecnologa Electrnica 13


ndice de tablas
Tabla2.1:Valoresdelstd_logic........................................................................................................................................................ 20
Tabla7.1:PuertosdelRS232queusaremosylospinesenlasplacas ............................................................................................ 79
Tabla7.2:ConstantesdelaUARTparasuconfiguracin................................................................................................................. 81
Tabla7.3:PuertosdeltransmisordelaUART .................................................................................................................................... 81
Tabla7.4:Tabladeestados,entradasysalidasdeltransmisordelaUART .................................................................................. 92
Tabla7.5:PuertosdeINTERFAZ_PBysucorrespondenciaconlospulsadoresdelastarjetasyeldatoquetienenque
enviaraltransmisor ......................................................................................................................................................... 114
Tabla7.6:PuertosdelreceptordelaUART....................................................................................................................................... 130
Tabla8.1:Nmerosencomplementoadosde4bitsysucorrespondientedecimal ................................................................. 146
Tabla8.2:Variacindereayretardosconelnmerodebitsdelosfactoresdelmultiplicadorcombinacionaldel
apartado8.8.3paralaNexys2 ........................................................................................................................................ 162
Tabla8.3:Variacindereayretardosconelnmerodebitsdelosfactoresdelosmultiplicadoresembebidosdela
Nexys2(cdigo8.19) ........................................................................................................................................................ 162
Tabla8.4:Variacindereayretardosconelnmerodebitsdelosfactoresdelosmultiplicadoressegmentados
(cdigo8.29) ...................................................................................................................................................................... 166
Tabla8.5:Variacindereayretardosconelnmerodebitsdelosfactoresdelosmultiplicadoressecuenciales
(cdigo8.30) ...................................................................................................................................................................... 169
Tabla9.1:Valoresparadiversasresolucionesdepantalla .............................................................................................................. 177
Tabla9.2:PuertosdelconversorVGAdelaXUPV2P ..................................................................................................................... 178
Tabla9.3:PuertosdelconversorVGAdelaNexys2........................................................................................................................ 179
Tabla9.4:Caractersticasdelospuertosdelmdulodesincronizacin.Elrestodepuertosestnenlastablas9.2y9.3... 180
Tabla11.1:ComunicacinentreelratnylaFPGAhastahabilitarlatransmisindedatosdelratn .................................. 198
Tabla12.1:ConfiguracionesdelasBRAM......................................................................................................................................... 203
Tabla12.2:TamaomximodelamemoriausandotodaslasBRAMdelaFPGAsegnelanchodepalabra..................... 203
Tabla12.3:TamaomximodelasimgenessegnelnmerodeimgenesquesevanaguardarenlasBRAM.Para
imgenesde8bitsporpxel. .......................................................................................................................................... 204
Tabla12.4:ListadodepuertosdelaBRAMdedoblepuerto ......................................................................................................... 205

Departamento de Tecnologa Electrnica 14


1. Introduccin
El objetivo de este manual es ensear a disear circuitos y sistemas digitales de cierta
complejidad usando VHDL y dispositivos lgicos programables (CPLD o FPGA). El
enfoqueesaprenderadiseardemaneraprctica,yquelanecesidadderealizaralgonos
haga tener curiosidad por los distintos mtodos y tcnicas para una eficiente
implementacindelcircuito.
EstemanualsehadesarrolladoenelDepartamentodeTecnologaElectrnica[9dte]dela
Universidad Rey Juan Carlos para la asignatura Diseo de Circuitos y Sistemas
Electrnicos (DCSE [10dcse]) de la titulacin de Ingeniera de Telecomunicacin1.
Previamente,losalumnosdeestacarrerahancursadolasasignaturasElectrnicaDigitalI
(ED1),ElectrnicaDigitalII(ED2[11ed2])ySistemasElectrnicosDigitales(SED),adems
deotrasasignaturasdeelectrnicabsicayelectrnicaanalgica2.
En ED1 los alumnos adquirieron los conceptos bsicos de la electrnica digital y
realizaron diseos tanto con componentes discretos como con dispositivos lgicos
programables.LasprcticasrealizadasconFPGAdeED1estnguiadasenelmanualdela
referencia[19mach].Endichasprcticasseenseaadisearcircuitoselectrnicosdigitales
con esquemticos y FPGA. As que para seguir este manual suponemos que ya has
adquirido los conceptos bsicos de los sistemas de numeracin y electrnica digital:
diseo con puertas lgicas, bloques combinacionales, elementos de memoria, registros y
contadores.RealizarlasprcticasdeED1[19mach]esunabuenabaseparaesto.
Un ao ms tarde, en ED2 los alumnos aprendieron a disear circuitos digitales ms
complejos,teniendoquedominarelempleodemquinasdeestadosfinitos(FSM3)parael
diseo y anlisis de los circuitos digitales. En la prctica, se pas de disear con
esquemticosadisearconellenguajededescripcindehardwareVHDL.Losdiseosde
los circuitos digitales de este curso estn recogidos en el manual de la asignatura
[17mach]. Ejemplos de los diseos de dicho manual son: cronmetros, el control de
mquinasexpendedoras,controldemotores,claveselectrnicas,etc.
Por tanto, para seguir este manual con una mayor comprensin se recomienda haber
realizado los diseos propuestos en manual de ED2 [17mach]. Este manual est
disponible en el archivo abierto de la Universidad Rey Juan Carlos. De todos modos, si
slo necesitas un breve repaso de VHDL, el manual que ests leyendo incluye una
pequeaintroduccinaestelenguajededescripcindehardware.
Como seguramente recuerdes, el VHDL es un estndar del Instituto de Ingenieros
Elctricos y Electrnicos4 (IEEE [13ieee]). Existen otros lenguajes de descripcin de
hardware como el Verilog o el SystemC. Histricamente, la existencia simultnea del
VHDL y Verilog ha dividido a la comunidad de diseadores, lo que ha provocado

1Esteplandeestudiosempezaextinguirseapartirdelcurso20092010conlaimplantacindelosgradosde
Boloniaenelprimercurso
2Enlareferencia[12educ]seresumeelcurrculumenelectrnicaqueadquierenlosalumnosendichoplande
estudios
3FSM:acrnimodelingls:FiniteStateMachine:Mquinadeestadosfinitos
4InstituteofElectricalandElectronicsEngineers

Departamento de Tecnologa Electrnica 15


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

dificultades en el intercambio de diseos y a las empresas que fabrican herramientas


informticasdeayudaaldiseo(CAD).
ElVHDLesunlenguajemuyamplioquefuecreadoparamodelarcircuitos.Mstardese
empez a utilizar para disear circuitos, utilizando para ello slo un conjunto reducido
delVHDL,loquesellamaVHDLparasntesis[25rtl].Latransformacindeuncircuito
descrito en VHDL a su esquema en puertas lgicas y biestables se llama sntesis. Esta
sntesis la realizan automticamente las herramientas CAD, lo que hace ahorrar mucho
tiempo a los diseadores de circuitos. De la misma manera que en el manual de ED2
[17mach], en este manual no aprenderemos a utilizar la totalidad del VHDL, sino que
usaremos un conjunto restringido del lenguaje orientado a sntesis. Lo que es ms,
tampocousaremostodoelconjuntodeVHDLparasntesis,sinoqueutilizaremosloque
vayamosnecesitando.Porsuerteopordesgracia,enVHDLunacosasepuededescribir
demuchasmanerasdistintas.Porlogeneral,enestemanualpropondremosslounade
ellas.
Pararealizarlasprcticaspropuestasenestemanualseutilizarndostarjetasbasadasen
FPGAdeXilinx[29xilinx]:laXUPVirtexIIpro[31xup]ylaNexys2[21nexys].Actualmente
Xilinx es el mayor fabricante de FPGA seguido de Altera. Xilinx proporciona una
herramientadediseoasistidoporordenador(CAD)gratuita:elISEWebpack[16ise]que
serlaqueseuseenestemanual.Paralasimulacin,seutilizarelpropiosimuladordel
ISEoelModelsim[20model].Sinembargo,aunqueconunesfuerzomayor,podrsseguir
este manual usando herramientas y tarjetas diferentes si te abstraes de las
particularidadesdestas.
Al realizar este manual hemos intentado buscar un punto intermedio entre dar una
solucin a cada prctica planteada, y dejarte slo y sin ayuda para que encuentres tu
propiasolucin.Asquehemosintentadodarunnmerodepautassuficientesparaque
puedas realizar el diseo por ti mismo sin que te sobrepase la dificultad, o que por el
contrario,copiesypegueslasolucinpropuestasinquetesupongaunretooquenote
estsdandocuentadeloqueestshaciendo.Encontraresepuntointermedionoesfcil,y
puede ser que a veces te parezca que el grado de detalle es excesivo, o que por el
contrario, necesites ms ayuda. En ambos casos, te pedimos que entiendas la dificultad
quenossuponeencontraresepuntomedio,yqueademsnoeselmismoparatodoslos
quevanaleerestemanual.
Las primeras prcticas son ms detalladas y conforme se avanza se proporciona menos
informacin de detalle y se incide en los aspectos ms generales de cmo abordar el
diseo. Las prcticas son de dificultad incremental y por este motivo te recomendamos
que sigas el orden establecido. A veces se incluyen apartados opcionales, que puedes
saltrtelossiaslodeseas.Estosapartadossehansealadoconelsmbolo.
Esmuyimportantequeparaseguirestemanualrealiceslasprcticasylasimplementes,y
notelimitesaleerlas.Yasabesquelaprcticanosiempreesigualquelateora.Tambin
te recomendamos que intentes pensar un tu propia solucin antes de mirar las guas
ofrecidasparaabordareldiseo.Pensarenunasolucinycompararlaconlaqueaquse
proponeteayudaraaprenderadisear.
Por ltimo, con el fin de que este manual pueda llegar al mayor nmero de personas y
conelobjetivodegenerarmaterialeducativoabierto,hemospublicadoestemanualbajo
unalicenciaCreativeCommons[5cc]quepermitesucopiaydistribucin.Hemospuestoel

16 Universidad Rey Juan Carlos


1. Introduccin

libro en el archivo abierto de la Universidad Rey Juan Carlos y se puede acceder a l


desdeelsiguienteenlacehttp://hdl.handle.net/10115/5700,endondeademsdeestelibro
puedes descargar algunos ficheros VHDL de las prcticas de este libro. Estos ficheros
tambinestndisponiblesenelenlace[28web]
Esperamos que disfrutes de su lectura y que te ayude a aprender a disear circuitos y
sistemas electrnicos digitales. Para ir mejorando el manual, agradeceremos la
comunicacin de comentarios, sugerencias y correcciones a las direcciones de correo
electrnicodelosautores.
felipe.machado@urjc.es,susana.borromeo@urjc.esycristina.rodriguez.sanchez@urjc.es

Departamento de Tecnologa Electrnica 17


2. Repaso de VHDL para sntesis
En este captulo repasaremos descripciones simples de VHDL sintetizable. Aunque
suponemos que se conocen los conceptos aqu explicados, este captulo se podr usar
comoreferenciaparaalgunasdelasconstruccionesVHDLmstpicas.Sitienesdudaso
quieres repasar con ms profundidad lo que aqu se dice te recomendamos un manual
msbsico[17mach].
El VHDL es un lenguaje muy amplio y fue concebido inicialmente para modelado y
simulacin,noparasntesis.Portanto,notodaslasdescripcionesVHDLsonsintetizables,
estoes,notodaslasdescripcionestienenunaequivalenciaenelniveldepuertas.Porotro
lado,unamismafuncionalidadpuededescribirsedemuchasmaneras.
EsporestoqueestecaptulonopretendeserunmanualexhaustivodelVHDL,sinodar
recetas para facilitar el diseo en VHDL. Todos los ejemplos de este manual se pueden
describirdeotramanera.
Antes de empezar con los ejemplos recordemos que el VHDL no distingue entre
maysculas y minsculas. De todos modos, por claridad se recomienda mantener una
mismaformadeescribir.Estoes,siporejemploseponenlosoperadoresenmaysculas,
serarecomendablequesemantuviesenasentodoeldiseo,lomismoesvlidoparalos
nombresdeseales.
Hayunconjuntodepalabrasreservadasquenosedebenusarparaotrospropsitos(por
ejemploparanombresdeseales).stasson:


Figura 2.1: Lista de palabras reservadas del VHDL

A continuacin veremos una serie de ejemplos de diseos VHDL de dificultad


incremental.

Departamento de Tecnologa Electrnica 19


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

2.1. Puerta AND


Para disear un circuito en VHDL lo mnimo que se necesita es una entidad y una
arquitectura. La entidad define el circuito como una caja, con sus puertos de entrada y
salida. Mientras que la arquitectura describe el interior del circuito. Una misma entidad
puedetenervariasarquitecturas.
As,siqueremosdescribirunapuertaANDenVHDL,crearemoslaentidad:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
PUERTA_AND
PUERTA_AND
entity PUERTA_AND is
port ( A
A : in std_logic; C
B : in std_logic; B
C : out std_logic

); Figura 2.2: Representacin de la entidad VHDL
end;
Cdigo 2.1: Entidad en VHDL

Hayvariascosasquesedebenresaltar:
LaentidadnosepodrallamarANDyaqueesunapalabrareservada(verfigura2.1).
Aunque la entidad se llame PUERTA_AND, simplemente representa su nombre, pero no su
funcionalidad. Que tenga ese nombre no significa que vaya a tener que funcionar como
unapuerta AND.Dependerdeloquesedescribaenlaarquitectura.Sinembargo,comoes
lgico,noesrecomendableponerleunnombrequenodescribasufuncionalidad.
Lospuertosdeentradasehandeclaradodetipostd_logic.Esteesuntipodedatosdeun
solo bit que puede tener valores distintos de 0 y 1. Y se usan as para tener ms
informacinenlasimulacin.Losvaloresquepuedetenerunstd_logicson:

'U':Noharecibidovalor 'X':Harecibidovaloresdistintos(desconocidofuerte) '0':Cerolgico(cerofuerte)


'1':Unolgico(unofuerte) 'Z':Altaimpedancia 'W':Desconocidodbil
'L':Cerodbil 'H':Unodbil '-':Noimporta
Tabla 2.1: Valores del std_logic

Alternativamente se podan haber declarado como tipo bit. El tipo bit slo tiene los
valores 0 y 1. Sin embargo es ms recomendable utilizar el tipo std_logic, pues en
simulacin, es importante saber si la seal no ha recibido valor ('U'), si est recibiendo
valoresdistintosenunmismotiempo('X')ositomaelvalordealtaimpedancia('Z')que
veremosenelapartado11.2.4.
Parapoderusareltipostd_logichayqueindicarqueseusaelpaquetestd_logic_1164,y
estosehaceconlasdoslneasqueestnantesdelaentidad(vercdigo2.1).
Como hemos dicho, por ahora nuestra entidad no hace nada, simplemente hemos
definidosusentradasysalidas.Paradescribirsufuncionalidadusamoslaarquitectura:

20 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

architecture BEHAVIORAL of PUERTA_AND PUERTA_AND


is
begin A
C <= A and B; C
B
end BEHAVIORAL;
Cdigo 2.2: Arquitectura en VHDL Figura 2.3: Representacin de la arquitectura VHDL

Elnombredelaarquitecturaes BEHAVIORAL(comportamental).Normalmenteseponeun
nombre que describa el nivel de abstraccin de la descripcin, que puede ser dataflow,
functional,RTL,...Peronotieneporquserunodeestos.

Delcdigopodemosdeducirquelaasignacindesealesserealizamedianteeloperador:
<=".

2.2. Varias puertas


LaspuertasdisponiblesenVHDLson:AND,NAND,OR,NOR,XOR,XNOR,NOT.
Para implementar un circuito con varias puertas, stas se pueden poner en la misma
expresin.Porejemplo,enelcdigo2.3semuestraunaarquitecturaquetieneunanica
sentenciacontodaslaspuertas.Parasimplificar,enelcdigonosehaincluidolaentidad
(yasseharenlosejemplossucesivosanoserqueseanecesario).
architecture UNO of PUERTAS is A
begin B
Z <= (not(A or B)) xor C;
end UNO; C Z

Cdigo 2.3: Arquitectura en VHDL Figura 2.4: Representacin de la arquitectura VHDL

Existen reglas de precedencia entre los operadores, pero lo ms seguro es poner


parntesis, puesto que adems de facilitar la lectura, nos aseguramos que lo estamos
describiendocorrectamente.
Se puede realizar un circuito equivalente al cdigo 2.3 en dos sentencias, para ello es
necesariousarsealesauxiliares:
architecture DOS of PUERTAS is AUX
A
signal AUX : std_logic;
begin B
AUX <= not(A or B); C Z
Z <= AUX xor C;
end DOS; Figura 2.5: Representacin de la arquitectura VHDL
Cdigo 2.4: Arquitectura en VHDL

UnconceptomuyimportanteenhardwareyportantoenVHDLeslaconcurrencia.Esto
implica que no importa el orden de las sentencias que estn en el cuerpo de una
arquitectura, ya que el hardware se ejecuta concurrentemente: El hardware siempre se
estejecutando.Asqueelcdigo2.4esequivalentealsiguientecdigo:
architecture TRES of PUERTAS is
signal AUX : std_logic;
begin
Z <= AUX xor C; -- Ahora esta sentencia se ha puesto antes que la siguiente
AUX <= not(A or B); -- en VHDL el orden de sentencias concurrentes es indiferente
end TRES;
Cdigo 2.5: Arquitectura equivalente a la del cdigo 2.4

Antesdeseguir,asegratequeentiendesporquloscdigos2.4y2.5sonequivalentes.

Departamento de Tecnologa Electrnica 21


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

2.3. Multiplexor
Elmultiplexorseleccionaentrevariasalternativassegnelvalordelasealdeseleccin.
ParaelloelVHDLofrecevariasconstruccionesposibles.
Sepuederealizarmedianteunasentenciaconcurrenteenlaqueseincluyacondicin:
architecture UNO of MUX is
A 1
begin Z
B 0
Z <= A when Sel='1' else B;

end UNO;
Sel
Cdigo 2.6: Arquitectura de un multiplexor en
VHDL Figura 2.6: Representacin de la arquitectura VHDL

Otra manera de realizar un multiplexor es mediante el uso de procesos. Dentro de un


procesolaejecucindelassentenciasessecuencial:
architecture DOS of MUX is
begin

P_MUX: process (A,B,Sel) -- (A,B,Sel) es la lista de sensibilidad


begin
if Sel='1' then
Z <= A;
else
Z <= B;
end if;
end process;

end DOS;
Cdigo 2.7: Arquitectura equivalente de un multiplexor en VHDL

Enelcdigo2.7semuestraunmultiplexorequivalente.Paraellosehausadounproceso,
que como se ha dicho,se ejecutande forma secuencial. Los procesos tienen una lista de
sensibilidad,enlaquesetienenqueincluirtodaslassealesledasdentrodelproceso.En
estecaso,lassealesledassonA,BySel.
Hemosrealizadoelmultiplexorconlasentenciaif,aunqueesmshabitualhacerlaconla
sentenciacase.Enestecasonoesmuyimportanteporquelasealdeseleccin(Sel)esde
unsolobit.
architecture DOS of MUX is
begin
P_MUX: process (A,B,Sel)
begin
case Sel is -- en el case tienen que estar presentes todas las alternativas
when '1' =>
Z <= A;
when others => -- si no pongo todas las alternativas, pongo "others"
Z <= B;
end case;
end process;
end DOS;
Cdigo 2.8: Descripcin del multiplexor equivalente a la del cdigo 2.7 utilizando la sentencia case

Enelcdigo2.8sehadescritounmultiplexorconunasentencia case.Lasentencia case


tienequetenertodaslasalternativas,pudiendohaberunaalternativapordefectollamada
"others". Esta alternativa engloba a todas las que faltan. En este caso, como estamos
usandodatosdetipo std_logic,tenemosqueusarel others,yaquehaymsalternativas
que0y1(vertabla2.1).

22 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

2.4. Multiplexor de 2 bits de seleccin


El VHDL permite usar tipos de datos de ms de un bit (vectores). Para los vectores se
puede emplear el tipo std_logic_vector. Los vectores se declaran desde el bit ms
significativo(demayorndice)hastaelmenossignificativo(alqueseledaelndicecero5).
En el cdigo 2.9 semuestra la descripcin de un multiplexor de 2 bits de seleccin (con
datosdeunbit).Fjateenladeclaracindelasealdeseleccin:Sel.Paraestasealseusa
unstd_logic_vectorcuyorangovade1a0.Elbit1eselmssignificativo.
entity MUX_2B_SEL is
port (
A : in std_logic;
B : in std_logic;
C : in std_logic;
Sel : in std_logic_vector (1 downto 0);
Z : out std_logic
);
end; A 00

architecture UNO of MUX_2B_SEL is 01


begin B Z
P_MUX: process (A,B,C,SEL) 10
begin
case Sel is C 11
when "00" =>
Z <= A;
when "01" | "10" => -- mismo valor para 2
Z <= B; -- las 2 opciones Sel(1:0)

when others =>
Z <= C; Figura 2.7: Representacin del
end case; multiplexor
end process;
end UNO;
Cdigo 2.9: Multiplexor de 2 bits de seleccin

Tambinesinteresanteverenelcdigo2.9 cmoseindicaenunasentencia casequedos


opcionesdanelmismoresultado.Paraelloseutilizaeloperador|.
Elproceso del mismo multiplexor descritoconunasentencia ifen vezdecasequedar
comosemuestraenelcdigo2.10.Estecdigoproduceunmultiplexorequivalentealdel
cdigo2.9.
P_MUX_2: process (A,B,C,Sel)
begin
if Sel = "00" then
Z <= A;
elsif (Sel = "01") OR (Sel = "10") then
Z <= B;
else
Z <= C;
end if;
end process;
Cdigo 2.10: Proceso equivalente para el multiplexor de 2 bits de seleccin del cdigo 2.9

2.5. Elementos de memoria: latch6


Para describir un elemento de memoria podemos utilizar un proceso con sentencias
condicionalesenelqueenalgunasalternativasdejemoslasealsinasignar.Debidoaque
en dichas condiciones no se asigna ningn valor a la seal, sta tendr que guardar el

5Aunquesepuedeponerunndicedistintodecero,noesrecomendable.
6Unlatchesunelementodememoriacondosposiblesestados(biestable)queesactivopornivel.Lasealque
hacequeellatchestactivosesueledenominarenable(habilitacin).

Departamento de Tecnologa Electrnica 23


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

valor que anteriormente tena. Para guardar el valor ser necesario utilizar un elemento
dememoria.
En el cdigo 2.11 se muestra la descripcin de un latch de tipo D activo por nivel alto.
Cuando la seal Enable vale 0, la seal Z no recibe valor, y por lo tanto tendr que
guardareldatoquetenaantes.
entity LATCH is
port (
Enable : in std_logic;
A : in std_logic;
Z : out std_logic
);
end; LATCH D
architecture BEHAVIORAL of LATCH is A Z
begin
P_LATCH: process (Enable, A)
begin Enable
if Enable = '1' then
Z <= A; Figura 2.8: Latch de tipo D
end if;
end process;
end BEHAVIORAL;
Cdigo 2.11: Latch de tipo D activo por nivel alto

Esmuyimportantetenerestopresente,yaquecuandohaycondicionesenlasquenosele
asigna valor a una seal se genera un latch. A veces stos se generan por error del
diseador,quenosehafijadoqueenalgunaalternativanohaasignadoningnvalorala
seal.
Elcdigo2.11sepuedemodificarparaincluirunasealderesetasncrono(cdigo2.12).
entity LATCH2 is
port (
ResetN : in std_logic;
Enable : in std_logic;
A : in std_logic;
Z : out std_logic
); LATCH D
end;
architecture BEHAVIORAL of LATCH2 is A Z
begin
LATCH: process (ResetN, Enable, A)
begin Enable
if ResetN = '0' then -- activo por nivel bajo
Z <= '0';
elsif Enable = '1' then ResetN
Z <= A;
end if; Figura 2.9: Latch de tipo D con
end process; reset
end BEHAVIORAL;
Cdigo 2.12: Latch de tipo D activo por nivel alto con reset

FjatequeelresetsehallamadoResetN.ConlaNsehaqueridoindicarqueesactivopor
nivelbajo,estoes,quecuandoelresetvalecero,sereseteaellatch.

2.6. Elementos de memoria: biestables activos por flanco


Para describir un elemento de memoria activo por flanco se utilizan las siguientes
expresiones:
Parabiestableactivoporflancodesubida:clk'event and clk = '1'
Parabiestableactivoporflancodebajada:clk'event and clk = '0'

24 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

Enelcdigo2.13semuestraladescripcindeunbiestableDactivoporflancodesubida.
En la lista de sensibilidad de los biestables se puede poner solamente las seales que se
asignan(oseancondicin)antesdelasentenciadereloj.Noesunerror ponertodaslas
sealesqueinfluyen,sinembargopuedesermscmodoevitarnosponertodas,adems
dequehacemosquelasimulacinseamsrpida.
entity BIESTABLE is
port (
ResetN : in std_logic;
Clk : in std_logic;
A : in std_logic;
Z : out std_logic
); FF D
end;
architecture BEHAVIORAL of BIESTABLE is A Z
begin
P_BIEST:process (ResetN, Clk) --solo reset y clk
begin Clk
if ResetN = '0' then
Z <= '0';
elsif Clk'event and Clk = '1' then ResetN
Z <= A;
end if; Figura 2.10: Biestable de tipo D con
end process; reset
end BEHAVIORAL;
Cdigo 2.13: Biestable de tipo D activo por flanco de subida

2.7. Actualizacin de los valores de las seales


En un proceso, el valor de la seal se actualiza al finalizar el proceso y no durante la
secuenciadeasignaciones.Enelcdigo2.14,encadaflancodesubidadelreloj,alasealB
seleasignaA,yaZseleasignaB.Sinembargo,ZnorecibeelvalordeAdirectamente,sino
querecibeelvalorquetena Bcuandoseentrenelprocesoynoelquevaarecibir.Esto
es,aZlellegaelvalordeAconunretardodeunciclodereloj.
entity DETECTA_FLANCO is
port (
ResetN : in std_logic;
Clk : in std_logic;
A : in std_logic;
Z : out std_logic
); FF D FF D
end; B Z
architecture UNO of DETECTA_FLANCO is A
signal B : std_logic;
begin
P_DETECTA: process (ResetN, Clk)
begin
if ResetN = '0' then Clk
B <= '0';
ResetN
Z <= '0';
elsif Clk'event and Clk = '1' then Figura 2.11: Dos biestables en cascada
B <= A;
Z <= B; -- B no toma el valor de A
-- inmediatamente
end if;
end process;
end UNO;
Cdigo 2.14: Dos biestables en cascada

En la figura 2.11 se muestra el circuito generado por el cdigo 2.14. Este cdigo es
equivalente asignar lasseales en diferentes procesos. Esto se muestraen el cdigo 2.15
(sloaparecelaarquitectura).

Departamento de Tecnologa Electrnica 25


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

architecture DOS of DETECTA_FLANCO is


signal B : std_logic;
begin

P_BIEST_1: process (ResetN, Clk)


begin
if ResetN = '0' then
B <= '0';
elsif Clk'event and Clk = '1' then
B <= A;
end if;
end process;

P_BIEST_2: process (ResetN, Clk)


begin
if ResetN = '0' then
Z <= '0';
elsif Clk'event and Clk = '1' then
Z <= B;
end if;
end process;

end DOS;
Cdigo 2.15: Diseo equivalente al cdigo 2.14

Acontinuacinsemuestracmoconunaspequeasmodificacionesdelcircuitoanterior
sepuedecrearuncircuitodetectordeflancodesubida7.
entity DETECTA_FLANCO is
port (
ResetN : in std_logic;
Clk : in std_logic;
A : in std_logic;
FlancoUp : out std_logic
);
end;

architecture TRES of DETECTA_FLANCO is


-- ahora Z no es de salida
signal B, Z : std_logic;
begin

P_BIEST_1: process (ResetN, Clk)


begin
if ResetN = '0' then
B <= '0';
elsif Clk'event and Clk = '1' then
B <= A;
end if;
end process;

P_BIEST_2: process (ResetN, Clk)


begin
if ResetN = '0' then
Z <= '0';
elsif Clk'event and Clk = '1' then
Z <= B;
end if;
end process;

FlancoUp <= '1' when Z='1' and B='0' else


'0';
end TRES;
Cdigo 2.16: Circuito detector de flanco

7 Loscircuitosdetectoresdeflancoseexplicanenlareferencia[17mach]

26 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

FlancoUp

FF D FF D
B Z
A

Clk
ResetN
Figura 2.12: Esquema del diseo del cdigo 2.16

clk

B
Z

FlancoUp

Figura 2.13: Cronograma del diseo del cdigo 2.16

2.8. Contadores
Para contar podemos utilizar tipos de datos enteros (integer) o naturales (natural). Es
muyimportantedefinirelrangodelnmero,porquesinosesintetizarunnmerode32
bits, lo que implica 32 cables. Es tambin importante hacer que el rango sea un nmero
potencia de 2. Para que coincida el rango que definimos con el que se sintetizar. Por
ejemplo,sicreamosunrangode 0a13,elsintetizadorcrearunnmerode4bits(de0a
15),yporlotanto,nuestronmeropodrtomarvaloresquequedarnfueradelrangoque
hemosespecificado(14y15).
Uncontadordemdulo8semuestraenelcdigo2.17
entity CONTADOR is
port (
rst_n : in std_logic;
clk : in std_logic;
cuenta : out natural range 0 to 7
);
end CONTADOR;

architecture BEHAVIORAL of CONTADOR is


signal cuentaaux : natural range 0 to 7; -- rango potencia de 2: 8 (de 0 a 7)
begin
cuenta <= cuentaaux; -- Se conecta cuentaaux a cuenta
P_CONT: Process (rst_n, clk)
begin
if rst_n = '0' then
cuentaaux <= 0;
elsif clk'event and clk='1' then
if cuentaaux = 7 then -- cuenta no se podria leer por ser puerto de salida
cuentaaux <= 0; -- por eso se usa cuentaaux
else
cuentaaux <= cuentaaux + 1; -- Aqui se lee cuentaaux otra vez
end if;
end if;
end process;
end BEHAVIORAL;
Cdigo 2.17: Contador mdulo 8

Enelcdigo2.17hayunnuevoconceptoquesedebetenerencuentaaldisearenVHDL:
Lospuertosdesalidanosepuedenleer.Porestosehatenidoquecrearlasealauxiliar

Departamento de Tecnologa Electrnica 27


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

cuentaaux. Con cuentaaux se realizan las operaciones, y en una sentencia concurrente se


conectaconlasealcuenta.
Para ms una explicacin ms detallada de los contadores se recomienda la referencia
[17mach].

2.9. Registros de desplazamiento


Unregistrodedesplazamientosepuededescribircomosemuestraenelcdigo2.18.Este
circuitocargaenparaleloeldatodatoincuandocarga='1'.Ydesplazaeldatoatravsdel
bit0enserie.
Una vez ms se recomienda la referencia [17mach] para profundizar en los registros de
desplazamiento.
entity REG_DESPLZ is
port (
rst_n : in std_logic;
clk : in std_logic;
carga : in std_logic;
desplz : in std_logic;
datoin : in std_logic_vector (7 downto 0);
serieout : out std_logic
);
end REG_DESPLZ;

architecture BEHAVIORAL of REG_DESPLZ is


signal datoreg : std_logic_vector (7 downto 0);
begin
serieout <= datoreg(0);

REG_DESPLZ:Process (rst_n, clk)


begin
if rst_n='0' then
datoreg <= (others=>'0');
elsif clk'event and clk='1' then
if carga = '1' then
datoreg <= datoin; -- Carga paralelo
elsif desplz ='1' then -- Desplazamiento
datoreg(6 downto 0) <= datoreg(7 downto 1);
end if;
end if;
end process;
end architecture;
Cdigo 2.18: Registro de carga paralelo y salida serie

2.10. VHDL estructural


Para disear un circuito grande es conveniente separarlo en bloques funcionales. Cada
unodeestosbloquessediseacomohemosvistohastaahora(entidadyarquitectura).Y
estos bloques se juntan en una arquitectura que hace referencia a estos bloques.
Habitualmenteestetipodearquitecturasedenomina Estructural.Enundiseogrande
puedehabervariosnivelesdejerarqua,dondeunasarquitecturasestructuralescontienen
aotras.Lasventajasderealizareldiseodeestamanerasonvarias:
Permite dividir el circuito en partes ms sencillas, haciendo que el diseo sea ms
manejableyentendible.Estoademsfacilitaeltrabajoenequipo.
Esfcilmodificaralgnbloquedeldiseo,mientrasquesedejaelrestoigual.
Puedepasarqueenundiseosenecesiteusarvariosbloquesiguales,realizandoeldiseo
estructural, no hace falta volver a repetir el bloque, sino que basta con describir varias
referenciasaesebloque.

28 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

Permitelareutilizacinyaquepuedequeunbloquedeundiseolonecesitemosparaotro
diseo.
Podemosirprobandocadaunodelosbloquesalirlosdiseandoyunavezcomprobado
quefuncionanbien,irlosuniendo.
ParaexplicarcmosedescribeunaarquitecturaestructuralenVHDLloharemosconun
ejemplo.Supongamosquevamosarealizaruncircuitoconlossiguientescomponentes:
Elmultiplexordelafigura2.6(elcdigodelaarquitecturaestenelcdigo2.7)
Dosbiestablescomoeldelafigura2.10(cdigo2.13)
Elregistrodedesplazamientodelcdigo2.18.
Elesquemadelcircuitoestructuralquequeremosrealizarsemuestraenlafigura2.14.En
ste se han dibujado los bloques internos del circuito como cajas. Cada bloque tiene un
nombre REFERENCIA:ENTIDAD.Elprimernombre(REFERENCIA)indicaelnombrenicoque
identificaaesebloqueenparticular.Elsegundonombreindicaelcomponentealquese
refiere (el nombre de la entidad). Puede que un componente se utilice ms de una vez,
entonces este nombre estar repetido (como es el caso del BIESTABLE). Por tanto, la
referencia ser nica, aunque un mismo componente se utilice ms de una vez. La
referencia a veces se llama instancia o instanciacin, ya que en ingls se llama component
instantiation.
TOP_1

COMP_REG_DESPLZ:REG_DESPLZ
Carga
Carga
Desplz Desplz
8 Dato8bIn(7:0)
Dato8bIn(7:0)
Clk nombre de la referencia
SerieOut
(nombre nico)
RstN

nombre de la entidad a
RegDesplzOut

la que hace referencia


BIEST_DATO:BIESTABLE
COMP_MUX:MUX
Dato1bIn A
A
Clk Clk
Z Salida
Dato1bReg
RstN ResetN Z B

BIEST_SEL:BIESTABLE
Sel SelReg
A Z SEL
Clk

ResetN

Figura 2.14: Esquema del circuito estructural

ElcdigoVHDLdelcircuitodelafigura2.14semuestraenelcdigo2.19.Dentrodela
partedeclarativadelaarquitectura(antesdesu begin)sedeclaranloscomponentesque
se van a utilizar. Esta declaracin de los componentes es similar a la descripcin de la
entidaddelcomponente.Fjatequesedeclarantrescomponentesenvezdecuatro,yaque
hayuno(BIESTABLE)queseusadosveces.Enestapartedeclarativasedeclarantambin
lassealesinternasqueharnlasconexiones(SelReg,Dato1bReg,RegDezplzOut).
Enlapartedesentenciadelaarquitectura(despusdel begin)seponenlasreferenciasde
los componentes. Estas referencias especifican las conexiones de los puertos del
componenteconlassealesypuertosdelaarquitectura.Enlareferenciaalcomponente,

Departamento de Tecnologa Electrnica 29


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

su nombre debe ser nico: COMP_REG_DESPLZ, BIEST_DATO, BIEST_SEL, COMP_MUX. Y a


continuacin,despusdedospuntos,vaelnombredelcomponente(entidad).Encasode
queseutiliceunmismocomponentedosveces(comoocurrecon BIESTABLE)estenombre
estarrepetido.
EnVHDLsepuedeutilizaruncomponenteconunnombredistintoalaentidadalaque
se refiere. Para ello hay sentencias que lo especifican. Sin embargo, no todos los
sintetizadores contemplan esta posibilidad, y lo ms recomendable es declarar los
componentes(ysuspuertos)conelmismonombrequesuentidad.
El VHDL tambin permite especificar qu arquitectura elegir para el componente (si
hubiese ms de una), sin embargo, muchas herramientas cogen automticamente la
ltimaarquitecturacompiladaindependientementedesiseespecificaotraarquitectura.
entity TOP_1 is
port (
RstN : in std_logic;
Clk : in std_logic;
Carga : in std_logic;
Desplz : in std_logic;
Sel : in std_logic;
Dato1bIn : in std_logic;
Dato8bIn : in std_logic_vector (7 downto 0);
Salida : out std_logic
);
end TOP_1;

architecture ESTRUCTURAL of TOP_1 is

-- Declaracion del componente registro de deplazamiento


component REG_DESPLZ
port (
RstN : in std_logic;
Clk : in std_logic;
Carga : in std_logic;
Desplz : in std_logic;
DatoIn : in std_logic_vector (7 downto 0);
SerieOut : out std_logic
);
end component;

-- Declaracion del componente multiplexor


component MUX
port (
A : in std_logic;
B : in std_logic;
Sel : in std_logic;
Z : out std_logic
);
end component;

-- Declaracion del componente biestable


component BIESTABLE
port (
ResetN : in std_logic;
Clk : in std_logic;
A : in std_logic;
Z : out std_logic
);
end component;

-- Declaracion de las senales que realizan las interconexiones


signal RegDesplzOut : std_logic;
signal Dato1bReg : std_logic;
signal SelReg : std_logic;

30 Universidad Rey Juan Carlos


2. Repaso de VHDL para sntesis

begin

-- Referencia al componente RG_DESPLZ, la referencia se llama COMP_REG_DESPLZ


COMP_REG_DESPLZ: REG_DESPLZ
port map (
--(Puerto interno del componente) => (Senal o puerto de arquitectura)
RstN => RstN,
Clk => Clk,
Carga => Carga,
Desplz => Desplz,
DatoIn => Dato8bIn,
SerieOut => RegDesplzOut
);

-- Referencia al componente Biestable


BIEST_DATO: BIESTABLE
port map (
ResetN => RstN,
Clk => Clk,
A => Dato1bIn,
Z => Dato1bReg
);

-- Segunda referencia al componente Biestable


BIEST_SEL: BIESTABLE
port map (
ResetN => RstN,
Clk => Clk,
A => Sel,
Z => SelReg
);

COMP_MUX: MUX
port map (
A => RegDesplzOut,
B => Dato1bReg,
Sel => SelReg,
Z => Salida
);
end architecture;
Cdigo 2.19: Ejemplo de diseo estructural

Enelapartado7.6.3veremosotroejemplodediseoestructural.

Departamento de Tecnologa Electrnica 31


3. Funcionamiento bsico de las tarjetas electrnicas
ElobjetivodeestaprcticaguiadaesintroduciryempezarausarlaplacaXUPVirtexII
Pro (XUPV2P) [31xup] y la placa Nexys 2 [21nexys] mediante el uso de funcionalidad
elementalyautilizadaenotrasasignaturas,comosonlospulsadores,interruptoresyLED.
En el apartado siguiente veremos las caractersticas generales de estas dos tarjetas.
Posteriormenteimplementaremosundiseosencilloparaasegurarnosdequellevamosa
cabotodoelprocesodediseoconnormalidad.Estepasoesimportanteantesdeseguir
condiseosmscomplejos.

3.1. Tarjetas XUPV2P y Nexys2


LatarjetautilizadaenclaseserlaXUPV2PdelaempresaDigilent[8digi].Afechadela
redaccin de este manual, esta tarjeta ha dejado de producirse aunque se sigue
vendiendo. Esta tarjeta tiene un importante descuento importante si se va a utilizar con
finesacadmicos.
TambinexplicaremoscmoutilizarlatarjetaNexys2,queesmssencilla,tieneunprecio
msasequibleysigueenproduccin.
Cuando tengas las tarjetas, debes evitar tocar los componentes metlicos y conexiones
para no daar los circuitos por la electricidad esttica de nuestro cuerpo, ni siquiera
estandodesconectadadelafuente.

3.1.1. La tarjeta XUPV2P


Antes de iniciar la prctica se recomienda observar la placa y se identificar fsicamente
cadaunadeloscomponentessealadosenlafigura3.1.
LatarjetaXUPV2PtieneunaFPGAdeXilinxdemodeloVirtexIIPro30.EstaFPGAtiene
30816celdaslgicas8ymsde500pinesdisponiblesparaelusuario,apartedebloquesde
memoria,multiplicadoresyotrosbloques.
Amedidaquevayamosavanzando,iremosviendoloscomponentesdelaplaca,ascomo
algunosdelosbloquesinternosdelaFPGA.

8UnaceldalgicaconsisteenunaLUT(LookUpTable)de4entradas,unbiestableylgicadeacarreo

Departamento de Tecnologa Electrnica 33


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Alimentacin

Interruptor de Platform flash


alimentacin para guardar la
configuracin
Puerto de
video XSGA USB2 para
configuracin

Conectores SATA Tarjeta


para E/S serie gigabit compact flash

10/100 Ethernet Interruptores de


MAC/PHY configuracin

Estereo Audio Puertos de ratn


via AC97 codec y teclado PS/2

Puerto serie
Pulsadores, RS-232
interruptores y leds

Figura 3.1: Placa XUP Virtex-II Pro (XUPV2P) utilizada en la asignatura

Enlasprcticasdeestecaptuloseutilizarnlospulsadores,interruptoresyLEDquela
XUPV2P dispone para uso general. La placa adems dispone de otros pulsadores,
interruptoresyLEDquetienenunafuncionalidadespecfica.Enlapartebajadelafigura
3.1,bajoelepgrafePulsadores,interruptoresyledspuedesverdndeestnlosquevamos
autilizar.
Enlafigura3.2semuestranlasconexionesenlaplacadelospulsadores,interruptores,y
LED. Analizando la figura podemos observar que al pulsar o conectar un interruptor
enviamosun0alpindelaFPGA,ydemaneraanloga,losLEDseenciendenalponer
un0enelpindelaFPGAcorrespondiente.Porlotanto,enlatarjetaXUPV2Psetrabaja
con lgica negada con los pulsadores, interruptores y LED. Veremos que esto es muy
importantetenerloencuenta,sobretodositrabajamossimultneamenteconlaNexys,que
notienelgicanegada.
En la figura tambin se indican los pines de la FPGA que se conectan a los pulsadores,
interruptores y LED. Como se puede apreciar, los pulsadores no tienen circuitera de
anulacinderebotes9,porloquehabruntransitorioantesderecibirelvalordefinitivo.

9 Laanulacinderebotesseexplicaenelmanual[17mach]

34 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

SW2 D7
SW3 D8
Pulsadores SW4 Interrruptores SW7 LED D9
SW5 D10
SW6
3,3V 2,5V 3,3V
Virtex-II Pro
Virtex-II Pro
AG5: PB_ENTER
3,3K AH4: PB_UP 3,3K 130
AC11: SW_0
AG3: PB_DOWN Virtex-II Pro
AD11: SW_1
AH1: PB_LEFT AF8 : SW_2
AH2: PB_RIGHT on AC4: LED_0
AF9 : SW_3
AC3: LED_1
AA6: LED_2
AA5: LED_3

Sin pulsar -> 1 OFF -> 1 1 -> Apagado


Pulsado -> 0 ON -> 0 0 -> Encendido
Figura 3.2: Conexiones de los pulsadores, interruptores y LED de propsito general en la placa XUPV2P

3.1.2. La tarjeta Nexys2


LatarjetaNexys2[21nexys]separecealatarjetaBasys[3basys](explicadaenlareferencia
[17mach]).Enlafigura3.3semuestranalgunosdesuscomponentesmsimportantes.
LaNexys2contieneunaFPGAdeXilinxmodeloSpartan3EXC3S500EXC3S1200Econ
encapsulado FG320. Estas FPGA tienen respectivamente 500000 1200000 puertas
lgicasequivalentes.
La placa Nexys2 tiene algunos perifricos similares a la XUP2P, por ejemplo: 8 LED
(XUPV2P tiene 4), 4 pulsadores (XUPV2P tiene 5), 8 interruptores (XUPV2P tiene 4), un
puerto PS/2 (XUPV2P tiene 2), un puerto VGA (XUPV2P tiene uno de mejores
caractersticas) y un puerto de alta velocidad. Ambas tienen memoria pero de distinto
tipo.
LaXUPV2PtienepuertoparaconectarEthernet,unatarjetaCompactFlash,audioySATA,
quesonpuertosqueno tienelaNexys2.Porotrolado,la Nexys2tienecuatrodisplaysde
sietesegmentosyconectoresPMOD10.

10 AlosconectoresPMODselepuedenconectardispositivosmuyvariados:pantallasdecristallquido,
circuitoscontroldemotores,antenas,joysticks,amplificadoresdeaudio,micrfonos,etc.Sepuedenveren
http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,401&Cat=9

Departamento de Tecnologa Electrnica 35


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Interruptor
para encender
la tarjeta
Jumpers de Conectores PMOD
seleccin
alimentacin

memoria Jumpers de
seleccin
ROM-JTAG

VGA

FPGA

Puerto de
Puerto expansin
serie de alta
velocidad

USB

LEDs

Displays
PS/2
7 segmentos

Interruptores Pulsadores
Figura 3.3: Placa Nexys2 con la que de manera alternativa se puede seguir este manual

Enlafigura3.4 semuestranlasconexionesenlaplacadelospulsadores,interruptoresy
LED. Analizando la figura podemos observar que al pulsar o conectar un interruptor
enviamosun1alpindelaFPGA,ydemaneraanloga,losLEDseenciendenalponer
un1enelpindelaFPGAcorrespondiente.Porlotanto,enlatarjetaNexys2setrabaja
con lgica directa con los pulsadores, interruptores y LED. Esto es lo contrario que
ocurreconlaXUPV2P(recuerdalafigura3.2).
Como se puede apreciar, los pulsadores tampoco tienen circuitera de anulacin de
rebotes.EnlafiguratambinseindicanlospinesdelaFPGAqueseconectanastos.

Pulsadores Interruptores LED


Spartan3E Spartan3E Spartan-3E
3,3V 3,3V
PIN pulsador PIN interruptor PIN LED
B18 BTN0 G18 SW0 J14 LD0
10 k D18 BTN1 10 k H18 SW1 390 J15 LD1
E18 BTN2 K18 SW2 K15 LD2
H13 BTN3 K17 SW3 K14 LD3
10 k L14 SW4 E17 LD4
L13 SW5 P15 LD5
N17 SW6 F4 LD6
R17 SW7 R4 LD7

'1' Encendido
Pulsado '1' ON '1'
'0' Apagado
Sin pulsar '0' OFF '0'
Figura 3.4: Conexiones de los pulsadores, interruptores y LED de propsito general en la placa Nexys2

36 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

3.2. Encender los leds


En esta primera prctica se realizar un circuito muy simple para asegurarnos de que
funcionaelprocesodeprogramacindelaFPGAylaplaca,yasdescartarposiblesfallos
del diseo. Los leds nos mostrarn si nuestro circuito funciona correctamente. Aunque
estaprcticaseexplicaconciertodetalle,sivesquetecuestaseguirlaterecomendamos
queconsultesanteslareferencia[17mach],dondeseexplicaconmsprofundidadtodoel
proceso.
Para este ejemplo se detallar el proceso de diseo con la herramienta ISE de Xilinx,
usandolaversin9.2delISEWebPACK11.
Para comenzar crearemos un proyecto nuevo, primero arrancamos el
programa Xilinx Project Navigator, que se encuentra en InicioTodos los
ProgramasXilinx ISE 9.2iProject Navigator.
Nos puede aparecer una ventana con el Tip of the day que son indicaciones que hace la
herramientas cada vez que la arrancamos. Pinchamos en OK, con lo que se cierra dicha
ventana.
Normalmentelaherramientaabreelltimoproyectoconquesehaestadotrabajando,si
esas,locerramospinchandoen:FileClose Project.
Paracrearelnuevoproyecto,sepinchaen FileNew Project.ynossaldrlaventanaNew
ProjectWizardCreateNewProjectcomolamostradaenlafigura3.5.Enellapondremosel
nombre del proyecto, que lo llamaremos led1, indicamos la ruta donde guardaremos el
proyecto(Projectlocation),queser C:/practicas/dcse/tunombre.Respectoalnombreya
laruta,esconveniente:
NotrabajardesdeundispositivodememoriaUSB12.
Noincluirespaciosenlaruta,portanto,estoincluyenotrabajarenel "Escritorio"ni en
"Mis documentos"
Noincluirenlarutaoenelnombreacentosniees,nicaracteresextraos,ninombres
muylargos,lomsconvenienteeslimitarseacaracteresalfanumricos,yusarelguinbajo
envezdelespacio.
Paraelltimorecuadrodelaventana,dondeponeTopLevelSourceTypeseleccionaremos
HDL,yaquenuestrodiseoloharemosmediantelenguajesdedescripcindehardware13.
UnavezrellenadoslostresrecuadrospinchamosenNext.

11 Puedeserquealgunadelasventanasmostradasseandelaversin8.2.Estadiferencianodeberadeser
transcendente
12 Sieststrabajandoenellaboratorio,alterminarlasesinnoolvidescopiarlosficherosconextensin.vhd
y.ucfentumemoriaUSBoentucorreoelectrnico(ocupanmuypoco).Delocontrario,elprximoda
puedeserquelosficheroshayandesaparecido.
13 HDL:delingls:HardwareDescriptionLanguage

Departamento de Tecnologa Electrnica 37


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 3.5: Ventana para crear un nuevo proyecto

A continuacin aparecer otro cuadro de dilogo en el que se pregunta por el tipo de


dispositivoquesevaausaryporlasherramientasquesevanautilizaralolargodelflujo
dediseo.Segnlaplacaqueutilicemos,laFPGAvaaserdistinta,asquetendremosque
distinguirsiutilizamoslaXUPV2PolaNexys2.Enlasfigura3.6y3.7semuestracmo
interpretarlascaractersticasdelasFPGAdelasplacasXUPV2PyNexys2apartirdesus
encapsulados.

tipo de cdigo
tipo de dispositivo XC3S500ETM
dispositivo XC2VP30TM de fecha
encapsulado FGG320
encapsulado FF896 cdigo
de lote
velocidad 7C velocidad 4C
rango de operacin
C: comercial

Figura 3.6: Interpretacin del texto del
encapsulado de la FPGA de la XUPV2P Figura 3.7: Interpretacin del texto del encapsulado de la
FPGA de la Nexys2

A partir de la informacin de los encapsulados de las FPGA tendremos que rellenar la


ventanadelafigura3.8.
Paralaseleccindelaherramientadesntesisnotenemosalternativa,yparaelsimulador
enestaprcticanoesimportanteylodejamosenISE Simulator (VHDL/Verilog),aunquesilo
tienes instalado, podras poner el Modelsim. En el lenguaje de descripcin de hardware
preferido (Preferred Language) se deja el VHDL, que es el que usaremos. Al terminar
pinchamosenNext.

38 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

XUPV2P Nexys2
Family Virtex2P Spartan3E
Device XC2VP30 XC3S500E
Package FF896 FG320
Speed -7 -4


Figura 3.8: Ventana para la seleccin del dispositivo del nuevo proyecto

En las dos siguientes ventanas pinchamos en Next sin rellenar nada y en la ltima
pinchamosenFinish.
Yatenemoselproyectocreadoyahoranosdisponemosacrearnuestrodiseo.Paraello
creamosunanuevafuente(fichero)paraelproyectopinchandoen ProjectNew Sourceo
haciendodobleclicen Create New Source,queseencuentraenlasubventanaProcesses.
Con esta aparecer una nueva ventana que nos pedir el tipo de fuente que queremos
crear.ComoestamostrabajandoenVHDL,seleccionamosVHDLModule,ynombramosal
ficheroled1.Estepasosemuestraenlafigura3.9,acontinuacinpinchamosenNext.


Figura 3.9: Seleccin del tipo de la nueva fuente que vamos a crear

Departamento de Tecnologa Electrnica 39


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Ahoranossaldrunaventanacomolamostradaenlafigura3.10.Pordefecto,elnombre
de la arquitectura (Architecture Name) es Behavioral (comportamental). ste se puede
cambiar,peroporahora,lodejamosas.Enestaventanapodemosindicarlospuertosde
nuestra entidad. En la figura 3.10 se han creado cinco puertos de entrada14 (PB_ENTER,
PB_UP, PB_RIGHT, SW_0, SW_1) y cuatro de salida (LED_0, LED_1, LED_2, LED_3). Otra
alternativaescrearlospuertosdirectamenteen VHDL.ParaterminarpinchamosenNext
yluegoenFinish.


Figura 3.10: Definicin de los puertos

Si al terminar el proceso la herramienta nos muestra la siguiente imagen (figura 3.11),


debemos seleccionar el fichero que hemos creado (led1.vhd), ya sea pinchando en su
pestaa,oenWindowled1.vhd.

14LospuertossehannombradosiguiendolosnombresdelospulsadoresdelaplacaXUPV2P,encasodeque
estsusandolaplacaNexys2,puedesnombrarlospulsadorescomoPB_0(envezdePB_ENTER),PB_1(en
vezdePB_UP)yPB_2 (envezdePB_RIGHT).Elrestomantienesusnombres.

40 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas


Figura 3.11: Apariencia de la herramienta al aadir la nueva fuente led1.vhd

Comomuestralafigura3.12,podemosverquenoslonoshacreadolaentidad,sinoque
sehanincluidounascabeceras,bibliotecas,paquetesyladeclaracindelaarquitectura.
La cabecera es un apartado con comentarios para que lo rellenemos nosotros, para que
tengamosuncontroldelautor,lafechayladescripcindeldiseo,entreotrainformacin.
RecuerdaqueenVHDLloscomentariosseidentificancondosguiones--.Esinteresante
que lo rellenes, especialmente si trabajas en grupo. Pero incluso si trabajas solo es
conveniente rellenarlo porque es comn olvidarse de lo que se hace una vez que ha
transcurridociertotiempo.

Departamento de Tecnologa Electrnica 41


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Cabecera

Bibliotecas
y paquetes

Entidad

Arquitectura


Figura 3.12: Apariencia de la herramienta al aadir la nueva fuente led1.vhd

Despus de la cabecera se incluyen las referencias a los paquetes de la biblioteca15 del


IEEE16,quesonnecesariasparapoderutilizarlostiposdedatosqueemplearemos.Eneste
ejemplonosbastaconutilizarelpaquete IEEE.STD_LOGIC_1164.Losotrospaquetesnoson
necesariosenesteejemplo.
En general, recomendamos utilizar el paquete NUMERIC_STD (cdigo 3.2) en vez el
STD_LOGIC_ARITH(cdigo3.1).NoesobligatoriousarlaNUMERIC,peroloimportanteesusar
siemprelasmismasenunmismodiseo.Enelcaptulo8seprofundizaenestospaquetes.
library IEEE; library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Cdigo 3.1: Paquetes por defecto que pone el ISE Cdigo 3.2: Paquetes recomendados

Despusdelasreferenciasalasbibliotecasypaqueteshayunoscomentariosquepuedes
quitar.Acontinuacinestlaentidad.Laentidadtieneelaspectomostradoenelcdigo
3.3 o el cdigo 3.4 segn estemos usando la placa XUPV2P o la Nexys2 (si hemos
cambiadolosnombresdelospuertoscomodecalanotalapie14).

15Tambinllamadaslibrerasporsuparecidoconeltrminooriginalinglslibrary,querealmentesignifica
biblioteca.Eninglsunalibrerasetraducecomobookstore.
16ElIEEE(InstituteofElectricalandElectronicsEngineers)eslaasociacinquehaestandarizadoelVHDL.

42 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

entity led1 is entity led1 is


Port ( PB_ENTER : in STD_LOGIC; Port ( PB_0 : in STD_LOGIC;
PB_UP : in STD_LOGIC; PB_1 : in STD_LOGIC;
PB_RIGHT : in STD_LOGIC; PB_2 : in STD_LOGIC;
SW_0 : in STD_LOGIC; SW_0 : in STD_LOGIC;
SW_1 : in STD_LOGIC; SW_1 : in STD_LOGIC;
LED_0 : out STD_LOGIC; LED_0 : out STD_LOGIC;
LED_1 : out STD_LOGIC; LED_1 : out STD_LOGIC;
LED_2 : out STD_LOGIC; LED_2 : out STD_LOGIC;
LED_3 : out STD_LOGIC); LED_3 : out STD_LOGIC);
end led1; end led1;
Cdigo 3.3: Cdigo de la entidad para la XUPV2P Cdigo 3.4: Cdigo de la entidad para la Nexys2

Larepresentacinesquemticadeestasentidadessemuestraenlasfiguras3.13y3.14.La
entidaddefinelasentradasysalidasdelcircuito,peronohacereferenciaacmofunciona
osuestructurainterna.Escomosifueseunacajanegra.
LED1 (XUPV2P) LED1 (NEXYS2)

PB_ENTER LED_0 PB_0 LED_0


PB_UP LED_1 PB_1 LED_1
PB_RIGHT LED_2 PB_2 LED_2
SW_0 LED_3 SW_0 LED_3
SW_1 SW_1

Figura 3.13: Esquema de la entidad para la XUPV2P Figura 3.14: Esquema de la entidad para la Nexys2

Para describir el funcionamiento o la estructura interna del circuito se utiliza la


arquitectura.Enlafigura3.12vemosquesoloapareceladefinicindelaarquitectura,de
modoque,comoeslgico,elrestotenemosquedescribirlonosotros.
Paraesteejemplo,despusdel begindelaarquitectura,incluiremoselcdigo3.5(siests
usandolaNexys2sigueelcdigo3.6):
LED_0 <= '0'; LED_0 <= '0';
LED_1 <= '1'; LED_1 <= '1';
LED_2 <= PB_ENTER and SW_0; LED_2 <= PB_0 and SW_0;
LED_3 <= PB_UP when (SW_1 = '1') else LED_3 <= PB_1 when (SW_1 = '1') else
PB_RIGHT; PB_2;
Cdigo 3.5: Cdigo de la arquitectura de led1.vhd Cdigo 3.6: Cdigo de la arquitectura de led1.vhd
en la XUPV2P en la Nexys2

Una vez que hayas incluido el cdigo 3.5, guarda el fichero y comprobamos si hemos
tenidoalgnerrordesintaxispinchandoenSynthesize - XSTCheck Syntax.Estoestenla
subventanadeProcesses.Observalafigura3.15paralocalizarlo.

Departamento de Tecnologa Electrnica 43


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Synthesize - XST

Check Syntax

Subventana
de Processes


Figura 3.15: Comprobar la sintaxis: Synthesize - XSTCheck Syntax

Si tienes algn error, localzalo y corrgelo. Cuando no tengas errores, puedes pinchar
directamenteenSynthesize - XSTparasintetizar.
UnavezquehayamossintetizadotenemosqueindicarlospinesdelaFPGAquevamosa
utilizarysucorrespondenciaconlospuertosdelaentidad.
En la ventana de fuentes (Sources) verifica que el componente y el fichero que hemos
creado est seleccionado: led1-Behavioral (led1.vhd). Pincha en l una vez si no estuviese
seleccionado. Para indicarle a la FPGA qu pines vamosa utilizar y con qu puertos de
nuestro diseo los vamos a conectar deberemos lanzar la herramienta PACE. Esto lo
hacemos desde la ventana de Processes, en ella despliega la seccin que dice User
Constraints, pincha dos veces en Assign Package Pins. Posteriormente nos saldr una
ventanadeavisoquenosindicaqueparaesteprocesoserequiereaadiralproyectoun
ficherodeltipo UCF.Estetipodeficherossonlosqueseusanparadefinirlasconexiones
delospinesdelaFPGAconlospuertosdenuestrodiseo,yportantopinchamosenYes.
Ahora nos aparecer la herramienta Xilinx PACE. En ella podemos distinguir tres
subventanas,ladeladerecha,tiene2pestaasensuparteinferior,enunasemuestrala
arquitecturadelaFPGAyenlaotralaasignacindelospines(verfigura3.16).

44 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas


Figura 3.16: Herramienta PACE

Alaizquierda,enlaventanaDesignObjectListestnlospuertosdeentradasalida17.Yque
asignaremossegnsemostrenlafigura3.2paralaXUPV2Pofigura3.4 paralaNexys2.
Enla3.17semuestralaasignacindelospinesparalaXUPV2P.Aunqueenlacolumna
Locsalgaunmendesplegableconlosbancos,esunerrorytienesqueintroducirelpin
correspondienteconelteclado.Lacolumnadelos Bancos(Bank)notienesquerellenarla,
larellenaautomticamentelaherramientaalintroducirelpin.
Para saber el cdigo de los pines puedes consultar los manuales de referencia de las
placas (referencias [31xup] y [21nexys]). En el caso de la Nexys2, algunos de los pines
estn impresos en la propia placa entre parntesis, sin embargo, algunos de ellos son
errneos,comolosdelospulsadoresquelostieneintercambiados:ElBTN0porelBTN3,yel
BTN1porelBTN2.

17 Avecesnosalenlospuertoscorrectamente.Cuandoestoocurrarevisaquenotengasningnespacioo
carcterextraoenlarutadetuproyecto.Revisatambinqueeldiseosesintetizacorrectamente.

Departamento de Tecnologa Electrnica 45


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 3.17: Asignacin de los pines en la herramienta PACE para la XUPV2P

LospinesparalaNexys2seranlossiguientes(figura3.18).


Figura 3.18: Asignacin de los pines en la herramienta PACE para la Nexys2

Una vez que hayas incluido los pines, guardamos y cerramos la herramienta PACE.
Seguramente nos salga un aviso que nos pregunta cmo queremos guardar el fichero
.ucf. Para nosotros es indiferente y pondremos la primera de las opciones (XST
Default <>").
AhorapinchamosdosvecesenGenerate Programming FiledentrodelaventanaProcesses,y
esperamos a que termine el proceso de sntesis e implementacin, viendo si hay algn
erroroadvertenciadeimportancia(warning).
Sitodohaidobienyapodemosimplementarelcircuitoenlasplacas.Comoelprocesoes
diferentesegnestemosusandolaXUPV2PolaNexys2,cadaunadeellasseexplicaren
unapartadodiferente.

3.2.1. Implementacin en la tarjeta XUPV2P


Antesdeprogramarlaplacaponemoselinterruptor SW9(CONFIGSOURCE)demanera
que seleccione JTAG (ponemos ambos en OFF). Enchufamos el cable de alimentacin y
encendemoslaplaca(SW11).Elledverde JTAG CONFIG(D20)deberestarencendidoyel
ledD11(Error System ACE)podrestarparpadeando(estonoesunerror).

46 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

EnchufamoselcableUSBalPCyalaplaca.EstopodrprovocarunavisoennuestroPC
que nos indicar acerca de un nuevo hardware detectado. Si es la primera vez que lo
enchufamos,necesitarinstalarunosdriversyparaellonecesitaramosseradministrador,
enestecasoesnormalquevuelvaaaparecerelmismomensaje,yvolvemosadecirquelo
instale. En la herramienta ISE dentro de la subventana Processes pulsamos dos veces en
Generate Programming File ConfigureDevice (iMPACT),verlafigura3.19.


Figura 3.19: Llamada a la herramienta iMPACT para programar la FPGA de la XUPV2P

Conesto,internamenteestamosllamandoalaherramientaiMPACT,conlaquevamosa
programarlaFPGA.AparecerunaventanaenlaquepinchamosenFinish.
Puede pasar que salga un mensaje de error diciendo que no encuentra el cable, en este
caso hay que revisar la configuracin del cable de comunicacin y comprobar que los
pasossehanseguidobien(placaencendidaeinterruptorescorrectamenteposicionados).
PinchandoenOutput Cable SetupsedebeseleccionardentrodeCommunicationModeel
Platform Cable USBypincharenOK(verfigura3.20).

Departamento de Tecnologa Electrnica 47


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 3.20: Configurando el cable USB para programar la FPGA de la XUPV2P

Si todo ha salido bien, saldrn tres ventanas para seleccionar un fichero y en todas
seleccionamos Cancel. Veremos una ventana donde aparecen tres dispositivos, que
indicanlosdispositivosJTAGquelaherramientahaidentificadoenlaplaca(figura3.21).


Figura 3.21: Dispositivos JTAG identificados en la XUPV2P

48 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

El ltimo de la derecha es la FPGA que queremos programar (xc2vp30), sobre ella


pinchamos con el botn derecho del ratn18 y seleccionamos la opcin Assign New
Configuration Fileyescogemoselfichero led1.bit,queeselficherodeconfiguracindela
FPGAconnuestrocircuitosintetizado.LedamosaOKenlasiguienteventana.
Volvemos a pinchar con el botn derecho para indicarle que la queremos programar,
seleccionamos Programm..., y en la ventana que aparece pinchamos en OK (sin poner la
opcindeverificar).


Figura 3.22: Programacin de la FPGA de la XUPV2P

Por ltimo, iMPACT nos indicar si ha realizado la programacin correctamente (figura


3.23)ohahabidoalgnerror(figura3.24).Encasodequehayahabidoalgnerrorpuede
serquetehayasequivocadoeneltipodeFPGAseleccionadoconsultaelapartado3.3para
sabercmosehace.

18 Avecesseatascaelratn,siesaspinchaconelbotnizquierdodelratnfueradelostresdispositivos(en
laparteblanca),despusdeestoseguramenteyapuedaspincharconelbotnderechosobreeldispositivo.

Departamento de Tecnologa Electrnica 49


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 3.23: Programacin exitosa de la FPGA Figura 3.24: Programacin fallida de la FPGA

SitodohasalidaEnesecaso,seencenderelledrojoDONE(debajodelverdequeyaestaba
encendido).YseencenderelLED0,yaquecomolehabamosasignadoun'0'hacequese
encienda.ElLED1estarapagado.
El LED2 (LED_2 <= PB_ENTER and SW_0;)estarapagado('1')cuando SW_0='1' (OFF)y
PB_ENTER='1'.Presionando PB_ENTERo/yponiendo SW_0a ON,senosencenderelled.De
manera parecida podemos ver si el LED3 funciona cuando presionamos el PB_UP si SW_1
estenOFF;ycuandopresionamosPB_RIGHTsiSW_1estenON.
Fjatequeestoesasporquelospulsadores,interruptoresyleddelaXUPV2Ptrabajancon
lgicanegada.

3.2.2. Implementacin en la tarjeta Nexys2


AunquelatarjetaNexys2sepuedeprogramarconelconectorJTAG,vieneconunpuerto
USBquepermiteprogramarlademaneramscmoda.Elnicoinconvenienteesquehay
queinstalarelprogramagratuitoAdept[1adept].
Antes de conectar nada, lo primero que tenemos que hacer es situar el jumper de
configuracin en la posicin JTAG (en la parte derecha). El jumper de configuracin lo
puedeslocalizarenlafigura3.3(jumpersdeseleccinROMJTAG).Ponlacaperuzaazul
enlosdospinesdeladerecha,dondedice JTAG.EstoesparaquelaFPGAseprograme
desdeelJTAGynoseprogrameapartirdeloquehayagrabadoenlamemoriaROM(en
realidadesunamemoriaflash).DebidoaqueestasFPGAsonvoltiles,siqueremosquese
guarde un circuito de manera permanente en la tarjeta, lo guardaremos en la memoria
flash (no voltil). Si al encender la tarjeta el jumper est en la posicin ROM, la FPGA se
programarconelcircuitoquesehayagrabadoendichamemoriaflash.Comonosotros
vamos a probar circuitos de manera continua, y no queremos grabar de manera
permanenteningncircuito,loponemosenlaotraposicin.

50 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

Pon tambin los jumpers de POWER SELECT (figura 3.3: jumpers de seleccin
alimentacin)enlaposicinUSB.
AcontinuacinseexplicacmoseprogramalatarjetaNexys2conlaversin2delAdept.
Ejecuta el programa Adept: InicioTodos los ProgramasDigilentAdept.En la figura 3.25
semuestralapantallainicialcuandonohayningndispositivoconectado.Estosepuede
verenlapartederechadelaventana.


Figura 3.25: Pantalla inicial del Adept, sin dispositivos conectados

Ahora conectamos la tarjeta Nexys2 al ordenador mediante el cable USB y ponemos el


interruptordealimentacinenlaposicin ON.Transcurridountiempo,enlaventanadel
Adeptaparecerqueseha conectadounatarjeta,enlapartederechapondrOnboardUSB
(ver figura 3.26). Si no saliese nada, prueba a pinchar en el men que pone No Devices
Connectedaversicambia.Sinocambiase,pruebaacerrarelAdeptyvolverloaarrancar.
La primera vez que conectemos la tarjeta puede ser que Windows haya detectado un
nuevohardwareytengamosquedarpermisoparalainstalacindelosdriversquevienen
con la tarjeta (no tenemos que introducir un disco, la propia tarjeta le proporciona los
drivers).

Departamento de Tecnologa Electrnica 51


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 3.26: Pantalla del Adept que ha detectado algn dispositivo conectado

Ahora pinchamos en Initialize Chain y, como se ve en la figura 3.27, aparecern dos


componentes:unoeslaFPGAyotrolamemoria(PROM).Indicartambinelmodelode
FPGA,queennuestroeslaXC3S500E.


Figura 3.27: Pantalla del Adept que ha detectado la cadena JTAG de dispositivos (FPGA y PROM)

Acontinuacinpinchamosenelbotnbrowse...correspondientealaFPGA,ybuscamosel
fichero led1.bit que hemos generado en nuestro proyecto. Aparecer una advertencia
(warning)indicandoelmensaje:StartupclockforthisfileisCCLKinsteadofJTAGCLK.
Problems will likely occur. Associate config file with device anyway?. A este mensaje
contestamosS.

52 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

Otra cosa es que salga un mensajede error indicando: Unable to associate file with device
duetoIDCODEconflict.EstoesunerrorqueindicaquelaFPGAquehemosescogidono
es la misma que la que est en la placa. En este caso, tendremos que verificar que el
modelo de FPGA sea el mismo. Si no fuese as, lo tendremos que cambiar. Consulta el
apartado3.3sinosabescmoserealizaestaoperacin.
Sitodohasalidobien,slotenemosquepincharen Programyseprogramarla FPGA.El
resultado ser que se encender el led LD1, y el led LD0 estar apagado. Observa que es
justo lo contrario que ocurra en la XUPV2P. El comportamiento de los otros led es
tambindiferenteportenerlgicadirecta.Compruebaquefuncionacomodeberaser.

3.3. Cambiar el tipo de FPGA de un proyecto


Este apartado se incluye por si enun proyecto queremos modificar el tipo de FPGA, ya
seaporquevamosacambiardeplaca(porejemplodelaXUPV2PalaNexys2)oporque
noshemosequivocadoalprincipioponiendolascaractersticas(recuerdalafigura3.8),en
cualquier momento podemos realizar el cambio. Para ello, tenemos que seleccionar la
FPGA en la subventana Sources, y pinchar con el botn derecho del ratn. En el men
desplegable que aparece tendremos que pinchar en Properties (figura 3.28). Tras esta
operacinaparecerlaventanadelafigura3.8quenospermitircambiarelmodeloylas
caractersticasdelaFPGA.


Figura 3.28: Procedimiento para cambiar las caractersticas de la FPGA

Tenencuentaquesegnelcambioquehayamosrealizado,quiztambintengamosque
cambiarelfichero.ucf,puesenlseindicanlospines,ystospuedenserdistintosconel
modelo de la FPGA (incluso pueden haber cambiado de nombre). Otras cosas que
podemosnecesitarcambiarsonotrascaractersticasdelfuncionamiento:lafrecuenciade

Departamento de Tecnologa Electrnica 53


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

relojpuedehabercambiado,lalgicadelospulsadores,perifricos,...portantoavecesel
cambionoestanfcil.

3.4. Las restricciones del circuito


Hemos visto que dentro de la subventana Processes est el apartado User Constraints. En
donde, mediante la herramienta PACE hemos asignado los pines de la FPGA. En el
apartado4.1veremosquetambinsepuedenponerrestriccionestemporales.
Granpartedeestainformacinseguardaenunficherodetexto,conextensin .ucf,que
sepuedevisualizarymodificarconcualquiereditordetexto,ytambinsepuedeeditar
directamente desde la herramienta ISE pinchando dentro de la subventana Processes en
User Constraints Edit Constraints (Text).Verfigura3.29.


Figura 3.29: Edicin del fichero de restricciones

Enelficheropodemosverlaasociacindepuertos(NET)conpines(LOC).Estainformacin
se extrae de la gua de usuario de la placa. Como estamos trabajando con una placa ya
fabricada, los pines tienen una localizacin fija en la placa, y por tanto siempre que
usemos los mismos pines podemos usar el mismo fichero .ucf. En la pgina web de la
placaestndisponiblesestosficherosparaquesimplementetengamosquecopiarypegar
ennuestrodiseo19.
Para el caso de la XUPV2P, dentro del fichero comprimido hay distintos ficheros .ucf
agrupados por la funcionalidad de los pines (botones, leds, puerto serie,...). En estos

19DelaXUPV2P:http://www.xilinx.com/univ/XUPV2P/UCF_Files/UCF_FILES.zip
DelaNexys2:http://www.digilentinc.com/Data/Products/NEXYS2/Nexys2_500General.zip

54 Universidad Rey Juan Carlos


3. Funcionamiento bsico de las tarjetas electrnicas

ficheroshaymsinformacin,queindicaeltipodelgicadecadapin(LVTTL,LVCMOS,...)y,
enelcasodel.ucfdelosrelojes(CLOCKS.UCF)lafrecuenciadecadareloj.
Portanto,paraevitarequivocarnosalasignarlospines,envezdeutilizarlaherramienta
PACEpodemoscopiarypegardelosficheros.ucf.Esos,lospuertosdebenllamarseigual
queenelfichero.ucfysino,cambiarlosnosotrosconeleditor.

Departamento de Tecnologa Electrnica 55


4. Utilizacin del reloj y circuitos secuenciales
En la prctica anterior diseamos un circuito combinacional, que no tena reloj. Ahora
realizaremosunaprcticaconuncircuitosecuencialsencillopararecordarcmosehace.
Esta es una prctica de repaso, si tienes dudas te recomendamos que mires el manual
[17mach].
Los ejemplos sern sencillos y servirn para repasar. Tambin comprobaremos que los
relojesdelasplacasfuncionanbienynosayudaraentenderlasdiferenciasentrelasdos
placas.

4.1. Segundero (primera versin)


Enesteejercicioharemosqueunodelosledparpadee.Elledestarunsegundoapagado
yelsiguientesegundopermanecerencendido.Paraelloutilizaremoselrelojdelaplaca.
Sinembargo,lafrecuenciadelrelojdelatarjetaXUPV2PesdiferentealadelaNexys2.El
relojdela XUPV2Pvaa100MHzmientrasqueeldela Nexys2vaa50MHz.Esteesun
datomuyimportanteatenerencuentaenlosdiseosquetengasquerealizaralolargo
delcurso.
EnlaXUPV2P,elrelojentraporelpinAJ15delaFPGA,enlaNexys2elrelojlotenemosen
elpinB8.
Como seguramente recuerdes, para implementar un segundero podemos utilizar un
divisordefrecuencia(uncontador)quecadavezquelleguealfinaldesucuentadaruna
sealdeavisodequehapasadounsegundo.
Adems aadiremos una seal de reset que se corresponder con un pulsador. En la
XUPV2Putilizaremoselpulsadordelmedio(ENTER,pin: AG5),mientrasqueenlaNexys2
utilizaremoselpulsadordeladerecha(BTN0,pin: B18).
Anteriormente hemos visto que los pulsadores de la XUPV2P envan un cero cuando
estnpulsados,portanto,elresetseraanivelbajo(sereseteacuandorecibeuncero).Sin
embargoenlaNexys2,lospulsadoresenvanununocuandoestnpulsados.
Losledsdelasplacastambinfuncionandeformainversa,sinembargo,comovanaestar
lamitaddeltiempoencendidosylaotramitadapagados,probablementenonosdaremos
cuenta.
Porlotantotenemosdosdiferenciasimportantesalusarlasplacas:
Tienenfrecuenciaderelojdiferente
La lgica de los pulsadores, interruptores y leds es diferente (lgica directa y lgica
negada).
Siguiendo los pasos de la prctica anterior, crearemos un nuevo proyecto llamado SEG1.
Enestecasoslotendremos3puertos,dosdeentrada(clk,rst)yunodesalida(led0).Sin
embargo, debido a las diferencias entre las placas podra ser conveniente nombrar a los
puertosdedistintamaneraparadistinguirlosdiseos.As,lasealderelojdelaXUPV2P
lapodemosllamarclk_100mhzyladelaNexys2lallamaramosclk_50mhz.

Departamento de Tecnologa Electrnica 57


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Porotrolado,lassealesderesetsondiferentes,porquealpulsarelresetenlaXUPV2Pse
recibeuncero,yenlaNexys2serecibeununo.Portanto,elresetdelaXUPV2Pesactivoa
nivel bajo, y eso se puede representar ponindole una _n (de negado) al final de su
nombre:rst_n.
Enlasfiguras4.1y4.2semuestranlasrepresentacionesesquemticasdeestasentidades.
SEG1_XUPV2P SEG1_NEXYS2

led0 led0
clk_100mhz clk_50mhz

rst_n rst

Figura 4.1: Esquema del segundero para la Figura 4.2: Esquema del segundero para la Nexys2
XUPV2P

Si has realizado las prcticas de Electrnica Digital II [17mach] seguramente recuerdes


cmosehaceunsegundero.Loidealseraqueintentasesrealizarloportimismo.Anas,
acontinuacinsemuestraunejemplodecdigoparaqueloimplementes.Obsrvalobien
e intentadescubrirsiescorrecto,yaquetiene algnfallo.Enelcdigo4.1semuestrala
versinparalaXUPV2P.
entity SEG1_XUP is
Port (
rst_n : in std_logic;
clk_100mhz : in std_logic;
led0 : out std_logic
);
end SEG1_XUP;

architecture BEHAVIORAL of SEG1_XUP is


signal contseg : natural range 0 to 100000000; -- XUPV2P: 100MHz a 1 segundo
signal led0aux : std_logic;
begin
led0 <= led0aux;
P_Conta: Process (rst_n, clk_100mhz)
begin
if rst_n = '0' then -- XUPV2P: reset activo a nivel bajo
contseg <= 0;
led0aux <= '0';
elsif clk_100mhz'event and clk_100mhz='1' then
contseg <= contseg + 1;
if (contseg = 0) then
led0aux <= not led0aux;
end if;
end if;
end process;
end BEHAVIORAL;
Cdigo 4.1: Cdigo de la primera versin (con fallos) del segundero para la XUPV2P

Recuerdaquesehatenidoquecrearlasealauxiliarled0aux yaquelospuertosdesalida
nosepuedenasignar.
Enelcdigo4.2semuestralaversin(tambinconalgnfallo)paralaNexys2.

58 Universidad Rey Juan Carlos


4. Utilizacin del reloj y circuitos secuenciales

entity SEG1_NEXYS is
Port (
rst : in std_logic;
clk_50mhz : in std_logic;
led0 : out std_logic
);
end SEG1_NEXYS;

architecture BEHAVIORAL of SEG1_NEXYS is


signal contseg : natural range 0 to 50000000; -- Nexys2: 50MHz a 1 segundo
signal led0aux : std_logic;
begin
led0 <= led0aux;
P_Conta: Process (rst, clk_50mhz)
begin
if rst = '1' then -- Nexys2: Reset activo a nivel alto
contseg <= 0;
led0aux <= '0';
elsif clk_50mhz'event and clk_50mhz='1' then
contseg <= contseg + 1;
if (contseg = 0) then
led0aux <= not led0aux;
end if;
end if;
end process;
end BEHAVIORAL;
Cdigo 4.2: Cdigo de la primera versin (con fallos) del segundero para la Nexys2

Una vez creado el fichero VHDL comprobamos su sintaxis. Para ello seleccionamos el
fichero en la ventana Sources, y en la ventana Processes, hacemos doble clic en
SynthesizeCheck Syntax.
Si el resultado es correcto, ahora debemos indicar las restricciones temporales que
tenemos. Entonces hacemos doble clic dentro de la ventana Processes, en User
ConstraintsCreate Timing Constraints.Nospodrsalirunavisodequevaacrearunfichero
.ucf, le damos a aceptar, pues en estos ficheros se guardan las restricciones y las
asignaciones de los pines. Aparecer la herramienta Xilinx Constraints Editor (figura 4.3)
en ella seleccionamos la pestaa Global y en el reloj le indicamos su periodo: 10 (en
nanosegundos)paraelcasodelaXUPV2Py20nsparaNexys2.Guardamosycerramos,y
volvemosalaventanadelISE.


Figura 4.3: Xilinx Constraints Editor

Departamento de Tecnologa Electrnica 59


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

En cuanto a las restricciones temporales, es importante sealar que las restricciones del
reloj, son precisamente restricciones de nuestra placa, y le estamos indicando a la
herramienta a qu frecuencia va nuestro reloj. Con este dato, la herramienta intentar
ajustarlaimplementacindeldiseoaesasrestricciones,yencasodequenoseaposible,
nosotros debemos o bien usar un reloj con menor frecuencia (mediante el uso de
componentesdelaFPGAquegeneranrelojesmslentos)uoptimizarnuestrodiseopara
queseamsrpido.
Ahoraasignaremoslospines,nosaseguramosqueelmdulo seg1estseleccionadoenla
subventana Sources, y en la subventana Processes, pinchamos en User ConstraintsAssing
Package Pins. Asignamos los pines de manera similar a la prctica anterior, en este caso
para la XUPV2P: clk_100mhzAJ15 ; rst_nAG5 ; led0AC4. Y para la Nexys2:
clk_50mhzB8;rstB18;led0J14.

Guardamos y cerramos, puede pasar que la herramienta pregunte por el formato del
fichero.ucf,puedesercualquiera,asqueponemoselprimerodeellos.
Ahora, en la subventana Processes hacemos doble clic en el apartado Implement Design.
Vemos si hay algn error o advertencia. Posteriormente, en la subventana central
seleccionamos la primera pestaa Design Summary, y en ella localizamos Performance
Summary, donde debe indicar si se han cumplido las restricciones temporales. Debe
aparecerAllContraintsMetysepuedepincharenellaparaanalizarelinformeconmayor
detalle. Para este ejemplo tan sencillo, las restricciones temporales no iban a suponer
ningnproblema.
Ahorasepuedegenerarelficherodeprogramacin(.bit)ycargarloenlaFPGAmediante
eliMPACToelAdept,segnlaplacaquetengamos.
Como resultado deberamos ver parpadear el LED0 cada segundo, si pulsamos el botn
centralsereiniciaelparpadeoysilomantenemospulsado,enlaXUPV2Pelledsequeda
encendido,yaqueseleasignauncero,quehacequeseilumineelled.EnlaNexys2ocurre
locontrarioalpulsarelreset.

4.2. Segundero (segunda versin)


Has descubierto el fallo del anterior circuito? Te has fijado si el led permaneca
encendidoexactamenteunsegundo?
Elcircuitoanteriortenaalgnfallo.Cuandosecreauncircuitoparasntesisysedeclara
una seal entera con un rango se est especificando el ancho que tendr dicha seal, es
decirelnmerodebits.Yportanto,sintetizarundiseoquetieneunasealconunrango
quenoespotenciade2puedecrearnosproblemas.
Por ejemplo, supongamos que necesitamos una seal con un rango de 0 a 9. Para
representarestasealenbinarionecesitamoscuatrobits.Siladeclaramossegnelcdigo
4.3, independientemente de que hayamos indicado que su rango llega hasta 9, al
sintetizarlasealvaatener4bits,yportanto,surangorealvaaserde0a15.Ysianas
quisisemoslimitarelrango,tendramosnosotrosquegenerarelhardwareadecuado(con
comparadoresyotroscomponentes)paraquenuncasepasede9.
Por tanto, la manera adecuada de declarar la seal sera la mostrada en el cdigo 4.4.
Siendo la declaracin de dec2 la ms adecuada, pues con ella, al usar la operacin

60 Universidad Rey Juan Carlos


4. Utilizacin del reloj y circuitos secuenciales

potencia (**) estamos especificando el nmero de bits. No debemos olvidar restar uno,
puessino,estaramosusandounbitms.
signal dec0 : natural range 0 to 9; signal dec1 : natural range 0 to 15;
signal dec2 : natural range 0 to 2**4-1;
Cdigo 4.3: declaracin de un rango
"incorrecta" para sntesis Cdigo 4.4: declaraciones correcta de un rango

Es importante tener en cuenta que si declaramos una seal entera o natural sin rango
(cdigo 4.5), el sintetizador implementar la seal con 32 bits (32 cables). Si no
necesitamostantosbitsparalasealestaremosdesperdiciandorecursosdelaFPGA.
signal sin_rango : natural; -- por no tener rango se sintetiza con 32 bits
Cdigo 4.5:la declaracin de una seal sin rango implementa una seal de 32 bits

Unaopcinrecomendableenelusodeseales,eselempleodeltipo unsignedenvezde
natural, y el uso de signed en vez de integer. El uso de estos tipos se explic en el
captulo6delareferencia[17mach],tambinseverconmsdetalleenelcaptulo8.Un
ejemplodedeclaracindesealunsignedsemuestraenelcdigo4.6.
signal dec_us : unsigned (3 downto 0);

Cdigo 4.6: Declaracin de seal unsigned

Es probable que con esta informacin ya sepas por qu no funciona correctamente la


versinanteriordelsegundero.
En el cdigo 4.1 creamos la seal contseg con un rango de 100 millones ( 50 millones
para la Nexys2, cdigo 4.2). Esto lo hicimos porque tenamos dividir la frecuencia entre
100 millones ( 50 millones) para pasar de 100 MHz ( 50 MHz) a 1 Hz. Sin embargo,
como acabamos de ver, indicar que una seal tiene un rango de 100 millones no nos
aseguraquefsicamenteesasealtengaeserango.Dehecho,elrangodeesasealserla
potenciade2inmediatamentesuperior,enestecaso,algomsde134millones(227).Para
elcasodelaNexys2elrangoseraalgomsde67millones(226).Porlotanto,nuestroled
vaaestarencendidoalgomsde1,34segundosenvezdeestarunsegundoluciendo.
Para comprobarlo, creamos un nuevo proyecto SEG2 (no cambies el proyecto anterior
porque lo vamos a usar), que ser una ampliacin del diseo de laanterior prctica. En
esteproyectovamosacontarsegundosdetresmanerasdiferentes,portanto,envezdeun
ledusaremostresparamostrarlastrescuentas.LaentidadparalaXUPV2Psemuestraen
elcdigo4.7yparalaNexys2semuestraenelcdigo4.8:
entity SEG2_XUP is entity SEG2_NEXYS is
Port ( Port (
rst_n : in std_logic; rst : in std_logic;
clk_100mhz : in std_logic; clk_50mhz : in std_logic;
led0 : out std_logic; led0 : out std_logic;
led1 : out std_logic; led1 : out std_logic;
led2 : out std_logic led2 : out std_logic
); );
end SEG2_XUP; end SEG2_NEXYS;
Cdigo 4.7: Entidad de la segunda versin del Cdigo 4.8: Entidad de la segunda versin del
segundero para la XUPV2P segundero para la Nexys2

Portanto,enlaarquitecturausaremostrescontadores,cuyassealesdeclararemosas:
architecture Behavioral of SEG2_XUP is
signal cont0 : natural range 0 to 100000000;
signal cont1 : natural range 0 to (2**27)-1;
signal cont2 : natural range 0 to (2**27)-1;
....
Cdigo 4.9: Declaracin de las seales usadas para contar

Departamento de Tecnologa Electrnica 61


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Laseal cont0tieneunrangode108,mientrasquelaseal cont1y cont2tienenunrango


mayorquesecorrespondeconlapotenciade2inmediatasuperiora108.
Vamosaimplementarloscontadoresvanacontardelasiguientemanera:
cont0vaahacerparpadearaled0delamismamaneraqueenlaprcticaanterior.

cont1 va a hacer parpadear a led1 de la misma manera que en la prctica anterior, la


diferenciaconcont1eselrango.Elrangodecont0esmenorqueeldecont1.
cont2vaahacerparpadeara led2peronosevaadesbordar,sinoquecontrolaremosque
cuando llegue a1081se inicialice. En caso de laNexys2, cuando el contador llegue a50
millones.
Unavezquetenemoseldiseoyhemoscomprobadosusintaxis,loimplementamosenla
FPGA, y vemos si cont0 parpadea a la frecuencia de cont1 o de cont2. Si parpadea a la
frecuencia de cont1 significa que ha superado el rango que le habamos impuesto en la
declaracin y que imponer rangos que no sean potencias de dos nos puede llevar a
errores.

62 Universidad Rey Juan Carlos


5. Simulacin con Modelsim
EnestecaptulovamosavercmosimularconModelsim20.Enelmanualdeprcticasde
ED2 [17mach] se explic cmo simular con el simulador del ISE (captulo 8). Es
conveniente que repases ese captulo, pues describe los fundamentos de los bancos de
pruebas.
Hasta ahora hemos realizado circuitos simples que en el caso de que hayamos tenido
algn error, no era muy difcil de corregir. Sin embargo casi nunca es as, y conviene
simularelcircuitoparacomprobarsihayalgnerrorantesdeimplementarloenlaFPGA.
De hecho, lo habitual es que los diseos no funcionen a la primera, y por tanto, la
simulacinseconvierteunpasoimprescindible.
Vamos a crear un banco de pruebas (en ingls test bench) dentro del proyecto anterior
(apartado 4.1). El banco de pruebas es un diseo VHDL que sirve para comprobar el
funcionamiento de un circuito. Este diseo VHDL no tiene que estar limitado a las
estructurasparasntesis,sinoquepuedeusartodoelconjuntodelVHDL.Estosedebea
que el banco de pruebas no va a implementarse en la FPGA (por lo tanto no se va a
sintetizar)sinoqueseutilizarnicamenteparasimulacin.
AsquecreamosunanuevafuentedetipoVHDLTestBenchylallamaremos tb_seg1.vhd
(figura5.1).


Figura 5.1: Creacin de un nuevo banco de pruebas

Pinchamos en Next o Finish en todas las ventanas que nos aparezcan hasta llegar a la
edicindelficherodelbancodepruebas.ElISEnoshacreadolaestructuradelbancode
pruebas(figura5.2)yahoratenemosquecrearlosprocesosquegenerenlosestmulos.Si
tienesdudassobrelaestructuradelbancodepruebasdelafigura5.2,terecomendamos

20 Modelsim(http://model.com)esunsimuladordelacompaaMentorGraphics.Tienenunaversin
limitadaparaestudiantesytambinofreceunaversinparaXilinx:ModelsimXE,disponibledesdela
pginawebdeXilinx.

Departamento de Tecnologa Electrnica 63


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

querepaseselcaptulo8delmanualdeprcticasdeED2[17mach],dondeseexplicacon
detallecadaunalaspartesdelbancodepruebas.

Seleccionar
Behavioural Simulation

Declaracin de componente

Referencia o
"instanciacin"
Conexiones
del componente

Estmulos


Figura 5.2: Estructura del banco de pruebas

Dentro de la zona sealada como estmulos de la figura 5.2 hay una plantilla de un
procesocreadaporelISE.Nosotrosvamosacreardosprocesos.Unoparalasealqueva
a simular la seal de reloj y otro para la seal de reset. No hace falta ms, ya que este
circuito slo tena estas dos sealesde entrada.Para crear los procesos, o bien borras la
plantilla creada y aades los procesos nuevos, o bien modificas la plantilla para que el
procesoquedecomosemuestraacontinuacin.
Elprocesoquesimulalasealderelojsemuestraenloscdigos5.1y5.2.Ladiferencia
entreamboseslafrecuenciadelreloj.Elcdigo5.1generaunrelojde10ns(5+5ns),que
eselrelojdelaXUPV2P(100MHz).Porotrolado,elcdigo5.2generaunrelojde20ns
(10+10ns),queeselrelojdelaNexys2(50MHz).

64 Universidad Rey Juan Carlos


5. Simulacin con Modelsim

PClk_XUP: Process PClk_Nexys: Process


begin begin
clk_100mhz <= '0'; clk_50mhz <= '0';
wait for 5 ns; wait for 10 ns;
clk_100mhz <= '1'; clk_50mhz <= '1';
wait for 5 ns; wait for 10 ns;
end process; end process;
Cdigo 5.1: Proceso que simula el reloj de la Cdigo 5.2: Proceso que simula el reloj de la
XUPV2P Nexys2

Observa que estos procesos no tienen lista de sensibilidad. Esto es porque los procesos
que tienen sentencias con wait no tienen lista de sensibilidad. Estos procesos no son
vlidosparasntesis21,yaquealhardwarenolepuedesdecirdirectamentequeespere5
nanosegundos. Para ello, tendras que realizar un contador que contase los ciclos de un
reloj cuya frecuencia sea conocida (de manera similar a como se hizo en la prctica
anterior).
Durantelasimulacin,losprocesosdeloscdigos5.1y5.2seejecutanpermanentemente.
Sedetienedurante5ns(10ns)cadavezquellegaaunadelassentenciaswait.Portanto,
lasealdereloj(clk_100mhzclk_50mhz)recibeperidicamenteunvalordiferente..
Paraelprocesodelasealderesetnospodrabastarconsimularquepulsamoselbotn
de reset una vez. Los cdigos 5.3 y 5.4 muestran estos procesos para la XUPV2P y la
Nexys2. La nica diferencia de estos dos procesos es cmo se activan los reset: en la
XUPV2PanivelbajoyenlaNexys2anivelalto.
PRst_N_XUP: Process PRst_Nexys: Process
begin begin
rst_n <= '1'; rst <= '0';
wait for 108 ns; wait for 108 ns;
rst_n <= '0'; -- Reset a nivel bajo rst <= '1'; -- Reset a nivel alto
wait for 75 ns; wait for 75 ns;
rst_n <= '1'; rst <= '0';
wait; -- esperamos "eternamente" wait; -- esperamos "eternamente"
-- con el reset desactivado -- con el reset desactivado
end process; end process;
Cdigo 5.3: Proceso que simula la seal de reset Cdigo 5.4: Proceso que simula la seal de reset
para la XUPV2P para la Nexys2

En estos ejemplos, el reset se ha activado en un tiempo aleatorio de 108 ns. Poda


haberseelegidootro.Ysehamantenidoactivodurante75ns.Enrealidad,estostiempos
tendran que ser mucho mayores si se quisiese representar el tiempo que
aproximadamente se mantienen presionando los pulsadores, pero es innecesario alargar
lasimulacinduranteelreset.
La ltima sentencia de estos procesos es un wait que termina en punto y coma, sin
tiempos de espera. Este wait hace que se detenga la ejecucin del proceso y se quede
esperando eternamente. Por lo tanto, a partir de entonces el reset se quedar inactivo
durantetodalasimulacin.
Para simular el circuito, podemos realizarla de dos maneras (lo haremos de la segunda
forma):
Para la primera forma, necesitamos haber seleccionado el Modelsim como el simulador
dentrodelISE(recuerdalafigura3.8.).SeleccionamosBehavioral Simulationenlasubventana

21 Procesosconsentenciawait for,unprocesoconsentenciawait untilpuedesersintetizableaunque


nolosveremos.

Departamento de Tecnologa Electrnica 65


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Sources(pestaa Sources),verfigura5.2.Parasimularelmodelopodemospinchar dentro


delaventanaProcesses,enModelsim Simulator
La segunda forma es crear un proyecto en Modelsim. Esta manera se explicar a
continuacin.
Creamosunacarpetallamadasimulacionenlacarpetadondetengamosnuestroproyecto.
Abrimos el Modelsim y creamos un nuevo proyecto: FileNewProject. Y creamos el
proyectoseg1dentrodelacarpetasimulacion.
Aadimos al proyecto los ficheros VHDL que hemos creado desde el ISE: FileAdd to
ProyectExisting File.


Figura 5.3: Aadiendo ficheros al proyecto de Modelsim

Unavezqueaparecenlosdosficherosenlaventanadelaizquierda,seleccionamosambos
y con el botn derecho del ratn le damos a CompileCompile All, y vemos si tenemos
algn error. En caso de que haya algn error de compilacin se mostrar en la ventana
inferiorenletrasrojas,ypinchandodosvecesenelmensajenossaldrunaventanaconla
informacindelerroryelnmerodelnea.Tambinsepuedepincharenelmensajepara
que se muestre el error en el cdigo. Si hubiese un error, lo corregimos, grabamos y
volvemosarepetirelproceso.Enlaventanaizquierdadebernaparecerambosficheros
conunamarcaverdequeindicaquesehancompiladoconxito.

66 Universidad Rey Juan Carlos


5. Simulacin con Modelsim


Figura5.4: Compilando los ficheros del proyecto de Modelsim

Para empezar la simulacin, pinchamos en SimulateStart Simulation. Nos saldr una


ventana, en ella entramos en work, y dentro de ella seleccionamos el banco de pruebas
(tb_seg1_vhd),yledamosaOK.


Figura 5.5: Comienzo de la simulacin y seleccin del fichero del banco de pruebas para simular

SegncmotengamosconfiguradoelModelsim,saldrnunasventanasuotras.Nosotros
queremosquesalganlasventanasObjetcyWave.Paraello,sinoestuviesen,pinchamosen
ViewDebug WindowsWaveyenViewDebug WindowsObjects.

Departamento de Tecnologa Electrnica 67


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 5.6: Aadiendo la ventana de las formas de onda (Wave)

Paraincluirlassealesenlaventanadesimulacin(Wave)yasverlasformasdeonda,
nosponemosenlaventanade Workspaceyseleccionamoselcomponente UUT.Haciendo
esto,enlaventana Objectsaparecernlassealesdeesecomponenteypinchandoconel
botnderechodel ratndentrodelaventana Objectsseleccionamos Add to WaveSignals
in Region. Si quisisemos aadir todas las seales de circuitos, haramos Add to Wave
Signals in Design.Obienpodemosaadirlassealesindividualmente.


Figura 5.7: Aadiendo las seales de un componente

68 Universidad Rey Juan Carlos


5. Simulacin con Modelsim

Ahoraqueremossimularelcircuitodurante1400ms(unpocomsdeunsegundo).Esto
lo indicamos en la ventanita para poner el tiempo de simulacin (ver figura 5.8). Y
pinchamosenelbotndeladerecha(Run).Seleccionamoslapestaawavesinoestuviese
seleccionada.

tiempo de simulacin: Run:


1400 ms orden para simular


Figura 5.8: Indicacin del tiempo de simulacin y orden para empezar la simulacin

Es una simulacin larga, pues un segundo de simulacin son muchos ciclos de reloj. Al
sobrepasar el segundo de simulacin se producir un error por haberse desbordado el
contador. En este caso, la simulacin nos advierte del error que vimos en el apartado
anterior:hemosdefinidolasealconunrangoquesevaadesbordar(outofrange)yno
hemoslimitadolacuenta(verfigura5.9).
Para ver las formas de onda, en caso de que no se muestre, pincha en la pestaa de las
formasdeonda.Paraverlasimulacincompleta,pinchaeneliconomostradoenlafigura
5.9. Al lado del icono tienes otros para ampliar o disminuir el detalle (zoom). Puedes
extraer la ventana de las formas de onda y hacerla independiente de la ventana del
Modelsim.

Ver la simulacin Extraer la ventana


completa de formas de onda

Pestaa de las
formas de onda

Aviso de error

Figura 5.9: Resultado de la simulacin

Encaptulosposterioresiremosprofundizandoenlosbancosdepruebasylasimulacin.

Departamento de Tecnologa Electrnica 69


6. Constantes, genricos y paquetes
Enestecaptulorepasaremosalgunosconceptosytcnicasquenosfacilitarneldiseoen
VHDL, especialmente si necesitamos adaptar nuestro diseo a otras FPGA, tarjetas o
entornos. Esto es muy importante porque har que nuestro diseo sea ms fcilmente
reutilizable,loquenospermitirahorrartiempodedesarrollo.

6.1. Uso de constantes


De las prcticas anteriores podemos haber notado la incomodidad que implica utilizar
dos placas con algunas caractersticas diferentes. Por ejemplo, en la placa XUPV2P para
encenderunlednecesitamosponerun0,mientrasqueenlaNexys2tenemosqueponer
un1paraencenderlo.Tambinvimosquelasplacasrelojescondistintafrecuencia.
Por ltimo, si hemos utilizado la XUPV2P, quiz habremos notado que utilizar lgica
negada puede dificultarnos la implementacin y la comprensin del funcionamiento un
circuito. Por ejemplo, si queremos encender el led ld0 cuando presionamos el pulsador
pb0 y tengamos el interruptor sw0 conectado, por ser lgica negada, la sentencia no es
muyintuitiva,puesnoseformaconla and (cdigo6.1),sinoconla or(cdigo6.2).Esto,
aunqueesfcilmenteexplicableconlasleyesdeDeMorgan,nospuedeprovocaralgode
confusin.
ld0 <= pb0 and sw0; ld0 <= pb0 or sw0;
Cdigo 6.1: Sentencia con lgica directa Cdigo 6.2: Sentencia equivalente al cdigo 6.1
pero con lgica inversa

Para evitar la confusin que nos puede dar lugar al leer el cdigo 6.2 tenemos varias
opciones:
1. Usar nombres que indiquen que son seales con lgica negada. Esto nos advierte de la
situacin,sinembargotenemosqueseguirtrabajandoconlgicanegada.Elcdigo6.3nos
muestra un ejemplo de cmo podramos indicar que las seales funcionan con lgica
negada(aadiendo"_n").
2. Usarlgicadirectainternamente,habiendonegadolospuertosdeentradaantesdeusarlos
y negando despus las salidas. A los nombres de los puertos les podemos aplicar la
recomendacinanterior.Comoejemplosemuestraelcdigo6.4,enelquelastresprimeras
sentencias transforman la lgica de los puertos. A raz de esto, la ltima sentencia ya
trabajaconlgicadirecta.

Departamento de Tecnologa Electrnica 71


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

ld0_n <= pb0_n or sw0_n; -- asignacion de los puertos


-- pb0_n, sw0_n : puertos entrada
Cdigo 6.3: Aadiendo '_n' a las seales que usan pb0 <= not pb0_n;
lgica inversa sw0 <= not sw0_n;
-- ld0_n, : puerto de salida
ld0_n <= not ld0;

-- Ya trabajamos con logica directa:


ld0 <= pb0 and sw0;
Cdigo 6.4: Invirtiendo los puertos que trabajan con
lgica inversa

3. Usarconstantesquenosdiganculeselvalordefuncionamientodelasseales(cdigo
6.5).Conestohacemoselcircuitoindependientedeltipodelgica,lonicoquetenemos
quehaceresponerelvaloradecuadodelasconstantes.Estaopcintienelagranventajade
que nos permite usar el mismo diseo para la XUPV2P y la Nexys2 con solo cambiar el
valordelasconstantes.Elinconvenienteesquelasentenciaesmslarga.
architecture ....
constant c_on : std_logic := '0'; --solo tenemos que cambiar aqui segn la lgica
constant c_off : std_logic := not c_on;
begin
ld0 <= c_on when ((pb0 = c_on) and (sw0 = c_on)) else c_off;
end ...;
Cdigo 6.5: Usando constantes para independizar el circuito del tipo de lgica de las entradas

Siguiendo esta ltima indicacin, puedes probar a cambiar el cdigo 3.5 de modo que
funcioneigualqueloharaenlaNexys2(cdigo3.6).

6.2. Uso de genricos


Si tenemos un diseo grande, con muchos ficheros (recuerda el VHDL estructural del
apartado2.10),puedeserincmodoyprovocarerroreseltenerquecambiarelvalordelas
constantes en cada uno de los ficheros, ya que en cada uno de los ficheros tendramos
declaradaslasmismasconstantes(comoenelcdigo6.5).
ElVHDLnospermitedefiniruntipodeconstantesespecialesllamadasgenricos(generic).
Estas constantes se declaran en las entidades y sus valores se pueden propagar al
referenciarloscomponentes.
Enelcdigo6.6semuestralaadaptacindelcdigo6.5asignandoelgenricoalvalorde
laconstante.
entity gen_xup is
-- los genericos van en la entidad antes de los puertos
Generic (
g_logic : std_logic := '0'
);
Port (
pb0 : in std_logic;
sw0 : in std_logic;
ld0 : out std_logic
);
end gen_xup;

architecture Behavioral of gen_xup is


constant c_on : std_logic := g_logic; -- el generico se puede asignar a la cte
constant c_off : std_logic := not c_on;
begin
...
Cdigo 6.6: Declaracin y uso de genricos

Como se ha comentado, la ventaja del genrico es que se puede propagar por el VHDL
estructural. El paso de los valores se hace de manera similar a los puertos, en vez de la

72 Universidad Rey Juan Carlos


6. Constantes, genricos y paquetes

sentenciaPORT MAPseutilizaGENERIC MAP.Alpropagarlosgenricossepierdeelvalorque


selehabadadoenladeclaracindelaentidad.Dehecho,porestomismonoesnecesario
asignarunvalorenladeclaracin.
Aunquemsadelante veremosejemplosdesuutilizacinencircuitosestructurales,enel
cdigo6.7semuestraunejemplo.
GEN: GEN_XUP
generic map (
g_logic => g_tipolog, -- el generico g_logic recibira el valor de g_tipolog
g_generico2 => g_generico2
)
port map (
pb0 => pb0,
sw0 => clk,
ld0 => ld0
);
Cdigo 6.7: Ejemplo de la transmisin de los genricos en una referencia a componente

Aunque el uso de genricos tiene muchas ventajas, no siempre es conveniente usarlos.


Algunasherramientassloadmitenalgunostiposconcretodedatosparalosgenricos.Y
por otro lado, no conviene declarar una gran cantidad de genricos. Algunos
recomiendanelusodegenricossloparaciertosaspectosenconcreto,porejemplopara
simulacin (definir retardos o condiciones variables), o tambin cuando segn
determinadas condiciones se quiera variar el valor de los genricos de un componente.
Estatcnica,aunquemuytil,porahoranolavamosaver.

6.3. Uso de paquetes


Una alternativa al uso de genricos es declarar las constantes en un paquete. El VHDL
permite declarar constantes, tipos, funciones, procedimientos, etc. en paquetes de modo
quesepuedanutilizarentodoeldiseosintenerquedeclararlosencadafichero.
De hecho, ya hemos estado usando paquetes al incluir las siguientes sentencias (cdigo
6.8)encadaficheroVHDL.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

Cdigo 6.8: Inclusin del paquete STD_LOGIC_1164 de la biblioteca IEEE

Con la primera sen estamos diciendo que vamos a incluir la biblioteca IEEE. Con la
segunda sentencia decimos que de la biblioteca IEEE vamos a usar el paquete
STD_LOGIC_1164.ElALLdelfinalindicaquepodremosusartodoloqueincluyeelpaquete.

Ahora crearemos un sencillo proyecto en el que incluiremos un paquete. El nombre del


proyectoserled_pkg.
Un paquete se crea en un fichero aparte. Para crear un nuevo paquete, desde la
herramienta ISE crearemos una nueva fuente como ya sabemos hacer, pero indicaremos
queesdetipoVHDLPackage.AlhacerlolaherramientaISEincluyeunospatronesquenos
puedenservirdeayudapararecordarlasintaxis.Detodosmodos,comonuestropaquete
vaasermuysencillonosbastaconcopiarelcdigo6.9.
package CTE_PKG is
-- Paquete de definicion del nivel logico de las constantes
constant c_on : std_logic := '0'; --solo tenemos que cambiar aqui segn la lgica
constant c_off : std_logic := not c_on;
end CTE_PKG;
Cdigo 6.9: Paquete con la definicin de las constantes

Departamento de Tecnologa Electrnica 73


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

En el cdigo 6.9, la constante de encendido c_on se ha puesto a '0', por tanto


correspondera a la versin de la XUPV2P, para la Nexys2 bastara con poner esta
constantea'1'.
EnlaherramientaISElospaquetesnoestnalavistadesdelaventanaSources.Parapoder
editar un paquete tienes que pinchar en la pestaa Libraries y desplegar la carpeta work,
allverssielpaqueteestincluidoono.Pinchandoenlpodrseditarlo.Enlafigura6.1
semuestraunaventanaquemuestralaanteriorexplicacin.

Dentro de Paquete
work

Seleccionar
Libraries


Figura 6.1: Cmo ver el paquete incluido en el proyecto

Ahoracrearemosunaentidadquevaausarestepaquete.Laentidadsimplementetendr
queapagarelled ld0yencenderel ld1.Laentidadseracomolamostradaenelcdigo
6.10.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

library WORK; -- la biblioteca por defecto del diseno se llama WORK


use WORK.CTE_PKG.ALL;

entity led is
Port ( ld0 : out STD_LOGIC;
ld1 : out STD_LOGIC);
end led;

architecture Behavioral of led is


begin
ld0 <= c_off;
ld1 <= c_on;
end Behavioral;
Cdigo 6.10: Entidad y arquitectura que usan el paquete del cdigo 6.9

Observandoelcdigo6.10podemosapreciarquenotenemosquemodificarlaentidady
la arquitectura para usarlas en la XUPV2P o en la Nexys2, nos bastara con modificar el
valor de la constante del paquete (cdigo 6.9). Esto nos permite realizar diseos ms
fcilmenteadaptablesaotrosentornos.Ennuestrocaso,podemosusarambasplacascon
menoresinconvenientes.

74 Universidad Rey Juan Carlos


6. Constantes, genricos y paquetes

En el cdigo 6.10 podemos observar que la biblioteca del paquete que hemos creado se
llama WORK. Esta es la biblioteca por defecto, la biblioteca de trabajo y por lo general,
pondremosnuestrospaquetesenesabiblioteca(sinodecimosnada,estarnah).
Ahora, prueba a implementar este diseo en la XUPV2P y en la Nexys2. Lo nico que
tienesquehacerescrearelpaquetedelcdigo6.9ylaentidadyarquitecturadelcdigo
6.10. La constante del paquete la tendrs que cambiar segn en qu placa lo ests
implementando,igualqueelfichero.ucf,questeinevitablementevaaserdistinto,pues
esespecficoparacadaplaca.

Departamento de Tecnologa Electrnica 75


7. Transmisin en serie por RS-232
El objetivo de esta prctica es realizar un diseo de mediana complejidad. Para la
realizacin de este circuito es importante que tengas claro la teora de los registros de
desplazamiento y las mquinas de estados finitos (FSM22) y cmo se implementan en
VHDL.Sitienesdudasotehasolvidado,terecomendamosquerealices las prcticasde
ED2, en concreto los captulos 7, 9 y posteriores del libro [17mach]. Una buena prctica
seraquelasimplementasesenlasplacasXUPV2PyNexys2.
En esta prctica vamos a establecer una comunicacin asncrona entre la placa y una
computadora.Esunbuenejemplodediseojerrquicoyconfigurable,enelqueadems
se van a repasar las mquinas de estados finitos y registros de desplazamiento, y nos
servir para aplicar conceptos vistos en prcticas anteriores, como los divisores de
frecuenciayelusodepaquetesenVHDL.
Por otra parte, y aunque en el captulo 5 de este manual ya se utiliz la herramienta de
simulacinModelsim,enestaprcticasevaaexplicarendetallecmohacerunbancode
pruebas(testbench)ycomointerpretarlosresultadosqueseobtienendelsimulador.
Debido a que esta prctica es larga y se aplican conceptos importantes, en el apartado
siguienteseresumesucontenido.

7.1. Desarrollo de la prctica


En primer lugar, se expondr la metodologa propuesta para afrontar el diseo de un
circuitocomplejo,enlaqueesfundamentalrealizarunaparticindelcircuitoenmdulos
mssencillos.
Posteriormente, en el apartado 7.3 se explicar brevemente el funcionamiento de una
UARTyelenvodedatosmedianteelprotocoloserieRS232:tamaodedatos,tramade
datos,sealesqueseutilizanenlacomunicacin,velocidaddetransmisin,etc.
Acontinuacinseproponeundiseomodular,enelque primerose hareltransmisor
(en el apartado 7.4), despus el receptor para posteriormente integrarlos en un nico
diseo.
Paradiseareltransmisorloprimeroquesehaceesidentificarlasentradasysalidas.A
continuacinseplanteasudiagramadebloques.Eldiseoqueseproponeesundiseo
configurable,enelqueelusodeconstantes,funcionesypaquetesfacilitalareutilizacin
y reduce las fuentes de errores al utilizar dos placas distintas en las prcticas. Una vez
diseadoeltransmisorseprocedeasucomprobacin(apartado7.5).Paraellocrearemos
elbancodepruebas,ymedianteunsimulador(eldelISEoelModelSim)verificaremosel
funcionamientodelcircuito.
Paraterminarconeltransmisor,loimplementaremosenlaFPGAynoscomunicaremos
conlacomputadoramedianteelpuertoserie.
De forma anloga a como se ha realizado el transmisor se disear el receptor, para
posteriormenteimplementarlaUARTcompleta.Enundiseoestructuralconectamosel

22 FSM:delingls:FiniteStateMachine

Departamento de Tecnologa Electrnica 77


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

transmisor y el receptor de manera que lo recibido por el receptor se emita por el


transmisor,obtenindoseelecoenlacomputadora.

7.2. Consideraciones para el diseo de un circuito


Antes de explicar qu es una UART y abordar su diseo, vamos a introducir unas
consideraciones previas, a tener en cuenta no slo para esta prctica sino tambin cada
vezquenosenfrentemosconeldiseodeuncircuitodigital.
Comoyasehacomentadoanteriormenteelobjetivofundamentalquesepersigueconeste
manualesaprenderadisearcircuitosdigitalesderelativacomplejidadusandoVHDLy
dispositivoslgicosprogramables(CPLDoFPGA).Paraconseguiresteobjetivo,alolargo
del manual se propone un metodologa para el diseo de estos circuitos. Para ello los
pasosaseguirson:
Estudiodelasespecificaciones
Divisinfuncional
Integracindecadaunodelosbloques(omdulos).
La particin del circuito en bloques (divisin funcional) es muy importante para poder
abordar un diseo complejo. En el apartado 2.10 vimos las ventajas de realizar la
particin,algunasdeellasson:
Independizarlosbloques:cadaunadelaspartessonindependientes
Poderrepartireltrabajoentrevariaspersonas
Simplificarlacomplejidaddeldiseo,pueslosbloquessonmssencillos.Estohaceque
seamsfcildedisearydeverificar.
Simplificar la verificacin del diseo. Como los bloques estn verificados de manera
independiente,laverificacindelconjuntoresultamssencilla.
Y otras ventajas como mayor facilidad para reutilizar los bloques, modificarlos, usar
otrosyadiseados,...
Para cada uno de los bloque funcionales en que se dividida el proyecto habr que
identificar entradas y salidas, realizar el diseo y por ltimo, comprobar su correcto
funcionamiento.Paraverificarquenuestromdulohaceloquetienequehacer,ynohace
lo que no tiene que hacer, se utilizarn las herramientas de simulacin. Mediante la
generacindeestmulosylainterpretacindelosresultadosdelasimulacinpodremos
identificarydetectarerroresantesdeimplementareldiseoenlaFPGA.Porltimo,una
vez que se hayan validado cada uno de los bloques funcionales se proceder a la
integracinenelsistemacompleto.

7.3. Funcionamiento de una UART


En esta prctica disearemos un transmisor/receptor serie asncrono (Universal
Asynchronous ReceiverTransmitter) que siga la norma RS232. Este mdulo nos permitir
comunicar nuestra placa con el puerto serie de la computadora. En la norma se definen
dos tipos de terminales: DTE y DCE, donde DTE es el equipo terminal de datos (la
computadora)yDCEeseldecomunicacindedatos,yquehabitualmenteesunMODEM
yennuestrocasoeslaplacadelaFPGA.

78 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Aunque en la norma se definen ms seales, para establecer la comunicacin slo son


imprescindiblestresseales:lalneadetransmisindedatos(TxD),laderecepcin(RxD),y
la lnea de masa (GND). Como puedes ver en la figura 7.1, la referencia se toma desde la
computadora(elDTE).Portanto,desdeelpuntodevistadelaFPGA(DCE),laseal RxD
eslaquesetransmitealacomputadora,mientrasquelasealTxDeslaqueserecibedela
computadora.Tendremosquetenercuidadoporqueestonospuedeconfundir.

(cables) imprescindibles:
Tres lneas (cables)

2
RxD RxD 3

TxD TxD
3 2

5
GND 5

DCE DTE

Data Communications Equipment Data Terminal Equipment



Figura 7.1:Esquema de la conexin RS-232

Para la conexin serie, las placas tienen un conector DB9 como el mostrado en la figura
7.2.ElconectorDB9hembraestenelDCEyelmachoenelDTE(computadora).
TxD: Computadora FPGA
GND
RxD: FPGA Computadora

5 3 2


Figura 7.2: Conector DB9 hembra de la placa y los pines utilizados

Lospinesdela FPGAqueestnconectadosconelpuertoRS232semuestranenlatabla
7.1. Aunque la placa XUPV2P tiene disponibles ms pines que estn incluidos en el
protocolo,sinembargosloutilizaremoslosdosimprescindibles23(mostradosenlatabla
7.1).Paraevitarconfusionesacercadelosnombres,lospuertosdelRS232losllamaremos
comomuestralatabla7.1,demodoquealincluirelprefijoFPGAindicamosquehacemos
referenciaalaFPGA.Portanto,elpuerto FPGA_TXrepresentaeldatoqueenvalaFPGAa
la computadora, que en el protocolo RS232 sera el RxD por estar referenciado al
computador.

PIN
Puerto Sentido
XUPV2P Nexys2

FPGA_TX FPGA Computadora AE7 P9

FPGA_RX Computadora FPGA AJ8 U6



Tabla 7.1: Puertos del RS-232 que usaremos y los pines en las placas

Existendistintasvelocidadesdetransmisin,quesedefinenenbitsporsegundo(bps)o
baudios(921600,460800,230400,115200,57600,38400,19200,9600,4800,).Tambinse

23 EnlaNexys2nohaymspinesdisponiblesparalaUART

Departamento de Tecnologa Electrnica 79


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

puede variar el nmero de bits del dato que se enva, as como el envo de un bit de
paridadyelnmerodebitsdefin.
La lnea serie permanece a nivel alto (1) mientras no se envan datos. Cuando el
transmisor va a empezar la transmisin, lo hace enviando un bit de inicio poniendo la
lneaacero.Posteriormenteseenvanconsecutivamentelosbitsdeldatoempezandopor
elmenossignificativo.Despusdelltimobitdedatoseenvaelbitdeparidadencasode
quesehayaespecificado.Porltimo,secierralatramaconunoodosbitsdefinponiendo
lalneaanivelalto.Enlafigura7.3semuestraelcronogramadeunenvoRS232con8
datos(enesteejemplo:11011101),unbitdeparidad(enestecasopar)yunbitdefin.
dato de 8 bits 11011101
bit de bit de bit de
inicio
in icio bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 paridad fin
lnea en reposo reposo

1 0 1 1 1 0 1 1
Transmisin dato de 8 bits

En reposo
TxD est a '1'

dato de 7 u 8 bits Uno dos


bit de inicio a '0' paridad par bits de fin
paridad impar
sin bit de paridad

Figura 7.3: Trama de un envo en RS232 con 8 bits, bit de paridad y un bit de fin

La prctica consistir en disear una UART compatible con RS232 que enve 8 bits de
datos, que pueda recibir y transmitir simultneamente (fullduplex), sin bit de paridad y
conunbitdefin.
Parairpasoapaso,primeroserealizarsloeltransmisor.Posteriormenteserealizarel
receptor,paraluegounirlosenunnicodiseo.

7.4. Diseo del transmisor


Haremosuntransmisorquetendrlossiguientespuertos(figura7.4):
UART_TX
8
dato_tx_in hacia el exterior
transmite (computadora)
(computad ora)
de/hacia transmitiendo Pines:
nuestro fpga_tx FPGA_TX AE7 (XUPV2P)
clk P9 (Nexys2)
sistema
rst


Figura 7.4: Entradas y salidas del transmisor

Enlafigura7.4,lospuertosdelaizquierdasonlosqueserelacionanconnuestrosistema
(elqueimplementemosenlaFPGA)yelpuertodeladerecha(fpga_tx)envaeldatoserie
alacomputadora.Antesde pasaradescribirlasseales,enlatabla7.2seincluyenunas
constantes que se usarn en el diseo (recuerda el captulo 6). Fjate que las constantes
comienzanporc_paraqueseamsfcilsuidentificacin.

80 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Constante Tipo Descripcin


Indicaelniveldelalgica.1paralgicapositiva(Nexys2),y0para
c_on std_logic
lgicanegada(XUPV2P)
Frecuenciadelreloj.Ennuestrocaso:108paralaXUPV2Py5107parala
c_freq_clk natural
Nexys2
c_baud natural LosbaudiosalosquevaatransmitirlaUART:9600,115200,...
Tabla 7.2: Constantes de la UART para su configuracin

Lasespecificacionesdelospuertossonlassiguientes:
Puerto bits I/O Descripcin
rst 1 I Sealderesetasncrono,suniveldependerdec_on
Sealderelojdelaplaca.Lafrecuenciadelrelojseindicaenlaconstante
clk 1 I
c_freq_clk.
Sealdelsistemaqueordenaalmdulolatransmisindeldatoquese
transmite 1 I
encuentraendato_tx_in.Laordenserdeunnicociclodereloj.
Datoquesequiereenviar,seproporcionacuandoseactivatransmite
dato_tx_in 8 I
(cuandotransmite='1')
Indicaalsistemaqueelmduloesttransmitiendoyportantonopodr
transmitiendo 1 O atenderaningunanuevaordendetransmisin.Ignoraratransmite
cuandotransmitiendo estauno
fpga_tx 1 O Tramaqueseenvaenseriealacomputadora,sigueelformatoRS232
Tabla 7.3: Puertos del transmisor de la UART

Con estas especificaciones tenemos informacin suficiente para hacer el transmisor. Lo


primero que tienes que hacer es crear un nuevo proyecto llamado uart_tx. Dentro del
proyecto crea el paquete UART_PKG (recuerda la seccin 6.3 para ver cmo se crean los
paquetes)eincluyelasconstantesdelatabla7.2.Esimportantequeenelpaquetepongas
comentarios sobre el significado y los valores de las constantes, y sobre todo, que
comentesquvaloressonlosmshabituales.Ennuestrocasodeberasdecomentarqu
valorestendrasiseusaseparalaXUPV2P yparalaNexys2.Paramostrarunejemplode
cmosepuedenponerestoscomentarios,sehaaadidoelcdigo7.1.
package UART_PKG is
--------------------- declaracion de constantes ----------------------------------
-- c_on: indica el tipo de logica de los pulsadores, interruptores y LEDS
-- si es '1' indica que es logica directa -> PLACA NEXYS2
-- si es '0' indica que es logica directa -> PLACA XUPV2P
constant c_on : std_logic := '0'; -- XUPV2P

-- c_freq_clk: indica la frecuencia a la que funciona el reloj de la placa


-- para la Nexys2 el reloj va a 50MHz -> 5*10**7;
-- para la XUPV2P el reloj va a 100MHz -> 10**8;
constant c_freq_clk : natural := 10**8; -- XUPV2P

-- c_baud: indica los baudios a los que transmite la UART, valores


-- tipicos son 9600, 19200, 57600, 115200
-- Este valor depende de la conexion establecida con la computadora
constant c_baud : natural := 115200;

end UART_PKG;
Cdigo 7.1: Paquete con la declaracin de constantes

Departamento de Tecnologa Electrnica 81


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Ahora crea la entidad UART_TX. En la entidad incluye los puertos de la tabla 7.3 y no te
olvidesdeincluirlareferenciaalpaqueteenlacabeceradelaUART24.
El siguiente paso es disear el transistor de la UART por dentro, es decir, tenemos que
crear la arquitectura. Con lo que ya sabemos, te recomendamos que pienses cmo lo
harasantesdepasaraverlasolucinpropuesta.Existenmuchasalternativasdediseo
paraunamismafuncionalidadylaqueseproponeaqunoeslanicanitampocotiene
queserlamejor.
SegnlasespecificacionesdelfuncionamientodelprotocoloRS232podemospensarque
necesitaremos:
Undivisordefrecuenciaparagenerarunasealperidicaconlafrecuenciaindicadaenlos
baudios.
Unregistroqueguardeeldatoquevamosaenviar,yquelovayadesplazandosegnelbit
queestemosenviando
Un selector (multiplexor) que enve el bit de inicio, el bit de fin, los bits de datos o que
mantengaenreposolalnea.
Unbloquedecontrolqueindiquealrestodebloquesenqueestadoestamos,esdecir,qu
esloquetocaenviar:bitdeinicio,defin,bitsdedatosoreposo.
As que en una primera versin hemos identificado estos cuatro bloques que podran
organizarsecomosemuestraenlafigura7.5.Normalmente,estasprimerasversioneslas
tendremosquemodificarconformevamosrealizandoelcircuito.Anas,cuantomslo
pensemos al principio, menos modificaciones tengamos que hacer, y posiblemente
perdamosmenostiempo.
Carga_desplz

dato_tx_in

Seleccion
'0' fpga_tx

transmite '1'
desplaza
desplaza
Control clk
transmite clk
transmite rst rst
transmitiendo
transmitiendo
estado_tx n
baud
DivFreq clk

clk baud rst

rst
Figura 7.5: Diagrama de bloques preliminar del transmisor de la UART

Acontinuacinexplicaremoscadaunodelosbloques.

7.4.1. Divisor de frecuencia


Estebloquesecorrespondeconelbloque DivFreqdelafigura7.5.Estebloquegenerarla
sealqueindicacundohapasadoelintervalodetiempocorrespondienteacadabitdela

24 Recuerdaelcdigo6.10:library WORK; use WORK.UART_PKG.ALL;

82 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

tramadeenvo(figura7.3).Estasealtendrunafrecuenciadeterminadaporlaconstante
c_baudyquesecorrespondeconlosbaudiosalosquesecomunicarlaUART.Encasode
quetehayasolvidadodeloscontadoresydivisoresdefrecuencia,terecomendamosque
repaseselcaptulo6delasprcticasdeED2[17mach].
Estediseoloqueremoshacerconfigurable,demodoquesienundeterminadomomento
queremoscambiarlosbaudiosdelaUARTosiusamosunaplacacondistintafrecuencia
dereloj,notengamosquerehacerelcircuito,sinoquenosbasteconcambiarelvalorde
lasconstantes(tabla7.2ycdigo7.1).
Realizarundiseoconfigurableesmscomplicadoalprincipioyhacequesetardems
en disear. Sin embargo, a la larga hace ahorrar mucho tiempo porque no hace falta
redisear. Adems el diseo configurable suele ser ms seguro, ya que si tenemos que
redisearuncircuitopodemoscometernuevoserrores.
En nuestro caso, el diseo configurable tambin nos puede hacer ahorrar tiempo de
simulacin, ya que para simular se pueden poner frecuencias mayores de envo de la
UART,yasnotenerqueesperarloslargostiemposdesimulacin.
Para facilitar la comprensin y el diseo, antes de pensar en el diseo configurable,
veamoscmoharamoseldiseoconvaloresconcretos.
Por ejemplo, a partir del reloj de la placa XUPV2P de 100 MHz (clk) supongamos que
queremostransmitirconfrecuenciade9600Hz(baud).Portanto,lasealc_baudtendrun
periodode104,167s,ylacrearemosdemodoqueestunnicocicloderelojaunoyel
restodeltiempoacero.Lafigura7.6representaloscronogramasdelassealesdeentrada
(clk)ysalida(baud).
T=104,167 s
T=10 ns
10 ns
DivFreq
Di vFreq

Clk
Cl k baud

rst
100 MHz 9600 Hz
Figura 7.6: Divisor de frecuencia de 100 MHz a 9600 Hz

Paradiseareldivisordefrecuenciasedividelafrecuenciadeentradaentrelafrecuencia
desalida(100MHz/9,6kHz=10416,6710417)yelnmeroresultantenosdarlacuenta
necesaria para obtener la frecuencia de salida. Hacindolo de manera inversa, 10417
cuentasde10ns(clk)nosdaunperiodode104,17s,queesunabuenaaproximacinde
lafrecuenciaquequeremos.Estoes,queremos9600Hzyobtenemos9599,69Hz.
Para la creacin de este bloque habra que tener en cuenta lo explicado referente a los
rangosnumricosdelapartado4.2,yenvezdecrearuncontadorconrangode0a10416
que no tiene ninguna correspondencia fsica, lo haramos con el rango que delimite el
anchodelbus.Comolog2(10416)=13,35;necesitaramos14bitsparaelcontador.
Aunqueenesteejemplonoestanimportantecontarunciclomsomenos,yaque10nses
despreciable frente a 104,167 s, en general hay que ser cuidadosos para hacer un
contadorquecuenteelnmerodeciclosquequeremos.Convienedibujarelcronograma
delcircuito(figura7.7)yposteriormentedisearlo.

Departamento de Tecnologa Electrnica 83


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

10413 ciclos fin de


de reloj la cuenta

T=10 ns if clk'event and clk='1' then


if cuenta = 10416 then
cuenta <= 0;

clk

cont_baud 0 1 10414 10415 10416 0 1

baud

10417 x 10 ns
Figura 7.7: Cronograma del contador del divisor de frecuencia en el final de la cuenta

Apartirdelcronogramapodemosverqueunavezque cont_baudvalga10416escuando
debemosinicializarelcontador.Comolastransicionesocurrenduranteelflancoactivode
reloj(clk'event and clk='1')podemosconfundirnosconlosvaloresqueseevalanpara
cadasealeneleventodereloj,quvalorhemosdeponerenlacomparacin,elanterior
oelposterioralatransicin?Ennuestrocaso,comparamoscon10416ocon10417para
iniciarelcontador?
Lafigura7.8muestraelcronogramaampliado.
clk
Podemosapreciarqueesapartirdelflancodel
relojcuandolassealesregistradas (cont_baud
cont_baud 10416 0 1
y baud) cambian de valor, por tanto, se
comparan los valores que las seales tienen
baud
justo antes del flanco de reloj. Por tanto, en
nuestrocaso,comparamoscon1416. Figura 7.8: Cronograma en la transicin a cero

Ahoraqueyasabemoscmohacereldiseoconvaloresconcretos,veamoscmose hara
configurableconlasconstantes.
Enelejemploanterior,paracalcularelfindecuentadividimoslafrecuenciaderelojdela
placaentrelavelocidaddetransmisin(100MHz/9,6kHz=10416,6710417).Porlotanto,
en vez de hacer que el fin de cuenta sea hasta 10417, usaremos una constante
(c_fin_conta_baud) que tenga el valor resultante de la divisin entre la constante que
indicalafrecuenciaylaconstantequeindicalavelocidaddetransmisin.Estaconstante
semuestraenelcdigo7.2yladeberemosincluirenelpaquete.Eloperador/realizala
divisinentera.Observaqueselerestaunoporquelacuentaempiezadesdecero.
constant c_fin_cont_baud : natural := c_freq_clk/c_baud - 1;
Cdigo 7.2: Constante para el clculo del fin de cuenta de divisor de frecuencia de la UART

Conesto,enlaarquitecturadeltransmisorpodramosdeclararlasealdelacuentaconel
rangodependientedelaconstantec_fin_cont_baud.
signal cont_baud : natural range 0 to c_fin_cont_baud;
Cdigo 7.3: Rango de la seal cuenta basado en la constante de fin de cuenta

Sinembargo,conelcdigo7.3cometemoselmismofalloquemostramosenelapartado
4.1 (recuerda los cdigos 4.1 y 4.3), en donde el rango no es potencia de dos. Esto lo
podramos solucionar asegurndonos que la seal nunca sobrepase el fin de cuenta,

84 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

aunque una alternativa ms segura es usar una funcin que calcule el rango. Esto se
explicarenelsubapartadosiguiente.
7.4.1.1. Uso de funciones
Queremos calcular cuntos bits necesitamos para la seal cont_baud, para ello podemos
crear una funcin que nos calcule el logaritmo en base dos del valor del fin de cuenta
(c_fin_cont_baud). En VHDL una funcin puede tener varios argumentos de entrada y
devuelveunasalida.
En VHDL se pueden declarar funciones en la parte declarativa de la arquitectura (antes
del begin),sinembargonosotroslapondremosenelpaquetequehemoscreado.Deesta
maneralapodremosusarenelrestodemdulosdeldiseo.
Por tanto, se ha de incluir la declaracin de la funcin (cdigo 7.4) en el paquete que
hemoscreado(cdigo7.1).Esdecir,copiaelcdigo7.4 enel paquete UART_PKG.Observa
loscomentariosdelafuncin,esimportantequeincluyascomentariosparasabercmose
usalafuncinsintenerquemirarteelcdigoparadescubrirsufuncionamiento.
--------------------------- funcion: log2i --------------------------------------
-- Descripcion: funcion que calcula el logaritmo en base 2 de un numero entero
-- positivo. No calcula decimales, devuelve el entero menor o igual
-- al resultado - por eso la i (de integer) del nombre log2i.
-- P. ej: log2i(7) = 2, log2i(8) = 3.
-- Entradas:
-- * valor: numero entero positivo del que queremos calcular el logaritmo en
-- Salida:
-- * devuelve el logaritmo truncado al mayor entero menor o igual que el resultado
function log2i (valor : positive) return natural;
Cdigo 7.4: Declaracin de una funcin para el clculo del logaritmo

Cuandounafuncinsedeclaraenunpaquete,elcuerpodelafuncin(functionbody)se
tiene que incluir en el cuerpo del paquete (package body). El cuerpo del paquete lo
podemoscrearacontinuacindelpaquete(package).
Paracalcularellogaritmo,lafuncinlog2itendrquedividirpordosdemanerasucesiva
hasta que el resultado sea cero (realizando la divisin entera). El nmero de divisiones
quehayamosrealizadonosindicarelnmerodebitsnecesarios.
Enelcdigo7.5sehaincluidoelcuerpodelpaquete UART_PKGydentrosehaincluidoel
cuerpodelafuncin log2i.Observaquesehanincluidocomentariosqueexplican cmo
realiza las operaciones internamente. Quiz no sea necesario tanto detalle, pero es
importante para facilitar la labor en el futuro si tuvieses que hacer correcciones o
modificaciones.Copiaestecdigoeinclyelodespusdelpaquete.

Departamento de Tecnologa Electrnica 85


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Package body UART_PKG is


-------------------- Funcion log2i ---------------------------------------
-- Ejemplos de funcionamiento (valor = 6, 7 y 8)
-- * valor = 6 | * valor = 7 | * valor = 8
-- tmp = 6/2 = 3 | tmp = 7/2 = 3 | tmp = 8/2 = 4
-- log2 = 0 | log2 = 0 | log2 = 0
-- - loop 0: tmp 3 > 0 | - loop 0: tmp 3>0 | - loop 0: tmp 4>0
-- tmp = 3/2 = 1 | tmp = 3/2 = 1 | tmp = 4/2 = 2
-- log2 = 1 | log2 = 1 | log2 = 1
-- - loop 1: tmp 1 > 0 | - loop 1: tmp 1 > 0 | - loop 1: tmp 2 > 0
-- tmp = 1/2 = 0 | tmp = 1/2 = 0 | tmp = 2/2 = 1
-- log2 = 2 | log2 = 2 | log2 = 2
-- - end loop: tmp = 0 | - end loop: tmp = 0 | - loop 2: tmp 1 > 0
-- * return log2 = 2 | * return log2 = 2 | temp = 1/2 = 0
-- | log2 = 3
-- | - end loop: tmp = 0
-- | * return log2 = 3
function log2i (valor : positive) return natural is
variable tmp, log2: natural;
begin
tmp := valor / 2; -- division entera, redondea al entero inmediatamente menor o =
log2 := 0;
while (tmp /= 0) loop
tmp := tmp/2;
log2 := log2 + 1;
end loop;
return log2;
end function log2i;
end UART_PKG;

Cdigo 7.5: Cuerpo del paquete UART_PKG y cuerpo de la funcin log2i

Observa que dentro de la funcin se han declarado variables, que son distintas que las
seales. A diferencia de las variables, las seales no se pueden declarar dentro de una
funcin.Laasignacindelasvariablesserealizaconeloperador:=.Lasvariablestoman
suvalorconlaasignacinynocomoocurreconlassealesenlosprocesosquetomanel
valoralsalirdeproceso.
Fjate que la funcin devuelve un nmero menor al nmero de bits necesario, por
ejemplo,pararepresentarun6necesitamos3bitsyno2(queserloquedevuelvalog2i).
Siqueremosrepresentarunentero,tendremosquesumarunoalresultado,sinembargo,
paralostiposunsignednosvienebienas,porqueelrangoincluyeelcero.Parafacilitarla
sucomprensin,enlafigura7.9sedetallaesteconcepto.
Queremos representar el 6

Al calcular el logaritmo con log2i el resultado es 2:


log2i(6) 2

Si queremos usar un natural Si queremos usar un unsigned


hay que sumarle 1: 2+1 no hay que sumar nada: 2

signal sen_nat: natural range 0 to 2**3-1; signal sen_us: unsigned (2 downto 0);

7 3 bits: de 0 a 7

Figura 7.9: Uso del valor devuelto por la funcin log2i para la obtencin del rango de un natural y un
unsigned

En el cdigo 7.6 se muestran un ejemplo de cmo se declararan dos seales (natural y


unsigned)apartirdelresultadodevueltoporlafuncinlog2i.
constant log2_6 : natural := log2i(6); -- para representar 6, log2i devuelve 2
signal sen_nat: natural range 0 to (2**(log2_6+1))-1; -- si es entero hay que sumar 1
signal sen_us : unsigned (log2_6 downto 0); -- si es unsigned dejamos igual

Cdigo 7.6: Ejemplo de la utilizacin del resultado de la funcin log2i para los rangos de las seales

86 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Aspues,declararemosunaconstantequerepresenteelnmerodebitsnecesariosparael
contador (en realidad el nmero de bits menos 1). Esta constante la pondremos en el
paquete. Tiene que estar despus de la declaracin de la funcin (cdigo 7.4) ya que
utilizadichafuncin25(lomejoresqueladeclaracindelafuncinlapongasalprincipio
delpaquete).Estadeclaracinestenelcdigo7.7.
-- el numero de bits (nb) menos 1 necesarios para representar c_fin_cont_baud
constant c_nb_cont_baud : natural := log2i(c_fin_cont_baud);
Cdigo 7.7: Constante que representa el nmero de bits menos uno del contador del divisor de frecuencia

Ahorayapodemosdeclararlasealdelcontadorenlaarquitectura.Elcdigo7.8muestra
ladeclaracindelasealparaelcasodetipounsigned.
signal cont_baud : unsigned (c_nb_cont_baud downto 0); -- unsigned: dejamos igual

Cdigo 7.8: Declaracin de la sea , para el caso de tipo unsigned, que cuenta con el rango determinado
por la constante calculada

Siquisisemosdeclararlacomonatural,podramosusarladeclaracindelcdigo7.9.Se
ha incluido como ejemplo, ya que en este diseo disearemos el contador con tipo
unsigned. Fjate que en el cdigo 7.9 se ha sumado 1 a la constante c_nb_cont_baud, y
luegoseleresta1alresultadodelaexponenciacin,noesqueseleestemosrestando1
otra vez al exponente. Esto es por la precedencia de los operadores, la exponenciacin
tienemayorprecedenciaquelaresta.
signal cont_baud : natural range 0 to 2**(c_nb_cont_baud+1)-1; -- entero: sumar 1
Cdigo 7.9: Declaracin de la seal, para el caso de tipo natural, con el rango determinado por la constante
calculada

As que con la seal declarada, ya podemos realizar el divisor de frecuencia. Intenta


hacerlo t mismo sin mirar el cdigo 7.10, de todos modos, como se han introducido
muchasconstantesyconceptosnuevos,hemosincluidounaposiblesolucinparaquela
compares con tu divisor de frecuencia. Es importante que antes de mirar la solucin
disees la tuya, pues conforme avancemos en el libro, se va a reducir el cdigo de
ejemplo.
P_DivFreq: Process(rst,clk)
begin
if rst = c_on then
cont_baud <= (others => '0'); -- todo a cero
baud <= '0';
elsif clk'event and clk='1' then
baud <= '0'; -- por defecto, siempre a cero
if cont_baud = c_fin_cont_baud then
baud <= '1'; -- avisamos de fin de cuenta
cont_baud <= (others => '0');
else
cont_baud <= cont_baud + 1;
end if;
end if;
end process;
Cdigo 7.10: Proceso del divisor de frecuencia del transmisor de la UART

7.4.1.2. Operaciones con constantes y con seales en VHDL


Enelcaptulo8veremosquemuchasdelasoperacionesqueseconsideransimples,como
ladivisin,notienenunaimplementacindirectaenhardware.Porejemplo,pararealizar

25 Importante:Enalgunossimuladores(porejemplo,laversin6.0deModelsim),nosepuedeusaruna
funcinantesdetenerdeclaradosucuerpo.Sitienesesteproblemaconsultaelapartado7.4.1.3

Departamento de Tecnologa Electrnica 87


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

una divisin tenemos que disear un mdulo VHDL que describa el hardware que la
implemente,yyaveremosquenohaynicamaneradeimplementarundivisor.
Arazdeestonospodramospreguntarsiloquehemoshechoenelapartadoanteriores
correcto, ya que hemos calculado el logaritmo de un nmero mediante divisiones
sucesivas. Por tanto podramos preguntarnos podemos realizar estas divisiones en
VHDLtaninocentemente?larespuestaessegnconquoperandos.
Al sintetizar en VHDL se pueden realizar clculos complejos (divisiones,
exponenciaciones,...)enelcasodequeesasoperacionesserealicenduranteelprocesode
sntesis (antes de bajarlo a la FPGA). Esto implica que los operandos tienen que ser
constantes.Esdecir,podemosrealizarellogaritmode234,peronopodemosimplementar
ellogaritmodelaseal X(enrealidadsepodra,perotendramosquedescribirenVHDL
elmdulosintetizablequeloimplementase).
Asquelafuncinlog2ilapodemosutilizarparacalcularellogaritmodeconstantes,pero
no la podremos utilizar para implementarla en el circuito y calcular el logaritmo de
seales,puesvanacambiar.
Durantelasntesis,laherramientaISEeslaquecalculalosvaloresresultantesdeaplicar
lafuncin log2ialasconstantes.Esdecir,noeselcircuitoVHDLel queimplementala
funcin y calcula el resultado, sino el sintetizador. Si fuesen seales (que cambian de
valor) no se podra calcular el valor durante la sntesis, y por tanto habra que
implementarenhardwareeloperador,yporlotantonosepodrausarlafuncin.
7.4.1.3. Uso de funciones dentro del mismo paquete
Enalgunossimuladores(porejemplo,la versin6.0 deModelsim), nosepuedeusaruna
funcinantesdetenerdeclaradosucuerpo.Estohacequenopodamosusarunafuncin
paraconstantesdeclaradasenelmismopaquete.Estecasosemuestraenelcdigo7.11.
package UART_PKG is
function log2i (valor : positive) return natural;
constant c_nb_cont_baud : natural := log2i(c_fin_cont_baud);
end UART_PKG;

Package body UART_PKG is


function log2i (valor : positive) return natural is
variable tmp, log2: natural;
begin
tmp := valor / 2; -- division entera, redondea al entero menor
log2 := 0;
while (tmp /= 0) loop
tmp := tmp/2;
log2 := log2 + 1;
end loop;
return log2;
end function log2i;
end UART_PKG;
Cdigo 7.11: El uso de funciones dentro del mismo paquete da problemas en algunas herramientas

Esto no esun problema para el ISE, pero si queremos usar la versin 6.0 del Modelsim,
parasolucionarestotenemosqueusardospaquetes,unodelospaquetestendrtodaslas
declaraciones de funciones (UART_PKG_FUN) y en ese fichero incluiremos el cuerpo del
paquetecontodosloscuerposdelasfunciones.
En el segundo paquete incluiremos todas las declaraciones de constantes (UART_PKG). El
paquetequetienelasdeclaracionesdeconstantestendrquereferenciarelpaquetequede

88 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

las funciones26, mientras que el resto de unidades harn referencia al paquete de las
constantes, a no ser que necesiten usar alguna de las funciones y entonces tambin
tendrnquehacerreferenciaalosdospaquetes.
ExisteunaalternativaparaelModelsim,queesusardeclaracionesdiferidasdeconstantes
(deferred constant). Esto consiste en declarar la constante en el paquete sin darle valor y
volver a declarar la constante dndole su valor en el cuerpo del paquete, despus del
cuerpodelafuncin.Enelcdigo7.12semuestracmosolucionarelcdigo7.11.
package UART_PKG is
function log2i (valor : positive) return natural;

-- declaracion diferida de constante (deferred constant), sin valor


constant c_nb_cont_baud : natural;
end UART_PKG;

Package body UART_PKG is


function log2i (valor : positive) return natural is
variable tmp, log2: natural;
begin
tmp := valor / 2; -- division entera, redondea al entero menor
log2 := 0;
while (tmp /= 0) loop
tmp := tmp/2;
log2 := log2 + 1;
end loop;
return log2;
end function log2i;

-- se le da el valor a la constante en el cuerpo del paquete


constant c_nb_cont_baud : natural := log2i(c_fin_cont_baud);

end UART_PKG;
Cdigo 7.12: Uso de constantes diferidas para evitar problemas por usar funciones dentro del mismo
paquete (cdigo 7.11). No vale para el ISE

Pordesgracia,estemtodonoloaceptaelISE.Conestopuedesverquemuchasvecesel
diseadorestlimitadoalasherramientasqueutilice.Enelcasoqueacabamosdever,lo
queaceptauna,noloaceptalaotrayviceversa.

7.4.1.4. Ms funciones
Este apartado te lo puedes saltar si ests cansado de funciones, constantes y dems. Es
simplementeuncomentarioparalosmsatentos.
Quizs te has fijado que en el cdigo 7.2, el resultado de realizar la divisin entera de
c_freq_clk/c_baud - 1da10415ynosotroshabamoscalculadoquelaconstantedeberaser
10416porelredondeo,yaqueladivisinda10416,67yhabamosredondeadoa10417(y
luegolehabamosrestadounoporquesecuentadesdecero).
Como el operador / realiza la divisin entera truncando al entero inferior inmediato,
nosotros podramos crear una funcin entera con redondeo al entero ms cercano. Esta
funcinlapodemosincluirenelpaqueteycalcularelfindecuenta(cambiandoelcdigo
7.2) con esta funcin en vez de con el operador /. Aunque incluimos la funcin en el
cdigo7.13,intentahacerlaportimismoantesdemirarelcdigo.

26 Recuerdaelcdigo6.10:library WORK; use WORK.UART_PKG_FUN.ALL;

Departamento de Tecnologa Electrnica 89


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

function div_redondea (dividendo, divisor: natural) return integer is


variable division : integer;
variable resto : integer;
begin
division := dividendo/divisor;
resto := dividendo rem divisor; -- rem: calcula el resto de la division entera
if (resto > (divisor/2)) then
division := division + 1;
end if;
return (division);
end;
Cdigo 7.13: Funcin para el redondeo

7.4.2. Bloque de control


Elbloquedecontroleselencargadodirigir en reposo
alrestodebloques.Pararealizarelcontrol e_init
podramospensarencuatroestados:inicial
(reposo), envo del bit de inicio, envo de
los8bitsdedatosyelenvodelbitdefin e_bit_fin e_bit_init

(en caso de que hubiese bit de paridad enviando el


enviando el bit de inicio
habra que incluir un estado ms). La
bit de fin
figura7.10muestraunaversinpreliminar e_bits_dato
enviando los 8
deldiagramadeestados. bits de datos
Figura 7.10: Diagrama de estados preliminar del
transmisor de la UART

Hayotrasopcionesalternativasalafigura7.10,porejemploincluirunestadoparacada
bit.Comoyasabes,unamismafuncionalidadsepuedeimplementardemuchasmaneras.
Vamosaexaminarquharancadaunodeestosestados:
Estadoinicial(e_init):enesteestadoinicialelsistemaestenreposoesperandolaorden
de transmitir. Por tanto, la lnea de transmisin estar a uno (fpga_tx='1'), ya que es el
valor inactivo. Cuando la seal transmite valga 1 ser el indicativo de que se quiere
transmitir un dato, y por tanto se pasar a enviar el bit de inicio: e_bit_init. En este
momento se dar la orden de cargar el dato (seal cargadato) que se quiere enviar
(dato_tx_in) en el registro de desplazamiento. Simultneamente debemos sincronizar el
contadordeldivisordefrecuencia,paraellopodramosdeshabilitarelcontadorduranteel
estadoinicialparaquenocuente.Estasealdehabilitacin(en_divfreq)nolahabamos
contempladoenlaversinpreliminardeldiagramadebloques(figura7.5).
Envo de bit de inicio (e_bit_init): en este estado se est enviando el bit de inicio,
poniendo la lnea de transmisin a cero (fpga_tx='0'). Se saldr de este estado cuando
hayapasadoelperiododetiempocorrespondienteaunbit.Estetiempovienedeterminado
porlaseal baud,generadaporeldivisordefrecuencia(apartado7.4.1).Despusdeeste
tiemposepasaraenviarlosbitsdedato.
Envodelosbitsdeldato(e_bits_dato):enesteestadoseenvanlos8bitsdeldato.Una
alternativa a estaopcinsera ponerun estado para cada bit, sin embargo, usaremosun
estadoparalos8bitsy,medianteuncontador,llevaremoslacuentadelnmerodebitsque
sehanenviado.Paraenviarcadabit,elcontrolgenerarlasealdesplazaqueleindicaal
registrodedesplazamientoquetienedesplazarsusbits.Cuandosehayanenviado/contado
los8bitselcontadorgenerarunaseal(fin_cont8bits)queindicarquehayquepasara
enviarelbitdefinyporlotantocambiaremosdeestado(siquisisemosimplementarelbit

90 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

deparidad,iraahora).Porlodichoanteriormente,eneldiagramapreliminardelafigura
7.5habrqueaadirunbloquequecuentelosbits.
Envo del bit de fin (e_bit_fin): En este
estadose enva el bit defin, poniendo la baud e_init transmite
lneadetransmisinauno(fpga_tx='1').
Se saldr de este estado cuando haya
pasado el periodo correspondiente a un e_bit_fin e_bit_init

bit (ponemos un nico bit de fin), este


periododetiempoloindicalasealbaud.
fin_cont8bits e_bits_dato baud
En lafigura7.11semuestraeldiagramade
estadosconlaindicacindelassealesque
Figura 7.11: Diagrama de estados con la indicacin
hacencambiardeestado. de las seales que hacen cambiar de estado

Comohemosvistoenelanlisisdecadaunodelosestados,noshacenfaltamssealese
inclusounbloquenuevorespectoaloqueinicialmentevimosenlafigura7.5.Asqueel
nuevodiagramadebloquespodraquedarcomomuestralafigura7.12,dondeseincluye
elbloquecontadordelosbitsquesevanenviando,ylasseales en_divfreq, cargadatoy
fin_cont8bits. Como siempre, existen multitud de propuestas que tambin seran
vlidas.
Carga_desplz
dato_tx_rg

dato_tx_in

Seleccion
'0' fpga_tx

cargadato '1'
Control
desplaza
cargadato clk
clk
transmite transmite rst
desplaza rst
transmitiendo transmitiendo
en_divfreq estado_tx 2

DivFrec baud
en_divfreq fin_cont8bits
Clk
clk baud
rst
rst
CuentaBits
baud fin_cont8bits

clk estado_tx

rst
Figura 7.12: Diagrama de bloques definitivo del transmisor

Observa que ahora el divisor de frecuencia tiene una seal de habilitacin (en_divfreq),
as que tienes que modificar el cdigo 7.10 de modo que incluya la habilitacin del
contador.Sinoteacuerdascmosehace,uncontadorconhabilitacinlopuedesverenel
captulo16delmanualdeED2(cdigo16.2).
Enlatabla7.4semuestralatabladeestados,entradasysalidas.Antesdemirarlaintenta
realizarla por ti mismo. Puede ser que algunas salidas no te salgan igual, especialmente

Departamento de Tecnologa Electrnica 91


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

las de las transiciones, en algunas no tiene que ser un error que no estn iguales que la
tabla7.4.

Entradas Salidas

transmitiendo
Estado Estado

fin_cont8bits

en_divfreq
cargadato
transmite

desplaza
Actual siguiente

baud
e_init 0 X X e_init 0 0 0 0

e_init 1 X X e_bit_init 1 0 0 0

e_bit_init X 0 X e_bit_init 0 0 1 1

e_bit_init X 1 X e_bits_dato 0 0 1 1

e_bits_dato X X 0 e_bits_dato 0 baud 1 1

e_bits_dato X X 1 e_bit_fin 0 0 1 1

e_bit_fin X 0 X e_bit_fin 0 0 1 1

e_bit_fin X 1 X e_init 0 0 1 1

Tabla 7.4: Tabla de estados, entradas y salidas del transmisor de la UART

Fjate que la salida desplaza, se pone a uno cuando estando en el estado e_bits_dato la
seal baudseponeauno.Estoesporquecuandoseestnenviandolosbitsdedatohay
quedesplazarelregistrodedesplazamientoparacambiarelbitqueseenva,estosedebe
hacercuandotranscurreelperiododetiempomarcadoporlasealbaud.
Apartirdelatabla7.4,eldiagramadelafigura7.11ylasexplicacionesanteriores,quiz
puedas realizar el mdulo de control. Si no, repasa los captulos 9 y posteriores del
manualdeED2[17mach].
Tambin debes hacer el contador CuentaBits (figura 7.12). Fjate que este contador debe
funcionarsolamenteestandoenelestado e_bits_datoyquelaseal fin_cuenta8bits se
debedeactivarcuandosehayaterminadodetransmitireloctavobit.Aqudebesdetener
en cuenta la sincronizacin y evitar contar de ms o de menos. Es muy probable que
necesitessimularparacorregiralgnerror.

7.4.3. Registro de desplazamiento y multiplexor


EstosbloquessehanvistoenelmanualdeED2[17mach].Elregistrodedesplazamiento
seexplicaenelapartado7.1yelmultiplexorenelapartado3.1dedichomanual,adems
tienesejemplosdemultiplexoresenelapartado2.3deestemanual.
Lasalidadelmultiplexorlapuedespasarporunbiestableyquesealasalidadelbiestable
laquecorrespondaconlaseal fpga_tx,yaqueesunabuenaprcticadediseoregistrar
lassalidasdeldiseo.
Importante: si registras la salida del multiplexor, como se recomienda en el prrafo
anterior, debes tener en cuenta que en reposo, la lnea de transmisin del puerto serie
debeestara1,porlotanto,alresetear,lasealfpga_txladebesponera1ynoa0como
suele sermshabitual.Enotrocaso,alresetearpareceraquenuestrotransmisorfuesea
iniciarunatransmisin.

92 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Unavezquehayasrealizadoeldiseo,compruebaquelasintaxisestbien(Check Syntax),
inclusopruebaasintetizarlo(Synthesize - XST),peroantesdeimplementarloenlaFPGA
convendrsimularlo.

7.5. Simulacin del transmisor


Eltransmisorquehemosrealizadotieneciertacomplejidad,yadiferenciadeloscircuitos
quehemosrealizadohastaahora,noesfcildecomprobarsilohemosdiseadobien.En
losanteriorescircuitosdisponamosdelosledsparaverelcomportamientodelcircuito,
ahoranotenemoslosleds,ynoesfcilcomprobarsilatransmisinsehacecorrectamente
ycumplelosespecificadosdelprotocoloRS232.Asqueesprcticamenteimprescindible
simularelcircuitoantesdeimplementarloenlaFPGA.Enelcaptulo5vimoslospasos
para simular un circuito, tambin se explica en el captulo 8 del manual de prcticas de
ED2 [17mach]. Ahora vamos a seguir los mismos pasos, pero por las caractersticas de
nuestrocircuitotendremosquerealizarunbancodepruebasdemayorcomplejidad.
La realizacin de un buen banco de prueba es una tarea muy importante en el diseo,
inclusoendiseoscomplejospuedellevarmstiempoladepuracinqueelpropiodiseo.
Muchasveceselbancodepruebasyeldiseolorealizanpersonasdiferentesparaevitar
que el diseador realice el banco de pruebas en base a lo que ha diseado o segn su
interpretacin de las especificaciones del circuito. Un buen banco de pruebas debe
comprobarqueeldiseohaceloquedebehacerynohaceloquenodebehacer.
A veces la complejidad del banco de pruebas es muy grande y se crean modelos de
componentes para la simulacin. La descripcin de estos modelos puede ser muy
diferente a los modelos que se sintetizan, ya que para simulacin se acepta todo el
conjunto del VHDL, mientras que para sntesis slo se acepta un conjunto restringido.
Paraelbancodepruebasdeltransmisorrecurriremosaestetipodemodelos.
ParaempezararealizarelbancodepruebascrearemosunanuevafuentedetipoVHDL
TestBench y la llamamos tb_uart_tx.vhd. Este banco de pruebas estar asociado a la
entidaduart_txqueyahemoscreado.
Loprimeroquedebeshaceresponerlosmismospaquetesquepusisteeneltransmisorde
laUART,incluyendolareferenciaalpaquetequecreamosenelcdigo7.1.
Ya que cada placa tiene un reloj con distinta frecuencia, en vez de crear un banco de
pruebas distinto para cada placa, como hicimos en los cdigos 5.1 y 5.2, crearemos un
procesoderelojdependientedelaconstantedelafrecuenciaderelojc_freq_clk.
As que vamos a crear una constante con el periodo del reloj, para que pueda ser un
nmero entero lo pondremos en nanosegundos, multiplicndolo por 109. La declaracin
de la constante se ha puesto en el cdigo 7.14 y tendrs que incluirla en el paquete del
cdigo7.1.
constant c_period_ns_clk : natural := 10**9/c_freq_clk;
Cdigo 7.14: Constante con el periodo del reloj en nanosegundos

Con estaconstantepodemoscrearelmismoprocesoderelojparalasdosplacas,yaque
est hecho en funcin de la constante del periodo cs_period_ns_clk. Fjate en el cdigo
7.15 que como en la sentencia wait for hay que indicar un tiempo, hemos tenido que
multiplicarlaporunnanosegundo.

Departamento de Tecnologa Electrnica 93


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

P_Clk: Process
begin
clk <= '0';
wait for (c_period_ns_clk / 2) * 1 ns;
clk <= '1';
wait for (c_period_ns_clk / 2) * 1 ns;
end process;
Cdigo 7.15: Modificacin del proceso del reloj para que su frecuencia dependa de constantes

Ahoracreaelprocesodereset.Cralodemanerasimilaraloscdigos5.3y5.4perohazlo
usando las constantes c_on y c_off (cdigo 6.9) de manera que no tengas que usar un
procesodistintodependiendodelaplacaqueestsusando.
Fjate en ladeclaracin de sealesdel banco de pruebas. Observa que las seales tienen
asignado un valor inicial. Quiz recuerdes que en sntesis no tiene sentido dar un valor
inicialalasseales,puesslosepuededarvalorinicialalassealesqueformanbiestable
y stos se inicializan con el reset. El resto de seales que no forman biestable reciben el
valordeotrasseales,ysuvalorinicialserdependientedeesasotrasseales,portanto
noselepuedenasignarotrovalorinicial.
Sinembargo,parasimulacin(enlosbancosdepruebas)spuedesdarvaloresinicialesa
lasseales,aunquenoesnecesario.Siensimulacin,unasealdetipo std_logicnoha
recibidovalor,mostraruna'U' (deUnknown,desconocido).Ensntesis,notienesentido,
yaquefsicamentelasealtendrunatensincorrespondienteconelcerooelunolgico,
aunqueparanosotrossuvalorseadesconocidooindeterminado.
Ennuestrobancodepruebascambiaremoselvalorinicialdelasealderesetasuvalor
inactivo(c_off),envezdel0quetienepordefecto.Elrestodesealeslaspodemosdejar
igual.
Acontinuacin,enelsubapartadosiguientecrearemoselprocesoquesimulaelenvode
un dato,posteriormenteincluiremoselenvodemsdatos,yporltimoaadiremosun
modelo de receptor para simulacin que nos dir de manera automtica si el envo es
correctoysicumplelostiemposdadosporlanormaRS232.

7.5.1. Proceso que modela la orden de enviar un dato


Dentro del banco de pruebas crearemos un proceso llamado P_Estimulos que va a
modelar la accin de ordenar al transmisor el envo de un dato determinado. En este
procesovamosahacerlosiguiente:
1. Inicialmenteponemoslasealtransmiteytodoslosbitsdedato_tx_inacero.
2. Unavezquelasealderesetsehayaactivadoydesactivado,esperamos70ns.Estopuedes
hacerlodedosmaneras:
Calculando el tiempo que transcurre hasta que el reset vuelva a estar inactivo. Del
cdigo5.3sabesqueelresetestarinactivodespusde108+75nsapartirdelcomienzo.
Aestohabraqueaadirlelos70nsdelaesperaqueahorasepide.
La manera anterior nos hace depender de los tiempos del proceso del reset, pero es
mejorhacerlodependerdeloseventos.Esdecir,primeroesperaraquehayauncambio
enelvalordelreset(rst'event)yqueelresetsepongaactivo(rst=c_on).Posteriormente
esperaraqueelresetsevuelvaaponerinactivo.Yporltimo,esperarlos70ns.
Enlafigura7.13semuestranlasdosopcionesdemaneragrfica.Laprimeraopcin,
basada en tiempos, se muestra arriba; mientras que la segunda opcin, basada en

94 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

eventos,semuestradebajo.Nosotrosimplementaremoslasegundaopcin.Fjateque
elcronogramadelresetserefierealaplacaXUPV2P,puesesactivoanivelbajo.
wait for 108 ns; wait for 75 ns; wait for 70 ns;

ns ns
XUPV2P
rst

wait until rst'event and rst=c_on; wait until rst=c_off; wait for 70 ns;

Figura 7.13: Captura de eventos del reset basados en tiempos o en eventos. Referenciado a la XUPV2P

3. Esperamosaquehayaunflancodesubidadelasealdereloj.Estosehaceconlasentencia
delcdigo7.16:
wait until clk'event and clk='1'
Cdigo7.16: Esperar a que haya un flanco de subida del reloj

4. Enviamos el dato 01010101. Para ello tendremos que poner la seal transmite a uno,
dando as la orden de transmitir, simultneamente asignamos a dato_tx_in el valor que
queremostransmitir.
5. Esperamosalsiguienteflancodesubidadereloj.
6. Quitamoslaordendetransmitiryponemoseldatoatransmitirtodoacero.
7. Esperamosindefinidamente.Recuerdaquesehaceconlasentenciawait; (cdigo5.3).
Ahora,implementaesteprocesoparasimularelcircuito(enModelsimoenelsimulador
delISE).Antesdesimularconvieneestimarcuntotiempodesimulacinrequerimospara
comprobar que nuestro envo se realiza correctamente. Esto adems es necesario para
comprobarquelasimulacinescorrecta.
Estamos enviando a una frecuencia de 115200 baudios (o lo que hayas puesto en la
constante c_baud del paquete UART_PKG). Esto significa que cada bit se debera de enviar
durantealgomenosde8681ns(27).Comoenviamoselbitdeinicio,los8bitsdeldatoyel
bitdefin,eltiempodetransmisinser10vecesmayor:86810ns,yaestoletenemosque
sumar el tiempo del reset (figura 7.13) que es algo menos de 300 ns. Por tanto, nuestra
simulacindurarunos87110ns,asquepodemosindicaralsimuladorquesimule88s.
En el apartado siguiente vamos a analizar la simulacin, se va a explicar con el ISE
Simulator,yaquetienealgunasparticularidades,perosepuedehacerdemanerasimilar
conelModelsim.Enestaexplicacinsesuponequeyasabeslosconceptosbsicosdela
simulacinyelmanejodelossimuladores.Estoseexplicenelcaptulo5ysobretodoen
elcaptulo8delmanualdeED2[17mach].Paracualquierdudaconsultaestoscaptulosya
queesprobablequeestnexplicadas.
El apartado siguiente es muy importante porque de nada nos vale hacer el banco de
pruebassinosabemosinterpretarlosresultadosdelasimulacin.Lasformasdeondade
lasimulacinpuedenresultarininteligiblessinoseanalizanconciertodetalleypaciencia.

27 Calculamoslainversadelosbaudiosylamultiplicamospor109parapasarlodesegundosananosegundos.
EnrealidadnuestraUARTnopodrsertanexacta,sinoqueeltiempotendrqueserunacantidadmltiplo
denuestroperiododereloj(apartado7.4.1)

Departamento de Tecnologa Electrnica 95


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Para el anlisis es imprescindible tener claro cmo deben de comportarse las seales.
Comparando los resultados de la simulacin con los que nosotros esperamos podremos
descubrirsihayalgnerrorennuestrodiseo.

7.5.2. Comprobacin de la simulacin


Las instrucciones bsicas para arrancar la simulacin con el ISE Simulator estn en el
captulo8delmanualdeED2[17mach]porloquenoserepetirnaqu.Parasimularcon
Modelsimconsultaelcaptulo5.
ComoelISESimulatortienealgunasparticularidades,seexplicarlasimulacinconesta
herramienta.Anas,deberaspodersimularconModelsimsinproblemas.
Una vez que pinchas en Simulate Behavioral Model (estando seleccionado el mdulo del
banco de pruebas) aparece la ventana de las formas de onda. Por defecto se simula
durante 1000 ns y estn incluidas las seales del banco de pruebas, pero no las seales
internas del transmisor de la UART. En la figura 7.14 se muestra la ventana de
simulacin28.

Seleccin del tiempo de simulacin

Simulacin: 1000 ns

Seales del banco


de pruebas

Transmisor UART


Figura 7.14: Simulacin por defecto en el ISE

Si queremos observar todas las seales internas, como son estado_tx, baud, cargadato,
fin_cont8bits,...(recuerdalafigura7.12),paraellodebesdeexpandirelmendondese
encuentra el transmisor de la UART (figura 7.14), y una vez expandido, seleccionar
aquellas seales que queramos que aparezcan. Seleccionaremos todas menos las que ya
estnenelbancodepruebas(rst,clk,transmite,...),pinchamosconelbotnderechodel

28Sihassimuladoconanterioridadenelmismoproyecto,suelesimulareltiempodelaltimasimulacine
incluyelassealesqueseusaronenesasimulacin

96 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

ratnyseleccionamos Add to waveform.Conestoyatendremoslassealesenelvisorde


formasdeondas.


Figura 7.15: Aadir seales en el ISE Simulator

Sinembargo,podemosobservarqueparalassealesquehemosaadidonosemuestran
susformasdeonda.Asquetendremosquereiniciarlasimulacin.Paraello,pinchaen
SimulationRestart (o busca el icono). Y ahora pon 88 s en la seleccin del tiempo de
simulacin(miralafigura7.14paraverdndeest).PorltimopinchaenSimulationRun
For Specified Time.Conestosemostrarnlasformasdeondadelassealeshastalos88s.
Para ver la simulacin completa pincha en SimulationZoomTo Full View 29. Ahora es el
momentodecomprobarsinuestrocircuitofuncionacomodebe.Lafigura7.16muestralas
formasdeondaqueaproximadamentedeberanaparecer.


Figura 7.16: Simulacin del transmisor con seales internas durante 88 s

29 EnModelsim,extraelaventanadelasformasdeonda(figura5.9)ypichaenViewZoomZoom Full

Departamento de Tecnologa Electrnica 97


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Ahorapasaremosacomprobarqueelcircuitofuncionabien.
Loprimeroquetienesquemirareslaseal fpga_tx.Estasealdebedehaberenviadoel
dato01010101conformealprotocoloRS232.Comoyasabemoslasespecificacionesdel
protocolo,elaspectodelasealdebesercomoelmostradoenlafigura7.17.Acurdate
queelprimerbitdeldatoqueseenvaeselbit0,porlotanto,tienequeserun1.
'0' '1' '0' '1' '0' '1' '0' '1' '0' '1'

bit de bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 bit de
inicio fin

bits del dato


Figura 7.17: Forma de onda de la seal fpga_tx despus de simular 88 s

Si el resultado de tu simulacin no fuese como el mostrado en la figura 7.17 tendremos


que buscar qu ha fallado. De todos modos, no es preocupante, rara vez los diseos
funcionanalaprimera.
Haymuchascosasquepuedenhaberfallado,asquevamospocoapocoyempezaremos
porelprincipio.Acontinuacinsemuestranunaseriedepasosquedebescomprobar:
1. Compruebaqueelbancodepruebashaceloquequeramosquehiciese
Nuestrobancodepruebaseramuysencillo,asqueestacomprobacinvaaserfcil.
Lo primero es aumentar el zoom de las formas de ondas. Para ello pincha en
SimulationZoomIn(obuscaelicono30),tendrsquepincharunas7vecesohastaque
empiecesaverlastransicionesdelreloj.
A continuacin llevamos la simulacin al inicio arrastrando la barra inferior a la
izquierda.Laseal dato_tx_inlaponemosenformatobinario(pinchandoencimade
ellaconelbotnderecho).
Tenemosquecomprobarquelasealderesetsecomportacomomuestralafigura7.13
(o invertida si trabajamos con la Nexys2). Y que aproximadamente a los 260 ns se
activa la seal transmite, esta activacin debe durar un ciclo de reloj.
Simultneamente la seal dato_tx_in debe de cambiar a 01010101. Posteriormente
ambassealesseponenacero.
Si esto est bien nos hace pensar que el banco de pruebas es correcto y que el fallo
debedeestareneltransmisor.Acontinuacinpasamosacomprobarlo.
2. Compruebaquehaycambiodeestadoconlaordendetransmitir
Arazdequeseactivalaordendetransmitirdebesuceder:
Elestado(estado_tx)pasadee_initae_bit_init
Lasealcarga_datoseactivaenelmismociclodereloj
Elpuertodesalidatransmitiendoseponeauno
Lahabilitacindelcontador(en_divfreq)seponeauno
Elbiestabledondeseguardaeldatoatransmitir(dato_tx_rg)secargaconelvalorque
queremosenviar(estosucedeenelcicloderelojsiguiente).
Lasalidadeltransmisor(fpga_tx)seponeacero(quiztardeunoodosciclosdereloj)
indicandoqueseempiezaaenviarelbitdeinicio.

30EnModelsim:ViewZoomZoom In

98 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Elcontadordelosbitsqueseenvan(cont8bits)debemantenerseacero
Lassealesbaud,desplaza,fin_cont8bits debenseguiracero
Y por ltimo, el contador del divisor de frecuencia (cont_baud) debe estar en cero y a
partirdelcambiodeestadodebedeempezaracontarcadaciclodereloj.Hazqueeste
contadorserepresentecomoenterosinsigno(unsigned)paraqueseamsfcildeverla
cuenta.
En caso deque algo no funcione, identifica en el cdigo VHDL dnde est el fallo y
corrgelo.Cuandolotengasbien,pasaalsiguientepunto.Comopuedesver,setrata
deircomprobandoquelasespecificacionessecumplen.
3. Compruebaqueseenvaelbitcerodeldato
Si todo lo del punto anterior era correcto, ahora tienes que comprobar que
transcurridosalrededorde8681ns,eltransmisorcambiadeestadoypasaaenviarel
bitcerodeldato.Comoseempezelenvosobrelos260ns,tendrsqueiraltiempo
8950 ns, para ello pincha en SimulationGoto Time e introduce el tiempo deseado.
Deberaapareceralgosimilaralomostradoenlafigura7.18.


Figura 7.18: Formas de onda para la transicin a los bits de datos

Como puedes ver, la seal baud se pone a uno, el estado cambia a e_bits_dato y el
puertofpga_txempiezaaenviarelbit0deldato,queesununo.
Si no ocurre nada de esto, comprueba la seal cont_baud. Esta seal debe de
incrementarsucuentaencadaciclodereloj.Comoyavimosenelapartado7.4.1,elfin
de cuenta depende de la frecuencia de reloj y de los baudios. Para la XUPV2P y a
115200 baudios, el fin de cuenta ser 867. Para la Nexys2, como la frecuencia es la
mitad, la cuenta tambin ser de la mitad: 433. Esto lo calculaste en la constante
c_fin_cont_baud(cdigo7.2).

Entoncescompruebaque:
Lasealcont_baudrealizalacuentacorrectamenteyseponeacerodespusdesufinde
cuenta
Despusdelfindecuentadecont_baudsedebeactivarlasealbaud.

Departamento de Tecnologa Electrnica 99


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Compruebaquehaycambiodeestadodesdee_bit_initae_bits_dato.
Engeneralcompruebaquesecumplenlastransicionesdelatabla7.4.
4. Compruebaqueseenvanelrestodelosbitsdeldato
De manera similar al punto anterior, tienes que comprobar que se van enviando el
restodebitscorrectamente.Tendrsquecomprobarque:
Lasealcont_baudrealizalacuentacorrectamenteyseponeacerodespusdesufinde
cuenta
Lasealdesplazaseactivaconlasealbaud.
Elregistrodedesplazamientodato_tx_rgdesplazasusbitsaladerecha.
Lacuentadelosbitsenviadoscont8bitsvacreciendoconcadanuevoenvodebits
5. Compruebalatransicindelltimobitdedatosalbitdefin
Esta transicin suele dar problemas porque la sincronizacin de la cuenta con el
cambio de estado hay que hacerla con cierto cuidado. En la figura 7.19 se muestra
cmopuedeserlatransicin.Cuandoseactivalaseal baudylacuenta cont8bitsva
por 7 ocurre la transicin al nuevo estado porque la seal fin_cont8bits se activa.
Fjatequeenlafigura7.19laseal baudy fin_cont8bitsseactivansimultneamente.
Notieneporquseras,perodependedecmoesthechoelrestodelcircuito,podra
daralgnproblema.


Figura 7.19: Formas de onda para la transicin al bit de fin

Arazdelaactivacindelaseal fin_cont8bitselestadodeberapasara e_bit_fin.


Conloqueelpuertofpga_txsedebedeponerauno(porserelbitdefin).
6. Compruebalatransicindelbitdefinalestadodereposo:
Si todo lo anterior te funciona porque has tenido que corregirlo, esta ltima parte
deberasertefcil.Tendrsquecomprobarqueseactivalaseal bauddespusdelfin
de cuenta. Y la activacin de esta seal nos debera de llevar al estado de reposo
e_init. Debido a esto, la salida fpga_tx debe de seguir a uno (reposo) y comprueba
quelassealesestncomolasdelatabla7.4.

100 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

7. Compruebalostiempos:
Sihasllegadohastaaqu,significaquelasformasdeondatienenunaspectosimilara
lasdelafigura7.16ysobretodo,eldatoquesetransmiteporelcableRS232esigual
al de la figura 7.17. Sin embargo, puede ser los tiempos no sean exactos, aunque
seguramente s lo sean, pues has hecho comprobaciones que en cierta medida
compruebantiempos.
Ahora, para comprobar los tiempos, vuelve a mostrar la simulacin completa
(ViewZoomTo Full View31).Ponelcursoren40s,quemsomenosdebeestarenel
envodeltercerbit.Paraponerelcursorenuntiempo,obienloarrastrasconelratn
obienpinchasenSimulationGoto Time... eintroduceseltiempo32.
Ahora queremos llevar el cursor al momento que ocurre la transicin de la seal
fpga_txdesdeelbit2hastaelbit3.Paraello,seleccionalaseal fpga_txypinchaen
SimulationGoto Previous Transition, y el cursor ir al tiempo (35 s). En Modelsim

tienes que buscar el icono para ir al transicin previa (tambin existe un icono
similarenelISESimulator).
Asquepodemosllevarloscursoresdetransicinentransicinyverenqutiempos
ocurren.
Se pueden insertar varios cursores, en el ISE: SimulationMarkersSingle Marker. En
Modelsim se insertan: InsertCursor. El Modelsim indica en la parte inferior la
diferenciadetiemposentredoscursores.Asquesillevaslosdoscursoresjustoenlas
transiciones de dos bits consecutivos, puedes ver si la diferencia de tiempo se
correspondeconlaespecificada.Ennuestrocasomuestra8680ns(muycercanoalos
8681nsquehabamoscalculado).
Para calcular diferencias de tiempos en el simulador del ISE pinchamos en
SimulationMarkersMeasure Marker y pinchamos en donde queramos situarlo.
Aparecern dos cursores, con una diferencia de tiempos encima de ellos.
Seleccionamosunodeellosylollevamosalatransicindelbit2al3(noteolvidesde
seleccionarprimerolasealyluegopincharenSimulationGoto Next Transition).Hazlo
mismoconelotroextremodelcursor,llevndoloalatransicindelbit3al4.ElISE
Simulator nos indica que la diferencia de tiempos es de 8,7 s. Si hacemos zoom de
modoquesalgaeltiempoennanosegundos,tendremoslamedidaexacta.Sihaciendo
zoom perdemos el cursor, pinchamos en MarkersGoto Previous Marker hasta
encontrarlo.
Por ltimo, comprueba que desde el bit de inicio hasta el bit de fin transcurren
86800ns.Tambinpuedescomprobarlomidiendoeltiempoenquetransmitiendoest
auno.
Sitodaslascomprobacionesquehemoshechosoncorrectas,esprobablequeeldiseo
lotengasbien.Sinembargo,annolohemoscomprobadodemanerasuficiente.Por
tanto en los siguientes apartados realizaremos unos bancos de pruebas ms
exhaustivos.Esimportantequeaprendasadetectarportimismoloserrores,paraque
puedasserindependienteenlasprcticassiguientes.

31 EnModelsimViewZoomZoom Full
32 EnModelsimViewGoto Time...cuandointroduces40s,lointroducesennanosegundos(40000)

Departamento de Tecnologa Electrnica 101


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

7.5.3. Proceso que modela las rdenes de enviar varios datos


En el banco de pruebas anterior comprobamos el envo de una trama, sin embargo,
muchasvecesloserroresseproducenalenviarunasegundatrama,yaque,porejemplo,
puedepasarquenosehayaninicializadobienelcontadordelosbitsdeenvo.
Por otro lado, en los bancos de pruebas tambin hay que considerar el funcionamiento
errneo. Por ejemplo, qu pasara si antes de haber terminado el envo, se ordena un
envonuevo.Enprincipiohemosespecificadoquecuandoseestenviando,eltransmisor
novaaatenderningunapeticindeenvo.Porlotanto,tenemosquecomprobarestetipo
decosas.
As que vamos a crear un nuevo banco de pruebas que enve cuatro datos y adems
realicerdenesdeenvoantesdequeeltransmisorhayaterminadodeenviardato.
Para conservar el banco de pruebas anterior, realiza una copia del fichero del banco de
pruebasyllmalatb_uart_tx_2.vhd.Edtalaycambiadenombrealaentidad,llamndola
tb_uart_tx_2, cambia tambin el nombre de la entidad que aparece en la arquitectura.
Deberaquedarcomoindicaelcdigo7.17
...
Entity tb_uart_tx_2 is
End tb_uart_tx_2;

Architecture tb ot tb_uart_tx_2 IS
COMPONENT uart_tx
...
Cdigo 7.17: Nombre de la nueva entidad para el banco de pruebas

Ahora desde el ISE, selecciona Behavioral Simulation (figura 5.2). Pincha en Add Existing
Sourceyaadeelnuevoficheroqueacabamosde crear.Deesteficheromantenemostodo
casiigualmenoselprocesodelosestmulos(P_estimulos).
Vamos a crear una constante en la que guardaremos los cuatro datos que queremos
enviar.Estaconstantelacrearemosenlamismaarquitecturadelbancodepruebas.Como
la constante es un vector de vectores de 8 bits, tenemos que crear un tipo de datos que
serunvectorde std_logic_vectorde8bits.Enelcdigo7.18semuestraladeclaracin
quetienesqueincluir.
type vector_slv is array (natural range <>) of std_logic_vector(7 downto 0);
constant datos_test : vector_slv := ("10001101","01010101","11001010","00101101");

Cdigo 7.18: Declaracin de un tipo de datos que es un vector de std_logic_vector (slv) y la constante
con los datos a probar

En la declaracin del tipo, el rango <> indica que est abierto y se especificar en la
declaracin de la seal o constante. En la declaracin de la constante, el rango viene
especificadoporelnmerodedatosincluidosenlainicializacin(4).Enestecaso,porser
un rango de tipo natural es ascendente, empezando en el ndice cero (10001101) y
terminandoen3(00101101).
Hastaelprimerenvoloharemosigualquecomolotenamosenelproceso P_estimulos
(apartado7.5.1),peroenvezdeasignara dato_tx_indirectamenteunvalorconstante,le
asignaremos el contenido del ndice cero de la constante datos_test. Para ello, la
asignacinladebeshacercomosemuestraenelcdigo7.19.
dato_tx_in <= datos_test(0); -- asignamos el dato del indice cero
Cdigo 7.19: Asignacin del valor del ndice cero de la constante

102 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Ahoravamosaquitarlaltimasentenciadelproceso(wait;)yvamosahacerlosiguiente:
1. Esperamoshastaqueterminelatransmisindelenvoanterior.Estolopodemosdetectar
cuandoveamosquelaseal transmitiendoseponeacero(sinoteacuerdas,enlafigura
7.13seexplicabacmohaceresto).
2. Unavezquehayamosdetectadoquesehaterminadolatransmisin,vamosaempezarel
segundoenvo,yterecomendamosquepongasuncomentarioqueindiqueelcomienzo
delsegundoenvo.Comoyasabes,loscomentariossonmuyimportantes,nosloparati,
sinoparaaquellosquetrabajancontigooterevisaneltrabajoyintentanaveriguarqueslo
quehasqueridohacer.
3. Ahoracomienzasarealizarelsegundoenvo,yasabescmosehace:
Ponemostransmiteauno
Asignamos a dato_tx_in el dato que hay en el ndice 1 de la constante datos_test
(recuerdaqueempiezaencero,poresoeselndice1ynoel2)
Esperamosalsiguienteflancodesubidadereloj(recuerdaelcdigo7.16)
4. Despusdeordenarelsegundoenvo,podramosponerlasealtransmiteacero.Perono
lovamosahacerparaprobarquocurresilasealtransmiteduramsdeunciclodereloj.
Esto sera normal si, por ejemplo, la seal transmite estuviese asociada a un pulsador.
Entoncesloqueharemosser:
Ponemos (dejamos) transmite a uno. En realidad no hara falta, porque guardara su
valor,perolodejamosparadarnoscuentadeloqueestamoshaciendo.
Ponemostodoslosbits dato_tx_inacero.Estolohacemosparadetectarsihayfallo,al
cambiareldato,sienelsegundoenvotodoslosbitssoncero,implicaquenohacargado
bieneldato.
Esperamos200ns.
Ahoras,ponemostransmiteacero.
Dejamostodoslosbitsdedato_tx_inacero.
Y esperamos a que termine la transmisin, es decir detectamos cuando transmitiendo
seaigualacero.
5. Todava no hemos empezado el tercer envo y vamos a cambiar algo las entradas
esperandoquenoocurranada.Enlasimulacinhabraquecomprobarquenoocurrenada
porestecambio
Mantenemostransmiteacero
Asignamosadato_tx_ineldatodelanteriorenvoconlosbitsnegados:
dato_tx_in <= not datos_test(1);
Cdigo 7.20: Negamos los bits del segundo envo

Y ahora esperamos un ciclo de reloj, ya que para que las seales actualicen su valor
tenemosqueponerunwait.
6. Empezamoseltercerenvo:
Ponemosuncomentarioqueloindique
Ponemostransmiteauno
Asignamosadato_tx_ineldatoquehayenelndice2delaconstantedatos_test
Esperamosunciclodereloj(esperamosalsiguienteflancodesubida)

Departamento de Tecnologa Electrnica 103


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

7. Despusdeordenareltercerenvo,ponemosotrodatoendato_tx_inparacomprobarque
noloenva:
Ponemostransmiteacero
Asignamos a dato_tx_in el dato negado que hay en el ndice 2 de la constante
datos_test
Esperamos300ns
Ponemostransmiteauno(estonodeberacambiarnada)
Esperamos100ns
Ponemostransmiteacero
Ponemostododato_tx_inacero
Esperamos200ns
Yesperamosaqueterminelatransmisin(detectamoscuandotransmite='0').
8. Esperamos la mitad del tiempo en que se enva un bit. Es decir, estamos probando qu
pasasimantenemoslaUARTinactiva.Estetiempolovamosaponerenunaconstanteen
elpaqueteUART_PKG,igualquelohicimosconc_period_ns_clk(cdigo7.14).
constant c_period_ns_baud : natural := 10**9/c_baud;
Cdigo 7.21: Tiempo que transcurre en enviar un bit

As pues esperamos la mitad del tiempo de un bit, similar a lo que hicimos con la
sentenciadelreloj(cdigo7.15)peroconlaconstantec_period_ns_baud.
9. Realizamoselcuartoenvo(elltimo).Comolaltimaesperahasidodetiempos,ynode
evento,esperamosuncicloderelojparaasegurarnosquelosvaloresqueponemosvana
duraruncicloderelojcompleto.Paraentenderlo,fjateenlafigura7.20:hemosesperado
48ns, que coincide con 2 ns antes del flanco de subida del reloj. Si en ese momento
ponemoslasealsauno,yesperamosunciclodereloj,lasealssloestaractivadurante
2ns,envezdeestaractivaduranteunciclocompletodereloj.Especialmentegraveesel
casodequeesperemosportiempoycoincidajustaenelflancodelreloj:estamosanteso
despusdelasubida?
Partimos
de aqu
s <= '0';
wait for 48 ns; clk
s <= '1';
wait until clk'event and clk='1';
s <= '0'; wait for 48 ns;
wait until clk'event and clk='1'

La seal S se activa mucho


menos de un ciclo de reloj
Figura 7.20: Esperar por tiempos y luego por eventos puede producir seales de ancho muy inferior al ciclo
de reloj

Para evitar este tipo de situaciones, cuando queramos activar una seal durante un
ciclo de ciclos de reloj, ser conveniente hacer una espera por eventos de una seal
sincronizada con el reloj (no tiene que ser el reloj, puede ser la seal transmitiendo
como hemos hecho anteriormente). La figura 7.21 explica de manera grfica la
solucin.

104 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Partimos
de aqu
s <= '0';
wait for 48 ns; clk
wait until clk'event and clk='1';
s <= '1';
wait until clk'event and clk='1'; wait for 48 ns;
s <= '0';
wait until clk'event and clk='1'
wait until clk'event and clk='1'

La seal S se activa durante


un ciclo de reloj completo
Figura 7.21: Solucin a la espera por tiempos seguida de espera por eventos (figura 7.20)

Asquepararealizarelcuartoenvoharemos:
Insertamosuncomentarioindicandoqueempezamoselcuartoenvo.
Esperamosalsiguienteflancodesubidadelrelojparasincronizar(figura7.21).
Ponemostransmiteauno
Asignamosadato_tx_ineldatoquehayenelndice3delaconstantedatos_test
Esperamosalsiguienteflancodesubidadelreloj
10. Terminamoslatransmisin.Antesdeesto,declararemosunasealllamada fin_enviode
tipostd_logic,ylainicializaremosacero.Estasealnosservirparasabercuandohemos
terminadodeordenarelltimoenvo.Msadelanteencontraremossuutilidad
Insertamosuncomentario
Ponemostransmiteacero
Ponemostododato_tx_inacero
Ponemoslasealfin_envioauno.
Esperamosindefinidamente:wait;
Conestoyatendramostodoelbancodepruebas.Ahoraquedasimularlosiguiendolos
pasosdelapartado7.5.2.Comosoncuatroenvosyvimosqueunenvoseranunos88s,
simularemos352s,ounpocoms.
Unaveztengaslasformasdeonda,tendrsqueobservarsiseaprecianloscuatroenvos,
si la mquina de estados cambia a los estados adecuados, los contadores cuentan
correctamente...33 En fin tendrs que realizar los pasos del apartado anterior pero
considerando los cuatro envos. Y antes de nada, observar si los estmulos del banco de
pruebascumplenlasespecificaciones.Esunatareadebastantepaciencia,peronoestan
complicada.

7.5.4. Autocomprobacin en el banco de pruebas


Hemos visto que comprobar un banco de pruebas no es que sea excesivamente
complicado (aunque lo pueda llegar a ser) sino que sobre todo es tedioso. Hay que ir
transicinatransicincomprobandoquetodoestcomosuponemosquedebeestaryala
vez,comprobandoquesecumplenlostiemposespecificados.Estoademsseagravapor

33 TenencuentaqueenelsimuladordelISE,cuandoestsviendotodalasimulacin(nohasampliadoconel
zoom)avecesnosemuestrantransicionesdesealesqueduranpocotiempo(unciclodereloj).Enel
Modelsimsisemuestranestastransicionesconunalnea.

Departamento de Tecnologa Electrnica 105


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

el hecho de que cada vez que hagamos un cambio en nuestro diseo tendramos que
volver a realizar toda la comprobacin. Por esto es muy interesante la idea de crear un
bancodepruebasquelmismoseautocompruebe,avisndonosdecundohayaunerror
yporconsiguienteevitndonostenerquerevisarcadadetalledelbancodepruebas.
Evidentemente,hacerunbancoqueseautocompruebeesmscomplicadoyrequierems
tiempo.Peroeltiempoinvertidoenhacerloseverecompensadoporunadeteccinmucho
msrpidadeloserrores.
Para crear un banco de pruebas que se autocompruebe lo que tenemos que hacer es
codificarenelbancodepruebaslascomprobacionesqueharasapartirdelasformasde
ondadelasimulacin(similaraloquehicimosenelapartado7.5.2.).
En nuestro caso, para comprobar que el envo del transmisor de la UART es correcto,
podramosponerunmodelodeunreceptordelaUARTdemodoqueverifiquemosque
lo que ha recibido el modelo del receptor se corresponde con lo que ha enviado el
transmisor.
Como estamos haciendo un banco de pruebas, el modelo del receptor no tiene que ser
sintetizable y puede estar basado en tiempos y eventos, segn las especificaciones del
envoRS232(figura7.3).Dehecho,nisiquieratienequeestarreferenciadoalasealde
reloj.Porlotantoesunmodelobastantemssencillodehacer.
Conestoestamosviendoqueunmismocircuitosepuededescribirendistintosnivelesde
abstraccin.Porejemplo,eltransmisorquehemoshechoestdescritoenloquesellama
niveldetransferenciaderegistros(RTL34).Enestenivel,elfuncionamientodelcircuitose
describe en trminos del flujo de las seales (o transferencia) entre los biestables (o
registros).EnRTL,lastransicionesestndefinidasporlafrecuenciadelreloj. Hayniveles
deabstraccinmsbajosqueelRTLcomopodraserladescripcindelcircuitoenelnivel
depuertaslgicas,einclusomsbajo,comoloseraelniveldetransistores(describiendo
cada puerta en su transistor correspondiente). Sintetizar es el proceso de pasar de un
nivel de abstraccin ms alto a otro inferior, y esto es lo que hace el ISE de manera
automticacuandoqueremospasarnuestrodiseoalaFPGA.
Tambin hay niveles ms altos que el RTL, como el nivel de algoritmo, en el que se
describeelfuncionamientocomosiseprogramaseenunlenguajedeprogramacin.Este
seraelnivelenelquevamosadescribirelreceptordelaUARTparaelbancodepruebas.
VeremosqueenestenivelladescripcinesmuchomssencillaqueenRTL.
Ahoravamosaempezararealizarelmodelodelreceptorqueincluiremosenelbancode
pruebas.Paraello,demanerasimilaralapartado7.5.3,hacemosunacopiadelbancode
pruebas anterior, y al nuevo le llamamos tb_uart_tx_3.vhd. Editamos el fichero y
cambiamosdenombrealaentidad,llamndola tb_uart_tx_3 (recuerdacdigo7.17).Por
ltimo,aadimoselficheroalproyectodelISE.
Acontinuacin,enelbancodepruebasincluimosunnuevoprocesoquevaasernuestro
modelo del receptor de alto nivel. Al proceso lo llamaremos P_Receptor. El esquema de
nuestro nuevo banco de pruebas se muestra en la figura 7.22. En este esquema, los
bloques con lnea discontinua representan los procesos del banco de pruebas. Puedes
observarqueelmodelodelreceptornogeneraestmuloscomoelrestodeprocesos(reset,

34RTL:delinglsRegisterTransferLevel

106 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

reloj y entradas), sino que su funcin es leer la seal enviada por el transmisor para
comprobarqueescorrecta.

Proceso que
P_Estmulos
UUT:UART_TX
modela las 8
entradas al dato_tx_in
circuito transmite P_Receptor
transmitiendo
P_Clk fpga_tx
Proceso que clk
modela el reloj
rst

P_Reset Proceso que modela el


Proceso que receptor y verifica
Componente que se que la seal se recibe
modela el reset
quiere comprobar: correctamente
Transmisor descrito
en nivel RTL
Figura 7.22: Esquema del banco de pruebas del transmisor que incluye un proceso que modela el receptor
descrito a alto nivel y verifica que el envo es correcto

Yaquevamosamodelarelreceptor,tenemosquetenermuypresentecmoeslatramade
envo(recuerdalafigura7.3).
Lospasosparacomprobarelenvoson:
1. Esperamoshastaqueeltransmisorenveelbitdeinicio.Recuerdaqueelbitdeiniciose
indicaponiendolalneadetransmisin(fpga_tx)acero.Yasabescmosehaceesto:
wait until fpga_tx'event and fpga_tx='0';
Cdigo 7.22: Espera al flanco de bajada de la seal fpga_tx

2. Nos situamos en el tiempo medio del bit de inicio: Una vez que hemos detectado el
comienzo de la transicin, esperamos la mitad del periodo de envo de cada bit
(c_period_ns_baud/2)parasituarnosjustoenmedio.Estoesimportante,porquesileemos
elbitjustoenlatransicinaotrobit,puedepasarqueestemosleyendoelbitcontiguo.La
figura7.23muestrademaneraesquemticadndenossitaestaespera.
c_period_ns_baud c_period_ns_baud c_period_ns_baud

reposo bit de inicio bit 0 del dato bit 1 del dato bit 2 del dato ...

wait until fpga_tx


fpga_tx'event
'event Lectura
Lectura
and fpga_tx = '0';

fpga_tx

esperamos la mitad del


para leer nos situamos en el medio del bit
periodo para situarnos
en medio del bit
c_period_ns_baud wait for c_period_ns_baud/2 * 1 ns
2
Figura 7.23: Espera para situarnos en medio del bit de inicio

3. Leemoselvalordelbitdeinicio:Estandoenmediodelbitdeinicio,procedemosaleersu
valor.Aunqueparaelbitdeinicionoesnecesarioleersuvalor,porqueyalosabemos('0'),
lalecturalahacemosparacomprobarsiefectivamenteelbitdeinicioescero.Encasode
quenoseacero,enVHDLexistelasentencia assert quenospermiteavisardeerrorese

Departamento de Tecnologa Electrnica 107


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

inclusodetenerlasimulacin.Lasentenciadelecturayverificacindeunvalorsemuestra
enelcdigo7.23.
assert fpga_tx = '0' -- Si no se cumple da el aviso
report "Fallo en el bit de inicio"
severity ERROR; -- niveles de severidad: NOTE,WARNING,ERROR,FAILURE

Cdigo 7.23: Ejemplo de una sentencia assert

Delcdigo7.23podemosobservarquelasentenciaasserttienetrespartes:
Lacondicinquesequiereverificar(fpga_tx = '0')
Sinoseverificalacondicinanterior,semuestraelsiguienteaviso.Queenelejemploes:
falloenelbitdeinicio.
Porltimo,lagravedaddelerror.Haycuatronivelesdeerror,quedemenoramayor
son: NOTE, WARNING, ERROR, FAILURE. Dependiendo del nivel de error, se puede ordenar
detenerlasimulacinosimplementeavisar35.
Importante: date cuenta que estas tres partes forman el assert, y que es una nica
sentencia. Por tanto hay un nico punto y coma al final (en medio no hay puntos y
comas aunque se pueda separar en varias lneas). Si pusieses un punto y coma
despusdelassertimplicaraquesondossentencias,unadeellasunassertsinaviso
(sin report),ylaotraslotendra report,porloquesiempreavisara,ypensarasque
teestavisandodeunerror.
Otracosaquepuedes observaresqueestamosleyendosolamenteenelpuntomedio,
como muestra la figura 7.23. Siendo estrictos deberamos de comprobar que la
transmisinsemantieneacerodurantetodoeltiempocorrespondientealbitdeinicio,
y no solo en el punto medio. Sin embargo, para simplificar el banco de pruebas,
asumiremosqueessuficienteconcomprobarelpuntomedio.
4. Esperamos hasta el punto medio del bit cero del dato. Es decir, esperamos el tiempo
correspondiente a un bit (c_period_ns_baud). En la figura 7.24 se muestra la espera que
estamoshaciendo.
c_period_ns_baud c_period_ns_baud c_period_ns_baud

reposo bit de inicio bit 0 del dato bit 1 del dato bit 2 del dato ...

wait until fpga_tx'event Lectura Lectura


and fpga_tx = '0';

fpga_tx
esperamos la mitad del
periodo para situarnos c_period_ns_baud
en medio del bit
c_period_ns_baud
para leer nos situamos en el medio del bit
2
wait for c_period_ns_baud/2 * 1 ns wait for c_period_ns_baud * 1 ns;

Figura 7.24: Espera para situarnos en medio del bit 0 del dato

35EnelModelsim,elniveldondesedetienelasimulacinseindicaenSimulateRuntime Options...Enla
ventanaqueaparece,hayqueseleccionarlapestaaAssertionsyenelapartadoBreakonAssertionsse
seleccionaelniveldeseado

108 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

5. Leemoselvalordelbitcerodeldato.Tenemosquecompararelvalorledoconelvalorque
envi el transmisor. Los datos enviados por el transmisor los tenemos en la constante
datos_test(recuerdaelcdigo7.18).Ahoraestamosenelprimerenvo(0)yenelbitcero.
Por lo tanto la comparacin ser con datos_test(0)(0). Y el aviso (report) tendra que
hacerreferenciaalbitcerodelprimerenvo.Lasentenciadelecturayverificacindeun
valorsemuestraenelcdigo7.24.
assert fpga_tx = datos_test(0)(0) -- Si no se cumple da el aviso
report "Fallo en el bit cero del dato del primer envio"
severity ERROR; -- niveles de severidad: NOTE,WARNING,ERROR,FAILURE

Cdigo 7.24: Sentencia assert para el bit 0 del primer envo

6. Ahoratendramosquerepetirlaesperayrepetirlalecturaconelassertparalosrestantes7
bitsdeldato.Paraevitarcopiarypegarsieteveces,podemoshacerunbucle forcomoel
delcdigo7.25.Siincluyeselbucletalcomoestenelcdigo7.25,tendrasqueborrarlo
quehicisteparaelbitcero(puntos4y5),puesestincluidoenestebucle.
for i in 0 to 7 loop
wait for c_period_ns_baud * 1 ns; -- punto medio bit i del dato
assert fpga_tx = datos_test(0)(i) -- leo y comparo el valor del dato
report "Fallo en el bit del dato del primer envio (0)"
severity ERROR;
end loop;

Cdigo 7.25: Bucle for para comprobar todos los bits del dato

EnVHDLelndice(i)delosbuclesfornohayquedeclararlocomosealovariable.
Observa que con el bucle hemos perdido parte de la informacin del report pues
ahoranoindicaenqubitsehacometidoelfallo.Comoenelreportslopuedehaber
texto(string),nopodemosincluirelndicedirectamente36.
7. Unavezquehemosledoelltimobitdeldato(bit7),tenemosquehacerunaesperams
paraelbitdefin.
8. Seguidamenteleemoselbitdefin,comprobamossisuvalores1ynotificandosihayerror.
9. Opcionalmentepodemosesperarmedioperiodoparaterminarelbitdefin,perorealmente
noesnecesario,pueselbitdefintieneelmismovalorquelalneaenreposo.
10. Paraterminarelprocesoyquenovuelvaaejecutarsemsdesdeelprincipio,terminacon
unasentenciawait;.
Ahorasimulaelcircuitoduranteunos355s,comohicisteenelapartado7.5.3yobserva
sihayalgnavisodelos assert.Estosavisossemuestranenlaventanainferior(mirala
figura7.25).EnModelsim,pinchandoenelavisoelcursorsecolocaenelinstanteenque
sehaproducido.ElISEnotienenestacaracterstica,asquetendrsquemirarelinstante
detiempoenelqueseprodujoyiraesetiempo(SimulationGoto Time...).Puedeserqueel
avisosehayaproducidoporunfalloenelbancodepruebasqueacabasdehacerynopor
el propio transmisor que estas probando. Si no encuentras el fallo, revisa que no tengas
ningnpuntoycomaenmediodelasentencia,especialmenteentreelassertyelreport.

36 Estosepuedesolucionarcreandounafuncin(a_texto)querecibaunnatural(elndicei)ydevuelvael
stringcorrespondientealnmerodelndice.Enelreportpodemosconcatenar(&),porejemplo:
report "Fallo en el bit " & a_texto(i) & " del primer envio"
Sedejacomoejercicioopcionalincluirestafuncin

Departamento de Tecnologa Electrnica 109


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Aviso de los Assert


Figura 7.25: Avisos de los assert en Modelsim

Quiz te hayas dado cuenta que con lo que hemos hecho hasta aqu slo estamos
comprobando el primer envo, lo que sera el banco de pruebas del apartado 7.5.1, pero
qupasaconlossiguientesenvos?cmoloscomprobamos?
Podramos pensar en incluir otro bucle for en el proceso que hemos hecho para
considerar cada envo. Sin embargo, sabemos que los procesos se ejecutan
permanentemente a no ser que terminen en un wait;. Por tanto, quitando el ltimo
wait; el proceso volvera al principio despus del primer envo y realizara las mismas
comprobaciones que acabamos de hacer. As que no hace falta incluir el bucle for, sino
quitarelltimowait;yadaptarelprocesoparaquehagalascomprobacionesadaptadasa
cadaunodelosenvos.
Demaneraesquemtica,loquetendrsquehaceres:
1. Quitarelltimowait;paraqueelprocesonosedetengadespusdelprimerenvo.
2. Cambiar la comprobacin de los datos enviados. Modificando el assert del cdigo 7.25
para que compruebe el dato segn el nmero de envo en el que estamos. Esta
modificacinsemuestraenelcdigo7.26
assert fpga_tx = datos_test(numenvio)(i)
report "Fallo en el bit del dato"
severity ERROR;
Cdigo 7.26: Modificacin del cdigo 7.25 para que compare los bits segn el nmero de envo

Fjate que el report ya no distingue ni nmero de envo ni bit. Puedes ampliar lo


indicadoenlanotaalpienmero36(pgina109)paraqueincluyaestainformacin.
Observa tambin que en el cdigo 7.26 se ha creado una variable o seal nueva:
numenvio. Esta variable va a indicar el nmero de envo en el que estamos. As que
tendremosquedeclararla(enelpuntosiguiente).
3. Declarardelavariablenumenvio.Enlosprocesossepuedendeclararvariablesysedeclaran
antesdelbegin.Ensimulacinsepuedeninicializarlasvariables(ensntesisnosetieneen
cuenta la inicializacin), por tanto, como estamos haciendo un proceso utilizado
simulacin,nohayproblema.Enelcdigo7.27semuestraladeclaracineinicializacinde
lavariablenumenvio.

110 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

P_Receptor: Process
variable numenvio : natural := 0;
begin
....

Cdigo 7.27: Declaracin de la variable numenvio dentro del proceso P_Receptor

4. Incrementar el valor de numenvio al terminar cada recepcin. Esto lo hars al final del
proceso.Recuerdaquelasvariablesseasignanmedianteeloperador:=y querecibenel
valorinmediatamente.Adiferenciadelassealesquerecibenelvalorconlasentenciawait
o al terminar el proceso. En el cdigo 7.28 se muestra la asignacin de incremento de la
variablenumenvio,queserlaltimasentenciadelproceso.
...
numenvio := numenvio + 1;
end process
Cdigo 7.28: Incremento de la variable numenvio

Con esto ya comprobaramos los cuatro envos. Ahora vuelve a simular el circuito
observando si hay nuevos avisos provenientes de los asserts. En teora, si has hecho
todos los bancos de pruebas propuestos y has verificado que funcionan bien, podemos
pasaraimplementarlaenlaFPGA.
Antesdelaimplementacin,elapartadosiguientetemuestraunamaneramssofisticada
de hacer bancos de pruebas de modo que terminen por s mismos y no tengas que
calcular el tiempo de simulacin. Este apartado es opcional, y puedes saltrtelo o
mirrtelomsadelantesiestscansadodelosbancosdepruebas.

7.5.5. Bancos de pruebas que terminan por s mismos


Comomuestraelsmbolo,esteapartadoesopcionalymuestracmohacerqueelbanco
de pruebastermineporssolo,ahorrndonostenerquecalculareltiempodesimulacin
queleindicamosalsimulador.
Elahorrarnoscalcularel tiempodesimulacin puedepareceunahorroinsignificante,sin
embargo, es muy til para alguien que no ha hecho el banco de pruebas y no tiene la
informacinquenosotrostenemos.Msan,esteclculolohemoshechoapartirdeuna
frecuenciadetransmisindelaUART(baudios),quepuedevariaryaquedependedeuna
constante (c_baud). Por lo tanto, el tiempo de simulacin es variable, y recalcularlo nos
podraimplicartenerqueleernosladocumentacinoinclusopeor,tenerquedescifrarel
cdigodelbancodepruebas,especialmentesihemosdiseadoelbancodepruebashace
tiempo. Como consecuencia, todo esto implica dedicar tiempo que nos lo podemos
ahorrarhaciendounbancodepruebasquetermineporsmismo.
Para detener la simulacin y por tanto, hacer un banco de pruebas que termine solo,
tenemosquedetenerparasiempretodoslosprocesosquegeneranestmulos,estoes,los
procesosdelbancodepruebas.
Vamos a verlo con un ejemplo. Copiamos el fichero del ltimo banco de pruebas que
hemos hecho (el fichero tb_uart_tx_3.vhd del apartado 7.5.4) y lo llamamos
tb_uart_tx_4.vhd. Cambiamos tambin el nombre de la entidad y arquitectura y lo
aadimosalproyectodelISE.
Observamos el banco de pruebas y vemos que de los cuatro procesos, hay dos que
terminan con la sentencia wait;, que son el proceso de los estmulos y el proceso del

Departamento de Tecnologa Electrnica 111


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

reset. Por tanto, estos dos procesos terminan por s mismos, y no tenemos que
modificarlos.
Delosotrosdosprocesos,tenemoselprocesodelrelojqueesindefinidoysiempreestar
generando la seal de reloj, y el proceso del receptor, que siempre est a la espera de
recibirunanuevatransmisin.
Tenemosquecambiarestosdosprocesosdemodoquetambinterminenconlasentencia
wait;cuandosehayacompletadolatransmisinyrecepcin.
En el proceso que genera los estmulos habamos asignado a uno de la seal fin_envio
(recuerda el punto 10 de la pgina 105) justo antes de terminar (antes de la sentencia
wait;).Hastaahoraestasealnolahemosutilizado,ynosservirparaavisarnossobre
cundosedaltimaordendetransmisin.
Sinembargo,nodebemosdedetenerlasimulacincuandolaseal fin_envioseponea
uno, pues esta seal indica cundo se ha dado la ltima orden de envo. Habr que
esperar a que el transmisor enve cada uno de los bits con el protocolo RS232 y que el
receptorlosreciba.
Ahoratendremosquemodificarelmodelodelreceptordemodoqueunavezquelaseal
fin_envio valga uno, y se haya completado la recepcin, ponga una nueva seal a uno
indicando que se debe terminar la simulacin. Esta nueva seal la llamaremos
fin_simulacion,yladeclararemosconvalorinicial'0'.

Con esta modificacin, el proceso del modelo del receptor terminar como muestra el
cdigo7.29.
...
if fin_envio = '1' then
fin_simulacion <= '1';
-- esperamos un poco para no detener simulacion de repente
wait for c_period_ns_baud * 1 ns;
wait; -- detenemos este proceso despues derecibir el ultimo envio
end if;
end process;
Cdigo 7.29: Modificacin del proceso del receptor del banco de pruebas para que se detenga en la ltima
recepcin y genere la seal de aviso del fin de la simulacin

Observaqueenelcdigo7.29,conelltimowait;detieneelprocesoencasodequese
estrecibiendoelltimoenvo.Observatambinque antesdelltimo waitsehaincluido
unaesperadeunperiododelaUARTparaquelasimulacinnoterminerepentinamente
justodespusdelarecepcindelbitdefin.Dejandoastiempoparaqueelreceptorpase
alestadodereposo.
Ahora slo nos queda detener el proceso del reloj y lo detendremos con la seal
fin_simulacion.Modificamoselprocesodelcdigo7.15paraqueterminecomomuestra
elcdigo7.30
...
if fin_simulacion = '1' then
wait; -- detenemos el proceso cuando se haya recibido el ultimo
end if;
end process;
Cdigo 7.30: Modificacin del proceso del reloj para detener la simulacin

Conestoyanotenemosquepreocuparnospordefiniruntiempodesimulacin.EnelISE
pincharemos en SimulationRun All; mientras que en Modelsim pincharemos en
SimulateRunRun -All,oenlosiconoscorrespondientes.Conestaordenydebidoaque

112 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

los procesos terminan con wait; la simulacin se detiene sola y no tendremos que
preocuparnos de cunto tiempo debemos simular. No obstante, siempre puede suceder
quetehayasequivocadoalhacerestasmodificaciones,asquealhaceruncambiodebes
de comprobar que todo sigue bien. En este caso debes de comprobar que se hacen los
cuatro envos correctamente y que tanto el transmisor como el receptor terminan en el
estadoinicial.

7.6. Implementacin en la FPGA: diseo estructural


Queelcircuitoseafuncionalmentecorrectonoimplicaqueyanovayamosatenerningn
problemaensuimplementacin.Puedeocurrirquetengamosrestriccionestemporales,de
rea o de consumo que nos obliguen a realizar modificaciones. Adems, a veces ocurre
que los resultados de simulacin no se corresponden con los de sntesis, ya que, entre
otros motivos, por ser el conjunto de sntesis ms reducido que el de simulacin, la
sntesisnosiempretraducefielmenteelmodeloVHDL.
Ya hemos diseado el transmisor, que lo hemos simulado y al menos en tera funciona
bien.SinembargoseraintilimplementarloenlaFPGAsinnadams,pueseltransmisor
necesitaunaordenparatransmitir.Asquetenemosquehaceruncircuitosencilloquenos
d algo que transmitir. Para ello emplearemos los pulsadores, pues ya hemos probado
que funcionan, y haremos que al pulsar se enve un byte por el transmisor a la
computadora.
Esteejemplonosservirparaintroducireldiseoestructural.
Para comenzar la implementacin, volvemos al proyecto en el ISE, all tendremos el
componente transmisor y el banco de pruebas. En la subventana de fuentes (Sources)
seleccionamos las fuentes para sntesis e implementacin (Sources for:
Synthesis/Implementation).
Ahora crearemos un diseo estructural, donde tengamos el transmisor junto con un
interfazconlospulsadores.Elesquemadeldiseosemuestraenlafigura7.26.
TOP_UART_TX

INTERFAZ_PB
UART_TX
Pulsadores

pb_0 pb_0 8
caracter dato_tx_in
pb_1 pb_1
pb_2 pb_2 transmite transmite
pb_3 pb_3 tx_ocupado transmitiendo
RS-232
clk rst
fpga_tx fpga_tx

clk clk

rst rst


Figura 7.26: Esquema estructural del transmisor de la UART que implementaremos en la FPGA

Cadaunodelosbloquesdelafigura7.26representaunaentidadVHDLylocrearemosen
unficherodistinto:
UART_TX:eseltransmisordelaUARTquehemoscreadoysimulado

INTERFAZ_PB: es el interfaz con los pulsadores que cuando se presionen uno de los
pulsadoresgenerarlaordendetransmitirundatoconcretoalaUART

Departamento de Tecnologa Electrnica 113


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

TOP_UART_TX:esunbloqueestructuralquevadefinirlasentradasysalidas,yestablecer
lasconexionesentrelosdosmdulosanteriores.
Acontinuacinsedanguasparadisearestosmdulos

7.6.1. Diseo del interfaz con los pulsadores


Empezamoscreandounanuevafuente(New Source)detipo VHDL Module,cuyospuertos
son los mostrados en la figura 7.26. Todos los puertos sern de tipo std_logic, menos
caracterqueserunstd_logic_vectordeochobits.

LasespecificacionesdelmduloINTERFAZ_PBson:
1. Recibirlasentradasdecuatropulsadores.Yasabemosqueestasentradassontotalmente
asncronasydeduracinvariable.
2. Segnelpulsadorquesepresione,debededarlaordenaltransmisordeenviarundato
determinado. En la tabla 7.5 se muestra la correspondencia de los puertos con los
pulsadoresdelaplaca,eldatoquedebenenviar(enhexadecimal)yelcarcterASCIIconel
quesecorresponde.
Pulsadoresalosqueestconectado Carcter
Puerto Dato
XUPV2P Nexys2 ASCII
pb_0 DOWN BTNO x"61" 'a'
pb_1 RIGHT BTN1 x"6C" 'l'
pb_2 UP BTN2 x"6F" 'o'
pb_3 LEFT BTN3 x"68" 'h'

Tabla 7.5: Puertos de INTERFAZ_PB y su correspondencia con los pulsadores de las tarjetas y el dato que
tienen que enviar al transmisor

3. Laordendetransmisindebededurarunnicocicloderelojydebeenviarseunanica
ordendeenvoporcadapulsacin.
4. Si se presiona el pulsador mientras el transmisor est enviando un dato
(transmitiendo='1'),seignorarlapulsacinynoseenviarningunaordenaltransmisor.
5. Esimprobablequesepresionendospulsadoresenelmismoinstante,enescasopuedes
elegirquenvotendrprioridad.
Conestasespecificacionesintentarealizarelinterfazportimismo.Posteriormente,para
comparar tu solucin o si ves que no te sale, lee las indicaciones que se dan a
continuacin.
Como la orden de envo tiene que durar un nico ciclo de reloj y los pulsadores son
asncronos, haciendo que las seales estn activas durante muchos ciclos de reloj,
tendremos que realizar detectores de flanco37 para cada seal proveniente del pulsador.
Incluso, para la placa Nexys2 se debera de hacer un circuito antirebotes38. Por tanto
internamenteelcircuitopodratenerdosprocesos:
P_detecta_flanco:Procesodetectordeflancosparacadapulsador

P_envia_orden: Procesoquedalaordendeenviarlosdatosdeterminadosporlatabla
7.5
Elesquemainternodelcircuitosemuestraenlafigura7.27.

37Recuerdaelcdigo2.16.Losdetectoresdeflancoseexplicancondetalleenelcaptulo5.3.2dellibrodeED2
38Prctica11delmanualdeED2[17mach]

114 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

x"68"

x"6F"

x"6C"

x"61"
8 8 8 8
Pulsadores P_detecta_flanco
pb_0 pb_0 pulso_0 pulso_0 8
caracter dato_tx_in
pb_1 pb_1 pulso_1 pulso_1
pb_2 pb_2 transmite transmite
pulso_2 pulso_2
pb_3 pb_3 pulso_3 pulso_3
tx_ocupado transmitiendo
clk rst

clk P_envia_orden
rst
Figura 7.27: Esquema interno de interfaz con los pulsadores

Enelproceso P_detecta_flancodebesdetenerencuentaquesegnlaplacaqueuses,los
pulsadores sern activos a nivel alto o bajo. Esto ya lo solucionamos con las constantes
c_ony c_off(recuerdaelcdigo6.5),enelresetdebesdeinicializarlosbiestablesdelos
detectoresdeflancoalnivelinactivo(c_off)porquedelocontrario,seguramentetengas
unaordendeenvoconelreset.Lasealesdelospulsosdetectados(pulso_0, pulso_1,...)
laspuedesponeractivasanivelalto.
El proceso P_envia_orden puede ser combinacional, simplemente tiene que dar la orden
de transmitir (transmite='1') cuando alguno de los pulsos (flancos detectados) estn
activos y la seal tx_ocupado no est activa. En ese caso, se enviar el dato
correspondientealpulsadorpresionado.
Comoesunprocesocombinacional,noteolvidesdeasignarlassealesentodosloscasos
obienponerunaasignacinpordefecto.Conestoevitasqueseformenlatchs(recuerdael
apartado2.5).
Comoltimoapunte,paraasignarunvalorhexadecimal,enVHDLseindicaconunax
delante.Porejemplo:
caracter <= x"68"; -- "01101000", la x indica que es hexadecimal; en ascci: h
Cdigo 7.31: Asignacin de un hexadecimal a un vector de 8 bits

Una vez que realicemos los dos procesos comprobamos la sintaxis en el ISE (Check
Syntax). Fjate que si tienes seleccionado el mdulo INTERFAZ_PB, en la subventana
Processeshaymenosopciones.Mientrasqueseleccionandola UART_TXaparecentodaslas
opcionesdeimplementacin.EstosedebeaquelaUART_TXfiguracomoelmdulodems
altonivel,estoelISEloindicaconunsimbolitoconcuadraditosasuizquierda .Para
ponerunmdulocomoeldemsaltonivelsepinchaconelbotnderechoencimadely
se selecciona Set as Top Module (figura 7.28). De todos modos, ninguno de estos dos
mdulosvaaserelsuperiorenlajerarqua,sinoqueserel TOP_UART_TX,quecrearemos
msadelante.

Departamento de Tecnologa Electrnica 115


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Seleccin del
mdulo de ms
alto nivel


Figura 7.28: Cmo indicar el mdulo de mayor nivel

7.6.2. Banco de pruebas del interfaz con los pulsadores


Aunque el interfaz con los pulsadores es un diseo sencillo, es habitual cometer algn
fallo,porlotantoserecomiendahacerunbancodepruebasparaasegurarqueestbien.
Comparadoconelbancodepruebasdeltransmisor(apartado7.5),estebancodepruebas
esmuchomssencilloynodeberasuponerningunadificultad.
Terecomendamosquelointenteshacerportimismoyluegoveaslasindicacionesquese
danacontinuacin.
El interfaz con los pulsadores tiene cinco entradas adems del reloj y el reset. De estas
entradas, cuatro corresponden a los pulsadores y la otra indica si el transmisor est
ocupado. Un banco de pruebas sencillo para este circuito consistira en modelar el
funcionamiento de los pulsadores. Aunque en vez de hacer que los pulsadores estn
activosdurantemilisegundos,parareducirlostiemposdesimulacin,haremosqueestn
activosduranteunoscientosdenanosegundos(oalomsmicrosegundos).
Alactivarunpulsador,tenemosquecomprobarquelasalida transmiteseactivedurante
unnicocicloderelojyque,enelmismociclodereloj,lasalida caractertengaelvalor
correspondientealpulsador.Sitedascuenta,estamosrepitiendolasespecificacionesdel
apartado anterior. As que lo que hay que hacer es modelar el comportamiento de las
entradasycomprobarquesecumplenlasespecificaciones.
Enunprincipio,parasimplificarelbancodepruebas,puedesdejarlaentrada transmite
permanentemente a cero. Aunque para ser ms rigurosos, podras implementar un
pequeo proceso que modelase de forma simplificada el transmisor. De modo que
simplementeactivelaseal transmiteduranteunoscienciclosdereloj39cadavezqueel
interfazconlospulsadoresdlaordendetransmitir(transmite='1').

39Deberaestaractivaloqueduraunatransmisin,perolopuedesdejarencienciclosderelojparasimplificar
yreducireltiempodesimulacin.

116 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Asimismo podras probar qu sucede si se activan dos pulsadores simultneamente y


tambinsiseactivanentiemposmuyprximos.
Alhacerelbancodepruebas,usalasconstantes c_ony c_offparaindependizarlodelas
caractersticasdelaplaca.
Una vez que has comprobado que funciona, puedes pasar al siguiente apartado para
implementar en la placa el diseo completo: el transmisor de la UART junto con el
interfazconlospulsadores.

7.6.3. Diseo estructural: unidad de ms alto nivel


En este apartado crearemos el mdulo que engloba a los anteriores, lo llamaremos
TOP_UART_TXylaarquitecturaserdetipo Estructural.Alponerleestenombreindicamos
quelaarquitecturanodescribeuncomportamientosinoqueindicalosbloques(mdulos)
conlosqueestformadaylasconexionesentrelosbloquesylospuertosdelaentidad.
Lospasospararealizareldiseoestructuralson40:
1. Declararlospuertosdelaentidad.Lospuertossonlosmostradosenla7.26,todosellos
sondetipostd_logic.Recuerdaquealdeclararlaentidadylospuertosestamosindicando
quenuestrocircuitoescomounacajanegraquesecomunicaconelexteriorconlospuertos
de entrada y salida. En nuestro caso, esta caja negra se representara como muestra la
figura7.29.
TOP_UART_TX
Pulsadores

pb_0
pb_1 RS-232
pb_2 fpga_tx
pb_3

clk
rst
rst

Figura 7.29: Representacin esquemtica de la entidad de ms alto nivel

2. NombraralaarquitecturaEstructural(oeninglsStructural)delaentidadTOP_UART_TX.
3. Declararloscomponentesquevamosautilizar.Comoesundiseoestructuralqueest
formadoporcomponentes,tenemosquedeclararloscomponentesenlapartedeclarativa
delaarquitectura.Estoyalohemoshechoenlosbancosdepruebas(recuerdalafigura5.2).
Sin embargo, al crear un banco de pruebas, la herramienta ISE declara el componente
automticamente,asqueesprobablequenotehayasdadocuentadeestadeclaracin.
Ladeclaracindeuncomponenteesmuysimilaraladeclaracindelaentidad.Enel
cdigo7.32semuestraladeclaracindelaentidaddelINTERFAZ_PByenelcdigo7.33
se muestra la declaracin del componente INTERFAZ_PB. Las diferencias se han
resaltadoenrojo.

40 SinoapareceelcomponentequeacabasdeaadirpuedeserporqueelISElohaaadidocomounafuente
desimulacin.Paraqueaparezcaensntesis,enSourcesforseleccionaBehavioral Simulation(figura5.2).
AllprobablementeestelcomponenteTOP_UART_TX.Pinchaenlconelbotnderechoyselecciona
Properties.EnAssociationseleccionaSynthesis/Imp + SimulationypinchaenOk.Detodosmodos,al
principio,mientrasnoincluyasningunasentenciasintetizable,elISEvaainterpretarqueesparasimulacin
ynocambiarlaspropiedades.AsquealprincipiotrabajadesdeBehavioral Simulationhastaquetengas
avanzadoelcircuito,enesemomentocompruebaslasintaxis(Check Syntax),lecambiaslaspropiedadesy
vuelvesatrabajardesdeSourcesforSynthesis/Implementation.

Departamento de Tecnologa Electrnica 117


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

entity interfaz_pb is component interfaz_pb is


Port ( Port (
rst : in std_logic; rst : in std_logic;
clk : in std_logic; clk : in std_logic;
pb_0 : in std_logic; pb_0 : in std_logic;
pb_1 : in std_logic; pb_1 : in std_logic;
pb_2 : in std_logic; pb_2 : in std_logic;
pb_3 : in std_logic; pb_3 : in std_logic;
tx_ocupado : in std_logic; tx_ocupado : in std_logic;
transmite : out std_logic; transmite : out std_logic;
caracter : out std_logic_vector (7 downto 0) caracter : out std_logic_vector (7 downto 0)
); );
end interfaz_pb; end component;

Cdigo 7.32: Declaracin de entidad y diferencias Cdigo 7.33: Declaracin de componente41 y


con la declaracin de componente diferencias con la declaracin de entidad

As que incluye las declaraciones de los componentes INTERFAZ_PB y UART_TX en la


partedeclarativadelaarquitectura(antesdelbegin).
4. Referenciaroinstanciarloscomponentes.Estoseracomocolocaryconectarennuestro
circuito estructural los mdulos que vamos a utilizar. En la referencia se indican las
conexionesdeseales,elllamadoportmap,dondelospuertosdelcomponentereferenciado
seconectanconlassealesypuertosdelcircuitoestructural.
En la figura 7.30 hemos detallado el circuito original (figura 7.26), donde se han
diferenciadolospuertosdelaentidad TOP_UART_TXenazul,lassealesinternasdela
arquitecturaTOP_UART_TXenrojoylospuertosdelcomponenteUART_TXenverde.
Puertos de UART_TX
Seales de
(no se ven desde
TOP_UART_TX
TOP_UART_TX)
TOP_UART_TX

INTERFAZ_PB
UART_TX
pb_0 pb_0 caracter_tx 8
caracter dato_tx_in
pb_1 pb_1
transmite transmite
pb_2 pb_2 transmite
tx_ocupado
pb_3 pb_3 tx_ocupado transmitiendo
clk rst
fpga_tx fpga_tx
clk clk

rst rst

Puertos de
TOP_UART_TX
Figura 7.30: Representacin esquemtica de la arquitectura estructural, con los componentes referenciados
y sus conexiones

Los puertos de los componentes no se ven desde la arquitectura estructural. Por


ejemplo,elpuertodesalida transmitiendodelcomponente UART_TXnosepuedeusar
directamente por ser un puerto del componente. Esto es lgico, ya que dos
componentes podran tener puertos con el mismo nombre (por ejemplo imagina que
hubiese otro tipo de transmisor con la misma seal transmitiendo), en ese caso, si
pudisemoshacerreferenciaalospuertosdeloscomponentesnoscrearaunconflicto
porquenosabramosaculdelosdospuertosnosestaramosrefiriendo.

41ElVHDLavecesesflexibleensucodificacin.Porejemplo,lapalabraisquevadespusdelnombredel
componente(enlaprimeralnea)esopcional.Otroejemploesquedespusdelend componentsepuede
incluirelnombredelcomponente(antesdelpuntoycoma).

118 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

As que los puertos de los componentes los conectaremos con seales o puertos del
diseoestructural,yloqueusaremosenlaarquitecturasernesassealesopuertos.
Estassealesypuertosdeldiseoestructuralnotienenporqullamarseigualquelos
delcomponente,aunquepuedanllamarseigual.
Enlafigura7.31seexplicacmosereferenciauncomponenteenVHDL.Enelpunto1
seponeelnombredelareferencia.Estoesasporqueunmismocomponentesepuede
utilizar ms de una vez. En el punto 2 se pone el nombre del componente utilizado,
queeselnombredelaentidad.Enelportmapseconectanlospuertosdelcomponente
con los puertos y seales del estructural. A la izquierda los puertos del componente
(punto3)yaladerechalospuertosysealesdelestructural(punto4).Enelejemplo,
deestospuertosyseales,tressonseales(punto5)yelrestosonpuertos(punto6).
Observaqueelnombredelospuertosdelcomponentenotienequecoincidirconlos
puertosysealesdelestructural.
Nombre de la instancia del componente (un
1
componente se puede referenciar ms de una vez)

2 Nombre del componente


(el nombre de la entidad)

TX: UART_TX
Port Map (
6
rst => rst, puertos de
clk => clk, TOP_UART_TX
transmite => transmite, 5
dato_tx_in => caracter_tx, seales de
transmitiendo => tx_ocupado, TOP_UART_TX
fpga_tx => fpga_tx
);

3 Puertos de UART_TX 4 Puertos y seales


(no se ven desde de TOP_UART_TX
TOP_UART_TX)
Figura 7.31: Explicacin de la referencia o instancia de un componente en VHDL

AhoraincluyelareferenciadelaUART_TX(figura7.31).Apartirdelaexplicacinquese
ha dado y observando las conexiones de la figura 7.30, incluye tambin la referencia
delINTERFAZ_PB.
5. Declararseales.Observaenlasfiguras7.30y7.31lassealesdelestructural: transmite,
caracter_txy tx_ocupado.Estassealeslastendremosquedeclararenlaarquitectura.As
pues declralas en la parte estructural de la arquitectura. Estas seales tendrn que
coincidirentipoynmerodebitsconlospuertosconlosqueseconectan.Delocontrario
aparecerunerroralcompilar.
Unavezhayashechotodosestospasos,yapuedescomprobarsilasintaxisescorrecta.Si
anestsenSourcesfor: Behavioral Simulationmiralanotaalpie40delapgina117para
cambiarasntesis.
Fjatequinesahoralaunidaddemsaltonivel,deberadeserTOP_UART_TX.
Ahoracreaelfichero.ucfparaasociarlospuertosconlospines.Lospulsadoresascialos
segnlatabla7.5.ParalaXUPV2Pponelresetenelpulsadordelmedio,yenlaNexys2
ponelresetenelprimerinterruptor.

Departamento de Tecnologa Electrnica 119


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Sintetizaeimplementaelcircuitoenlaplaca.Conectaelpuertoseriedelordenadorconla
placa.
Yahoracomprobaremosquefuncionabien.Paraelloabrimosunhiperterminal,Windows
suele tener uno en Inicio Todos los programas Accesorios Comunicaciones
HyperTerminal.TambinhayotrosdelibredistribucincomoelRealTerm[24realt]quees
gratuitoytieneopcionesmuyinteresantesparadepurarencasodequealgonovayabien.
Usaremos el HyperTerminal de Microsoft, una vez que se sabe utilizar uno no es difcil
usarotro.
Al abrirlo nos aparecer una ventana para establecer una nueva conexin (figura 7.32),
nos pide nombre de la conexin y un icono para ella (esto del nombre y del icono no
siempre lo piden en otros hiperterminales). Si no nos lo pidiese pinchamos en
ArchivoNueva Conexin.


Figura 7.32: Nueva conexin del hiperterminal

Posteriormente (figura 7.33) aparecer una ventana que dice Conectar a, le indicamos
Conectar usando COM1(uotroCOMsegntuordenador).
Yporltimonossaldrnlaspropiedadesdelacomunicacinconelpuertoserie(figura
7.34). Despus del diseo que hemos hecho, ya estaremos familiarizados con el
significado de estas propiedades. Las rellenamos segn las caractersticas de nuestro
diseo: bits por segundo (115200), paridad (sin paridad), bits de parada (1), control de
flujo(ninguno),....
Despusdedarleaaceptaryatendremoslaconexin,yprobamosapresionarunodelos
cuatrobotones(noeldelmedioqueeselresetparalaXUPV2Pynoharnadavisible).
Comprueba que en el hiperterminal aparecen los caracteres que has enviado. Si te salen,
enhorabuena, has logrado implementar un diseo de relativamente complejo. Si no te
sale,compruebaquelascaractersticasdelaconexinquehasestablecidocoincidencon
lasdetucircuito,yquetieneslospinescorrectamenteconfigurados.Avecessucedeque
el hiperterminal no funciona a altas velocidades de transmisin. En estos casos, el error
aparece al configurar el hiperterminal, sin siquiera conectar la placa al PC por el puerto

120 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

serie. Si esto sucede, prueba a poner una velocidad baja, por ejemplo 9600. Comprueba
tambin que el cable serie est bien conectado. Y si nada de esto funciona, prueba a
simularelcircuitocompletoysiannofunciona,miraelapartado7.6.4.


Figura 7.33: Conexin al puerto serie

Figura 7.34: Caractersticas de la conexin

7.6.4. Cuando la sntesis no funciona


Puede ser que hayas seguido todos los pasos anteriores y an as no te funcione el
circuito.Lascausasdequenofuncionepuedensermuydiversas,yporlotantoesresulta
difcildedarunaguaexhaustivadecmoproceder.Sobretodoeslaexperiencialaquete
ayudararesolverdemaneramsrpidaestosproblemas.Anastedaremosunaserie
depuntosquepodrsrevisarcadavezquenosepasdndeestelerror.
Importante: los momentos de bsqueda de fallos pueden ser desesperantes, sobre todo
cuandosealarganmuchoylostiemposdeentregaseacercan.Enestosmomentoscrticos
avecessucedequeestropeamosmsquearreglamos.Intentarmantenerlacalmapuede
serunconsejodifcilmentealcanzable,peroloquesestentumanoeshacercopiasde
seguridad. Cada vez que vayas a arreglar algo, haz una copia de seguridad. Lo
recomendable sera utilizar un sistema de control de versiones, pero como mnimo,
deberasdehacercopiasdelosficherosquevayasamodificar(incluyendoalnombredel
ficheroelnmerodeversin,porejemplo:nombrefichero_v13.vhd).
Acontinuacintedamosunaseriedepuntosqueesperamosqueteayudenaencontrar
loserrores:
7.6.4.1. Comprueba que todo est bien conectado
Aunqueestarecomendacinpuedaparecermuyevidente,aveceslascosasnofuncionan
porestetipodedespistesysepierdemuchotiempobuscndoloenotrositio.Comprueba
quetodoestbienconectado:placaenchufada,interruptorencendido,cablesconectados:
RS232,USB,...
7.6.4.2. Comprueba el fichero .ucf
Mira el fichero .ucf y vuelve a repasar la correspondencia de los pines con los puertos.
Compruebaquenoestsnombrandolospinesdeotraplaca.RecuerdaqueenlaNexys2
hayalgunospinesqueenlaplacanoestncorrectamentenombrados,miralashojasde
caractersticasdelaplacayvulvelosarevisar.

Departamento de Tecnologa Electrnica 121


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

7.6.4.3. Comprueba el reset del circuito


Hazlassiguientescomprobacionesdelresetdetucircuito:
Miradequpulsadorointerruptorvieneelresetyverificaquenolotengasreseteado.
CompruebaqueeneldiseoVHDLelresetdeloselementosdememoriaseactivesiempre
almismonivel.
Si has usado la constante c_on para activar los elementos de memoria (como hemos
recomendado), comprueba que el valor de la constante se corresponde con el valor de
activacin de su pulsador correspondiente. Recuerda que los pulsadores de las placa
XUPV2PfuncionananivelbajoylosdelaNexys2anivelalto.
7.6.4.4. Simula el circuito completo
Puedeserquehayascadaunodelosmdulosporseparado,peronoelcircuitocompleto.
Quiz el fallo est en alguna conexin del mdulo de ms alto nivel. Simula el circuito
completo y revisa bien las formas de onda. Vuelve a repasa las simulaciones de los
mdulos.
7.6.4.5. Revisa las advertencias del sintetizador
Observa detenidamente los warnings (advertencias) que da el ISE al sintetizar. Hay
algunosquenospuedenayudaraencontrarelfallo(otrosnotienenmuchautilidad).Para
ver los warnings tienes que pinchar en View Design Summary dentro de la subventana
Processes (punto 1 de figura 7.35) o bien seleccionar la pestaa del resumen del diseo
(Design Summary) (punto 2 de figura 7.35). En la ventada del resumen del diseo tienes
quepincharenloswarnings(punto3defigura7.35).Tambinlospuedesverpinchando
enlapestaadeWarningsdelasubventanainferior(punto4defigura7.35),sinembargo,
aqu slo veras los warnings, y hay ciertos avisos que pueden ser muy tiles que no se
muestranaqu.

1
Ventana del
3 Pinchar para
resumen
del diseo ver los
warnings


Figura 7.35: Resumen del diseo en el ISE

122 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Acontinuacinseexplicanelsignificadodealgunosdeestasadvertencias:
1. Erroresenlaslistasdesensibilidad.Laslistasdesensibilidadsonparasimulacin(repasa
elmanualdeED2[17mach]),peronoseusanensntesis.Cuandounprocesotienemalla
lista de sensibilidad, puede ocurrir que la simulacin no se corresponda con la sntesis.
Recuerda que en la lista de sensibilidad se deben incluir las seales que se leen en el
proceso42, aunque si es un proceso con reloj basta con incluir la seal de reloj y las
anteriores43(elresethabitualmente).Asquecompruebaelwarningquedice:
Xst:819Thefollowingsignalsaremissingintheprocesssensitivtylist...
2. Comprueba si hay registros que se quedan con valores constantes. Esto no siempre
implicaqueseaunerror,asquedebesdecomprobarsisetratadeunerroroestbienas.
Por ejemplo, probablemente al sintetizar el circuito completo te haya salido el siguiente
error:
Xst:1710 FF/Latch <dato_tx_rg_7> (without init value) has a constant value of 0 in block
<TX>.
Estaadvertencianosavisaqueelbit7delaseal dato_tx_rgqueestenelbloque TX
tieneelvalorconstante0.Elnombredelbloque(TXenestecaso)lodaelnombreque
hemos puesto a la referencia o instancia del componente (recuerda la figura 7.31
dondesepusoelnombre TXalcomponente UART_TX).Ennuestrocasotendremosque
comprobarporquelbit7delasealdato_tx_rgsequedaacero.
Que un biestable est siempre a cero, aparentemente es un error. Para descubrir si
realmente se trata de un error tenemos que ir al proceso donde se asigna la seal
(fichero uart_tx.vhd) y analizar las asignaciones. El proceso es el registro de
desplazamiento. En la figura 7.36 se muestra el proceso44 y en ella podemos apreciar
queelbit7de dato_tx_rgseasignasloenlasdosprimerassentencias,mientrasque
en la ltima sentencia se asignan todos los bits menos el 7. Esto es porque es un
registrodedesplazamientoaladerechayportanto dato_tx_rg(7)mantienesuvalor.
En la primera sentencia (en el reset) se asigna un cero y en la segunda se asigna
dato_tx_in(7). Por lo tanto habr que seguir investigando qu valores tiene
dato_tx_in(7).

P_CargaDesplaza: Process(rst, clk)


begin
if rst = c_on then
dato_tx_rg <= (others => '0'); dato_tx_rg(7) <= '0'
elsif clk'event and clk = '1' then
if cargadato = '1' then
dato_tx_rg <= dato_tx_in; dato_tx_rg(7) <= dato_tx_in(7)
elsif desplaza = '1' then
dato_tx_rg (6 downto 0) <= dato_tx_rg (7 downto 1); dato_tx_rg(7)
no recibe valor,
end if;
guarda el que tena
end if;
end process;

Figura 7.36: Asignacin de la seal dato_tx_rg

42 Revisaelcaptulo3delmanualdeED2[17mach]
43 Revisaelcaptulo5delmanualdeED2[17mach]
44 Probablementenohayasrealizadoelprocesoigual,perofjateenestosejemplosparaentenderloquese
intentaexplicar,yluegocompralocontudiseo.

Departamento de Tecnologa Electrnica 123


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

El puerto dato_tx_in est conectado con el puerto caracter del INTERFAZ_PB (figura
7.30). As que tendremos que analizar qu valores recibe el puerto caracter. En la
figura7.37semuestraelprocesodondeseasigna45.
P_envio_orden: Process(pulso_0, pulso_1, pulso_2, pulso_3, tx_ocupado)
begin
if tx_ocupado = '1' then
transmite <= '0';
caracter <= (others => '0'); caracter(7) <= '0'
else
transmite <= '0';
caracter <= (others => '0'); caracter(7) <= '0'
if pulso_0 = '1' then
transmite <= '1';
caracter <= x"61"; -- "01100001", letra 'a' caracter(7) <= '0'
elsif pulso_1 = '1' then
transmite <= '1';
caracter <= x"6C"; -- "01101100", letra 'l' caracter(7) <= '0'
elsif pulso_2 = '1' then
transmite <= '1';
caracter <= x"6F"; -- "01101111", letra 'o' caracter(7) <= '0'
elsif pulso_3 = '1' then
transmite <= '1';
caracter <= x"68"; -- "01101000", letra 'h' caracter(7) <= '0'
end if;
end if;
end process;

Figura 7.37: Asignacin del puerto de salida caracter

Observandoelprocesonosdaremoscuentaqueelbit7de caractersiemprerecibeun
cero.Estoesunacasualidad,debidoaquelascuatroletrasqueasignamostienenelbit
mssignificativoacero.Elsintetizadorsehadadocuentadeesto,yenvezdeusarun
biestableparaestebit,lohareducidoaunaconstanteyloavisa conesewarning.En
otrocasopodraserdebidoporunerrornuestroalcodificar,peroenestecaso,debido
alaparticularidaddelasasignaciones,lasimplificacinescorrecta.
3. Sealesquenoseusan.Normalmentedeclararunasealsinusarlapuedesignificarquete
hasolvidadodeusarlaoqueinicialmentepensabasquelaibasausarytehasdadocuenta
quenolanecesitabas.Enelprimercaso,estewarningteestrecordandoquetefaltapor
haceralgoenelcircuitoypuedeserqueseaporestoquenofuncione.Enelsegundocaso
deberasdeborrarocomomnimocomentarladeclaracin.Esimportantetenerelcdigo
ordenadoyquitarcosasintilesquedificultenlacomprensindelcdigo.Elavisoqueda
elISEparaestassealesquesedeclaranperonoseusaneselsiguiente(enesteejemplola
sealsellamas_inutil):
Xst:1780Signal<s_inutil>isneverusedorassigned.
4. Sealesqueseasignanperoquenoseusan.Cuandohasasignadovaloraunasealpero
no usas esa seal, seguramente sea que te has olvidado darle uso. En la figura 7.38 se
representaestecaso.Comopuedesvernotienesentidocrearunasealyasignarlevalor
paranada.

45Delamismamaneraqueelcasoanterior,tuprocesopuedeserdiferente

124 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

seal que no
se propaga

sin_salida
puerto_entrada_1
puerto_entrada_2

Figura 7.38: Esquema de un circuito con una seal que no da valor

ElwarningquedaelsintetizadorISEeselsiguiente:
Xst:646Signal<sin_salida>isassignedbutneverused.
5. Sealesqueseusansinrecibirvalor.Eselcasocontrarioalanterior,esbastantegraveque
unasealqueestsusandonolehayasasignadovalor.Seracomoponeruncablealairey
seguramente implique que te hayas olvidado de incluir la sentencia que le da valor. La
figura7.39representaestecaso,dondealasealsin_asignarnoselehaasignadonada.
seal que no
recibe valor

sin_entrada

puerto_salida
puerto_entrada

Figura 7.39: Esquema de un circuito con una seal que no ha recibido valor

Enestecasoelwarningeselsiguiente,yelsintetizadorlaponeavalorcero.
Signal<sin_entrada>isusedbutneverassigned.Tiedtovalue0.
6. Creacin de Latches. Cuando el sintetizador avisa de que ha creado un latch46 para una
seal conviene que comprobar que realmente queramos generar el latch. Aunque la
creacindeunlatchnonecesariamenteimplicaqueseaunerror,engeneralserecomienda
disear circuitos sncronos con el reloj, haciendo que los elementos de memoria sean
activos por el flanco del reloj. Esto es una recomendacin de diseo porque son ms
segurosydanmenosproblemas,peronoimplicaqueseaerrneo.
Adems de esto, muchas veces se crean latches involuntariamente. Por ejemplo,
cuando una seal combinacional no la asignamos en todas las alternativas, la seal
tiene que guardar su valor y para ello genera un latch. Implementar la seal con un
latch en vez de con un circuito combinacional puede producir un comportamiento
indeseadoenelcircuito.Asquecuandoveasestewarningcompruebaquelasealse
asignaentodaslasalternativas,prestandoatencinen que lassentencias ifterminen
en else(ynoen elsif).Revisaloscaptulos4y5delmanualdeED2[17mach]sino
entiendesestoltimo.
ElavisoquedaelISEsemuestraacontinuacin,enelqueindicaquesehagenerado
unlatchparalaseals_latch.
Xst:737Found1bitlatchforsignal<s_latch>.
7. Formacindelazoscombinacionales.Cuandoapareceestaadvertenciahayquedescubrir
qu la ocasiona y solucionarlo. En un circuito sncrono con FPGA no debera de haber

46 Loslatchsseexplicanenelapartado2.5ymsenprofundidadelcaptulos4y5delmanualdeED2
[17mach]

Departamento de Tecnologa Electrnica 125


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

buclescombinacionales.Unbuclecombinacionalseformacuandoelrecorridodeunaseal
sepropagahacasmismasinquehayanelementosdememoriaenmedio.Enlafigura7.40
semuestraelesquemadeunlazocombinacionalyelVHDLquelogenera.
Lazo
combinacional
s_lazo

s_2 s_2 <= in_1 or s_lazo;


in_1 s_lazo <= in_2 or s_2;

in_2 s_lazo
Figura 7.40: Esquema de un circuito con lazo combinacional y el cdigo VHDL que lo forma

Fjate que las seales s_2 y s_lazo forman el lazo combinacional. Estos lazos
provocaranunfuncionamientoasncronoyerrticoporlosretardosdelaspuertasy
conexiones.Porlotantohayqueevitarlos,paraellohayqueentenderlafuncionalidad
del circuito e intentar buscar una descripcin alternativa. La manera habitual de
evitarlosesponerunbiestableenmedio,aunquehayquehacerloconcuidado,siendo
necesariocomprobarqueelnuevocircuitocumplelafuncionalidaddeseada.
Lafigura7.41muestracmosepuederomperellazocombinacionaldela figura7.40.
Observa que este lazo se podra romper tambin por la seal s_2, en vez de por la
seal s_lazo.Lafuncionalidaddeestoscircuitossera diferente,porloquesedebede
comprobarsielcircuitosecomportacomoqueremos.
s_lazo s_2 <= in_1 or s_lazo;

s_2 P: Process (rst,clk)


in_1 begin
if rst = c_on then
in_2 s_lazo s_lazo <= '0';
elsif clk'event and clk='1' then
s_lazo <= in_2 or s_2;
Un biestable rompe end if;
el lazo combinacional end process

Figura 7.41: Esquema que muestra cmo se puede romper el lazo combinacional de la figura 7.40

El aviso del sintetizador del ISE se muestra a continuacin. Sin embargo, si miras el
avisoporlaventanadelresumendeldiseo(punto2delafigura7.35),nosemuestra
la seal que forma el lazo. Tienes que mirarlo en la pestaa de Warnings de la
subventana inferior (punto 4 de figura 7.35). An as, la informacin no siempre es
muyclarayhayqueinvestigarunpocoparaencontrarellazo.
Xst:2170Unitinterfaz_pb:thefollowingsignal(s)formacombinatorialloop:s_lazo.
Porltimoindicarqueloslazoscombinacionalessonmsdifcilesdedetectarcuando
se forman entre varios mdulos de un diseo estructural. Vemoslo con un ejemplo
similar al del transmisor de la UART pero ms sencillo. Tenemos un circuito
estructuralcondosmdulos(figura7.42).

126 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

TOP_TX

INTERFAZ TRANSMISOR
pb pb transmite transmite
transmite tx tx
transmitiendo transmitiendo

clk rst clk rst

clk

rst

Figura 7.42: Esquema de ejemplo de circuito estructural para mostrar lazos combinacionales entre mdulos

Unmduloesuntransmisorquecuandorecibelaordendetransmitir(transmite='1')
comienza la transmisin por el puerto tx. Durante la transmisin pone la seal
transmitiendoavalor1.Estecircuitotienedosestados: e_inity e_tx.Enelprimero
estenreposoesperandolaorden,yenelsegundoesttransmitiendo,alterminarde
transmitir,vuelvealestadodereposo.
El otro mdulo es un interfaz con un pulsador pb. Este circuito detecta el flanco del
pulsador generando la seal pulso_pb. Cuando hay flanco (pulso_pb='1'), ordena el
iniciodelatransmisinaltransmisor.Encasodequeeltransmisoresttransmitiendo
(transmitiendo='1')elinterfaznoordenarlatransmisin.
Podramos describir los procesos que asignan las salidas transmite y transmitiendo
comosemuestranenlafigura7.43.
INTERFAZ TRANSMISOR
... ...
P_I: Process (transmitiendo, pulso_pb) P_T: Process (estado, transmite)
begin begin
if transmitiendo = '1' then case estado is
transmite <= '0'; when e_init =>
elsif pulso_pb='1' then if transmite = '1' then
transmite <= '1'; transmitiendo <= '1';
else else
transmite <= '0'; transmitiendo <= '0';
end if; end if;
end process; when e_tx =>
... transmitiendo <= '1';
end case;
end process;
...

transmite se transmitiendo se
pone a '0' cuando pone a '1' cuando
transmitiendo='1' transmite='1'

transmite = '1' transmitiendo ='1' transmite = '0'

Por la rapidez, el estado no habr cambiado, estado=e_init y pulso_pb todava estar a '1'

transmite = '0' transmitiendo ='0' transmite = '1'



Figura 7.43: Procesos en mdulos distintos que forman un lazo combinacional con las seales transmite y
tranmitiendo.

Siobservaslosprocesos,ambossoncombinacionales.Lasealtransmitiendodepende
delaseal transmiteyviceversa.Porlotantoambasformanunlazocombinacional.
Este lazo combinacional hara que en cuanto la seal transmite se pusiese a uno se
volveraaponeracerocasiinstantneamentedebidoaque transmitiendo sepondra

Departamento de Tecnologa Electrnica 127


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

a uno. Tardara el tiempo de retardo de las seales y las puertas. Sin embargo, las
sealesnoseranestablesyvolveranotravezalosvaloresinicialesporque pulso_pb
seguira a uno y el estado no habra cambiado, ya que por haber sido tan rpido el
cambiodelasseales,annohabrallegadoelflancoderelojqueharacambiaralos
biestables. Adems esto podra hacer que el circuito fuese inestable porque no
cumplirselostiemposdesetupyholddelosbiestables,provocandometaestabilidaden
losbiestables(estoseexplicenED2).
Cmo podramos solucionar este problema y romper el lazo combinacional? una
primerasolucinpodraserregistrar47lassalidastransmitey/otransmitiendo.Laotra
solucin es hacer que la seal transmitiendo dependa slo del estado y no de la
entrada transmite.SirecuerdasdeED2,estoeshacerquelamquinadeestadossea
unamquinadeMooreenvezdeMealy(elprocesodelafigura7.43).Lafigura7.44
muestraelprocesocomomquinadeMoore,conestoserompeellazocombinacional.
INTERFAZ TRANSMISOR
... ...
P_I: Process (transmitiendo, pulso_pb) P_T: Process (estado, transmite)
begin begin
if transmitiendo = '1' then case estado is
transmite <= '0'; when e_init =>
elsif pulso_pb='1' then transmitiendo <= '0';
transmite <= '1'; when e_tx =>
else transmitiendo <= '1';
transmite <= '0'; end case;
end if; end process;
end process; ...
...

transmite se transmitiendo
pone a '0' cuando depende del estado no
transmitiendo='1' de transmite
Figura 7.44: El proceso del transmisor como mquina de Moore para romper el lazo combinacional.

8. Simplificacin de lgica. El sintetizador simplifica la lgica que no es til en el circuito


final.Tenemosqueestarmuyatentosaestassimplificacionesporqueimplicaqueloque
hemosqueridocodificarnosevaimplementarcomoesperamos.Porejemplo,supnque
enalsintetizareltransmisordelaUARTtenemosunavisoqueindicalosiguiente48:
Xst:2679 Register <baud> in unit <uart_tx> has a constant value of 0 during circuit
operation.Theregisterisreplacedbylogic.
Delafigura7.12yrecordandoloquehacenuestrotransmisorpodemosdeducirquesi
laseal baudtieneunvalorconstantecero,nuestrotransmisornofuncionar,pueses
el que hace cambiar de estados y hacer los desplazamientos del registro de
desplazamiento. Efectivamente, el que la seal baud valga cero el la causante de que
porejemplolasealdesplazatengaelmismoavisoquebaud.Ytambinlaresponsable
delosavisos:
Xst:1799Statee_bits_datoisneverreachedinFSM<estado_tx>.
Xst:1799Statee_bit_finisneverreachedinFSM<estado_tx>.
Esdecir,nosestdiciendoquenuncasellegaalosestados e_bits_datoy e_bit_fin.
Loqueeslgicosibaudsiempresequedaacero.
47Registrarunasealeslomismoqueponerunbiestableenesaseal.
48Curiosamenteesteavisonoestcatalogadoconowarningsinocomoinfo,porloquenoseveenlasuventana
deWarnings(laqueestabajo,elpunto4defigura7.35).

128 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Otrowarningnosdiceque:
Xst:646Signal<dato_tx_rg<7:1>>isassignedbutneverused.
Estaadvertenciatambineslgica,pues dato_tx_rgeselregistrodedesplazamiento.,
quecomolasealdesplazasequedaacero,losbitsdel7al1nuncavanaserusados.
Por tanto, las advertencias del sintetizador pueden darnos informacin muy valiosa.
Estandoatentosastapodemosdetectarenqufallaelcircuito.Enestecaso,eraun
fallodeldivisordefrecuenciayestefallotambinlohubisemosdetectadomediante
simulacin,perocuandonoencuentraselfallo,esimportantebuscarcualquierfuente
deinformacin.
9. Otrosavisos.Nopodemosdarunalistaexhaustivadetodosloswarningseinfosquedael
sintetizador, adems de que hara que este manual fuese muy aburrido. Con esta
introduccinyatienessuficienteinformacinparainvestigarportimismoelsignificadode
otrosavisos.Hayavisosquenosonimportantesylosversencasitodoslosdiseos,como:
Xst:2734Propertyuse_dsp48isnotapplicableforthistechnology.
As que con atencin y la experiencia que vayas adquiriendo irs aprendiendo a
identificarelsignificadodelosavisosysuimportancia.
7.6.4.6. Muestra informacin del circuito por los leds
Cuando el circuito no hace nada que podamos ver, como por ejemplo el circuito del
transmisor de la UART, no tenemos informacin de si el circuito est haciendo algo. En
estos casos los leds pueden ser una fuente de informacin muy valiosa. Puedes sacar
sealesqueteayudenaconocerelestadointerno.Puedestambincodificarlosvaloresde
losestadosenlosleds,paraversisequedaatascadoenalgnestado.Tencuidadodeno
sacar seales cuya activacin sea muy corta, porque si es as, no podrs apreciar la
activacin.Alsacarsealesporlosledstenencuentalascaractersticasdelosledsdela
placa, esto es, si funcionan a nivel alto o bajo. Mejor es que uses las constantes c_on y
c_off.

7.6.4.7. Crea un nuevo proyecto en el ISE


A veces el proyecto del ISE se corrompe y no actualiza los cambios que hagas en el
circuito.Enestoscasos,elfichero .bitgeneradonocambiaycorrespondeaunaversin
anterior.Lasolucinescrearunnuevoproyectoeimportarlosficheros .vhddelanterior.
Puede ser desesperante que despus de horas de intentarlo todo, sea esto lo que haya
originadoelfallo(aunqueporotraparteseaunaliviohaberencontradoelfallo).

7.7. Diseo del receptor de la UART


En este apartado se darn las indicaciones para disear el receptor de la UART. En los
apartadosanterioressehadadomuchainformacinconelobjetivodequepuedasserms
independiente en los diseos que se propongan a partir de ahora. As que no dudes en
repasarlosconceptosanterioresencasodequeteencuentrescondificultades.
Con todo lo que hemos visto sobre el funcionamiento del protocolo RS232, despus de
haber diseado el transistor e incluso haber diseado un receptor para simulacin
(apartado7.5.4),nodeberasernecesariamuchaexplicacinparaquepuedasdisearun
receptorsintetizable.
Laentidadquequeremosdiseartieneelaspectomostradoenlafigura7.45:

Departamento de Tecnologa Electrnica 129


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

UART_RX
8
dato_rx_out del exterior
aviso_rx (computadora)
de/hacia Pines:
recibiendo
nuestro fpga_rx FPGA_RX AJ8 (XUPV2P)
sistema U6 (Nexys2)
clk

rst

Figura 7.45: Entradas y salidas del receptor

Lasconstantesdeldiseosernlasmismasqueusamosparaeltransistor(tabla7.2)yde
hechousaremoslosmismospaquetes.
Lasespecificacionesdelospuertossonlassiguientes:
Puerto bits I/O Descripcin
rst 1 I Sealderesetasncrono,suniveldependerdec_on
Sealderelojdelaplaca.Lafrecuenciadelrelojseindicaenlaconstante
clk 1 I
c_freq_clk.
fpga_rx 1 I Tramaqueserecibeenseriedesdelacomputadora,sigueelformatoRS232
Avisodequeseharecibidounnuevodatoyqueestdisponibleen
aviso_rx 1 O dato_rx_out.Elavisosedarponiendolaseala1duranteunnicociclo
dereloj.
Proporcionalos8bitsdeldatoqueseharecibido.Estedatoessloser
dato_rx_out 8 O
vlidodesdequeaviso_rxvalga1ymientrasrecibiendosea0
Cuandovale1indicaqueelmduloseencuentrarecibiendounatramay
recibiendo 1 O
portantoelvalordeldatodato_rx_outnoesvlido
Tabla 7.6: Puertos del receptor de la UART

Enlafigura7.46semuestracmodeberaserelcronogramadelassalidasdelreceptoral
terminar una recepcin (fjate dnde est el bit de fin), posteriormente con la lnea en
reposo, y por ltimo al comienzo de una nueva recepcin (fjate dnde est el bit de
inicio).Apartirdelafiguraseobservaqueeldatorecibido(dato_rx_out)sloservlido
apartirdelavisodelaseal aviso_rxymientrasquelaseal recibiendosemantengaa
0.Cuandolaseal recibiendosepongaa1eldatonoservlido.Nuncapodrnestar
simultneamentea1lassealesrecibiendoyaviso_rx.
fin de la recepcin comienzo de nueva recepcin

... bit 7 del dato bit de fin reposo bit inicio bit 0 ...

fpga_rx

recibiendo

aviso_rx

dato_rx_out(7:0) dato vlido

clk

dato invlido fin de la recepcin dato invlido



Figura 7.46: Cronograma de salidas del receptor al terminar la recepcin y el comienzo de una nueva

130 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Apartirde aqu, intentahacerelreceptorpor timismo.Sivesquetienesdudas,opara


comparartusolucinconunapropuesta,consultalasguasquesedanacontinuacin.
El diseo del receptor se puede realizar de manera parecida al del transmisor. Una
primeraaproximacinaldiagramadebloquesdeldiseosemuestraenlafigura7.47.
Desplz_SIPO dato_rx_out(7:0)
RegIn
fpga_rx fpga_rx_rg
7 0
Control desplaza
desplaza clk rst
aviso_rx
baud_medio aviso_rx
baud recibiendo
recibiendo
DivFrec rst en_divfreq
Clk
baud_medio
baud
en_divfreq
clk rst

Figura 7.47: Diagrama de bloques preliminar del receptor

Acontinuacinsedescribenbrevementecadaunodelosbloques.

7.7.1. Registro de desplazamiento


Elregistrodedesplazamiento(Desplz_SIPO)esunregistroalqueselevancargandolos
datos en serie y los devuelve en paralelo (serialin parallelout: SIPO). ste es el registro
opuesto al que tenamos en el transmisor, que cargaba en paralelo y devolva en serie
(PISO).Comoelprimerbitqueserecibeeselbit0,silacargaseriesehaceporelbitms
significativodelregistroysehacendesplazarlosbitshacialaderecha[bitnbit(n1)],
enelltimodesplazamiento,elbit0recibidoestarenelbit0delregistro,yestarntodos
los bits ordenados. La carga y el desplazamiento se realizan bajo la orden de la seal
desplazaoriginadaenelbloquecontrol

7.7.2. Registro de entrada


Laentradadelacomunicacinseriefpga_rxseregistraenfpga_rx_rg(mduloRegIndela
figura7.47).Comofpga_rxesunasealasncronaesconvenienteregistrarla,yparaevitar
metaestabilidadsepuedeinclusoregistrardosvecesponiendodosregistrosencascada
(recuerdalafigura2.11).

7.7.3. Divisor de frecuencia


Para el receptor, el divisor de frecuencia debe sincronizarse con la trama que se recibe.
Estoesasporqueelreceptornodirigelatransmisin,comosucedaconeltransmisor.El
divisor de frecuencia se mantiene inactivo con la cuenta a cero hasta que la entrada
en_divfreqseponea1.Eldivisordefrecuenciasacadosseales:baudybaud_medio.baud
marca la transicin del estado, y baud_medio marca el punto medio de cada bit de la
transmisin. En este punto medio es donde se evala el valor del bit recibido, evitando
evaluar el bit cerca de las transiciones donde se puede tomar el valor del bit contiguo.
Estoessimilaraloquehicimosconelreceptorparasimulacin,recuerdalafigura7.24.

Departamento de Tecnologa Electrnica 131


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

En la figura 7.48 se muestra el cronograma del divisor de frecuencia con una cuenta de
ejemplo de 20 (en realidad la cuenta es mucho ms larga, y viene indicado por la
constantec_cont_baud calculadaenelcdigo7.2).
comienzo de nueva recepcin

reposo bit inicio bit 0 del dato bit 1 ...

fpga_rx_rg

cuenta 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 2

baud

baud_medio

en_divfreq

nos situamos en el medio para leer el valor


Figura 7.48: Cronograma del divisor de frecuencia

7.7.4. Bloque de control


El bloque de control es una mquina de estados similar a la del transmisor (apartado
7.4.2). El cambio de estado tambin viene provocado por baud. La orden de
desplazamiento (desplaza) se dar cuando se est en el estado de recepcin de dato
(e_bits_dato)yllegalasealbaud_medio.

7.8. Banco de pruebas del receptor de la UART


Para hacer un banco de pruebas tenemos que crear un modelo de simulacin de las
entradas.Enelcasodelreceptor,slotenemostresentradas(figura7.45),siendodosde
ellaselrelojyelreset.Laotraentradaeselpuertofpga_rx,quesecorrespondeconeldato
serie que se recibe con el protocolo RS232. Por tanto, para realizar el banco de pruebas
tendramosquerealizarunprocesodesimulacinquemodelaseunenvoRS232.Habra
quecontarlostiemposdecadabit,yenviarelbitdeinicio,los8bitsdeldato,elbitdefin
y finalmente poner la lnea en reposo. Con todo lo que hemos visto sobre el protocolo
RS232 y sobre simulacin, no deberas de tener muchas dificultades para realizar un
banco de pruebas de este tipo. La figura 7.49 muestra un esquema de cmo podramos
hacer el banco de pruebas del receptor. Observa que es similar a banco de pruebas del
transmisor7.22.
UUT: UART_RX
8
Observar las salidas o dato_rx_out
crear un proceso que las
P_Transmisor
verifique automticamente aviso_rx
recibiendo fpga_rx
P_Clk
Proceso que clk
modela el reloj
rst
Proceso que modela el
transmisor generando
P_Reset tramas serie con
Proceso que formato RS-232
modela el reset

Figura 7.49: Esquema del banco de pruebas del receptor, que incluye un proceso que modela el transmisor
descrito a alto nivel

132 Universidad Rey Juan Carlos


7. Transmisin en serie por RS-232

Otraopcinparaelbancodepruebasesutilizareltransmisorqueyahemosrealizadoy
subancodepruebasparagenerarlatramaRS232.Conestonosahorraramosrealizarel
modelo de alto nivel del transmisor que genera la trama RS232. Como ya hemos
comprobado que el transmisor funciona, en este banco de pruebas slo estaramos
probandoelreceptor,queesloquequeremosprobar.Lafigura7.50muestraelesquema
de este banco de pruebas. La ventaja de hacer este banco de pruebas es que tardamos
menosendisearlo,ladesventajaesquelasimulacinsermslentaporqueelmodelo
deltransmisoresmscomplejoquesifueseunmodeloparasimulacin.
UUT: UART_RX
8 Este es el
Observar las salidas o dato_rx_out componente que
crear un proceso que las
estamos probando
verifique automticamente aviso_rx

P_Clk recibiendo fpga_rx

clk

rst

Proceso que
P_Estmulos
TX: UART_TX
modela las 8
entradas al dato_tx_in
circuito transmite
transmitiendo
P_Clk fpga_tx
Proceso que clk
modela el reloj
rst

P_Reset
Proceso que
Este componente ya
modela el reset
est probado
Figura 7.50: Esquema del banco de pruebas del receptor, que incluye el transmisor sintetizable

Ahora,eligeunodelosdosbancosdepruebasycompruebaquelassalidas dato_rx_out,
aviso_rx y recibiendo son correctas. Probablemente no te salga bien a la primera y
tendrsqueanalizarlassealesyestadosinternosdelreceptor.Realizaestoportimismo
para afianzar el anlisis de la simulacin explicado en el apartado 7.5. Consulta este
apartadosinosabescmoprocederalacomprobacindelasformasdeondas.

7.9. Implementacin de la UART completa


Sihasprobadoelreceptor,ahoralopodrsunirconeltransistoreimplementarlosjuntos
enunslodiseo.Vamosarealizarundiseoquetransmitalorecibidoporelreceptor,
consiguindoseunecoenelhiperterminal.Paraello, cadavezqueserecibaundatoporel
receptortendramosquedarlaordendetransmitir. Podemosutilizarelpuerto aviso_rx
del receptor para dar la orden al transmisor por el puerto transmite, puesto que ambas
funcionan con un ciclo de reloj. Adems, cuando aviso_rx est activo, el dato est
disponibleendato_rx_out,porloquenohabraquehacernadamsqueconectarloscomo
muestralafigura7.51.

Departamento de Tecnologa Electrnica 133


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

UART_ECO

RX: UART_RX
8
dato_rx_out del exterior
aviso_rx (computadora)
Pines:
recibiendo fpga_rx FPGA_RX AJ8 (XUPV2P)
U6 (Nexys2)
clk

rst

TX: UART_TX
8
dato_tx_in hacia el exterior
transmite (computadora)

transmitiendo Pines:
fpga_tx FPGA_TX AE7 (XUPV2P)
clk clk P9 (Nexys2)
rst rst


Figura 7.51: Circuito que transmite lo que recibe con protocolo RS-232

Implementas el diseo y observa si tienes eco. Ten en cuenta que los hiperterminales
normalmente no tienen eco, esto es, no muestran lo que escribes (a no ser que lo
configures), por tanto si ests viendo lo que escribes, probablemente lo tengas bien.
PruebaaescribirsinelcableconectadooconlaFPGAdesprogramadaaversiveseco.
Si obtienes caracteres distintos a los que has enviado, revisa la configuracin del
hiperterminal.Sinotesalebien,compruebalospasosdelapartado7.6.4orealizaunbanco
depruebasdelcircuitocompleto.

134 Universidad Rey Juan Carlos


8. Circuitos aritmticos
En esta prctica se introducir el diseo de mdulos aritmticos en VHDL. La
implementacin de este tipo de mdulos es de mucha utilidad, ya que una de las
aplicacionesdelosdispositivosprogramablescomolasFPGAesacelerarelcmputo.Sin
embargo, para la implementacin de la mayora de las operaciones matemticas
necesitamosdescribircmoeselhardware.Esdecir,nopodremosutilizareloperadorde
divisinentredossealesenteras,sinoquetendremosdescribircmoeselhardwareque
implementaladivisin.Otrasoperacionesmssencillascomolasuma,larestay,aveces
la multiplicacin entera, habitualmente las implementa el sintetizador. As que aunque
para estas operaciones normalmente no tenemos que describir cmo se implementa en
hardware,esimportantesaberentendercmofuncionanparaevitarerroresdediseo49.
Debemos ser cuidadosos al implementar las operaciones matemticas en VHDL. Por un
lado se deben elegir los tipos numricos correctamente y establecer operaciones
consistentes entre las seales y variables. Por otro lado, como ya se ha dicho, se debe
tener en cuenta que operaciones complejas como la divisin no son inmediatas en
hardwareynormalmentesedebeespecificarqualgoritmolarealizar.
Esimportantequenoolvidemosquelassealesdeuncircuito(hardware)nosonmsque
un grupo de cables elctricos. Haciendo una abstraccin hemos agrupado y ordenado
estoscables,considerandoqueformanunasealconunnmerodeterminadodebits.Y
que incluso hemos determinado que esa seal es de un tipo numrico determinado. As
queaunquedigamosqueunasealesdetipoenteroconsigno,tenemosquerecordarque
esasealnoesmsqueungrupodecablesalqueledamosunsignificado.
Eltipodedatosquehabitualmentehemosusadoparavectoreses std_logic_vector.Para
estetipodedatoselVHDLnotieneimplementadosoperadoresaritmticos50.Porejemplo,
si queremos realizar una suma de seales std_logic_vector debemos implementar
nosotros el sumador. Esto tiene sentido, ya que con el tipo std_logic_vector no se
especificaqunmerorepresenta,esdecirnosabemossisecorrespondeconunbinario
puro,ositienesigno,yenesecaso,siselarepresentacinesencomplementoados,signo
magnitud, ... Sin embargo, si usamos vectores de tipo unsigned signed ya estamos
especificandolarepresentacinyelsintetizadorpodrimplementaralgunasoperaciones
pornosotros.
En este captulo veremos los paquetes matemticos necesarios para implementar las
operaciones.Posteriormenteveremoscmotrabajarconlostipos unsignedy signedpara
realizar operaciones de suma y resta. A continuacin vermos cmo describir una
multiplicacin entera y analizaremos con cierto detalle las ventajas e inconvenientes de
algunas implementaciones. Por ltimo se introducir cmo se podra implementar la
operacindeladivisinentera.

49 Enlareferencia[19mach]seexplicacmodescribirelhardwaredesumadoresyrestadoresusando
esquemticos.
50 Estodependedelpaquete.Elpaquetenumeric_stdnolaspermite,peroelpaquete
std_logic_unsignedslaspermite,aunqueestopuedellevaraerror.Poreso,comoveremos,se
recomiendaelpaquetenumeric_std.

Departamento de Tecnologa Electrnica 135


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

8.1. Paquetes matemticos


Para usar los tipos unsigned y signed debemos usar ciertos paquetes (packages) que
definenestostiposylasoperaciones.Existendospaquetesqueimplementanestostiposel
IEEE.NUMERIC_STD y el IEEE.STD_LOGIC_ARITH. El primero es estndar y su uso est ms
recomendado51,aunqueambossepuedenutilizar.Aspues,cambiaremoslacabecerade
nuestroficheroacomosemuestraenelcdigo8.1:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; -- usaremos este

Cdigo 8.1: Llamada al paquete numeric_std, recomendado

YquitaremoslasqueXilinxponepordefecto:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; -- esta no usaremos
use IEEE.STD_LOGIC_UNSIGNED.ALL; -- esta no usaremos

Cdigo 8.2: Llamada a los paquetes std_logic_arith y std_logic_unsigned, no recomendado,


usaremos el del cdigo 8.1

De todas maneras es correcto usar ambos paquetes, pero s es importante que todos los
mdulos de tu diseo usen los mismos paquetes y no mezclar numeric_std con
std_logic_arith.

Siquieresecharunvistazoaestospaquetes,suelenestareneldirectoriodeinstalacinde
Xilinx, probablemente lo encontrars en C:\Xilinx92i\vhdl\src\ieee. All estn todos los
ficheros .vhd de los paquetes. Dentro de ellos puedes mirar las declaraciones de las
funciones,tipos,constantes,...ElVHDLdeestospaquetespuedeserunpococomplicado.
Ten cuidado de no modificar estos ficheros, si los vas a ver a menudo, cpialos en otro
directorio.Detodosmodosestosficherossonfcilesdeencontrareninternet.

8.2. Tipos unsigned y signed


Ya hemos trabajado con los tipos unsigned y signed (apartado 4.2 y captulo 6 de la
referencia [17mach]). A diferencia de los integer que son datos escalares, los signed y
unsignedsonvectores,cuyoselementosrepresentanlosbitsdelaseal.

El uso de estos tipos se recomienda frente al uso de enteros. Aunque parezca ms fcil
utilizar los tipos enteros, el uso de stos puede hacer que cometamos errores. Por otro
lado, el uso de tipos vectoriales nos facilita la descripcin de muchas operaciones
habituales en los circuitos digitales, como por ejemplo el desplazamiento, el uso de
mscaras o la asignacin de bits concretos. Adems, nos da una visin ms prxima al
hardwareque estamosdescribiendo,yaquecadaelementodelvectorsecorrespondecon
uncabledelcircuito.
Una seal de tipo unsigned representa un nmero entero sin signo, por tanto se
corresponde con un nmero entero en binario puro. Mientras que una seal de tipo
signedrepresentaunnmeroenteroconsignorepresentadoencomplementoados.

51Elusodelpaquetestd_logic_arith puededarlugaraambigedadesyerrores.Siquieresprofundizar
consultaelsiguienteenlace:
http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf

136 Universidad Rey Juan Carlos


8. Circuitos aritmticos

Enlossiguientesejemplos,parafacilitarlaidentificacindelostiposdesealesusaremos
lassiguientesterminacionesenlosnombresdelasseales:
_us: sealesdetipounsigned
_s: sealesdetiposigned
_slv: sealesdetipostd_logic_vector
_sl: sealesdetipostd_logic
_int_ps: sealesdetipointegerconrangopositivo(sinsigno)

_int: sealesdetipointegerconrangopositivoynegativo(consigno)
Opcionalmente, cuando sea de utilidad, al final del nombre se aadir un nmero que
indicarelnmerodebitsdelaseal.As,lasealsenal_slv3,seraunstd_logic_vector
de3bits(rangode2a0).
Siguiendoestanotacin,enelcdigo8.3muestraladeclaracindetresseales: unsigned,
signedystd_logic_vector.

En las ltimas sentencias del cdigo se muestra cmo asignando los mismos bits los
valoresrepresentadossondistintossegneltipodedatos.Enelcasodelasealdetipo
std_logic_vector,stanodeberaderepresentarningnnumero,yaspasasiseutilizael
paquete numeric_std (cdigo 8.1). Sin embargo, si se usa el paquete std_logic_arith
(cdigo8.2)seconsidera queesunnmerosinsigno,yestopuedellevaraerrorsinolo
tienes en cuenta. Por esto no se recomienda el uso de los paquetes std_logic_arith y
std_logic_unsigned(cdigo8.2).
signal senal_us3 : unsigned (2 downto 0);
signal senal_s3 : signed (2 downto 0);
signal senal_slv3 : std_logic_vector (2 downto 0);
...
begin
senal_us3 <= "111"; -- representa 7 en decimal
senal_s3 <= "111"; -- representa -1 en decimal
senal_slv3 <= "111"; -- no representa un numero, aunque si se usa el
-- paquete STD_LOGIC_UNSIGNED es 7

Cdigo 8.3: Comparacin entre tipos unsigned, signed y std_logic_vector

Acontinuacinveremosrealizarconversionesentrelostiposnumricos.

8.3. Conversin de tipos numricos


Paraconvertirlostiposdedatosseusancastyfuncionesdeconversin.

8.3.1. Asignacin de bits


Como muestra el cdigo 8.4, los elementos (bits) de los unsigned signed y
std_logic_vectorsepuedenasignarautomticamenteentreellosyastd_logic.
signal senal_sl : std_logic;
signal senal_slv : std_logic_vector (c_nbits-1 downto 0);
signal senal_us : unsigned (c_nbits-1 downto 0);
signal senal_s : signed (c_nbits-1 downto 0);
...
begin
senal_sl <= senal_us(2); -- elemento (bit) de unsigned a std_logic
senal_slv(0) <= senal_s(1); -- bit de signed a bit de std_logic
senal_us(1) <= senal_slv(0); -- bit de std_logic_vector a bit de unsigned
senal_s(2) <= senal_us(1); -- bit de unsigned a bit de signed

Cdigo 8.4: Conversin directa entre elementos (bits) de vectores y con std_logic

Departamento de Tecnologa Electrnica 137


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

8.3.2. Conversiones
Lasconversionesentretipos unsignedy signedaltipo std_logic_vectorsedebeusarun
cast.Lassealesdebentenerelmismorango.
signal senal_sl : std_logic;
signal senal_slv : std_logic_vector (c_bits-1 downto 0);
signal senal_us : unsigned (c_bits-1 downto 0);
signal senal_s : signed (c_bits-1 downto 0);
...
begin
senal_slv <= std_logic_vector(senal_us); -- de unsigned a std_logic_vector
senal_slv <= std_logic_vector(senal_s); -- de signed a std_logic_vector
senal_s <= signed (senal_slv); -- de std_logic_vector a signed
senal_us <= unsigned (senal_slv); -- de std_logic_vector a unsigned

Cdigo 8.5: Conversin cast entre signed y unsigned con std_logic_vector (del mismo rango)

Paraconvertirsignedyunsignedainteger,sedebenusarfuncionesdeconversin:
signal senal_int_ps : integer range 0 to 255;
signal senal_int : integer range -128 to 127;
signal senal_us8 : unsigned (7 downto 0);
signal senal_s8 : signed (7 downto 0);
...
begin
senal_int_ps <= TO_INTEGER (senal_us8); -- de unsigned a entero sin signo
senal_int <= TO_INTEGER (senal_s8); -- de signed a entero con signo
-- de entero sin signo a unsigned, 8: indica el n bits:
senal_us8 <= TO_UNSIGNED(senal_int_ps,8);
-- de entero con signo a signed, 8: indica el n bits:
senal_s8 <= TO_SIGNED (senal_int,8);

Cdigo 8.6: Funciones de conversin entre signed y unsigned a integer, usando el paquete
numeric_std

Si se usa el paquete std_logic_arith las funciones de conversin son conv_integer,


conv_signed y conv_unsigned, en vez de to_integer, to_signed y to_unsigned
respectivamente.
La diferencia entre las asignaciones del cdigo 8.5 con las del cdigo 8.6 es que en las
primeras se realiza un cast y en las segundas se utiliza una funcin de conversin que
estnenlospaquetes.
Por un lado el cast es una reinterpretacin del significado de la seal, pero la seal
mantieneelmismonmerodebitsyelmismoformato.Enelejemplodelcdigo8.5,lo
queanteseraunvectorde8bitssinningnsignificadonumricopasaaserunnmero
codificadoenbinarioconsignoosinsignosegnusemoselcast signedo unsigned.Ola
conversin contraria, un nmero binario que pasa a ser considerado un vector de 8 bits
sininterpretacinnumrica.
Porotroladolaconversin(cdigo8.6)sueleimplicaruncambioenelformatodeldato.
En el ejemplo se realizan conversiones entre nmeros escalares (integer) y nmeros
vectoriales(signedyunsigned).
Para convertir de std_logic_vector a entero se requieren dos pasos. Primero se debe
realizarprimerouncastasignedounsignedyluegounaconversinaentero.Pararealizar
la conversin contraria, se convierte primero el entero a signed o unsigned y luego se
realiza el cast a std_logic_vector. En el cdigo 8.7 se muestran ejemplos de estas
conversiones. Se ha omitido la declaracin de la mayora de las seales, pues se
corresponderanconlasdelcdigo8.6.

138 Universidad Rey Juan Carlos


8. Circuitos aritmticos

signal senal_slv8 : std_logic_vector (7 downto 0);


...
begin
-- de std_logic_vector a entero sin signo:
senal_int_ps <= TO_INTEGER(unsigned(senal_slv8));
-- de std_logic_vector a entero con signo:
senal_int <= TO_INTEGER(signed(senal_slv8));
-- de entero sin signo a std_logic_vector:
senal_slv8 <= std_logic_vector(TO_UNSIGNED(senal_int_ps,8));
-- de entero sin signo a std_logic_vector:
senal_slv8 <= std_logic_vector(TO_SIGNED(senal_int,8));

Cdigo 8.7: Conversin entre integer y std_logic_vector

8.4. Uso de constantes numricas


No podremos asignar directamente una constante decimal a un signed o unsigned,
aunque s podemos comparar, o utilizarlos si interviene en una operacin (por ejemplo
unasuma).Elcdigo8.8muestraunamaneraderealizarasignacindeconstantes.
signal sa_us8, sb_us8, sc_us8 : unsigned (7 downto 0);
...
begin
-- No se puede asignar la constante 5 directamente
-- sa_us8 <= 5; --> esto no se puede
sa_us8 <= TO_UNSIGNED(5,8);
-- Las constantes se pueden usar con otras operaciones
sb_us8 <= sa_us8 + 5;
-- Las constantes se pueden usar con comparaciones
sc_us8 <= TO_UNSIGNED(5,8) when (sb_us8 = 5) else TO_UNSIGNED(1,8);

Cdigo 8.8: Asignacin de constantes a un unsigned y uso de constantes en operaciones

8.5. Suma de nmeros positivos


Pararealizarunasumatenemosqueconsiderarelrangodelosoperandosyelacarreo.Es
interesante adems que recuerdes cmo se realiza un sumador con esquemticos
[19mach].
Enesteapartadoveremoscmosumarnmerossinsigno(unsigned),lasumadenmeros
consignoseverenelapartadosiguientequesedescribelaresta.
EnVHDL,lasumadossealesunsigneddelmismorangodacomoresultadoununsigned
delmismorango.Porconsiguiente,sinolotenemosencuenta,perderemoselacarreo.En
elcdigo8.9semuestraesteejemplo.
signal sa_us4, sb_us4, resul_us4 : unsigned (3 downto 0);
...
begin
-- Suma sin acarreo:
resul_us4 <= sa_us4 + sb_us4;

Cdigo 8.9: Suma de tipos unsigned sin considerar el acarreo

Comolasumadelcdigo8.9notieneencuentaelacarreonospuedellevararesultados
errneos.Parasolucionarlotenemosquedosopciones:
Aumentarenunoelrangodelresultado
Avisardequehahabidoundesbordamiento(overflow)
En el ejemplo del cdigo 8.9, como los sumandos tienen 4 bits, el resultado de la suma
tendrcomomximo5bits(verfigura8.1).Estaeslareglageneralparacualquiernmero
debits,elresultadotendrcomomximounbitmsquelosoperandos.

Departamento de Tecnologa Electrnica 139


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

1111 1510
+1111 1510
No representable con 4 bits
11110 3010
Representable con 5 bits

Desbordamiento

Figura 8.1: Desbordamiento en la suma de nmeros sin signo

Sin embargo no basta con asignar el resultado a un unsigned de 5 bits. El cdigo 8.10
muestraunamaneraerrneadeintentarsolucionarelproblema.
signal sa_us4, sb_us4 : unsigned (3 downto 0);
signal resul_us5 : unsigned (4 downto 0);
...
begin
resul_us5 <= sa_us4 + sb_us4; -- MAL

Cdigo 8.10: Suma de tipos unsigned considerando el acarreo de manera errnea

Hay que tener cuidado con descripciones como la del cdigo 8.10 pues a veces las
herramientas dediseonolaconsideranerrnea.Porejemplo,laversinqueusamosdel
ISEslodaunaadvertencia(warning52)yponedirectamenteaceroelbit4delresultado.
Estoharaquenuestrodiseonofuncionasecomoesperamos.Poresoesimportanteleer
lasadvertenciasdelISEysimularelcircuito.
Paraincluirelacarreoenelresultadopodemosconcatenarunceroalaizquierdadelos
sumandos.Deestamaneralossumandostendrn5bitsyproporcionarnunresultadode
5bits.Paraconcatenarseutilizaeloperador&.
Enelcdigo8.11semuestracmoconsiderarlosacarreos.Ladeclaracindelassealeses
lamismaqueladelcdigo8.10
resul_us5 <= ('0' & sa_us4) + ('0' & sb_us4);

Cdigo 8.11: Suma considerando el acarreo de tipos unsigned

Sin embargo, no siempre podemos aumentar el tamao del resultado. En este caso
tendremos que avisar si ha habido desbordamiento. Lo podremos hacer extrayendo los
cuatro primeros bits del resultado, y dejando el bit ms significativo como seal de
desbordamiento(ov).
signal sa_us4, sb_us4, resul_us4 : unsigned (3 downto 0);
signal resul_us5 : unsigned (4 downto 0);
signal ov : std_logic; -- aviso de desbordamiento (overflow)
...
begin
resul_us5 <= ('0' & sa_us4) + ('0' & sb_us4); -- resultado interno
resul_us4 <= resul_us5(3 downto 0); -- resultado de 4 bits
ov <= resul_us5(4); -- senal de desbordamiento

Cdigo 8.12: Suma de unsigned con aviso de desbordamiento

Observa en el cdigo 8.12 que trabajar con tipos vectoriales como unsigned permite
extraer de manera sencilla el desbordamiento (ov). Si utilizsemos tipos escalares sera
ms complicado y no tendramos el mismo control sobre los desbordamientos y el
nmerodebitsqueestamosutilizandoencadaoperacin.

8.5.1. Informe de sntesis


Es interesante mirar los informes de la sntesis del ISE, en stos se muestran los
sumadoresquesehangeneradoyelnmerodebitsdelsumador.Paraverelinformede
sntesis, dentro de la subventana Processes, pincha en Synthesize - XSTView Synthesis

52Elwarningquedadiceas:Widthmismatch.<resul_us5>hasawidthof5bitsbutassignedexpressionis4bitwide.

140 Universidad Rey Juan Carlos


8. Circuitos aritmticos

Report.Enlaventanadeladerechaaparecerelinforme,dondepuedesbuscarelnmero
desumadores/restadoresquesehancreadoyelnmerodebitsdecadaunodeellos.En
lafigura8.2semuestraunapartedelinformeparaelsumadordelcdigo8.11.Vemosque
sehacreadounsumadorde5bits,queesloquequeramosparaconsiderarelacarreo.

Sumador de 5 bits

Synthesize
Sy nthesize
- XST

View
Synthesis
Report


Figura 8.2: Informe de sntesis

Engeneralesinteresanteecharleunvistazoal informede sntesis,endondesemuestra


msinformacin,comoelnmerodeLUTs53utilizadasyestimacionestemporales.
Hay otras formas de acceder al informe de sntesis, por ejemplo accediendo al resumen
deldiseo54(Design Summary)ydesdeallpuedespincharenelSynthesis Report.

8.5.2. Esquema RTL


Una vez realizada la sntesis podemos ver el esquema RTL del circuito resultante. Para
ello pinchamos en Synthesize - XSTView RTL Schematic. Aparecer una caja
representandoalcircuitoconsuspuertosdeentradaysalida(figura8.3).

53 LUT:LookUpTable,tablasdeconsultaqueenlasFPGAsseutilizanparaimplementarlasfuncioneslgicas
54 Recuerdalospasos1y2delafigura7.35

Departamento de Tecnologa Electrnica 141


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Doble click
dentro del
circuito


Figura 8.3: Esquema RTL

Haciendodobleclickdentrodelacajaveremoselesquemadelsumador(figura8.4).
Pinchandoenloselementosdelesquemasemuestrainformacinenlasventanasdeabajo.
De esta manera se pueden identificar las seales y ver cmo se ha sintetizado nuestro
diseo. Para circuitos muy grandes se requiere paciencia por la gran cantidad de
elementosquepuedellegarahaber.


Figura 8.4: Esquema RTL del sumador

Encircuitosestructuralessepodrpincharenlascajasquehabrdentrodecadacircuito.
Para volver a los circuitos de mayor jerarqua basta con hacer doble click fuera del
circuito.

142 Universidad Rey Juan Carlos


8. Circuitos aritmticos

8.6. Resta de nmeros positivos


En este apartado veremos cmo hacer la resta de nmeros positivos, considerando el
resultadocomonmeropositivo(magnitudomdulo)yteniendounasealdeunbitque
indicarelsigno.Estoesequivalentealarepresentacinensignoymagnitud.
Si queremos realizar una resta de nmeros positivos y queremos obtener el resultado
como nmero positivo, tenemos que poner como minuendo el nmero mayor y como
sustraendo el menor. Por lo tanto, antes de realizar la resta tendremos que comparar y
realizarlasasignacionescorrespondientessegnquinseaelmayor.Sihemostenidoque
intercambiarminuendoporsustraendodeberemosavisarqueelresultadoesnegativo.
Estecircuitosepodradescribircomomuestraelcdigo8.13.Comoyasabemos,existen
muchas alternativas equivalentes para describir este circuito, por ejemplo, usando
procesos,otrassealesintermedias,...
entity restapositiva is
Port (
p_minuen_us : in unsigned (3 downto 0); -- Minuendo
p_sustr_us : in unsigned (3 downto 0); -- Sustraendo
p_resta_us : out unsigned (3 downto 0); -- Resta
-- si es 1 indica que el resultado es negativo minuendo < sustraendo
p_dif_negativa : out std_logic
);
end restapositiva;

architecture behavioral of restapositiva is


signal dif_negativa : std_logic;
begin
-- si el sustraendo es mayor que el minuendo la diferencia sera negativa
dif_negativa <= '0' when (p_minuen_us >= p_sustr_us) else '1';

p_resta_us <= (p_minuen_us - p_sustr_us) when dif_negativa = '0' else


(p_sustr_us - p_minuen_us);

p_dif_negativa <= dif_negativa;


end behavioral;
Cdigo 8.13: Resta de nmeros positivos

Comolarestadenmerospositivosenlaqueelminuendoeselmayorestacotadaentre
elvalordelminuendoycero,enestecasonotendremosdesbordamiento.

8.7. Suma y resta de nmeros enteros


Para sumar y restar nmeros enteros podemos combinar los apartados anteriores de
modo que siempre sumemos o restemos nmeros positivos y calculemos el signo del
resultado.Paraestoesnecesariorealizarunassencillascomprobacionesdelossignosylas
magnitudesdelosoperandos.Estaseralamaneradeoperarconnmerosrepresentados
consignoymagnitud.
Otraalternativa,msutilizadaenloscircuitosdigitales,esoperarencomplementoados.
Elcomplementoadospermiteoperarnmerospositivosynegativossinpreocuparnossi
tienendistintosigno.Asqueevitamoshacerlascomprobacionesquesehacenconsignoy
magnitud. En el apartado 8.7.3 se ha incluido un pequeo repaso de los nmeros en
complemento a dos. En la referencia [19mach] se explica cmo se realiza un
sumador/restadordenmerosencomplementoadosusandoesquemticos.
En VHDL, los nmeros en complemento a dos los podemos declarar como un signed.
Para realizar la suma o la resta slo nos tenemos que preocupar de los rangos y del

Departamento de Tecnologa Electrnica 143


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

desbordamiento. Los desbordamientos en las operaciones en complemento a dos son


distintosquelosproducidosconnmerossinsigno(recuerdalafigura8.1).
En la suma, el desbordamiento se produce cuando los dos sumandos tienen el mismo
signo y el resultado tiene un signo distinto. Esto est explicado en la figura 8.5 del
apartado8.7.3.
Con esto ya tenemos la informacin necesaria para describir el sumador de nmeros
enteros. El cdigo 8.14 muestra una posible implementacin del circuito, que incluye el
avisodedesbordamiento.
entity sumaentera is
Port (
p_sum1_s : in signed (3 downto 0);
p_sum2_s : in signed (3 downto 0);
p_resul_s : out signed (3 downto 0);
p_ov : out std_logic -- p_ov='1' -> desbordamiento
);
end sumaentera;

architecture behavioral of sumaentera is


signal resul_s : signed (3 downto 0);
begin
resul_s <= p_sum1_s + p_sum2_s;

-- calculo del desbordamiento: resultado con distinto signo que los 2 sumandos
p_ov <= ( p_sum1_s(3) and p_sum2_s(3) and not(resul_s(3))) or
(not(p_sum1_s(3)) and not(p_sum2_s(3)) and resul_s(3) );

p_resul_s <= resul_s;


end behavioral;
Cdigo 8.14: Suma de nmeros enteros

Encomplementoados,larestanoesmsqueunasumaenlaquesecambiaelsignodel
sustraendo55.ParadescribirunarestaenVHDL,simplementeponemoslaoperacindela
restaycalculamoseldesbordamientoconsecuentemente,esdecir,negandoelsustraendo..
Elcdigo8.15muestralassentenciasquecambiaranrespectoalasuma(cdigo8.14).
...
resul_s <= p_sum1_s - p_sum2_s;

-- calculo del desbordamiento: resultado con distinto signo que los 2 sumandos
p_ov <= ( p_sum1_s(3) and not(p_sum2_s(3)) and not(resul_s(3))) or
(not(p_sum1_s(3)) and p_sum2_s(3) and resul_s(3) );
Cdigo 8.15: Resta de nmeros enteros

8.7.1. Aumento del rango de la suma en complemento a dos


Lasuma56denmerosenterospuededesbordarse(figura8.5).Igualqueenelcasodela
sumadenmerospositivos(apartado8.5),sinoqueremostenerdesbordamientotenemos
queaumentarelrangodelresultadoenunbit.Enelcdigo8.11vimoscmoresolveresta
situacin para los nmeros positivos. En esta solucin concatenbamos un cero a la
izquierdadecadasumando.
Sin embargo, con nmeros enteros en complemento a dos no podemos hacer lo mismo
porqueestaramoscambiandoelsignodelosnmerosnegativos.Porejemplo,sitenemos
elnmero 1101(3)yleconcatenamosunceroalaizquierdaloconvertiremosen 01101,
quenosloahoraesunnmeropositivosinoquelohemosconvertidoenelnmero13.

55Recuerdaqueenlarepresentacinencomplementoados,cambiarelsignodeunnmeroescalcularsu
complementoados
56Ylaresta,quecomoyahemosdichonoesmsqueunasumacambiandoelsignodelsustraendo

144 Universidad Rey Juan Carlos


8. Circuitos aritmticos

Lasolucinesconcatenarunceroalaizquierdasielnmeroespositivoyununosiesel
nmeroesnegativo.Esdecir,concatenarconelvalordelbitmssignificativo,queesel
bit que indica el signo. As, por ejemplo, si tenemos 0010 (2), obtendremos 00010, que
siguesiendoel2.Ysitenemos1110(2),obtendremos11110,quesiguesiendoel2.
Porlotanto,laadaptacindelcdigo8.11anmerosenterossemuestraenelcdigo8.16.
resul_s5 <= (sa_s4(3) & sum1_s4) + (sb_s4(3) & sum2_s4);

Cdigo 8.16: Suma de tipos signed considerando el acarreo

8.7.2. Aumento del rango usando funciones y atributos *


Unaalternativaalcdigo8.16esusarlafuncin resize.Lafuncin resizeseencargade
redimensionar los vectores signed y unsigned. Esta funcin est en el paquete
numeric_std,porloquenolapodrsutilizarsiestasusandolospaquetesstd_logic_arith
ystd_logic_unsigned(recuerdaelapartado8.1).
Conestafuncinelcdigo8.16quedaracomomuestraelcdigo8.17.
resul_s5 <= resize(sum1_s4, 5) + resize(sum2_s4, 5)

Cdigo 8.17: Suma de tipos signed considerando el acarreo y utilizando la funcin resize

Enelprimerargumentodelafuncin resizeseponeelvector signedo unsigned,yenel


segundo argumento se pone el nmero de bits a los que se quiere redimensionar. La
funcinresizeredimensionarelvectoradecuadamentedependiendodeltipoydelsigno
delvector.
Sinembargopodemosobservarquerealmentenohaymuchadiferenciaentreloscdigos
8.17y8.16.Aunqueencasoqueelcambioseademuchosbitselcdigo8.17sermsclaro
yconciso.Porotrolado, resize estantopara signedcomopara unsigned.Silohacemos
nosotros, tendremos que elegir entre el cdigo 8.16 y el cdigo 8.10, segn sea signed o
unsigned.

Peroelcdigo8.17sepuedeoptimizar,envezdeusardirectamenteelnmerodebitsa
los que queremos convertir los sumandos (5 en el ejemplo), podemos usar el atributo
length, que nos devuelve el nmero de bits (longitud) de una seal. As, la expresin
resul_s5'length nosdevolverelnmerodebitsdelasealresul_s5,quees5.

Aunquenoloshemosnombradohastaahora,losatributosenVHDLseutilizanbastante.
Porejemplo,nosotrosyahemosutilizadoelatributoeventparalaexpresareleventodela
sealdereloj:clk'event(recuerdaporejemploelapartado2.6).
Losatributosseponenconunapstrofeacontinuacindelaseal.Haymuchostiposde
atributos, pero no todos son sintetizables o no son aceptados por las herramientas de
diseo.Asqueantesdeutilizarlosdebescomprobarquenohayproblemaconellos.
Utilizandoelatributolength,elcdigo8.17quedar:
resul_s5 <= resize(sum1_s4, resul_s5'length) + resize(sum2_s4, resul_s5'length);

Cdigo 8.18: Suma de tipos signed considerando el acarreo y utilizando la funcin resize con el atributo
length

Describiendoelsumadordeestamaneranolohacemosdependerdeunvalornumrico,
comoloerael3enelcdigo8.16el5enelcdigo8.17.Estotienemuchasventajas,ya
quesiqueremoscambiarelnmerodebitsdelsumadoryaseaparareutilizarlooporque
hayancambiadolasespecificaciones,nonecesitamoscambiarelvalornumrico,sinoque

Departamento de Tecnologa Electrnica 145


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

se hace automticamente al cambiar el rango de las seales en su declaracin. Esto nos


podrahorrarerroresdeedicinespecialmenteencircuitosgrandes.

8.7.3. Breve repaso del complemento a dos *


En este apartado se hace un pequeo recordatorio de la representacin de nmeros en
complemento a dos. En la tabla 8.1 se muestra la equivalencia de los nmeros en
compelementoadosdecuatrobits.
decimal 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
C2 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111

Tabla 8.1: Nmeros en complemento a dos de 4 bits y su correspondiente decimal

Losnmerospositivos(yelcero)representadosencomplementoadossiempretienenun
cero en el bit ms significativo. Como se ve en la tabla 8.1 los nmeros positivos en
complementoadossecorrespondenconlosbinariospuros.
Los nmeros negativos tienen un uno en el bit ms significativo. Para saber con qu
nmerosecorrespondenseinviertenloscerosporunosylosunosporcerosyalresultado
selesumauno.
Porejemplo,sitenemosel1011.
Vemosqueesunnmeronegativoporquetieneununoenelbitmssignificativo.
Invertimoscerosporunosyunosporceros:0100
Sumamosuno(0100+0001) =0101,queeselnmero5enbinario
Porlotanto,1011eselnmero5
Esta operacin es la misma para hallar el complemento a dos de cualquier nmero
(negarlo).
Enlasumadenmerosencomplementoadoseldesbordamientoseproducecuandolos
dossumandostienenelmismosignoyelresultadotiene unsignodistinto.Lafigura8.5
muestraconejemploscundoseproducedesbordamiento.

146 Universidad Rey Juan Carlos


8. Circuitos aritmticos

+ + - No desborda - + + No desborda

0000 010 1001 -7


+1111 +(-1)10 +0101 +5
Es representable
1111 -110 Representable 1110 -2
en Ca2 de 4 bits
iguales iguales
-110 -2
Sumandos con signos diferentes: Sumandos con signos diferentes:
No habr desbordamientoBien No habr desbordamientoBien

+ + + = + No desborda - + - = - No desborda
1001 -7
0100 4 +1111 +(-1)
Representable en
+0010 +2 1 1000 -8
Es representable Ca2 de 4 bits
0110 6 1000 en Ca2
en Ca2 de 4 bits iguales
iguales representa a
6 -8
Sin cambio de signo Bien Sin cambio de signo Bien
se ignora el acarreo

+ + + = - Desborda - + - = + Desborda

0110 6 1000 -8
+0101 +5 +1111 +(-1)
No representable No representable
1010 11 10111 -9
en Ca2 de 4 bits en Ca2 de 4 bits
al estar en Ca2 distintos al estar en Ca2 distintos
representa a representa a
-6 7
Cambio de signodesbordamiento Cambio de signodesbordamiento

Figura 8.5: Ejemplos de los casos de desbordamiento en la suma en complemento a dos

Para la resta, es equivalente que la suma pero habiendo cambiado previamente el signo
delsustraendo.

8.8. Multiplicacin
ElsintetizadordelISEimplementalamultiplicacindedosnmerosenteros.Elresultado
delamultiplicacintendrtantosbitscomolasumadelnmerodebitsdelosproductos.
Elcdigo8.19muestracmosedescribeunamultiplicacindenmerosenterossinsigno.
...
signal fact1_us4, fact2_us4 : unsigned (3 downto 0);
signal prod_us8 : unsigned (7 downto 0);
begin
prod_us8 <= fact1_us4 * fact2_us4;
...

Cdigo 8.19: Producto de dos unsigned produce un unsigned con un nmero de bits resultado de la suma
del nmero de bits de los factores

Las FPGA que usamos llevan integrados multiplicadores, por tanto, las operaciones de
multiplicacin entera quedan eficientemente implementadas automticamente. Sin
embargo,puedeserquenecesitemosimplementarmsmultiplicadoresquelosquetiene
laFPGA.LaFPGAdelaXUPV2Ptiene136,ladelaNexys2tiene20yladelaBasystiene4.
Esto lo puedes ver en el informe de sntesis, que indica el nmero de multiplicadores
totalesyusados.Enelcasoenelquesenecesitenmsmultiplicadoresquelosquetienela
FPGA,elsintetizadorlosimplementarconlgicacombinacional.
Enelcasoenelqueunodelosfactoresdelamultiplicacinseaunaconstante,stapodr
ser ms simple. Especialmente si la constante es potencia de dos. El mecanismo de la

Departamento de Tecnologa Electrnica 147


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

multiplicacinpordosenbinario es comolamultiplicacinpordiezendecimal,esdecir,
basta con aadir ceros a la derecha. As que una multiplicacin por dos es un
desplazamientoalaizquierda,conestosereducemuchsimola lgica requeridaparasu
implementacin.
Cuandosemultiplicaporunaconstante,elrangodelresultadoeseldobledelnmerode
bits del factor que no es constante. Este lleva implcito una consecuencia que hay que
tener en cuenta: no podemos multiplicar un nmero por una constante de rango mayor
queelnmero.
As,elcdigo8.20seracomomultiplicarporcero,porquesetruncalaconstantealmismo
nmerodebitsque fact_us4.Portantoel16(10000b)sequedaraen0(0000b)porhaber
truncado el uno que est en el bit ms significativo. Para solucionarlo, tenemos que
ampliarelrangodelfactorenunbityampliarelrangodelproducto.Enelcdigo8.21se
muestracmosehahechoesto.
... ...
signal fact_us4: unsigned(3 downto 0); signal fact_us4: unsigned(3 downto 0);
signal prod_us8: unsigned(7 downto 0); signal prod_us10:unsigned(9 downto 0);
begin begin
prod_us8 <= fact_us4 * 16; prod_us10 <= ('0'&fact_us4) * 16;
... ...
Cdigo 8.20: Producto por una constante de rango Cdigo 8.21: Producto por una constante de rango
mayor. Errneo mayor. Correcto

8.8.1. Algoritmo de la multiplicacin


Enesteapartadoseexplicarcmoeselalgoritmodelamultiplicacinyenlossiguientes
se describirn varias maneras de implementar un multiplicador. Aunque un
multiplicadorlopodemosdescribircomosemostrenelcdigo8.19yelsintetizadorse
encarga de implementarlo, este apartado puede ser til porque se darn algunas
indicaciones tiles para implementar otros operadores como la divisin, se analizarn
distintasestrategiasparaimplementarciertostiposdeoperadoresysevernmanerasms
avanzadasdedescribircircuitosenVHDL.
Antesvercmoimplementarlamultiplicacinvamosaanalizarculeselmecanismoque
utilizamos al multiplicar. La figura 8.6 muestra una multiplicacin con nmeros
decimalesyasuderechalamismamultiplicacinenbinario.
9 1001 : 9
x 13 x 1101 : 13
27 1001 9
+ 9 0000 0
117 1001 36
+ 1001 72
1110101 : 117
Figura 8.6: Ejemplos de multiplicacin entera en decimal y en binario

Siobservamoslafigura8.6podemosverquelosmecanismosdelamultiplicacindecimal
ybinariasonsimilares:semultiplicacadacifradelfactordeabajoporelfactordearriba.
Elresultadodelamultiplicacinsedesplazatantascifrasalaizquierdacomolacifradel
factordeabajo.Recuerdaquedesplazaralaizquierdaesequivalenteamultiplicarporla
base, en decimal 10 y en binario 2. Por ltimo se suman todas las multiplicaciones
parcialesyseobtieneelproducto.

148 Universidad Rey Juan Carlos


8. Circuitos aritmticos

En el caso de la multiplicacin binaria las multiplicaciones parciales son muy sencillas


porquelasnicasposibilidadessonmultiplicarporcerooporuno.Comoveremos,estas
multiplicacionessepuedenimplementarconpuertasand.

8.8.2. Implementacin de un multiplicador combinacional


Como hemos visto, para implementar la multiplicacin tendremos que realizar sumas,
desplazamientosymultiplicacionesporunoycero.
Eldiseoenesquemticosdeestecircuitosepodraimplementarcomomuestralafigura
8.7.Elmultiplicadortendrtantasetapascomobitsdelosfactores.Laprimeraetapaesla
nicaquenotienesumador57.
1001 fact1 fact1
x 1101 fact2(0)
1001 resul1 fact2(0)

+
1 prod(0) prod(0)
resul1
fact1
1001 fact1 fact2(1)
x 1101 fact2(1)
0100 resul1(4 downto 1) '0''0' '0'
+ 0000 sum_anded2
0010 resul2 sum_anded2

01
prod(1) +

prod(1)
resul2
fact1
1001 fact1
fact2(2)
x 1101 fact2(2)

0010 resul2(4 downt0 1) '0' '0'


+ 1001 sum_anded3
sum_anded3
101 resul3

101
+
prod(2)

prod(2)
resul3
fact1
1001 fact1 fact2(3)
x 1101 fact2(3)
'0' '0'
0101 resul3(4 downto 1) sum_anded4
+ 1001 sum_anded4
1110101 resul4 prod
+

resul4

prod(7 downto 3)

Figura 8.7: Esquema del multiplicador combinacional

Enlaimplementacinsehanhecholassumasparcialesconformesevamultiplicando.La
figura8.8muestralacorrespondenciadelosnombresquesehandadoalasseales.

57 Tambinsepuedeponerunsumadorenelqueunodelossumandosescero.

Departamento de Tecnologa Electrnica 149


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

1001 fact1
x 1101 fact2
1001 resul1 +
resul2 +
0000 sum_anded2 resul3 +
1001 sum_anded3 resul4
+ 1001 sum_anded4
1110101 prod
Figura 8.8: Sumas parciales para la multiplicacin

Lassealesson:
Losnmerosquesevanamultiplicar(factores):fact1yfact2
Los sumandos que ya se han multiplicado usando una puerta and: sum_anded1,
sum_anded2,sum_anded3
Las sumas parciales: resul1, resul2, resul3 y resul4. Las seales sum_anded1 y resul1
seranequivalentes
Elresultadodelamultiplicacin(producto):prod
ElVHDLdeesteesquemticopodraserelmostradoenelcdigo8.22.
entity mult_comb is
Port (
fact1 : in unsigned (3 downto 0);
fact2 : in unsigned (3 downto 0);
prod : out unsigned (7 downto 0)
);
end mult_comb;

architecture behavioral of mult_comb is


signal sum_anded1, sum_anded2, sum_anded3, sum_anded4 : unsigned(3 downto 0);
signal resul1, resul2, resul3, resul4 : unsigned(4 downto 0);
begin
-- primera etapa
sum_anded1 <= fact1 when fact2(0) = '1' else (others => '0');
resul1 <= '0' & sum_anded1;
prod(0) <= resul1(0);
-- segunda etapa
sum_anded2 <= fact1 when fact2(1) = '1' else (others => '0');
resul2 <= ('0' & resul1(4 downto 1)) + ('0' & sum_anded2);
prod(1) <= resul2(0);
-- tercera etapa
sum_anded3 <= fact1 when fact2(2) = '1' else (others => '0');
resul3 <= ('0' & resul2(4 downto 1)) + ('0' & sum_anded3);
prod(2) <= resul3(0);
-- cuarta etapa
sum_anded4 <= fact1 when fact2(3) = '1' else (others => '0');
resul4 <= ('0' & resul3(4 downto 1)) + ('0' & sum_anded4);
-- final:
prod(7 downto 3) <= resul4;
end behavioral;
Cdigo 8.22: Multiplicacin combinacional con sentencias concurrentes

Fjatequelassentenciasdelcdigo8.22sonconcurrentes,esdecir,noestndentrodeun
proceso.

8.8.3. Implementacin de un multiplicador combinacional genrico *


Elmultiplicadordelapartadoanterioresdecuatrobits58,siendoelresultadodeochobits.
Podemosverqueexceptolaprimeraetapa,elrestodeetapassonmuysimilares.Siahora
tuvisemosquedisearunmultiplicadorde16bits(32bitsparaelproducto)tendramos
que implementar las 16 etapas copiando y pegando de las anteriores. Esto, adems del
tiempoinvertido,favorecelaaparicindeerrores.

58Tambinsellamamultiplicador4x4

150 Universidad Rey Juan Carlos


8. Circuitos aritmticos

Para solucionar esto el VHDL permite generar sentencias repetitivas mediante la


sentencia generate. En este apartado veremos primero la sentencia generate que nos
permitereplicarsentenciasconcurrentessimilaresyposteriormentelaveremosaplicadaa
unmultiplicadorgenricoenelquepodremosvariarelnmerodebitsdelosfactorescon
genricos(recuerdaelapartado6.2).
8.8.3.1. La sentencia generate *
En VHDL se pueden generar sentencias repetitivas mediante la sentencia generate. Por
ejemplo, si queremos asignar a una seal los elementos de otra seal pero invertidos,
podramos hacerlo como en el cdigo 8.23. Como siempre, el VHDL tiene varias
alternativasparadescribirlamismacosa, yestasentencia generateno eslanicamanera
dedescribirestafuncionalidad.Enelcdigo8.24semuestracmohacerlo.
entity gen is
Port (
p_in : in std_logic_vector (3 downto 0);
... p_out : out std_logic_vector (3 downto 0)
begin );
p_out(0) <= p_in(3); end gen;
p_out(1) <= p_in(2);
p_out(2) <= p_in(1); architecture behavioral of gen is
p_out(3) <= p_in(0); begin
end behavioral; GENER: for i in 0 to 3 generate
p_out(i) <= p_in(3-i);
Cdigo 8.23: Asignacin invirtiendo el end generate;
orden de los bits end behavioral;
Cdigo 8.24: Asignacin invirtiendo el orden de los bits usando
la sentencia generate

Lascaractersticasbsicasdelasentenciagenerateson:
Esunasentenciaconcurrente,porloquenopuedeirdentrodeunproceso59.
Replicalassentenciasquecontieneconformealndicedelfor60 (enelejemplo:i)
Estendicenosedeclarayelrangonopuedeservariable(peropuedeserungenrico).
La sentencia generate empieza con una etiqueta (en el ejemplo: GENER), similar a las
etiquetasdelosprocesosylareferenciaacomponentes.
En el ejemplo puedes observar que si copias la sentencia interna del generate para los
cuatrovaloresdelndicesegeneranlasmismassentenciasdelcdigo8.23.
8.8.3.2. Multiplicacin con sentencia generate *
Ahoraqueconocemoslasentencia generatepodemosreescribirelmultiplicador(cdigo
8.22)demodoqueelanchodelosfactoresseagenrico.Enelcdigo8.25semuestrael
multiplicadorcombinacionalgenrico.

59 Dentrodelosprocesossepuedeutilizarlasentencialoopquetienealgunassimilitudes
60 Elgeneratetambinpuedesercondicionalconunif,envezdeiterativoconelfor.

Departamento de Tecnologa Electrnica 151


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

entity mult_comb_gen is
Generic (
g_bits : natural := 4
);
Port (
fact1 : in unsigned (g_bits-1 downto 0);
fact2 : in unsigned (g_bits-1 downto 0);
prod : out unsigned (2*g_bits-1 downto 0) -- doble de bits para el producto
);
end mult_comb_gen;

architecture behavioral of mult_comb_gen is


type t_vector_sumand is array (1 to g_bits) of unsigned (g_bits-1 downto 0);
type t_vector_resul is array (1 to g_bits) of unsigned (g_bits downto 0);
signal sum_anded : t_vector_sumand;
signal resul : t_vector_resul;
begin
-- primera etapa
sum_anded(1) <= fact1 when fact2(0) = '1' else (others => '0');
resul(1) <= '0' & sum_anded(1);
prod(0) <= resul(1)(0);
-- resto de etapas
gen_mult: for i in 1 to g_bits-1 generate
sum_anded(i+1) <= fact1 when fact2(i)='1' else (others =>'0');
resul(i+1) <= ('0' & resul(i)(g_bits downto 1)) + ('0' & sum_anded(i+1));
prod(i) <= resul(i+1)(0);
end generate;
-- final:
prod(2*g_bits-1 downto g_bits) <= resul(g_bits)(g_bits downto 1);
end behavioral;
Cdigo 8.25: Multiplicador combinacional genrico

Observandoelcdigo8.25podemosverque:
Elnmerodebitsdelosfactoresvienedefinidoporelgenricog_bits
Lasseales sum_anded1, sum_anded2,...y resul1, resul2,...sehatenidoqueagruparen
vectoresparapoderusarlasdemaneraiterativaconelndicedelgenerate.
Parapoderdeclararestosvectoreshayquedefiniruntipodedatosqueesunvectorde
vectores.Enestecasosonvectoresde unsigned.Luegolassealessedeclaranconestos
nuevostipos.
En general no se recomienda realizar el diseo genrico a la primera, sino realizar una
primeraversinparauncasoparticular,verquefuncionabienyluegogeneralizarla.Ya
queeldiseogenricoesmscomplicado.
8.8.3.3. Banco de pruebas para el multiplicador genrico *
Alhacerundiseogenricocomoelqueacabamosdever,tenemosquerealizarunbanco
depruebasqueseadaptealosdistintosvaloresdeldiseo.Enelcdigo8.26semuestra
unejemplodeestetipodebancosdeprueba.

152 Universidad Rey Juan Carlos


8. Circuitos aritmticos

entity tb_mult_comb_gen is
Generic (
g_bits : natural := 4
);
end tb_mult_comb_gen;

architecture TB of tb_mult_comb_gen is
component mult_comb_gen
Generic (
g_bits : natural := 4
);
Port (
fact1 : in unsigned (g_bits-1 downto 0);
fact2 : in unsigned (g_bits-1 downto 0);
prod : out unsigned (2*g_bits-1 downto 0)
);
end component;

signal fact1, fact2 : unsigned (g_bits-1 downto 0);


signal prod : unsigned (2*g_bits-1 downto 0);
begin
uut: mult_comb_gen
generic map (
g_bits => g_bits
)
port map(
fact1 => fact1,
fact2 => fact2,
prod => prod
);

P_stim: Process
begin
for i in 0 to 2**g_bits-1 loop
fact1 <= to_unsigned (i, g_bits);
for j in 0 to 2**g_bits-1 loop
fact2 <= to_unsigned (j, g_bits);
wait for 50 ns;
assert prod = i*j
report "Fallo en la multiplicacion"
severity ERROR;
wait for 50 ns;
end loop;
end loop;
wait;
end process;
end TB;
Cdigo 8.26: Banco de pruebas para el multiplicador combinacional genrico

Fjate que este banco de prueba es exhaustivo porque realiza todas las multiplicaciones
posibles para el rango de los factores. El banco de pruebas incluye adems la sentencia
assertquehacequeautocompruebesihahabidoalgnerror.

Observaademsqueenlosrangosavecesseutilizalamultiplicacin(unsloasterisco)y
otraslaexponenciacin(dosasteriscos),asegratequeentiendesporqu.

8.8.4. Implementacin de un multiplicador estructural *


Como ya sabemos, el VHDL permite mltiples descripciones para la misma
funcionalidad. Una alternativa a la descripcin del multiplicador combinacional del
apartado8.8.2esimplementarlodemaneraestructural.
Por ejemplo, podemos describir la estructura que se repite en la figura 8.7 como un
componente.Esdecir,describirlaentidaddelafigura8.9

Departamento de Tecnologa Electrnica 153


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

sum sum_and

p_and

'0' '0'

suma_and
+

resul

Figura 8.9: Componente bsico del multiplicador

La descripcin del mdulo de la figura 8.9 no tiene mayor dificultad y se deja como
ejercicio. El mdulo estructural tampoco es difcil, se ha incluido en el cdigo 8.27.
Observaqueadiferenciadelasversionesdeloscdigos8.22y8.25,enlaprimeraetapase
ha puesto un sumador con un sumando igual a cero, por lo que funcionalmente son
equivalentes.
entity mult_struct is
port (
fact1 : in unsigned (3 downto 0);
fact2 : in unsigned (3 downto 0);
prod : out unsigned (7 downto 0)
);
end mult_struct;

architecture behavioral of mult_struct is


constant c_cero : unsigned (3 downto 0) := "0000";
signal resul0, resul1, resul2, resul3 : unsigned (4 downto 0);

component suma_and is
port (
sum : in unsigned (3 downto 0);
sum_and : in unsigned (3 downto 0);
p_and : in std_logic;
resul : out unsigned (4 downto 0)
);
end component;

begin

154 Universidad Rey Juan Carlos


8. Circuitos aritmticos

C_SUM_AND0: suma_and
port map (
sum => c_cero,
sum_and => fact1,
p_and => fact2(0),
resul => resul0
);
prod(0) <= resul0(0);

C_SUM_AND1: suma_and
port map (
sum => resul0 (4 downto 1),
sum_and => fact1,
p_and => fact2(1),
resul => resul1
);
prod(1) <= resul1(0);

C_SUM_AND2: suma_and
port map (
sum => resul1 (4 downto 1),
sum_and => fact1,
p_and => fact2(2),
resul => resul2
);
prod(2) <= resul2(0);

C_SUM_AND3: suma_and
port map (
sum => resul2 (4 downto 1),
sum_and => fact1,
p_and => fact2(3),
resul => resul3
);
prod(7 downto 3) <= resul3;
end behavioral;
Cdigo 8.27: Multiplicador estructural

8.8.5. Implementacin del multiplicador estructural genrico *


Dentro de las sentencias generate se pueden referenciar componentes y por lo tanto el
multiplicadorestructuraldelcdigo8.27sepuedehacergenrico.
architecture behavioral of mult_struct is
type t_vector_resul is array (0 to g_bits) of unsigned (g_bits downto 0);
signal resul : t_vector_resul;

component suma_and is
generic (
g_bits : natural := 4
);
port (
sum : in unsigned (g_bits-1 downto 0);
sum_and : in unsigned (g_bits-1 downto 0);
p_and : in std_logic;
resul : out unsigned (g_bits downto 0)
);
end component;

begin

Departamento de Tecnologa Electrnica 155


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

resul(0) <= (others => '0');

GEN_SUMA: for i in 0 to g_bits-1 generate

C_SUM_AND: suma_and
generic map (
g_bits => g_bits
)
port map (
sum => resul(i)(g_bits downto 1),
sum_and => fact1,
p_and => fact2(i),
resul => resul(i+1)
);

prod(i) <= resul(i+1)(0);


end generate;

prod(2*g_bits-1 downto g_bits) <= resul(g_bits)(g_bits downto 1);


end behavioral;
Cdigo 8.28: Multiplicador estructural genrico

La entidad del multiplicador genrico no se ha incluido porque es similar a la del


multiplicadorcombinacionalgenrico(cdigo8.25).
Hayciertascosasinteresantesdelcdigo8.27:
Dentrodelgeneratehayunareferenciaacomponenteyunasentenciaconcurrente.
Comolaprimeraetapasehaincluidoenelgenerate(adiferenciadelcdigo8.25),eltipo
t_vector_resultieneunelementoms.Esteelementoeseldelndiceceroysuvalores
todocero.Esteelementoeselquesesumaenlaprimeraetapa,yesequivalenteano
realizarlasuma.
Porlaraznanterior,elfordelgeneratetieneunaiteracinms
El banco de pruebas de este multiplicador puede ser similar al del multiplicador
combinacionalgenricodelcdigo8.26.

8.9. Diseo considerando las prestaciones


El objetivo de este apartado es introducirnos en el anlisis de las prestaciones de un
circuito de procesamiento y aprender distintas tcnicas para modificar las prestaciones.
En el siguiente subapartado veremos un resumen de las prestaciones y cmo se deben
considerar en el diseo. Posteriormente mediante el operador de multiplicacin
aprenderemosdemaneraprcticaautilizaralgunasdeestastcnicas.

8.9.1. Anlisis de las prestaciones


Entrelasprestacionesdeuncircuitoseincluyenlavelocidaddeprocesamientoyelrea61.
La velocidad de procesamiento depende de muchos factores, como son la frecuencia de
reloj a la que funciona el circuito, la velocidad de propagacin de las seales y la
tecnologa empleada. El rea es la cantidad de lgica empleada para implementar un
circuito.
Para implementar un circuito el diseador tiene ciertas libertades y restricciones. Por
ejemplo, en nuestro caso podramos usar la placa XUP, la Nexys2 o la Basys, esto nos

61Elconsumoenergticotambinesuncomponentemuyimportanteenlasprestacionesdeuncircuito.Un
circuitoconbajoconsumoenergticonecesitarmenosenerga(menortamaodelabateraomayor
duracin),disiparmenoscalorysermsfiableporquenosecalentartanto.Elanlisisdelconsumoest
fueradelosobjetivosdeestelibro

156 Universidad Rey Juan Carlos


8. Circuitos aritmticos

dara ciertas libertades, pues si nuestro diseo fuese muy grande, podramos utilizar la
XUP ya que su FPGA (Virtex2p) contiene un mayor nmero de celdas lgicas y
multiplicadores.Evidentementeestosupondraunmayorcostededineroytenerqueusar
unaplacademayortamao.
Otroejemploseralafrecuenciadereloj,laXUPtieneunrelojde100MHzmientrasquela
Nexys2 tiene un reloj de 50 MHz. Por otro lado la Basys tiene un reloj configurable
medianteunjumperde100,5025MHz,loquenosdaramslibertad.Sinembargo,las
FPGAsSpartan3edelaNexys2ylaBasyssonmslentasquelaVirtex2p.Enotrosdiseos
eldiseadorpodratenerlalibertaddeelegirlafrecuenciadefuncionamientocambiando
elcircuitodelreloj.
Loqueacabamosdedecirnospodrallevarapensarqueeldiseadorestlimitadopor
circunstancias externas (frecuencia de reloj, FPGA utilizada, ...) y que el tipo de diseo
VHDL que haga notiene ningunainfluencia en sus prestaciones. Afortunadamente esto
no es as y una gran parte de las prestaciones del circuito viene determinada por la
descripcindelcircuitoporpartedeldiseador.
Una de las cosas que ms influyen en las prestaciones es el algoritmo empleado. Por
ejemplo, en vez del algoritmo de multiplicacin escogido en el apartado 8.8.1 podamos
haberimplementadolamultiplicacinsumandounfactortantasvecescomoelvalordel
otro factor. Es decir, si tenemos que multiplicar 7 x 9, podemos calcular el producto
sumando siete veces el nmero nueve o sumando nueve veces el nmero siete. Este
algoritmo es mucho menos eficiente que el que hemos visto en el apartado 8.8.1 ya que
necesita ms sumadores (rea) y ms tiempo para completarse. Puedes hacer la prueba
paracomprobarlo.
Asquelaeleccindelalgoritmoesunaspectoclaveenlasprestacionesdeuncircuitoque
incluso podra hacer que un diseo funcione ms eficientemente en una tecnologa ms
barataqueotrodiseoconpeoralgoritmoenunatecnologaconmsprestaciones.
Perolaeleccindelalgoritmonoeslanicaopcinconlaquecuentaeldiseador.Una
vez escogido un algoritmo, el diseador puede hacer variaciones para ajustarse a sus
especificaciones y restricciones. Normalmente, una vez elegido un algoritmo se puede
elegirenmejorarunaprestacinacostadelaotra.Esdecir,podemosemplearmsrea
para hacer el circuito ms rpido, y lo contrario, es decir hacer el circuito ms pequeo
paraquequepaenlaFPGAperohaciendoqueseamslento.
Estos casos se representan en las grficas de la figura 8.10. La grfica A de la izquierda
representara las funciones que muestran la relacin entre la superficie y el tiempo de
cmputoparadosalgoritmosA0yA1.ElalgoritmoA0esmenoseficientequeelalgoritmo
A1,yaquelaimplementacindelalgoritmoA1 dacomoresultadouncircuitoconmenos
reaymenortiempodecmputo.
LagrficaBdeladerechamuestralasvariacionesdereaytiempodecmputodentrode
unmismoalgoritmo.Comomuestralagrfica,empleandounmismoalgoritmopodemos
movernosdentrodedichafuncinsegndndetengamoslarestriccin,entiempooen
rea.

Departamento de Tecnologa Electrnica 157


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Mejora del algoritmo A0 A1 Mismo algoritmo A2

t0 > t1 Menor tiempo de cmputo t0 > t1 Menor tiempo de cmputo


S0 > S1 Menor superficie S0 < S1 Mayor superficie

A0 A2
A1 A B

superficie
superficie

x0 S1 y1
S0 y0
S0
x1 y2
S1 S2

t1 t0 tiempo de cmputo t1 t0 t2 tiempo de cmputo



Figura 8.10: Curvas de prestaciones rea-tiempo para algoritmos

Estas funciones son simplificaciones para intentar explicar las relaciones entre las
prestacionesdeuncircuito.Evidentementehaymsfactoresqueintervienen.
Paraentenderestomejor,resumiremosalgunasdelastcnicasutilizadaseneldiseode
circuitosdigitalesparaaumentaralgunasprestacionesacostadeotras.Estasson:
Paralelizacin
Segmentacin
Compartirrecursos
Diseosecuencial
Acontinuacinveremoscadaunadeestastcnicasconmsdetalle.
8.9.1.1. Paralelizacin
Estatcnicaconsisteenrealizaroperacionesenparaleloyesunadelasgrandesventajas
de las FPGAs frente a los microprocesadores. Si queremos aumentar el nmero de
elementos procesados por unidad de tiempo, podemos realizar procesamientos en
paralelo,duplicando/triplicando/...losmdulosdeprocesamiento.Lafigura8.11muestra
la representacin esquemtica de esta tcnica. Como se puede intuir, el doble de rea
produceeldobledeelementosprocesados,quesepodratraducirendoblevelocidadde
procesamiento o mitad de tiempo de cmputo. Sin embargo realmente no es as, pues
suelesermsdeldobledereaalsernecesarioincluirlgicadecontrol.Yporotrolado,
noesdeltodoexactodecirqueeltiempodeprocesamientosedisminuyealamitad,ya
quenosiemprehabrdoselementosdisponiblesparaserprocesados.

procesamiento
entrada procesamiento salida entrada salida
procesamiento

Figura 8.11: Paralelizacin

8.9.1.2. Segmentacin
La segmentacin62 consiste en dividir un procesamiento en tareas ms sencillas y
separarlas por elementos de memoria. La figura 8.12 muestra la representacin
esquemticadeestatcnica.

62Lasegmentacineninglssellamapipelining

158 Universidad Rey Juan Carlos


8. Circuitos aritmticos

50 ns

entrada procesamiento salida 20 MHz

entrada p1 p2 p3 salida 50 MHz

20 ns 20 ns 20 ns

Figura 8.12: Segmentacin

Conlasegmentacinsepuedenconseguirdosobjetivos:
Aumentarlafrecuenciaderelojdelcircuito
Aumentarelcantidaddeelementosprocesadosporunidaddetiempo
Sinosfijamosenlafigura8.12podemosverquedebidoalolargoqueeselprocesamiento
sinsegmentar,lafrecuenciamximadelcircuitoestlimitadaaltiempodeprocesamiento
de este mdulo. Podra suceder que el resto del circuito tenga que ir ms lentamente
debido a la lentitud de este mdulo, que impone 20 MHz de frecuencia mxima63. Esto
implicara un detrimento en las prestaciones del resto del circuito. En cambio, si
segmentamoselprocesamiento,cadaunadelasdivisionespodrirmsrpidamente,con
loquelafrecuenciamximadelcircuitopuedesermselevada(50MHzenelejemplo).
Porotrolado,lasegmentacinpermiteaumentarlacantidaddeelementosprocesadosya
que el procesamiento se realiza en cadena gracias a la separacin que establecen los
elementos de memoria. Es decir, al mismo tiempo que p3 (de la figura 8.12) est
terminandodeprocesarunelemento,p2estaprocesandoelsiguiente elemento,yp1est
procesandoel elementoqueacabadeentrarenlacadena.Estoimplicaque,unavezque
sehallenadolacadena,tendremosunnuevoelementoprocesadocada20ns(50MHz).
Sinembargolasegmentacinnoesideal,esdecir,sidividimosentresprocesamientos,no
obtendremoseltripledefrecuencia,yaqueesdifcilconseguirprocesamientosigualesde
modoquecadaunodeellostardeexactamenteunterciodeloriginal.Porotrolado,hay
que tener en cuenta el llenado y vaciado de la cadena de segmentacin, y que cuando
tenemosqueprocesarunsloelementovaatardartresciclosdereloj.
La segmentacin implica un aumento de rea por los elementos de memoria aadidos,
ademssuelenecesitaralgunalgicaaadidadecontrol.
Unejemplodemultiplicadorsegmentadoseverenelapartado8.9.3.
8.9.1.3. Compartir recursos
Cuandoelproblemaeselreaynolavelocidaddecmputo,ocuandosabemosquedos
mdulosdelcircuitonovananecesitarhacerelmismoprocesamientosimultneamente,
sepuedencompartirrecursos.Porejemplo,sitenemosdosmdulosquenecesitanrealizar
unamultiplicacin,envezdequecadaunotengaunmultiplicador,podemosdisearel
circuito de modo que haya un nico multiplicador para los dos. Cuando es un recurso
compartido por muchos mdulos, el ahorro de rea puede ser importante, aunque

63 Enelcasoquecompartanelmismoreloj

Departamento de Tecnologa Electrnica 159


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

tambin puede aumentar los tiempos de procesamiento. Tambin ser necesario incluir
mdulosdecontroldelosrecursos,loqueharqueaumenteelreaylacomplejidaddel
circuito.Estatcnicaseempleaextensamenteenarquitecturadecomputadores,endonde
secompartenbuses,perifricos,unidadesdeprocesamiento,memorias,...
En la figura 8.13 se muestra un esquema del mecanismo de compartir recursos. En el
nuevodiseoconelprocesamientocompartidosehaaadidounbloquectrlqueindicala
necesidaddeaadirunmdulodecontrolparaelrecursocompartidoylacomunicacin
conelrestodelcircuito.
Mdulo 1 Mdulo 2 Mdulo 1 Mdulo 2

ctrl
procesamiento procesamiento procesamiento

Figura 8.13: Compartir recursos

8.9.1.4. Diseo secuencial


Cuandotenemosquerealizarvariosprocesamientossimilaresencadenapodemosoptar
porrealizarundiseosecuencial.Conestaalternativaseahorrareaconelcostedetardar
variosciclosderelojenrealizarelprocesamiento.Enlafigura8.14semuestrademanera
esquemtica en qu consiste esta tcnica. En esta figura se comparan el diseo
combinacional,queeseldiseosin considerarningunatcnica,conlasegmentacinyel
diseo secuencial. En la figura podemos ver que el mismo procesamiento P se repite en
variasetapas.Coneldiseosegmentadoseintroducenelementosdememoriaentrecada
procesamiento, mientras que con el diseo secuencial, se utiliza un slo mdulo de
procesamiento P que se utiliza de manera iterativa para el procesamiento. Dicho de
manera coloquial, el diseo segmentado sera un diseo secuencial desenrollado.
Obviamente,eldiseosecuencialahorramdulosdeprocesamientoperorequieredeun
mdulodecontroldeciertacomplejidad.
A B C
entrada entrada
entrada

p p
control

p
p p

p
p
salida
p
p

salida
p biestables

salida

Figura 8.14: Tres opciones de diseo. A: combinacional. B: Segmentado. C: Secuencial

160 Universidad Rey Juan Carlos


8. Circuitos aritmticos

Siobservaselmdulocombinacional(A)delafigura8.14podrsverquelaestructuraes
similar al multiplicador combinacional de la figura 8.7, siendo el mdulo de
procesamientoelmostradoenlafigura8.9.Enlossiguientesapartadosseanalizarncada
una de estas estrategias con el ejemplo del multiplicador, as aprenderemos a utilizarlas
demaneraprctica,viendolasventajaseinconvenientesdecadauna.

8.9.2. Anlisis del multiplicador combinacional


Losmultiplicadorescombinacionalessuponenuncosteconsiderableenlgica(tamao)y
en retardos para el circuito. Adems el aumento del nmero de bits del multiplicador
tieneimportantesrepercusionesensutamaoyretardos.
Puede ocurrir que tengamos un circuito descrito correctamente pero que por su gran
tamaonoquepaenlaFPGA,otambinpuedeocurrirquelosretardosdelcircuitohagan
quenofuncionealafrecuenciadenuestratarjeta.Siestoltimoocurriese,elcircuitose
simularabienperonofuncionaracorrectamente enlaFPGAdebidoaquelassealesno
lleganatiempoporsuslargostiemposdepropagacin.Estopuedeserungranproblema
porque podemos estar eternamente revisando la funcionalidad del circuito y la
simulacin para encontrar los fallos y no lo encontraremos pues funcionalmente el
circuitoestbien.
En este apartado vamos a analizar el tamao y los retardos del multiplicador
combinacional.Esteanlisisnosloesvalidoparaeldiseo demultiplicadoressinoque
sertilparaotrotipodecircuitos.
Primerovamosacompararelreayelcaminocrtico.Recuerdaqueelcaminocrticoesel
camino combinacional del circuito que tiene un mayor retardo. El camino crtico ser el
quedeterminelafrecuenciamximaalaquepuedefuncionarelcircuito.
Paraanalizarel readeuncircuitotomaremoscomoreferenciaelnmerodeslicesquese
necesitan. Los slices son unas unidades elementales de las FPGAs de Xilinx [26spart3] y
contienenloselementosbsicosparaimplementarlalgicacircuitos:LUTs,elementosde
memoria,multiplexoresylgicaaritmtica.Cuatroslicesseagrupanenunbloquelgico
configurableoCLB64.
Gracias a que hemos diseado el multiplicador combinacional genrico en el apartado
8.8.3podremossintetizarelmultiplicadorcambiandoelnmerodebitsdelosfactorescon
slomodificarelgenricog_bits.
En el informe de sntesis (recuerda el apartado 8.5.1) puedes comprobar el nmero de
slicesnecesariosparalasntesisy unaestimacindelretardomximo.Estosretardosson
estimaciones,paraobtenerundatomsprecisohabraquehacerlaimplementacinyel
mapeado, e incluso realizar una simulacin despus de la sntesis. Pero para el anlisis
que queremos hacer esta estimacin es suficiente. Por otro lado, en el caso de que los
retardos sean crticos, para reducirlos se pueden incluir restricciones temporales y
opcionesdesntesisqueseenfoquenenminimizarlos.
En la tabla 8.2 se muestra el nmero de slices y los retardos para el multiplicador
combinacional segn el nmero de bits. Podemos ver que un nico multiplicador de 32
bits ocupa el 11% de la FPGA de la Nexys2 y que los retardos hacen que la frecuencia
mximaseadetanslo11,3MHz.

64 CLB:ConfigurableLogicBlock

Departamento de Tecnologa Electrnica 161


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

nbitsfactores 4 8 12 16 20 24 28 32
slices 17 29 67 121 202 290 394 514
%slicesNexys2 0,4% 0,6% 1,4% 2,6% 4,3% 6,2% 8,5% 11%
retardomx.(ns) 15,3 23,9 34,6 45,1 56,9 67,4 77,9 88,4
frecuenciamx.(MHz) 65,3 41,9 28,9 22,2 17,6 14,8 12,8 11,3
Tabla 8.2: Variacin de rea y retardos con el nmero de bits de los factores del multiplicador
combinacional del apartado 8.8.3 para la Nexys2

Losresultadossonmuypobreseimplementarestetipodemultiplicadoressuponeunalto
coste en rea y una reduccin muy importante en la frecuencia. Y lo que es peor,
tendramosquemodificarelrelojdelaNexys2paraadaptarnosaestafrecuencia65.
Los resultados para la XUPV2P tampoco son buenos aunque mejores a causa de sus
mayores prestaciones. Como su tamao es mayor, el multiplicador de 32 bits ocupa un
3,8%delaFPGAylosretardosobligaranafuncionaralaFPGAa16,3MHz.
Por suerte, estas FPGAs tienen multiplicadores embebidos de 18 bits. Y son los que se
emplean al describir un multiplicador con la operacin de multiplicacin (cdigo 8.19).
Losresultadosdereayretardosusandoestosmultiplicadoressonmuchomejores(tabla
8.3). Con estos resultados, para 32 bits la frecuencia mxima (56 MHz) es mayor que la
frecuenciadelrelojdelaNexys2,porloquenotendramosproblemaalusarlos.
nbitsfactores 4 8 12 16 20 24 28 32
slices 0 0 0 0 25 35 45 55
%slicesNexys2 0,0% 0,0% 0,0% 0,0% 0,5% 0,8% 1,0% 1,2%
multiplicadores 1 1 1 1 4 4 4 4
%multiplicadoresNexys2 5% 5% 5% 5% 20% 20% 20% 20%
retardomx.(ns) 9,7 10,2 10,2 10,2 16,4 16,9 17,4 17,9
frecuenciamx.(MHz) 103,4 98,4 98,0 98,0 60,8 59,1 57,5 56,0
Tabla 8.3: Variacin de rea y retardos con el nmero de bits de los factores de los multiplicadores
embebidos de la Nexys2 (cdigo 8.19)

Delatabla8.3podemosobservarvariascosasinteresantes.Apartirde20bitsseaumenta
el nmero de multiplicadores de uno a cuatro. Esto se debe a que los multiplicadores
embebidos son de 18x18 bits y por lo tanto hay usar cuatro para crear un multiplicador
mayor. Adems, a causa de la lgica que hay que aadir entre los multiplicadores los
retardos tambin aumentan considerablemente. En la figura 8.15 se muestra de manera
esquemtica cmo se utilizan cuatro multiplicadores de 2x2 para realizar una
multiplicacin de 4x4. Observa que despus de las multiplicaciones hay que realizar la
sumadeloscuatroresultados.Elesquemadelafiguraesampliableaotronmerodebits.

65RecuerdaquelafrecuenciaderelojdelaNexys2esde50MHz

162 Universidad Rey Juan Carlos


8. Circuitos aritmticos

10 01
x 01 x 01
10 01
1001 00 00
x 1101 001
1001 + +
010 001
010
0000 011
1001 10 01 + 110
+ 1001 x 11 x 11 1110101
1110101
10 01
+ 10 + 01
110 011

Figura 8.15: Algortimo para calcular un multiplicador de 4x4 a partir de4 multiplicadores de 2x2

Porltimo,vemosquelaSpartan3edelaNexys2slotiene20multiplicadores,porloque
unmultiplicadorde20bitsempleael20%delosmultiplicadoresdisponibles.LaVirtex2p
delaXUPV2Ptiene138multiplicadores,porloqueelproblemaesmenor,mientrasquela
Spartan3edelaBasystanslotiene4multiplicadores.
En el siguiente apartado veremos cmo disear un multiplicador segmentado y
analizaremossusprestaciones.

8.9.3. Multiplicador segmentado


Enelapartado 8.9.1.2vimoslasventajasderealizarunasegmentaciny queestatcnica
se poda aplicar a los multiplicadores. Para segmentar un multiplicador tenemos que
poner registros entre cada una de las etapas, teniendo cuidado de ir trasladando
correctamentelosdatosdecadaetapa.
Teniendopresenteelesquemadelmultiplicadorcombinacionaldelafigura8.7vemosque
sepuededividirnaturalmenteentantasetapascomobitsdelosfactores.Enlafigura8.7
lalneadiscontinuaazulmarcadndepodemosrealizarlasegmentacin.
En la figura 8.16 se muestra el esquema del multiplicador segmentado. Observa que en
cada etapa hay registros que separan una etapa de la otra. Incluso los factores (fact1 y
fact2)tienenqueestarregistradossiqueremospoderrealizaroperacionesencadenadas,
de manera que en las distintas etapas se puedan estar realizando multiplicaciones
simultneas.Conestohacemosquecadaunadelasetapasseaindependienteypodamos
estarrealizandounapartedeunamultiplicacindiferenteencadaetapa.

Departamento de Tecnologa Electrnica 163


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

fact1 fact2

3 0 3 0

fact1_rg1 fact1_rg1 fact2_rg1

fact2_rg1(0) e1

prod_rg1(0)
2 0 3 0 2 0
fact1_rg1 fact1_rg2 fact2_rg2
resul_rg1
fact2_rg2(1)
'0' '0'
e2

prod_rg2(1)

resul_rg2 fact1_rg3 fact1_rg3 fact2_rg3

fact2_rg3(2)
'0' '0'
prod_rg2(1..0) e3

prod_rg3(2)
resul_rg3
fact1_rg4
fact1_rg4 fact2_rg4

fact2_rg4(3)
'0' '0' prod_rg3(2..0)

e4

prod
7 0

Figura 8.16: Esquema del multiplicador segmentado

Enesteejemplo,lamultiplicacinestarlistaencincociclosdereloj,unciclomsquelos
bits del multiplicador. Sin embargo, una vez llena la cadena de la multiplicacin, si la
mantenemosllenaobtendremosunresultadodistintocadaciclodereloj.
Este diseo es modificable, por ejemplo se podra haber eliminado la primera etapa
juntndolaconlasegunda,yaquetienemenorretardoyrea.
EldiseoVHDLsemuestraenelcdigo8.29.Estediseosehahechogenricoydebidoa
ellohayelementosdesealesvectorialesquenoseusan,comoporejemploalgunosdelos
elementosdelvector prod_rg.Comovemosenlafigura8.16,laprimeraetapaslotiene
unelemento: prod_rg1(0),yvaaumentandoenunelementoconcadaetapa.Esdecir,en
lasegundaetapaesprod_rg2(1 downto 0),yassucesivamente.EldiseoVHDL,comoes
un diseo genrico, se ha creado el vector de vectores prod_rg, donde el primer ndice
corresponde con la primera etapa: prod_rg(1)(g_bits-1 downto 0), pero de este vector
sloseutilizaelbitcero: prod_rg(1)(0).Enlasegundaetapa,sloseutilizanlosdosbits
menossignificativos:prod_rg(2)(1 downto 0),yassucesivamente.

164 Universidad Rey Juan Carlos


8. Circuitos aritmticos

De manera similar ocurre con los registros del segundo factor: fact2_rg. Conforme se
avanzaenlasetapas,noesnecesarioguardarelvalordetodossuselementos.Delafigura
8.16 podemos observar que conforme se avanza en las etapas fact2_rg disminuye y
prod_rg aumenta. As que se podra haber utilizado el mismo vector para los dos,
utilizandoloselementosinferioresparaelprod_rgylossuperioresparafact2_rg.Estono
sehahechoparanodificultarlacomprensindelcdigo.Comoconsecuencia,alsintetizar
elcdigo8.16aparecernalgunosavisosdesealesnoutilizadas.
Parareducireltamaodelcdigoenestelibronosehaincluidoelresetenlosbiestables
delmultiplicador,peroseraconvenienteincluirlo.
entity mult_seg_gen is
Generic ( g_bits : natural := 4 );
Port (
clk : in std_logic;
fact1 : in unsigned (g_bits-1 downto 0);
fact2 : in unsigned (g_bits-1 downto 0);
prod : out unsigned (2*g_bits-1 downto 0)
);
end mult_seg_gen;

architecture behavioral of mult_seg_gen is


type t_vector_fact is array (1 to g_bits) of unsigned (g_bits-1 downto 0);
type t_vector_resul is array (1 to g_bits) of unsigned (g_bits downto 0);

-- prod_rg es la mitad inferior de prod, que se va manteniendo para abajo


signal prod_rg, sum_anded, fact1_rg, fact2_rg, resul_rg : t_vector_fact;
signal resul : t_vector_resul;
begin
-- primera etapa ---------------------------------------------------------------
sum_anded(1) <= fact1_rg(1) when fact2_rg(1)(0) = '1' else (others => '0');
resul(1) <= '0' & sum_anded(1);

P_reg_1e: Process (clk)


begin
if clk'event and clk='1' then
fact1_rg(1) <= fact1; -- registramos entradas
fact2_rg(1) <= fact2;
resul_rg(1) <= resul(1)(g_bits downto 1); -- registramos resultados
prod_rg(1)(0) <= resul(1)(0);
end if;
end process;

-- resto de etapas -------------------------------------------------------------


gen_mult: for i in 2 to g_bits generate
sum_anded(i) <= fact1_rg(i) when fact2_rg(i)(i-1)='1' else (others =>'0');
resul(i) <= ('0' & resul_rg(i-1)) + ('0' & sum_anded(i));

P_resuli_rg: Process (clk)


begin
if clk'event and clk='1' then
fact1_rg(i) <= fact1_rg(i-1);
fact2_rg(i) <= fact2_rg(i-1);
resul_rg(i) <= resul(i)(g_bits downto 1);
prod_rg(i)(i-1) <= resul(i)(0);
prod_rg(i)(i-2 downto 0) <= prod_rg(i-1)(i-2 downto 0);
end if;
end process;
end generate;

-- registrar la salida --------------------------------------------------------


P_prod_rg: Process (clk)
begin
if clk'event and clk='1' then
prod(2*g_bits-1 downto g_bits) <= resul(g_bits)(g_bits downto 1);
end if;
end process;
-- prod_rg ya esta registrado
prod(g_bits-1 downto 0) <= prod_rg(g_bits)(g_bits-1 downto 0);
end behavioral;
Cdigo 8.29: Multiplicador segmentado genrico

Departamento de Tecnologa Electrnica 165


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

De la misma manera que en los multiplicadores anteriores, se ha analizado el tamao y


los retardos del multiplicador segmentado (tabla 8.4). Como era de esperar el rea
aumentarespectoalmultiplicadorcombinacional(tabla8.2)ylafrecuenciahadisminuido
enormemente.Portanto,hemosresueltoelproblemadelafrecuenciadereloj,peroacosta
deaumentarelrea.
nbitsfactores 4 8 12 16 20 24 28 32
slices 30 83 178 306 492 698 953 1248
%slicesNexys2 0,6% 1,8% 3,8% 6,6% 10,6% 15,8% 20,5% 26,8%
retardomx.(ns) 4,7 4,1 4,5 4,8 4,7 5,0 5,1 5,4
frecuenciamx.(MHz) 214,3 246,2 222,2 207,9 211,2 198,5 195,4 185,6
Tabla 8.4: Variacin de rea y retardos con el nmero de bits de los factores de los multiplicadores
segmentados (cdigo 8.29)

Comolosretardoshandisminuidomuchomsdeloquenecesitamos,yparanoaumentar
tanto el rea utilizada, en vez de realizar la segmentacin entre cada etapa podemos
realizarlacadaciertonmerodeetapas.Paraestecasoparecequesegmentarcadatreso
cuatro etapas mantendra la frecuencia superior a 50 MHz y hara disminuir las
necesidadesderea.
Lasegmentacintambinestilcuandoqueremosimplementarmultiplicadoresmayores
de 18 bits utilizando los multiplicadores embebidos. Como vimos en la tabla 8.3, los
retardosaumentabanporlanecesidaddeunirlosresultadosdeloscuatromultiplicadores
(figura 8.15). Segmentar entre la salida de los multiplicadores y las sumas posteriores
haradisminuirlosretardos,consiguindosefrecuenciasderelojmsaltas.

8.9.4. Implementacin del multiplicador secuencial


Se podra decir que el multiplicador secuencial es como el multiplicador segmentado
enrolladosobresmismo,demodoquelassalidasdecadaetapasevuelvenasumarenel
nico sumador en vez de ir a la siguiente etapa (recuerda la figura 8.14). Por lo tanto,
todaslasetapasseprocesanenelmismohardwareycomoconsecuenciaelmultiplicador
estarocupadohastaquetermine.
Sernecesariouncontrolquecuenteelnmerodelamultiplicacinparcialenlaquese
est, que indique cundo ha terminado y que controle cundo se pueden admitir datos
para una nueva multiplicacin. La figura 8.17 muestra un esquemtico de uno de los
posibles circuitos que implementa un multiplicador secuencial. No es un esquemtico
completamentedetalladoparaqueseamsentendible.

166 Universidad Rey Juan Carlos


8. Circuitos aritmticos

fact2_rg
fact1_rg
3 0

3 0 3 2 1 0
cont_bits

contador
'0' '0' cont_bits

sum_anded
fincontbits

+
resul cargafact 1X X0
resul(0)

finmult e_init e_mult


fincontbits
0 1
0X
4 X1
4 cont_bits
XX e_fin
3 2 1 0
Mquina de estados
resul_rg prod_rg
7 0


Figura 8.17: Esquemtico del multiplicador secuencial de 4 bits

Enlafigura8.17sepuedeidentificarelelementobsicodeprocesamientosobreelquese
iteranlasoperacionesyqueyavimosenlafigura8.9.
LadescripcinVHDLcorrespondientealmultiplicadorsecuencialsemuestraenelcdigo
8.30.
entity mult_seq_gen is
Generic (g_bits : natural := 4 );
Port (
rst : in std_logic;
clk : in std_logic;
start : in std_logic; -- orden de empezar multiplicacion
fact1 : in unsigned (g_bits-1 downto 0);
fact2 : in unsigned (g_bits-1 downto 0);
finmult : out std_logic; -- fin de multiplicacion
prod : out unsigned (2*g_bits-1 downto 0)
);
end mult_seq_gen;

architecture behavioral of mult_seq_gen is


constant c_nb_contbits : natural := log2i(g_bits-1);
signal contbits_us : unsigned (c_nb_contbits downto 0);
signal contbits : natural range 0 to 2**(c_nb_contbits+1)-1;
signal fincontbits : std_logic;
signal cargafact : std_logic;
signal fact1_rg, fact2_rg, sum_anded : unsigned (g_bits-1 downto 0);
signal resul : unsigned (g_bits downto 0);
-- resul_rg tiene 1 bit menos, porque no guarda el bit menos significativo
-- ya que este va a prod_rg
signal resul_rg : unsigned (g_bits-1 downto 0);
signal prod_rg : unsigned (2*g_bits-1 downto 0);
type estados_mult is (e_init, e_mult, e_fin);
signal estado_act, estado_sig : estados_mult;
begin

Departamento de Tecnologa Electrnica 167


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

-------------------- MAQUINA DE ESTADOS -----------------------------------


P_control_seq: Process(rst,clk)
begin
if rst = c_on then
estado_act <= e_init;
elsif clk'event and clk='1' then
estado_act <= estado_sig;
end if;
end process;

P_control_comb: Process (estado_act, start, fincontbits)


begin
cargafact <= '0';
finmult <= '0';
case estado_act is
when e_init =>
if start = '1' then
estado_sig <= e_mult;
cargafact <= '1';
else
estado_sig <= e_init;
end if;
when e_mult =>
if fincontbits = '1' then
estado_sig <= e_fin;
else
estado_sig <= e_mult;
end if;
when e_fin =>
estado_sig <= e_init;
finmult <= '1';
end case;
end process;

--------------- CARGA Y REGISTRO DE LOS FACTORES A MULTIPLICAR-------------------


P_cargafact: Process (rst, clk)
begin
if rst = c_on then
fact1_rg <= (others => '0');
fact2_rg <= (others => '0');
elsif clk'event and clk='1' then
if cargafact = '1' then
fact1_rg <= fact1;
fact2_rg <= fact2;
elsif estado_act = e_fin then
fact1_rg <= (others => '0');
fact2_rg <= (others => '0');
end if;
end if;
end process;

-------------- CUENTA LOS BITS QUE SE VAN MULTIPLICANDO --------------------------


P_cuenta_bits: Process (rst, clk)
begin
if rst = c_on then
contbits_us <= (others =>'0');
elsif clk'event and clk='1' then
if estado_act = e_mult then
contbits_us <= contbits_us + 1;
else
contbits_us <= (others =>'0');
end if;
end if;
end process;

fincontbits <= '1' when contbits=g_bits-1 else '0';

contbits <= to_integer(contbits_us); -- para los rangos se necesita un entero

--------------- MODULO DE LA SUMA CON MULTIPLICACION (figura 8.9)


-- la multiplicacion parcial del bit de fact2 con fact1,
-- teniendo en cuenta el desplzamiento
sum_anded <= fact1_rg when fact2_rg(contbits) = '1' else (others => '0');
resul <= ('0' & resul_rg) + ('0' & sum_anded);

168 Universidad Rey Juan Carlos


8. Circuitos aritmticos

--------------------- GUARDA EL RESULTADO en:


-- resul_rg: si no se ha terminado
-- prod_rg : si es el resultado definitivo (fincontbits='1')
P_acum_mult: Process (rst, clk)
begin
if rst = c_on then
resul_rg <= (others => '0');
prod_rg <= (others => '0');
elsif clk'event and clk='1' then
case estado_act is
when e_init | e_fin =>
resul_rg <= (others => '0');
prod_rg <= (others => '0');
when e_mult =>
if fincontbits = '0' then
resul_rg <= resul(g_bits downto 1);
prod_rg(contbits) <= resul(0);
else
resul_rg <= (others => '0'); -- ya no hace falta resul_rg
prod_rg(2*g_bits-1 downto contbits) <= resul; --se guarda en prod_rg
end if;
end case;
end if;
end process;

prod <= prod_rg;


end behavioral;
Cdigo 8.30: Multiplicador secuencial genrico

Porltimonosquedaanalizarlasprestacionesdeestemultiplicador.Latabla8.5muestra
queconestemultiplicadormantenemoseltamaocontroladoytambinquelafrecuencia
nobajaexcesivamente.Sinembargohayquetenerencuentaquelamultiplicacintarda
unnmerodeciclosmayorqueelnmerodebitsdelmultiplicador66.
nbitsfactores 4 8 12 16 20 24 28 32
slices 38 37 83 81 136 144 156 162
%slicesNexys2 0,8% 0,8% 1,8% 1,7% 2,9% 3,1% 3,4% 3,5%
retardomx.(ns) 6,5 7,9 9,1 8,9 11,4 11,3 11,3 10,8
frecuenciamx.(MHz) 152,7 126,5 110,3 112,4 88,0 88,1 88,2 92,4
Tabla 8.5: Variacin de rea y retardos con el nmero de bits de los factores de los multiplicadores
secuenciales (cdigo 8.30)

8.9.5. Comparacin de los multiplicadores


Finalmente compararemos las cuatro alternativas de multiplicadores implementados.
Recordemosantesculessonestasalternativas:
Multiplicadorembebido(cdigo8.19)
Multiplicador combinacional (figura 8.7 y cdigo 8.22). El multiplicador genrico
combinacional(apartado8.8.3)yelestructural(apartado8.8.4)tambinestndentrode
estacategora
Multiplicadorsegmentado(apartado8.9.3)
Multiplicador(apartado8.9.4)
En lafigura8.18semuestrademaneragrficaelporcentajederea(slices)utilizadoenla
Nexys2 para implementar los distintos multiplicadores segn el nmero de bits de los
factores.

66 Dependiendodeltipodecontrolyeltipodemquinadeestadoselnmerodeciclospuedepuedevariar.

Departamento de Tecnologa Electrnica 169


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

30%

25%
segmentado

% Slices Nexys2
combinacional
20% secuencial
embebidos
15%

10%

5%

0%
4 8 12 16 20 24 28 32 n bits

Figura 8.18: Utilizacin de rea de la Nexys2 para implementar los distintos multiplicadores respecto al
nmero de bits del multiplicador

En la grfica se puede ver que la mejor alternativa en cuanto rea es utilizar los
multiplicadores embebidos (para eso estn). El inconveniente es que la Spartan3e de la
Nexys2tieneslo20multiplicadores,ycuandoserealizaunamultiplicacinde20bits,se
utilizan4deellos(el20%).Conloqueslopodramosimplementarcincomultiplicadores
embebidosde20bits.
Los multiplicadores secuenciales mantienen el rea controlada, mientras que los
multiplicadores combinacionales y segmentados aumentan mucho su rea conforme
aumentaelnmerodebits,especialmentelossegmentados.
En la figura 8.19 se muestra la frecuencia mxima a la que puede funcionar la Nexys2
segnelmultiplicadorqueseuseyelnmerodebitsdelosfactores.
segmentado
250 secuencial
embebidos
combinacional
200
MHz Nexys2

150

100

50

0
4 8 12 16 20 24 28 32 n bits

Figura 8.19: Frecuencia mxima de la Nexys2 para los distintos multiplicadores respecto al nmero de bits
del multiplicador

De la grfica podemos extraer que los multiplicadores combinacionales tienen muchos


retardos(bajafrecuencia)mientrasqueenelextremoopuesto,lossegmentadostienenuna
frecuenciamuchomayorquelaquenormalmenteutilizalatarjeta(50MHz).Porlotanto,
comoyasehaindicado,paraaumentarlafrecuenciadeloscombinacionalesyreducirel
readelossegmentados,sepuedehacerunasegmentacinintermedia.
Elmultiplicadorsecuencialtienebuenascaractersticasencuantoaretardosyrea,pero
eslentoporquerequierevariosciclosdereloj.
Y por ltimo, el multiplicador embebido tiene buenas prestaciones, pero podemos
observar que la frecuencia baja a partir de 18 bits, ya que hay que utilizar varios

170 Universidad Rey Juan Carlos


8. Circuitos aritmticos

multiplicadores (figura 8.15). Para solucionar esto se puede segmentar a la salida de los
multiplicadores embebidos o incluso realizar diseos mixtos, usando multiplicadores
embebidosalavezquemultiplicadorescombinacionalesosegmentados.
Comoresumen,noexisteunaestrategiaquesealamejorentodosloscasos,eslatareadel
diseador analizar los requisitos del sistema y elegir lo que ms conviene en cada caso.
Tambin es importante considerar el tipo de algoritmo, ya que ste puede influir en las
prestaciones del sistema independientemente de la estrategia utilizada. Hay otros
algoritmos y variantes que mejoran los que hemos vistos, el estudio de stos se sale del
objetivodeestelibro,paramsinformacinpuedesconsultarlareferencia[7desch].
Por otro lado tambin hay que sealar que el tiempo de diseo es un factor muy
importante.Estosignificaquenohayquemejorarlasprestacionescuandonoesnecesario.
Porejemplo,sinuestro multiplicadorfunciona bienyda lasprestacionesrequeridas,no
hay que dedicar ms tiempo a mejorarlo. No es eficiente implementar un multiplicador
msrpidooqueocupemenosreasiparasudiseonecesitoempleareldobledetiempo
ymisistemafinalnoobtieneningunaventaja.Unretrasoenelproyectopuedeserpeor
quereducirenun5%elreautilizadasitenemosunaFPGAsuficientementegrande.Esla
tarea del ingeniero valorar todos los aspectos del diseo, sus costes y los tiempos de
desarrollo.

8.10. Divisin
Al contrario de la multiplicacin, si necesitamos implementar una divisin entera, el
operador / no est soportado para la sntesis, por lo tanto tendremos que disear el
divisor67.
Existen muchos algoritmos de divisin, a continuacin se explicar uno que es el que
resulta ms parecido a nuestra forma de dividir a mano y es por tanto ms sencillo de
entender.
Enlafigura8.20semuestraunadivisinenterarealizadaconnmerosenterosdecimales
yconnmerosenterosbinarios.

157
157 13 10011101 1101 Dividendo:15710=10011101
-13 -1101
12 1100 divisor:1310=1101
27 01101 Cociente:1210=1100
-26 -1101
001 Resto:1
1
Figura 8.20: Ejemplo de divisin entera en decimal y en binario

Veamospasoapasoelalgoritmoparahacerladivisin:
Primerodesplazamosalaizquierdaeldivisorlomsquepodamossiemprequequepa
en el dividendo (D>d). La cantidad de veces que se ha desplazado la memorizamos. En
electrnicadigital,diramosquelaguardamosenunregistroquellamaremos Desplz.En
nuestroejemplodelafigura8.21eldesplazamientoes3.

67 Anoserqueestemoshaciendounadivisinentredosconstantes.EnestecasoelcompiladorVHDLcalcula
ladivisinyelresultadoeselqueseusaenlasntesis.Oquequeramoshacerunadivisinporunapotencia
dedos.

Departamento de Tecnologa Electrnica 171


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

10011101 Dividendo
1101 Divisor
10011101 1101
-1101 Desplazamos a la izquierda divisor
10011101 Dividendo
Desplz = 1
1101 Divisor
Sique cabiendo (Divisor < Dividendo)
10011101 Dividendo
Desplz = 2
1101 Divisor
Sique cabiendo (Divisor < Dividendo)
10011101 Dividendo
Desplz = 3
1101 Divisor
La siguiente no cabe (Divisor > dividendo)
10011101 Dividendo
Desplz = 4 No
1101 Divisor
Figura 8.21: Paso 1 de la divisin: clculo del desplazamiento inicial

Una vez que tenemos el divisor desplazado lo ms posible a la izquierda (Desplz=3),


restamosaldividendoeldivisoryponemosun1enelcociente(figura8.22).Enlafigura
sehanrellenadoloscerosquefaltanaladerechaprovocadosporeldesplazamiento.Enel
clculomanualsehaceimplcitamenteaunquenoseponenparaahorrarlaescrituradela
restacompleta.
10011101 1101
-1101000
1 Desplz = 3
0110101
Figura 8.22: Paso 2 de la divisin

Ahora,eldivisor,quehemosdesplazadotresvecesalaizquierda,lodesplazamosunavez
aladerecha,esdecir,comosideloriginallodesplazsemosdosvecesalaizquierda.Por
tanto Desplz=2. Probamos si cabe con el resultado de la resta anterior, si cabe (Dd)
ponemosununoenelcociente.
10011101 1101
-1101000
11 Desplz = 2
0110101
-110100
000001
Figura 8.23: Paso 3 de la divisin

Volvemosadesplazareldivisoraladerecha(ahoraDesplz=1),yvolvemosaversicabeen
lanuevarestaquehemoshecho.
10011101 1101
-1101000
110 Desplz = 1
0110101
-110100
000001 No cabe
11010
Figura 8.24: Paso 4 de la divisin

Vemosqueestaveznocabe,portantopondremosunceroenelcociente,nohacemosla
resta, y probamos desplazando el divisor a la derecha (ahora el Desplz=0, volvemos a
comoestabaalprincipio)

172 Universidad Rey Juan Carlos


8. Circuitos aritmticos

10011101 1101
-1101000
1100 Desplz = 0
0110101
-110100
000001 No cabe
1101
Figura 8.25: Paso 5 de la divisin

Tampococabe,ycomoelcocientehavueltoasuposicinoriginal(Desplz = 0)ladivisin
setermina(puesnosacamosdecimales).
10011101 1101
-1101000
1100 cociente
0110101
-110100
000001 resto
Figura 8.26: Paso 6 de la divisin

Ahora desplazando los restos a la izquierda podramos sacar decimales. En este caso
podramossacarelprimerdecimalparacalcularelredondeodelcociente.
Aspueslaimplementacinenhardwaredeestealgoritmodedivisinsepodrahacerde
manera secuencial, pero tambin se podra desenrollar y realizarla de manera
combinacionalosegmentada.
Si se realiza de manera secuencial, la divisin se hara en varios ciclos de reloj, que
dependerdelnmerodebitsdelosoperandos.Portanto,igualqueconelmultiplicador
secuencial, el divisor necesitar de una parte de control que ordene la ejecucin de las
operacionesquehayaquerealizarencadamomento.Unavezterminadaslasoperaciones
deber proporcionar una seal de aviso que indique que el resultado est disponible.
Adems,elmdulotendrunasealdeentradaqueordenelaejecucindeladivisin.
Para este ejemplo no se va a incluir el esquema o el cdigo VHDL del divisor. Te
recomendamosqueloimplementesportimismoyquehagaselbancodepruebas.Conla
informacin sobre el algoritmo de divisin junto con las explicaciones del algoritmo de
multiplicacinylosotrosoperadoresdeestecaptulo,pensamosquelopodrashacerpor
timismo.
InclusoteproponemosqueimplementesunapequeacalculadoraenlaFPGA.Metiendo
losdatosporlospulsadoreseinterruptoresoporlaUART.Porejemplo,siusaslaNexys2,
los interruptores podran ser los operandos y los botones la operacin: suma, resta,
multiplicacinydivisin.Elresultadoseobtendraporeldisplaydesietesegmentos.
Si usas la XUPV2P, como no hay tantos pulsadores ni interruptores, puedes realizar la
operacinporlaUART,introduciendoprimeroelprimeroperador,luegolaoperaciny
porltimo elsegundooperador.Elmayorproblemaaquserelcontroldeloquellega
por la UART y la conversin en rdenes al mdulo que realiza la operacin. Para
simplificar,terecomendamosquelosnmerosqueenvesestncodificadosenbinarioo
enhexadecimal,peronoendecimal.Estosignificaquedesdeelhiperterminal68enviaras
por ejemplo: 1110/11= E/3= en vez de 14/3=. Tu circuito debera devolver:
1000R10(enbinario)4R2(enhexadecimal).Eligeunadelasdosformas.
Este circuito de divisin o calculadora por la UART tiene cierta complejidad debido al
control,conversionesylaunindevariosmdulos,apartedelapropiacomplejidaddel

68 Recuerdaelapartado7.6.3

Departamento de Tecnologa Electrnica 173


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

divisor.Sinembargo,podraseruninteresanteproyectoqueunificaratodoloquehemos
vistohastaahora.

174 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA
En esta prctica aprenderemos a disear un controlador para pantalla. Este controlador
nossermuytilparalassiguientesprcticas,yaquepermitiralsistemaaumentarde
maneraextraordinarialascapacidadesdeofrecernosinformacin
Antes de explicar el funcionamiento de un controlador, piensa cmo puede un nico
circuitoindicarelvalordecadaunodelospxelesdeunapantalla.Inclusoenpantallasde
bajaresolucincomolasde640x480(640columnasy480filas)tenemosmsdetrescientos
milpxeles.
Evidentemente no se pueden controlar todos a la vez, y el mtodo par a controlarlo es
similar al control del display de siete segmentos que se vio en el captulo 6 del libro
[17mach].Esdecir,multiplexandoeneltiempo.Cadapxelseactivaduranteunapequea
fraccinde tiempoyserefrescacontinuamente.Comoestoocurreaunavelocidadmuy
elevada,nosotrosnonosdamoscuentaycreemosqueestncontinuamenteencendidos.
Para controlar una la pantalla existen multitud de estndares. Mediante SVGA (Super
Video Graphics Array) se conocen mltiples de estndares de visualizacin grfica de
ordenadores. SVGA surgi despus del estndar VGA, y muchas veces se nombran de
maneraindistinta(igualqueotrasvariantescomoXSGA).Estaspropuestasnoerannicas
y cada fabricante propona temporizaciones diferentes. Posteriormente, VESA (Video
Electronics Standards Association: http://www.vesa.org) defini un estndar para el video
conelqueseintentaglutinarlaspropuestasdelosfabricantes.
ElconectorVGAesdeltipomostradoenlafigura9.1,queeshabitual
en los ordenadores actuales. Las seales y el control se definieron
pensando en monitores de rayos catdicos, sin embargo, los
Figura 9.1: Conector
monitores digitales se han adaptado al mismo estndar para evitar VGA
problemasdecompatibilidad.
Para transformar las seales digitales de la FPGA en analgicas de estndar VGA se
necesitanvariosconversoresdigitalanalgicos.Estosconversoressuelenestarintegrados
enunchipypuedenserbastantediferentesunosdeotros.Estoocurreconlosdelatarjeta
XUPV2PylaNexys2.
EnestecaptuloveremoselestndarVGA.Acontinuacinseresumirnlascaractersticas
de los convertidores digitalanalgicos de las placas XUPV2P y Nexys2. Y por ltimo
propondreldiseodeuncontroladorVGA.

9.1. Funcionamiento del estndar VGA


Para el control del monitor, la informacin de cada pxel de la pantalla se va enviando
consecutivamente al ir barriendo toda la superficie por lneas horizontales y verticales.
Cadapxelsecomponedetrescolores:rojo,verdeyazul.
Las tres primeras seales de la tablas 9.2 y 9.3 indican la intensidad de cada color. Por
ejemplo, si red=0 el pxel no contiene rojo, si por el contrario red=255 (o red=7 en la
Nexys2)elpxeltieneelmximonivelderojo.

Departamento de Tecnologa Electrnica 175


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Elenvodelosvaloresdelospxelessehacefilaafilaempezandoporelpxeldearribaa
laizquierdayterminandoconelpxeldeabajoaladerecha(figura9.2).Existendistintas
resoluciones de pantalla, por ejemplo de 640 columnas x 480 filas (640x480) y otras ms
habitualescomo800x6001024x768.
barrido horizontal
pxel (0;0) pxel (0;639)
Al llegar al final de la
fila se sigue en el pxel
de la izquierda de fila
de abajo: pxel (1;0)

pxel (479;0) pxel (479;639)


Figura 9.2: Pxeles en una pantalla con resolucin de 640x480

Paraindicarelcambiodefilayelcambiodepantallaexistendossealesdesincronismo:
sincronismo horizontal (hsynch) y vertical (vsynch). El sincronismo horizontal marca el
finaldeunalneayelcomienzodeunanueva.Elsincronismoverticalmarcaelfindeuna
pantalla y el comienzo de una nueva. La frecuencia de refresco viene dada por la
frecuenciadelsincronismovertical.
Lafigura9.3muestralassealesdesincronismoparaelcontroldeunapantallaVGAcon
640x480pxelesyunafrecuenciaderefrescodeaproximadamente60Hz.Lostiemposse
hanadaptadoaunafrecuenciade25MHz:cadapxeldura40ns.
640 pxeles
639

0 1 2 ..

25,6 s

1,92 s 0,64 s

Sincronismo
Horizontal
hsynch
32 s
3,84 s

480 lneas
479

0 1 2 ..

480x32 s= 15,36 ms

0,992 ms 0,352 ms
Sincronismo
Vertical
vsynch
16,768 ms (~60Hz)
64 s

Figura 9.3: Seales de sincronismo para una frecuencia de refresco de 60 Hz y 640x480 pxeles

176 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA

Los valores de los tiempos son aproximados. Existe un estndar que define diversas
frecuenciasalasquenormalmenteseadaptanlomonitores,aunquecomoyasehadicho
que varan segn el fabricante. Observa que hay intervalos de tiempo entre la seal de
sincronismo y el envo de la informacin de los pxeles, a estos se les llama porches
delanteroytrasero.Enlafigura9.4semuestranelporchetraseroydelantero(backporchy
frontporch).
imagen Porche
Porche
trasero 640 pxeles delantero
48 pxeles 16 pxeles

639
0 1 2 ..

Sincronizacin
96 pxeles

Sincronismo
Horizontal
hsynch

Lnea: 800 pxeles


Comienzo de lnea Fin de lnea
Reloj de 25 MHz: 32 s
Figura 9.4: Cronograma de una lnea en pxeles

Aveces,eneldiseodigitallasespecificacionesnosedanentiempos,sinoquesedala
frecuencia a la que salen los pxeles. Con esta frecuencia, se especifica el nmero de
pxelesdelosporchesylassealesdesincronizacinparalasincronizacinhorizontal,y
el nmero de lneas para la vertical. Por ejemplo, en la figura 9.4 se muestra la
especificacindelaslneasenpxelesynoentiempos.
En la tabla9.1 semuestran los valores para diversas resoluciones de pantalla. Todas las
filasexceptolaprimerasecorrespondenconformatospropuestosporVESA.Laprimera
filadelatabla(sombreada)esunaaproximacindelasegundafilayeslaqueusaremos
ennuestrodiseo,paraevitarunafrecuenciaderelojde25,175MHz.Enlafigura9.3se
han obtenido los tiempos tomando los mismos valores de pxeles de la segunda fila,
aunqueconunafrecuenciaderelojligeramentemenor:25MHz,envezde25,175MHz.
Yaque,dehecho,conunrelojde25MHzsepuedentomarlosvaloresdelasegundafila,
yelcontroladortambinfuncionarenlamayoradelosmonitores.
Horizontal(enpxeles) Vertical(enlneas)
Reloj
Formato Vdeo Porche Porche Vdeo Porche Porche
MHz Sincr. Total Sincr. Total
activo delantero trasero activo delantero trasero
640x480@60Hz 25 640 16 96 48 800 480 9 2 29 520
640x480@60Hz 25,175 640 16 96 48 800 480 11 2 31 524
800x600@60Hz 40,000 800 40 128 88 1056 600 1 4 23 628
800x600@72Hz 50,000 800 56 120 64 1040 600 37 6 23 666
1024x768@60Hz 65,000 1024 24 136 160 1344 768 3 6 29 806
1024x768@75Hz 75,000 1024 24 136 144 1328 768 3 6 29 806
Tabla 9.1: Valores para diversas resoluciones de pantalla

9.2. Conversores digital-analgico para VGA


Como estamos utilizando dos tarjetas electrnicas, a continuacin se resumen los
convertidoresdeestasdosplacasysusentradas.

Departamento de Tecnologa Electrnica 177


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

9.2.1. Conversor VGA de la XUPV2P


LatarjetaXUPV2Ptieneuntripleconversordigitalanalgicodestinadoaaplicacionesde
video (FSM3818). Las salidas digitales de la FPGA correspondientes a cada color pasan
porestecircuitointegradoydeallvanalconectorVGA.Enestatarjetaseutilizan8bits
para cada color: rojo, verde y azul (RGB69). Por tanto, como cada color tiene 8 bits,
tendremos256nivelesdistintosparacadacolor.Contandolostrescolores,setienenms
de16,7millonesdecolores(2563).
LospinesdelaFPGAquecontrolanelvideosemuestranacontinuacin.Msadelantese
explicarsufuncinconmsdetalle.
Puerto bits I/O pin Descripcin
Nivelderojodelpxel(de0a255).Pines:H10(bit7);C7;D7;F10;F9;G9;
red 8 O
H9;G8(bit0)
Niveldeverdedelpxel(de0a255).Pines:E11(bit7);G11;H11;C8;D8;
green 8 O
D10;E10;G10
Niveldeazuldelpxel(de0a255).Pines:E14(bit7);D14;D13;C13;J15;
blue 8 O
H15;E15;D15
Relojdelconversor,quetendrunafrecuenciadiferentesegnla
pxl_clk 1 O H12
resolucinyfrecuenciarefrescoescogidas(tabla9.1)
Siestacerohacequenosesaquenadaporpantalla(paracuandonose
vga_blank 1 O A8 usa).Sivaleuno,funcionanormalmente.Enlazonaenlaquenoseemite
informacinvisibleseponeacero.
Sincronismohorizontal.Indicaelcambiodefila.Segnelestndarquese
hsynch 1 O B8
use,estasealpuedefuncionaranivelaltoobajo.
Sincronismovertical.Indicaelcambiodepantalla(frecuenciaderefresco).
vsynch 1 O D11
Segnelestndarqueseuse,estasealpuedefuncionaranivelaltoobajo
Conun1seaadecorrienteextraalconversordigitalanalgicodel
verde.Sinoseactiva,losblancossevenrosadosporqueelverdenotiene
comp_synch 1 O G12 tantaintensidad.Seponeaceroenlossincronismos70(horizontalesy
verticales).Sinembargo,cuandoseactiva,avecessevenbrillosverdes
extraos,asquealfinalpuedesalirmejorponerlasiempreacero.
Tabla 9.2: Puertos del conversor VGA de la XUPV2P

9.2.2. Conversor VGA de la Nexys2


LatarjetaNexys2tieneunconversordigitalanalgicomssencillo,consolo10bitsfrente
alos29bitsdelatabla9.2.LaNexys2tiene8bitsparatodosloscolores,loquehaceque
slotenga256coloresdistintos.Seemplean3bitsparaelrojo,3bitsparaelverdey2bits
para el azul, ya que parece que el ojo humano tiene menos sensibilidad para el azul.
Ademsdeestos8bits,estnlassealesdesincronismoverticalyhorizontal,peronose
proporcionarelojcomoenlaXUPV2Pniotrassealescomovga_blankycomp_synch.
Puerto Descripcin
bits I/O pin
Nivelderojodelpxel(de0a7niveles).
red 3 O
Pines:R8(bit2,mssignificativo);T8;R9(bit0,menossignificativo)

69RGB:delassiglaseninglsdeloscolores:red,greenyblue
70Independientementedelniveldelossincronismoshsynchyvsych

178 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA

Niveldeverdedelpxel(de0a7niveles).
green 3 O
Pines:P6(bit2,mssignificativo);P8;N8(bit0,menossignificativo)
Niveldeazuldelpxel(de0a3niveles).
blue 2 O
Pines:U4(bit1,mssignificativo);U5(bit0,menossignificativo)
Sincronismohorizontal.Indicaelcambiodefila.Segnelestndarqueseuse,
hsynch 1 O T4
estasealpuedefuncionaranivelaltoobajo.
Sincronismovertical.Indicaelcambiodepantalla(frecuenciaderefresco).
vsynch 1 O U3
Segnelestndarqueseuse,estasealpuedefuncionaranivelaltoobajo
Tabla 9.3: Puertos del conversor VGA de la Nexys2

Deestastablassepuedeobservarquelosconversoressonbastantedistintos.

9.3. Mdulo de sincronizacin


Conlainformacinquetenemospodemosrealizarunmduloquegenerelassealesde
sincronizacin para la pantalla VGA. Haremos un controlador con una resolucin de
640x480 pxeles a 25 MHz cada pxel, esto es, utilizaremos las especificaciones de la
primeralneadelatabla9.1.Paraestasespecificacioneslapolaridaddelasincronizacin
esnegativa,esdecir,sepondruncerocuandohayasincronismo(comosehadibujado
enlasfiguras9.3y9.4).
Elbloquetendrelaspectodelafigura9.5.
SINCRO_VGA
pxl_num
line_num
visible
hsynch
vsynch
pxl_clk
clk comp_synch
rst

Figura 9.5: Entradas y salidas del sincronizador

AunquelastarjetasXUPV2PyNexys2tengandistintosconversores,nosotrosusaremosel
mismobloqueysilotenemosqueimplementarenlaNexys2simplementedejaremos de
usar los puertos que no sean necesarios. Las nicas diferencias importantes en la
implementacinesquefuncionanadistintafrecuenciaderelojylaprofundidaddelcolor.
Apartedelresetyelreloj,lamayoradelassealesdelafigura9.5estnenlatabla9.2
9.3.Ladescripcindelospuertosquenoestnendichastablassemuestraenlatabla9.4.
Puerto Descripcin
bits I/O
Sealderesetasncrono.LoharemosactivoanivelbajoenlaXUPV2Pyanivel
rst 1 I
altoenlaNexys2.
clk 1 I Sealderelojdelaplaca.100MHzenlaXUPV2Py50MHzenlaNexyx2
Indicaconununosielmduloestenviandounpxelalapantalla.Siescerose
visible 1 O
esteneltiempodesincronismooporchedelanterootrasero(figura9.4)
Indicaelpxel(columna),incluyetodoslospxeles,tantolosvisiblescomolos
pxl_num 10 O pxelesdelasincronizacinylosporches.Paraunaresolucindepantallade
640x480losvaloresirnde0a800(tomandolaprimerafiladelatabla9.3).

Departamento de Tecnologa Electrnica 179


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Indicalalnea(fila),incluyetodaslaslneas,tantolasvisiblescomolaslneasde
line_num 10 O lasincronizacinylosporches.Paraunaresolucindepantallade640x480los
valoresirnde0a520(tomandolaprimerafiladelatabla9.3).
Tabla 9.4: Caractersticas de los puertos del mdulo de sincronizacin. El resto de puertos estn en las
tablas 9.2 y 9.3

El mdulo de sincronizacin se puede realizar de muchas maneras. Nuestra


recomendacineshacerlocontrescontadores,queseran:
Contadordeciclosdereloj:P_cont_clk.Cuentalosciclosderelojdecadapxel.Coneste
contadorsepasadelafrecuenciadelrelojdelaFPGAalafrecuenciadecadapxel71.Con
este mtodo slo el posible lograr las frecuencias que dividan (divisin entera) a la
frecuenciadereloj.
Contadordepxeles:P_cont_pxl.Cuentalospxelesdecadalnea.
Contadordefilas:P_cont_line.Cuentalaslneasdecadapantalla.
Terecomendamosquecadacontadorseaunprocesosecuencialindependienteenelque
sloseasignelacuentayque lassealesquedependendecadacuentaseasignenenun
proceso combinacional aparte. Ya que si se ponen las seales dentro del proceso
secuencial del contador se sintetizarn biestables y estarn retardadas respecto a la
cuenta.
La figura 9.6 esquematiza el sincronizador. Como se puede observar, los procesos
secuenciales nicamente llevan la cuenta, mientras que los procesos o sentencias
combinacionalesgeneranelrestodelasseales.Tencuidadodenogenerarlatchesenlos
procesoscombinacionales(recuerda2.5).

pxl_clk
Procesos o
sentencias
combinacionales hsynch

visible

visible_line
hsynch
visible_pxl vsynch vsynch
pxl_clk cont_line comp_synch comp_synch
cont_pxl new_line

cont_clk new_pxl

new_pxl cont_pxl new_line cont_line


cont_clk
clk clk clk
rst rst rst
P_cont_clk P_cont_pxl P_cont_line
line_num
10
pxl_num
Procesos
secuenciales

contador de ciclos de reloj contador de pxeles (columnas) contador de lneas (filas)


Figura 9.6: Esquema del sincronizador

El proceso contador de ciclos de reloj (P_conta_clk) ser diferente si utilizamos la placa


XUPV2PolaNexys2,yaquesusrelojestienendistintafrecuenciayporlotanto,lacuenta
ser distinta. Esto lo podemos ver en las siguientes figuras: la figura 9.7 muestra el

71indicadoenlasegundacolumnadelatabla9.3

180 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA

cronograma de lo que queremos hacer si tenemos la XUPV2P y la figura 9.8 muestra el


cronogramaparalaNexys2.
10ns 20ns

clk f=100 MHz clk f=50 MHz

cont_clk 0 1 2 3 0 1 2 3 0 cont_clk 0 1 0 1 0

pxl_clk f=25 MHz pxl_clk f=25 MHz

new_pxl f=25 MHz new_pxl f=25 MHz

40 ns 40 ns

Figura 9.7: Cronograma del contador de ciclos de Figura 9.8: Cronograma del contador de ciclos de
reloj para la XUPV2P (100 MHz) reloj para la Nexys2 (50 MHz)

ComolaXUPV2Pvaa100MHzyqueremosqueenviaralaVGAlospxelescada25MHz
(recuerdalaprimerafiladelatabla9.1),cadapxeldurar4ciclosdereloj.Porotrolado,
comolaNexys2vaa50MHz,cadapxelsemantendrdurante2ciclosdereloj.
En los cronogramas se ha incluido una seal new_pxl que avisar al siguiente contador
P_cont_pxl (que cuenta los pxeles) que aumente un pxel. Podemos observar que en el
caso delaNexys2estasealcoincidecon pxl_clk.AunquelaNexys2nonecesitalaseal
pxl_clk,lamantendremos.

Asqueelprocesoquecuentalos ciclosdereloj(P_cont_clk)contarcuatroodosciclos
segn tengamos la tarjeta XUPV2P o la Nexys2. Lo ideal sera declarar el fin de cuenta
medianteunaconstanteenunpaquete,yquealcambiardetarjeta,sloquetengamosque
cambiarlasconstantesdelpaquete.
Por otro lado, como podemos ver en la tabla 9.1, tenemos que tener en cuenta muchos
valores para el control de la VGA. As que antes de empezar a describir el VHDL del
sincronizador es conveniente declarar como constantes todos esos valores del control
VGA que hemos escogido (primera fila de la tabla 9.1). Como vimos en el captulo 6, el
usodeconstantesesmuyrecomendable.Ennuestrocaso,debidoaquehaytantosvalores
distintos,serecomiendaelusodeconstantespor:
Claridad: si en el cdigo VHDL en vez de poner 640 ponemos c_pxl_total, ser ms
fcil entender que nos referimos al nmero de pxeles totales. Un cdigo ms claro
facilitalareutilizacinydisminuyelaposibilidaddeequivocarnos.
Facilidadparacambiar:siqueremoscambiarelvalordeunaconstante,slotenemosque
cambiarsuvalorenladeclaracin,envezdebuscarlaportodoslosficherosenlosque
est. Esta ltima manera de hacerlo adems de implicar mucho ms esfuerzo en la
bsqueda,favorecelaaparicindeerroresyaquetambinhayconstantesencubiertas.
Esdecir,habraquebuscaryrehacerlasoperacionesconesasconstantes.Porejemplo,
habraquebuscaryrecalcularun639quevendradec_pxl_total-1.
Como ya vimos, para poder usar las constantes sin tener que redeclararlas en todos los
ficheros VHDL, conviene poner todas las constantes de la VGA en un paquete. Este
paquetelopodremosusarentodoslosdiseosdelaVGA,yademsnossermuchoms
fcildemodificareldiseosiqueremoscambiarlaresolucindelapantalla.
En el cdigo 9.1 se muestra cmo se podra hacer el paquete de la definicin de las
constantes.Estasconstantesestnbasadasenlaprimerafiladelatabla9.1.

Departamento de Tecnologa Electrnica 181


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Enestepaqueteseutilizanfuncionesqueyahemosutilizado,comolog2i(cdigo7.4).Por
lo tanto habra que incluir otro paquete ms general con estas funciones. No hace falta
usarestafuncinypuedesasignardirectamenteelvaloralasconstantes,queenestecaso
es10.Estosdospaqueteslospuedesdescargarenladireccindelareferencia[28web].
package VGA_PKG is
-- Orden:
-- 1) video activo, 2) porche delantero, 3) sincro 4) porche trasero
-- Empezamos por el visible para que sea mas facil saber en que pixel visible
-- estamos, ya que si no, habria que realizar una resta
-- Por ejemplo para 640x480@60 Hz:
---------- Pixeles (horizontal, columnas) ---------------------------------|
-- | | | | |
-- | video activo | porche | sincro | porche |
-- | | delantero | horizontal | trasero |
-- | | | | |
-- |<--------- 640 -------->|<--- 16 ---->|<------ 96 ----->|<---- 48 ---->|
-- | | | | |
-- | c_pxl_visible |c_pxl_fporch | c_pxl_synch | c_pxl_bporch |
-- | | | | |
-- | | | |
-- |<----- c_pxl_2_fporch: 656 ---------->| | |
-- | | |
-- |<------------- c_pxl_2_synch: 752 --------------------->| |
-- | |
-- |<------------------------- c_pxl_total: 800 -------------------------->|

-- Pixeles (horizontal o columnas):


constant c_pxl_visible : natural := 640;
constant c_pxl_fporch : natural := 16;
-- del inicio hasta el porche delantero:
constant c_pxl_2_fporch : natural := c_pxl_visible + c_pxl_fporch; -- 656
constant c_pxl_synch : natural := 96;
-- del inicio hasta la sincronizacion:
constant c_pxl_2_synch : natural := c_pxl_2_fporch + c_pxl_synch; -- 752
-- total de pixeles horizontales:
constant c_pxl_total : natural := 800;
-- el porche trasero:
constant c_pxl_bporch : natural := c_pxl_total - c_pxl_2_synch; -- 48

-- Filas (vertical):
constant c_line_visible : natural := 480;
constant c_line_fporch : natural := 9;
constant c_line_2_fporch : natural := c_line_visible + c_line_fporch; -- 489
constant c_line_synch : natural := 2;
constant c_line_2_synch : natural := c_line_2_fporch + c_line_synch; -- 491
constant c_line_total : natural := 520;
constant c_line_bporch : natural := c_line_total - c_line_2_synch; -- 29

-- numero de bits para la cuenta de pixeles(columnas) y lineas (filas)


-- el logaritmo devuelve un bit menos, por eso se pone + 1
-- y hay que ponerle un -1, porque en el caso de que la cuenta sea justo
-- potencia de dos, vale con un bit menos, porque se cuenta el cero
-- por ejemplo, 8: log2i(8)= 3 | + 1 = 4, pero con 3 bits, tengo de 0 a 7 (cuento 8)
-- 7: log2i(7)= 2 | + 1 = 3
constant c_nb_pxls : natural := log2i(c_pxl_total-1) + 1 ; --Para 640x480 es 10
constant c_nb_lines: natural := log2i(c_line_total-1) + 1 ; --Para 640x480 es 10

-- numero de bits para cada color (RGB) Para la XUPV2P


constant c_nb_red : natural := 8; -- 3 para la Nexys
constant c_nb_green : natural := 8; -- 3 para la Nexys
constant c_nb_blue : natural := 8; -- 2 para la Nexys

-- frecuencia de la VGA
constant c_freq_vga : natural := 25*10**6; -- VGA 25MHz

-- nivel activo de sincronismo


constant c_synch_act : std_logic := '0'; -- Para 640x480
end VGA_PKG;
Cdigo 9.1: Paquete con la definicin de las constantes del controlador VGA

Observaenelpaquetedelcdigo9.1quelacuentaestreferidaapartirdelvideoactivo,
envezdeempezarlalneaconelsincronismohorizontal(comosemostrabaenlafigura

182 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA

9.4). EnrealidadalmonitorVGAledaigualpordondeseempieceacontar,yaqueson
sealesperidicas.Almonitorleesindiferentequeloprimeroqueleenviemosseanlos
pxeles visibles o los de sincronismo. De hecho, probablemente la primera pantalla que
enviemosnosemuestreyelmonitornecesiterecibirvariassealesdesincronismoantes
demostraralgoporpantalla.Delamismamaneraquepodemosconectarunmonitoraun
ordenador en cualquier momento (y no justo cuando se enve la seal de sincronismo),
nosotrospodemosempezarlacuentapordondequeramossiemprequemantengamoslas
frecuenciasapropiadas.
Debidoaquenoesunproblemadondeseempiezalacuenta,recomendamosempezarlaa
partirdelospxelesvisibles72.Laventajadeestoesquelacuentasecorresponderconlas
coordenadasenlapantalla.Esdecir,silacuentadepxeles(pxl_num)es80yladelneas
(line_num) es 40, se est dibujando en la pantalla el pxel de la columna 80 y de la fila
40(73). Si comenzsemos la cuenta en otro punto, tendramos que restar para saber la
correspondenciaentrelacuentadepxelesylascoordenadasenlapantalla74.
La figura9.9muestraelcronogramadelacuentadepxelescuandoseempiezadesdelos
pxelesvisibles.

visible

pxl_num ... 798 799 0 1 2 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 639 640 ,,, ... 655 656 ... ... ... ... ... 751 752 ... ... ... 798 799 0 1 ...

hsynch

visible: 640 pxeles porche sincronizacin porche


delantero: horizontal: trasero:
19 pxeles 96 pxeles 48 pxeles
Comienzo fin de
de lnea lnea
lnea: 800 pxeles
Figura 9.9: Cronograma de la cuenta de pxeles comenzando desde los pxeles visibles

Aspues,conlasindicacionesquesehandado,creaelmdulo sincro_vga.Unavezque
lotengas,simlalo.Lacreacindelbancodepruebasessencilla,pueslasnicasentradas
sonelrelojyelreset.Lacomprobacindelasimulacinesmsdifcil,pueshayquemedir
ycomprobarquelascuentasylostiempossecumplen.Enla figura9.3podemos verque
comolafrecuenciaderefrescoesde60Hz,los sincronismosverticalesdeberan aparecer
aproximadamente cada 17 ms. Por lo tanto, con 55 ms de simulacin debera ser
suficiente, para cubrir tres refrescos de pantalla. En la comprobacin de la simulacin
debersobservarsisecumplenlostiemposdelafigura9.3,tantodelospxelescomode
laslneas.

9.4. Implementacin de un controlador VGA sencillo


Unavezquetenemoselsincronizador,lohemossimuladoyhemoscomprobadoquelas
cuentasytiempossoncorrectos,podemospasaraprobarloconunmonitorreal.

72 Ylacuentadelneasapartirdelaslneasvisibles
73 Considerandolacolumnaceroladelaizquierdaylafilaceroladearriba(figura9.2)
74 Estasrestastampocosonungranproblema,peroalfinalelcdigoquedamenosclaroyeldiseoms
sencillo

Departamento de Tecnologa Electrnica 183


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Paraelloutilizaremoselsincronizadoryloincluiremosdentrodeunmduloestructural
demsaltonivel(VGA_SIMPLE).Dentrodeestemduloestructuralincluiremosunmdulo
(PINTA_BARRAS)queseencargardedibujarunasbarrasdecoloresenelmonitorquenos
permitirn comprobar el correcto funcionamiento del sincronizador. El esquema
estructuraldeldiseoquequeremosimplementarsemuestraenlafigura9.10.
VGA_SIMPLE

PINTA_BARRAS
10 8
pxl_num red red
10 8
line_num green green
visible 8 blue
SINCRO_VGA blue
pxl_num
line_num
visible vga_blank
hsynch hsynch
vsynch vsynch
pxl_clk pxl_clk
clk clk
clk comp_synch comp_synch
rst

rst

Figura 9.10: Esquema de bloques del controlador VGA sencillo

Las salidas son las que controlan la VGA y ya se explicaron en el apartado 9.2. Este
esquemaesparalaXUPV2P,yaquelaNexysnonecesitatantassealesyelanchodebus
delassealesdelcoloresmenor.
Elmdulo PINTA_BARRASpondruncolordiferentesegnlacolumnadelapantallaenla
que se est. Como hemos puesto la cuenta de los pxeles y lneas coincidentes con las
columnas y filas de la pantalla, no hay que hacer ninguna conversin. Cuando visible
sercero,pondrelcoloranegro(todocero).
Elcdigo9.2muestraelcdigodelaarquitecturadelmdulo PINTA_BARRAS.Esteproceso
est orientado para la XUPV2P, aunque funciona para la Nexys2 si las constantes estn
biendefinidas.
architecture behavioral of pinta_barras is
constant c_bar_width : natural := 64;
begin
P_pinta: Process (visible, pxl_num, line_num)
begin
red <= (others=>'0');
green <= (others=>'0');
blue <= (others=>'0');
if visible = '1' then
-- linea blanca de 1 pixel en los bordes
if pxl_num = 0 OR pxl_num = c_pxl_visible -1 OR
line_num=0 OR line_num= c_line_visible -1 then
red <= (others=>'1');
green <= (others=>'1');
blue <= (others=>'1');
elsif line_num >= 256 and line_num < 256 + c_bar_width then
-- esto solo tiene sentido para la XUPV2P
red <= std_logic_vector(pxl_num(c_nb_red-1 downto 0));
green <= std_logic_vector(pxl_num(c_nb_green-1 downto 0));
blue <= std_logic_vector(pxl_num(c_nb_blue-1 downto 0));
if pxl_num >= 256 then
red <= std_logic_vector(pxl_num(c_nb_red-1 downto 0));
green <= std_logic_vector(resize(255-pxl_num(7 downto 0),c_nb_green));
blue <= (others=>'0');
end if;
if pxl_num >= 512 then -- rayas horizontales
red <= (others=>not(line_num(0)));
green <= (others=>not(line_num(0)));
blue <= (others=>not(line_num(0)));

184 Universidad Rey Juan Carlos


9. Controlador de pantalla VGA

end if;
elsif line_num >= 256+c_bar_width and line_num < 256 + 2*c_bar_width then
red <= std_logic_vector(resize(255 - pxl_num(7 downto 0),c_nb_red));
green <= std_logic_vector(resize(255 - pxl_num(7 downto 0),c_nb_green));
blue <= std_logic_vector(resize(255 - pxl_num(7 downto 0),c_nb_blue));
if pxl_num >= 256 then
red <=std_logic_vector(resize(255 - pxl_num(7 downto 0),c_nb_red));
green<=(others=>'0');
blue <= std_logic_vector(pxl_num(c_nb_blue-1 downto 0));
end if;
if pxl_num >= 512 then -- puntos
red <= (others=>pxl_num(0) xor line_num(0));
green <= (others=>pxl_num(0) xor line_num(0));
blue <= (others=>pxl_num(0) xor line_num(0));
end if;
elsif pxl_num/c_bar_width = 0 then
-- columna 0 sera blanca, columna 1 negra, ...
red <= (others=>not(pxl_num(0)));
green <= (others=>not(pxl_num(0)));
blue <= (others=>not(pxl_num(0)));
elsif pxl_num/c_bar_width = 1 then --blanco
red <= (others=>'1');
green <= (others=>'1');
blue <= (others=>'1');
elsif pxl_num/c_bar_width = 2 then --amarillo
red <= (others=>'1');
green <= (others=>'1');
blue <= (others=>'0');
elsif pxl_num/c_bar_width = 3 then --cian
red <= (others=>'0');
green <= (others=>'1');
blue <= (others=>'1');
elsif pxl_num/c_bar_width = 4 then --verde
red <= (others=>'0');
green <= (others=>'1');
blue <= (others=>'0');
elsif pxl_num/c_bar_width = 5 then --magenta
red <= (others=>'1');
green <= (others=>'0');
blue <= (others=>'1');
elsif pxl_num/c_bar_width = 6 then --rojo
red <= (others=>'1');
green <= (others=>'0');
blue <= (others=>'0');
elsif pxl_num/c_bar_width = 7 then --azul
red <= (others=>'0');
green <= (others=>'0');
blue <= (others=>'1');
elsif pxl_num/c_bar_width = 8 then --negro
red <= (others=>'0');
green <= (others=>'0');
blue <= (others=>'0');
else -- columna 639 sera blanca, 638 negra, ...
red <= (others=>pxl_num(0));
green <= (others=>pxl_num(0));
blue <= (others=>pxl_num(0));
end if;
end if;
end process;
end Behavioral;
Cdigo 9.2: Proceso que asigna colores segn el pxel

Loquesemuestraenlapantallasonunasbarrasverticalesdecoloresamododecartade
ajuste.Lafigura9.11muestraelresultadoparalaXUPV2P,comolaNexys2tienemenor
profundidad de color, las barras horizontales son distintas75 (slo hay una barra
horizontal).

75 Enlapginawebdelareferencia[28web]puedesdescargarteficheromsadecuadoparalaNexys2.

Departamento de Tecnologa Electrnica 185


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

640 pxeles

480 pxeles


Figura 9.11: Carta de ajuste que debe mostrarse por pantalla para la XUPV2P

Sinoconsiguesvernada,probablementeelsincronismoestmal.Aunquetambinpuede
serporcualquierotromotivo,tendrsquehacerlascomprobacionesqueyasabes:pines,
conexiones de seales, cables,... Tendrs tambin que hacer un banco de pruebas para
todo el diseo, comprobando que los puertos red, green y blue, se ponen en los valores
fijadossegnenelpxelylalneaenlaqueseest.
Unavezqueconsigasmostrarlacartadeajusteporlapantalla,debescomprobarquelas
barrassedibujancorrectamente.Comprueba:
Que se dibuja un marco de color blanco de un pxel de ancho en los cuatro bordes,
muchasvecesfaltaalgnbordeporpintarenblanco,oalgunosdelosbordestienems
de un pxel de ancho. Como la resolucin de la pantalla es baja, los pxeles se puede
distinguir.
Quelasbarrasverticalestienenelmismoancho
Quelasbarrasverticalesdelaizquierdayderechaestnformadasporlneasalternativas
deblancoynegro.
Los colores de las ocho barras verticales: blanco, amarillo, cian, verde, magenta, rojo,
azulynegro.Sielblanconoesblancosinorosadopuedeserporquenotieneslaseal
comp_synchcorrectamente(tabla9.2),perotambinpuedeserqueelmonitorestviejo.
Comprueba que el monitor muestra los colores correctamente conectndolo a un
ordenador76. Si los colores no se corresponden, comprueba que tienes los pines y las
conexionesbienhechas.
Queenlascuatrobarrashorizontalesnohaysaltosbruscosdecolor(siusaslaXUPV2P).
Siloshubiese,esposiblesquealgnpuertonoestconectadoalpinadecuado.
Laslneashorizontalesblancasynegrasdelabarrahorizontaldeladerecha(ladearriba)
Lospxelesblancosynegrosalternadosenlabarrahorizontalqueestabajoaladerecha.
Haz los cambios para que se vea la carta de ajuste correctamente, quiz tengas que
simularyverlosvaloresdeloscoloresenlasfilasycolumnasdondetengaslosproblemas

76Tambinlopuedescomprobarsielmonitormuestraunaimagencuandoestandoencendidonoest
conectadoaningncableVGA

186 Universidad Rey Juan Carlos


10. Videojuego de tenis
EnestaprcticautilizaremoselcontroladorVGAdelaprcticaanteriorparadisearuno
delosprimerosvideojuegosquesedesarrollaronysehizomuypopularaprincipiosde
losaossetenta.Estevideojuegoestbasadoeneltenisdemesa(pingpong)yporestofue
comercializadoconelnombrePongporlaempresaAtari.
En el videojuego hay un recuadro que marca los lmites del campo de juego. Dentro de
estecampohaydosbarrasverticales,unaaladerechayotraalaizquierdadelcampo,que
representanalosdosjugadores.Hayunapelotaquevadeunjugadoraotro(figura10.1).
La pelota puede rebotar en las paredes superior e inferior, pero si sobrepasa a los
jugadoresyalcanzalasparedesverticalessergol.


Figura 10.1: Campo de juego

Las barras verticales pueden moverse verticalmente dentro de los lmites del campo de
juego. En un principio, estas barras se mueven por la pulsacin de los pulsadores de la
placa.
PosteriormentesepodrncontrolarporeltecladoPS/2 conectadoa laplaca(captulo11).
Cadajugadortienedosteclas:una parairarribayotraparairhaciaabajo.Sinosepulsa
ningunateclaosepulsanambasnohabrmovimiento.
La figura 10.2 muestra un esquema de la implementacin del videojuego. Este esquema
tienetresbloques:
SINCRO_VGA:sincronizadordelaVGAquehemosrealizadoenlaprcticaanterior

INTERFAZ_PB:interfazconlospulsadoresdelaplaca

PONG:encargadodelcontroldeljuego,movimientodepelotayjugadores,ydemostrarlo
porpantalla.

Departamento de Tecnologa Electrnica 187


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

TOP_PONG
INTERFAZ_PB PONG
pb_1 pb_1 jugizq_sube jugizq_sube
pb_2 pb_2 jugizq_baja jugizq_baja
pb_3 pb_3 jugdcha_sube jugdcha_sube
pb_4 pb_4 jugdcha_baja jugdcha_baja

clk 10 8
rst pxl_num red red
10 8
line_num green green
visible 8 blue
SINCRO_VGA blue
pxl_num clk
rst
line_num
visible vga_blank
hsynch hsynch
vsynch vsynch
pxl_clk pxl_clk
clk clk comp_synch comp_synch
rst

rst

Figura 10.2: Esquema de bloques del juego de tenis controlado por los pulsadores

Como siempre, se recomienda realizar el diseo por pasos, de manera que podamos ir
comprobandoquetodovafuncionandocorrectamentedemaneraindependiente.
Asquelospasospodrnser:
Dibujaryhacermoveraunjugadorporsuzonaapartirdelapulsacindesusbotones.
Incluirelsegundojugadorycomprobarquesemuevendemaneraindependiente
Dibujar y mover una pelota de manera permanente por el campo de juego, sin
interaccinconlosjugadores
Incluirlainteraccindelosjugadoresconlapelotaeincluirelgolalalcanzarlosbordes
laterales
Acontinuacinsedarnalgunasindicacionesparaeldiseodeestasetapas.

10.1. Control de los jugadores


Comohemosdicho,vamosairporparteseneldiseo.Asqueprimerovamosdelimitar
el campo de juego. Este circuito es muy sencillo y ya hemos realizado algo similar. El
diseo ser ms sencillo que la carta de ajuste que hicimos (figura 9.11). Pintaremos un
campo de juego. Se recomienda limitar el campo de juego mediante constantes. De esta
manera que podamos modificar su tamao fcilmente. As pues, la primera tarea ser
dibujar el campo de juego, puedes elegir los colores que quieras. Pinta los lmites del
campo de juego con ms de un pxel de ancho, para que se vea bien. Realizaremos el
diseo, lo implementaremos en la FPGA para asegurarnos que tenemos el primer paso
correctamente.
Conelcampodejuegodefinido,ahoradibujaremoslosjugadores.Mejorempiezaconun
jugador,luego,cuandotefuncionepuedespasaralotro.
En la figura 10.3 se muestran las dimensiones y coordenadas del jugador izquierdo
respecto a la esquina superior izquierda. Esta esquina se considera el punto de
coordenadas(0,0),ycoincideconelpxel0delalnea0delsincronizador(figura9.2).

188 Universidad Rey Juan Carlos


10. Videojuego de tenis

c_coljug
punto (0,0) Columnas
columna: 0
fila: 0

filajugizq

c_altojug
no es una constante,
su valor se guardar
c_anchojug en un registro

c_anchoborde
Filas


Figura 10.3: Coordenadas y medidas del jugador izquierdo en el campo

En la figura 10.3 todos los nombres que empiezan por c_ indican constantes. Estas
constantes conviene declararlas para que sea fcil de cambiar. Observa que la fila del
jugador(filajugizq)noesunaconstante,sinoquestevaaserelvalorquevaacambiar
duranteeljuegoyaqueeljugadorsepodrmoverhaciaarribayabajo.
Seha referidolaposicindeljugadorconelregistro filajugizqylaconstante c_coljug.
Estas coordenadas se han considerado como el centro del jugador (figura 10.3). Para
calcularloscuatrobordesdeljugadortendremosquesumarorestaralascoordenadas,las
dimensiones divididas entre dos. Debido a esta divisin, es conveniente que las
dimensiones del jugador sean un nmero par. Los bordes para el jugador izquierdo
sern77:
Filadelbordesuperior(variable): filajugizq - c_altojug/2
Filadelbordeinferior(variable): filajugizq + c_altojug/2
Columnadelbordeizquierdo(constante): c_coljug - c_anchojug/2
Columnadelbordederecho(constante): c_coljug + c_anchojug/2
De estos bordes, como slo se mueve verticalmente, las filas sern variables y las
columnasconstantes.
Conestosvalores,antesdeempezaramovereljugador,dibujaunjugadorenlapantalla
poniendosufilacomounaconstantequeluegocambiars.
Una vez que tienes un jugador dibujado (o los dos), podemos empezar a moverlos.
Primerodebesdeescogerlospulsadoresdecadajugadoryenqusentidolodesplazan.
Hazestodemodosqueseancmodoseintuitivos.Esdecir,noelijaslospulsadoresdela
derecha para el jugador izquierdo, ni tampoco elijas como pulsador de un jugador uno
queestentrelospulsadoresdelotrojugador.
Tienesquedefinirelfuncionamientodelmovimientodelosjugadoresenrelacinconlos
pulsadores.Esdecir,podemosescogerentreestasdosopciones:

77 Enrealidad,conestasfrmulaselanchorealesunpxelmsanchoquelaconstante.Aunqueluegodepende
delascondicionesysiseponencomparacionesdemayorymenor,omayorigualymenorigual.

Departamento de Tecnologa Electrnica 189


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

El jugador se mueve slo al pulsar, pero si mantenemos pulsado el pulsador, no


contina el movimiento. Es decir tenemos que pulsar y soltar consecutivamente para
movereljugador.
Eljugadorsemuevedemaneracontinuamientrasmantenemoselpulsadorpresionado
Paralaprimeraopcintendramosquerealizarundetectordeflanco.Recuerdaelcdigo
2.16y lafigura2.13enlaquesepuedevercmosetransformaunapulsacinlargaenun
nicopulsodereloj78.Silohacemosdeestamaneratendremosquepulsarmuchasveces
paramovereljugadorytendremosquevariarenmsdeunpxellaposicindeljugador,
yaquedeotramaneraelmovimientosermuylento(pxelapxel).Podemostardarms
dediezsegundosenirdelbordesuperioralinferior.
Conlasegundaopcinseconsigueunmovimientomsrpido,perotanrpidoquehay
queralentizarlo.Nopodemoscambiarlaposicindeljugadorcadacicloderelojenelque
tengamos presionado el pulsador. Si lo hacemos as, el jugador ir tan rpido que ni lo
veremos, y pasar de estar en un extremo al otro (eso si estn bien los controles del
jugador para que se mantenga dentro del campo de juego). As que para este caso la
solucin est en muestrear la seal cada cierto tiempo (entre 5 y 10 ms son valores
razonables). Tendremos que realizar un contador que al terminar su cuenta enve una
seal de aviso para que se comprueben las seales de los pulsadores, si alguno est
activado,deberenviarunpulso79deuncicloderelojalmduloPONGparaqueaumenteo
disminuyaenunalnealaposicindeljugador.Esimportantevolverponerlassealesa
cerodespusdemuestrear,porquesino,denuevoirmuyrpidoeljugador.
Estasegundaopcinquedamejorynoesmsdifcildehacerquelaprimera.
Tenencuentaningunapartedeljugadordebesobrepasarloslmitesdelcampo,portanto,
paracontrolarlaposicindeljugadordebestenerencuentasualturaydndeestnlos
bordes. Por ejemplo, se debe de impedir que suba el jugador cuando est en el borde
superior.
En el caso de que el movimiento sea con los flancos hay que tener ms cuidado en el
control de que el jugador no se salga del campo porque el movimiento es en saltos de
variaslneas,ypuedeserquesaltefueradelcampo.

10.2. Pelota que rebota


Unavezquetenemosalosjugadoresvamosaincluirlapelota.Enlaprimeraversinla
pelotaylosjugadoresvanaserindependientes.Lapelotarebotarenlascuatroparedes
delcampodejuegoyno chocarconlosjugadores.Lapelotasercuadradaytendrun
anchopardefinidoenlasconstantesdelmdulo(c_anchobola).
La pelota puede variar tanto su fila como columna, no como los jugadores que slo
podan variar su fila. Por lo tanto se necesitan dos registros para guardar sus
coordenadas. Pero tambin necesitamos un registro que guarde la direccin del
movimientodelapelota.

78Tambinhicimosundetectordeflancoeneltransmisor,recuerdalafigura7.27
79Estassealesson:jugizq_sube,jugizq_baja,jugdcha_subeyjugdcha_baja

190 Universidad Rey Juan Carlos


10. Videojuego de tenis

Para simplificar, limitaremos el movimiento de la pelota a las NO NE


cuatro direcciones mostradas en la figura 10.4. Estas direcciones
las llamaremos NO, NE, SE y SO, que corresponden con las
direccionesnoroeste,noreste,suresteysuroesterespectivamente. SO SE

EnVHDL,estascuatrodireccioneslaspodemosdeclararcomoun Figura 10.4: cuatro
enumerado. direcciones de la pelota

La pelota seguir la misma trayectoria hasta que alcance uno de los bordes. Al llegar a
stos cambiar la direccin tomando la direccin simtrica. La figura 10.5 muestra dos
ejemplos de cambios de trayectoria de la pelota. El resto de choques son fcilmente
deduciblesapartirdestos.

SE

SE NE

SO


Figura 10.5: Ejemplos de cambios de trayectoria de la pelota al chocar con las paredes

Igualqueenelcasodelosjugadores,laposicindelapelotanopuedecambiarcadaciclo
de reloj. Tendremos que crear un contador de modo que cada cierto tiempo su posicin
vare. Este tiempo puede ser del mismo orden de magnitud que el de muestreo de los
jugadores.Cadavezqueelcontadoravisequesellegaalfindecuenta,sedebecomprobar
que,siguiendosutrayectoria,lapelotanochocaconlosbordes.Silapelotanochocase
cambiarsufilaycolumnaenunpxelsegnladireccinindicadaporlatrayectoria.En
elcasodehayachoque,lapelotacambiarsutrayectoria,yelcambiodefilaycolumna
seguirlanuevatrayectoria.
Puede pasar que cuando la pelota choca, si no cambias la fila y columna de manera
consecuenteconlanuevatrayectoria,lapelotasequedeenganchadaenunborde.Eneste
casodebesrevisarlascondicionesdechoqueyasegurartequeenelmomentodelchoque
secambienlafilaycolumnasegnlanuevatrayectoriaynoconlatrayectoriaanterioral
choque.
Al principio y despusde cada gol, la pelota puede salir del centro del campo, con una
direccinpseudoaleatoria.Paraconseguirquesealomsaleatorioposiblehayquehacer
dependerelvalordealgoaleatorio,porejemplo,uncontadorquedependadelaltima
vezquesehaempezadoapulsarcualquieradelospulsadores.

10.3. Videojuego
Uniendolosjugadoresylapelotaconstruiremoslaprimeraversindelvideojuego.Ahora
la pelota estar limitada por los jugadores y no por los lmites verticales (izquierdo y
derecho)delcampo.Silapelotallegaaunodelosbordesverticalesdelcampodejuego
significaqueeljugadorcontrariohametidogol.
Estediseosepuedemejorarenmuchosaspectos:

Departamento de Tecnologa Electrnica 191


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Aumentar el nmero de direcciones y aadir efectos, por ejemplo, si choca con un


jugadorquetienevelocidad
Variarlavelocidaddelapelota.
Aadir un marcador que cuente los goles de cada jugador. Si quieres hacer esto sera
mejor que esperes a ver el captulo de pintar caracteres por pantalla (captulo 13).
Aunquenoestmalquelopiensesantesdeverelcaptulo.
MoverlosjugadoresconuntecladoPS/2,loveremosenelcaptulosiguiente.
Ponerunapelotaredondayjugadoresmenosrudimentarios.Loveremosenelcaptulo
dedibujarunaimagenporpantalla(captulo12).
Ycualquierotraideaqueseteocurra,sinembargo,anoserquetengasundeterminado
inters,noesnecesariohacermejorasquenoimpliquenningnaprendizajenuevo.Para
elobjetivodeaprendizajedeestelibro,notienemuchosentidomejorareldiseoabase
deaadirmuchasmscondicionesenlosprocesossinms.

192 Universidad Rey Juan Carlos


11. Puerto PS/2
ElpuertoPS/2seutilizaparaconectareltecladoyelratnalordenador.Aunquecadavez
se usa menos desde la aparicin de los teclados y ratones USB, todava se ven muchos
ordenadoresconestosconectores.
ElconectorPS/2constade6pines,queesdetipominiDIN(figura11.1).Elconectordel
tecladopuedeteneruncolor violetaomoradoyeldelratnpuedeserverde,aunquea
vecesnotienenuncolorespecfico.
El puerto PS/2 consta de cuatro cables: la alimentacin (4,5
5,5V), la tierra, el dato y el reloj. La comunicacin se realiza
conlaslneasdedatoyreloj.Lacomunicacinserealizaentre
un dispositivo: el teclado o el ratn, y la computadora o la
FPGA(elhost). Figura 11.1: Conector PS/2

El teclado y ratn PS/2 implementan un protocolo serie bidireccional sncrono con la


computadora.Elbusestenespera(idle)cuandoambaslneas(datoyreloj) estnauno.
Lacomputadoratieneelcontrolltimosobreelbus,pudiendoinhibirlacomunicacinen
cualquiermomentoponiendounceroenlalneadereloj.
El teclado puede funcionar de forma unidireccional, de modo que la computadora
simplementerecibalastramasdelteclado.Sinembargo,paraelfuncionamientodelratn
se requiere un modo bidireccional. Por tanto, el funcionamiento del teclado es ms
sencilloqueeldelratnyporestoseexplicarantes.
Atencin: No se recomienda conectar un dispositivo PS/2 con el ordenador encendido.
Por si acaso, te recomendamos que sigas la misma recomendacin cuando conectes el
dispositivoalaplacadelaFPGA,esdecir,quelosconectesconlaplacaapagada.

11.1. Teclado PS/2


Como slo necesitamos recibir las tramas del teclado PS/2, realizaremos un receptor de
tecladoPS/2,dejandoeltransmisorparaelratnPS/2.
LastramasenviadasporelprotocoloPS/2sonde11bits,teniendounbitdeinicio,8bits
dedato,unbitdeparidadimparyunbitdefin.DemanerasimilaralprotocoloRS232,la
lneadedatossemantieneavalorlgico1cuandoestinactiva,siendoelbitdeinicioun
cero y el bit de fin un uno. Los ocho bits de datos se envan empezando por el menos
significativo.Elbitdeparidadimparestaraunosihayunnmero pardeunosenlos8
bits de datos, y estar a cero si hay un nmero impar. Por tanto, contando los 8 bits de
datosmselbitdeparidad,deberhaberunnmeroimpardeunos(poresoesparidad
impar).Estoseutilizaparadetectarerrores.Lafigura11.2muestraelcronogramadeun
envodeltecladoalacomputadora.

Departamento de Tecnologa Electrnica 193


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Lectura en los flancos de bajada

clkps2

dataps2 b0 b1 b2 b3 b4 b5 b6 b7 P

paridad
reposo bit de

de fin
impar
dato de 8 bits reposo

bit
a '1' inicio a '1'
a '0'
Figura 11.2: Cronograma general de la transmisin del puerto PS/2

Podemos ver que la transmisin es muy parecida a la de la UART, la diferencia ms


importanteesqueelPS/2tienedoslneas:ladedatos(dataps2)yladelreloj(clkps2).La
lneadelrelojeslaquemarcalafrecuencia,indicandoloscambiosdebitycundosedebe
deleer.Lafrecuenciadelrelojesdeunrangoentre10y16,7kHz(entre60y100s).La
lecturadelbitsedeberealizarenlosflancosdebajadadelrelojdelPS/2(clkps2).
Lectura en los flancos de bajada

clkps2

dataps2 1 0 1 1 1 0 1 1
bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7
paridad

reposo bit de
de fin
impar

dato de 8 bits bit reposo


a '1' inicio 11011101 a '1'
a '0'
Figura 11.3: Ejemplo del cronograma para una transmisin del teclado

Con todo esto, podemos deducir que el diseo del receptor del teclado PS/2 ser muy
parecido al receptor de la UART. La mayor diferencia est en la generacin de la seal
paralalecturadelosbits.RecuerdaqueenelreceptordelaUART,paraleerlosbitsdela
trama tenamos que generar la seal baud_medio a partir del divisor de frecuencia
(apartado 7.7.3 y figura 7.48). Ahora ya no tenemos que generar esa seal porque la
lecturavienemarcadaporlosflancosdebajadadelasealderelojdelPS/2(clkps2).Lo
quetenemosquehaceresundetectordeflancosdebajadadelaseal clkps2.Tendremos
queleercadabitdelatramacadavezquesedetectaunflancodebajada.
Aspues,laentidaddelreceptordeltecladopodrsercomolamostradaenelbloquede
lafigura11.4.ObservaqueestereceptordeseparecemuchoaldelaUART(figura7.45).
Ladiferenciaesqueahorasetieneelpuerto ps2clkqueeselrelojdelatransmisinque
vienedelteclado.Tambinquesehaaadidolasealdeerror(error_ps)queindicasiha
habidoerrorenlatransmisin,calculadoapartirdelatramarecibidaysubitdeparidad.

194 Universidad Rey Juan Carlos


11. Puerto PS/2

RECEPTOR_KBD
8
dato_kbd
aviso_kbd
a nuestro kbdclk del exterior
sistema recibiendo (teclado)
kbddata
(FPGA)
kbd

clk
rst

Figura 11.4: Entradas y salidas del receptor del teclado

En principio, con lo que hemos estudiado hasta ahora, no deberas de tener muchos
problemaspararealizarestediseo.
Se recomienda incluir uno o dos registros a la entrada de las seales externas (ps2clk y
ps2data)paraevitarmetaestabilidad,yhacerlaslecturasyladeteccindeflancoconlas
seales registradas. La metaestabilidad se explic en el captulo 5 de la referencia
[17mach].

11.1.1. Cdigos scan


Hemosvistocmorecibirlainformacindelteclado,peroquiztehayaspreguntadoqu
significado tienen las tramas recibidas. Es decir, cul es la relacin entre las teclas que
pulsamos y lo que se enva por el PS/2. La relacin viene determinada por los cdigos
scan. La figura 11.5 muestra los cdigos scan de las teclas de un teclado ingls
norteamericano.


Figura 11.5: Cdigos scan de un teclado ingls norteamericano

Los cdigos scan de la figura 11.5 estn en hexadecimal, la mayora de ellos tiene dos
dgitoshexadecimales,porlotantosepuedenenviarenlos8bitsdedatosdelatramadel
PS/2. Sin embargo puedes observar que hay caracteres especiales que tienen ms de un
cdigo scan y que su cdigo est precedido por E0h. Por ejemplo, la flecha hacia arriba
tiene el cdigo E0h 75h. Estos cdigos scan dobles se llaman cdigos escapados (escaped
scancodes)oteclasextendidas.Puedesverqueinclusohayalgunosquetienenmsdedos.
Normalmenteloscdigosescapadostienenalgunarelacinconlossencillos.Porejemplola
tecladecontrolCtrldelaizquierdatieneelcdigo14h,yladeladerechaesE0h14h.
Loscdigosscanqueenvaeltecladosondedostipos:makeybreak.Cadavezquesepulsa
unateclaseenvauncdigomakeycuandosedejadepresionarseenvauncdigobreak.
ElcdigobreakesigualqueelmakeperoprecedidoporelnmeroF0h(enhexadecimal).
Conestosepuedesabersiseestpulsandounateclamientrashayotrateclapulsada,lo
queestilporejemploparalasteclasdemaysculasycontrol:Shift,Alt,Ctrl,....

Departamento de Tecnologa Electrnica 195


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

El teclado no realiza ninguna interpretacin de las teclas pulsadas, esto lo tiene que
realizar la computadora (o en nuestro caso, la FPGA). Es decir, que si mantenemos
presionada la tecla Shift cuando pulsamos la letra a, el teclado no enva la letra A
mayscula,sinoquelecorrespondealacomputadorainterpretarquesehaenviadoletra
Alamayscula.
En los cdigos scan escapados, cuando se enva el cdigo break, se enva entre los dos
cdigosscan.Porejemplo,elcdigobreakdelaflechahaciaarribaserE0hF0h75h.
Porponerunejemplo,siqueremosescribirlaletraZmayscula,sucederlosiguiente:
PresionamoslateclaShift:12h,ysinsoltarla
PresionamoslateclaZ:1Ah
SoltamoslaletraZ:F0h1Ah
SoltamoslateclaShift:F0h12h
Asqueeltecladoenviar:12h1AhF0h1AhF0h12h.
Si una tecla se mantiene pulsada se convierte en typematic, que significa que el teclado
reenviarsucdigomakeaproximadamentecada100ms,hastaquesesuelteohastaque
sepresioneotratecla.Paraverificarestopuedesabriruneditordetextoyhacerlaprueba:
Pulsaunatecla,porejemplolaB,einmediatamenteaparecerlaletrabeneleditor.Si
la has mantenido pulsada, al cabo de un breve espacio de tiempo volver a aparecer
repetidamentehastaque lasueltesohastaquepulsesotratecla.Enesteltimocaso,esta
ltimaseconvertirentypematic.Estohayquetenerloencuentaenelcontrol,cuandose
esperaquesemantenganpresionadasvariasteclassimultneamente.
Conestoyatenemos informacinsuficienteparahacer unreceptordeltecladoy,sifuese
necesario,uncontrolquegestionelasteclasquesepulsan.
Para probar este diseo puedes probar a enviar por la UART lo que se recibe por el
tecladoopuedesincluirelcontroldelvideojuegoPongporelteclado.

11.2. Ratn PS/2


El interfaz con el ratn es ms complicado porque el ratn necesita recibir informacin
desde la computadora para empezara funcionar, mientras que para el teclado no es
necesarioaunquepuederecibirinformacindesdelacomputadoraparasuconfiguracin.
Enelapartadoanteriorhemosvistocmorecibirdatosdeltecladosinnecesidaddeenviar
altecladoningunainformacin.
En este apartado vamos a introducir un concepto muy interesante que son los puertos
bidireccionales.Estoes,puertosquepuedenenviaryrecibirdatos.
Enesteapartadovamosaver:
Funcionamientodelratn
ProtocoloPS/2paraenviarinformacinalratndesdelacomputadora
Puertosbidireccionales
DescripcindepuertosbidireccionalesenVHDL
11.2.1. Funcionamiento del ratn
ElinterfazestndarPS/2delratnadmitelassiguientesentradas:
MovimientoenelejeX(izquierda/derecha)

196 Universidad Rey Juan Carlos


11. Puerto PS/2

MovimientoenelejeY(arriba/abajo)
Botnizquierdo
Botncentral
Botnderecho
El ratn lee estas entradas a una frecuencia determinada y actualiza los contadores e
indicadores para reflejar los estados de movimiento y botones. Existen muchos
dispositivosapuntadoresquetienenentradasadicionalesypuedenproporcionardatosde
maneradiferentealaqueseespecificaaqu(comoporejemplolosquetienenlaruedecita
descroll).
El ratn estndar tiene dos contadores que recogen la informacin del movimiento: los
contadores de movimiento en X y en Y. Estos valores se codifican con 9 bits en
complemento a 2, teniendo cada uno asociada una bandera de desbordamiento. El
contenido de estos contadores, as como el estado de los tres botones, se envan a la
computadoraenunpaquetedetresbytes.Loscontadoresdemovimientorepresentanel
movimiento que el ratn ha experimentado desde que se envi el ltimo paquete, por
tantonorepresentanposicionesabsolutas.
El contenido de estos bytes se muestra en la figura 11.6. El protocolo de envo es el
explicadoanteriormenteenlafigura11.2.Enlafigura11.6slosemuestranlosochobits
dedatosdelostresenvosynosemuestranlosbitsdeincio,paridadyfin.
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

Byte 1 Overfl.Y Overfl. X Signo Y Signo X 1 bot. Medio bot. dcha bot. izq.

Byte 2 Movimiento X

Byte 3 Movimiento Y

Figura 11.6: Contenido de los tres bytes de informacin enviados por el ratn

Elratnsepuedeconfigurarparacambiarparmetroscomolavelocidaddemuestreo,la
resolucin,elescaladoysiesthabilitadalatransmisindedatosono.
Hastaaquelfuncionamientoessimilaraldelteclado,sinembargoestefuncionamiento
correspondeconelmododefuncionamientostream(transmisin)cuandoesthabilitada
latransmisindedatos,peronoeselmododefuncionamientoconelquearrancaelratn.
Elratntienevariosmodosdefuncionamiento:reset,transmisin(stream),remotoyeco
(wrap).Losmodosremotoyecocasinoseusan,asqueslovamosaverlosdosprimeros.
Elmodoreseteselmodoenelqueentraelratnalencenderse.Alentrarenestemodoel
ratnrealizauntestdeautodiagnsticoyponelossiguientesparmetros:
Velocidaddemuestreo:100muestras/s
Resolucin:4cuentaspormilmetro(porcadamilmetroloscontadoresaumentanen4)
Escalado:1:1
Envodedatos:deshabilitado
Unavezqueelratnrealizaelautodiagnsticoenvauncdigoqueindicarsihatenido
xito (AAh) o si ha habido algn error (FCh). Luego enviar la identificacin del
dispositivoPS/2,queparaunratnPS/2estndares00h.

Departamento de Tecnologa Electrnica 197


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Una vez que el ratn ha enviado la identificacin del dispositivo entra en el modo de
transmisin.
Enelmododetransmisinelratnenvalainformacinsitienehabilitadaestafuncin.
Sin embargo, hemos visto que al arrancar el ratn en el modo reset, se deshabilita esta
funcin.
Para habilitar la transmisin, la computadora tiene que enviar el comando F4h (Enable
Data Reporting). Una vez que el ratn recibe este comando, ste responder con el
comandoFAhparaindicarelreconocimientodelcomando.
Apartirdeahoraelratnenviardatosnormalmenteyyanosernecesarioenviarms
comandosalratndesdelacomputadora.
Sehaincluidolatabla 11.1pararesumirloscomandosqueseenvanentreelratnyla
computadora(oFPGA)alarrancar,
secuenciaeneltiempo 1 2 3 4 5 ...
ratnFPGA AAh 00h FAh informedemovimientodelratn(figura11.6.)
FPGAratn F4h
Tabla 11.1: Comunicacin entre el ratn y la FPGA hasta habilitar la transmisin de datos del ratn

SiqueremoshacerunsistemalomssencilloposibleennuestraFPGA,nosbastaracon
enviar el comando F4h pasado un tiempo desde el arranque y esperar a recibir el
comando de reconocimiento FAh, una vez hecho esto, el sistema pasara a recibir la
informacin del movimiento del ratn. Por otro lado, hay que tener en cuenta que si
estamos configurando la FPGA desde el cable JTAG y el ratn est conectado80, el ratn
habrenviadoestosdoscomandosantesdequelaFPGAestconfigurada.Portanto,siya
loshaenviado,nuestrosistemasepodraquedarbloqueadoesperandoarecibirlos.
OtraalternativaesforzarelresetenviandoelcomandoderesetFFh,trasestecomando,el
ratnenviarelreconocimientoycomenzarconlasecuenciadelatabla11.1.
AcontinuacinveremoscmofuncionaelprotocoloPS/2paraenviaruncomandodesde
lacomputadoraalratn

11.2.2. Protocolo PS/2 para transmitir desde la computadora


NormalmenteelcontroldelalneadedatosydelrelojPS/2lotieneeldispositivo(ratno
teclado).Silacomputadora(oFPGA)quieretomarelcontroldebedeponerlalneadel
reloj(clkps2)acerodurante100s,despusdeestetiempo,liberalalneadelrelojypone
lalneadedatosacero(bitdeinicio).Posteriormente,conlalneaderelojcontroladaya
por el dispositivo, espera a cada flanco de bajada del reloj para poner cada uno de los
datosyelbitdeparidad.Finalmente,lacomputadoraliberalalneadedatosconelbitde
finyeldispositivoponeuncerodereconocimientoenlalneadedatos.
La figura 11.7 muestra el cronograma de las lneas de reloj y datos del PS/2 cuando la
computadora(oFPGA)quiereenviardatosaldispositivo.Comolalneaesbidireccional,
en lafigurasehadibujadoenrojolosvalorespuestosporlacomputadorayenazullos
valorespuestosporelratn.

80RecuerdaquenoesrecomendableconectarelratnoeltecladoPS/2conlaplacadelaFPGAencendida.

198 Universidad Rey Juan Carlos


11. Puerto PS/2

FPGA toma el
control del reloj

100s

clkps2

dataps2 b0 b1 b2 b3 b4 b5 b6 b7 P

bit de fin
bit de bits del dato bit de bit de
inicio paridad reconocimiento
(ack)
Ratn

FPGA
Figura 11.7: Cronograma de la transmisin de datos entre la computadora o FPGA (rojo) y el ratn (azul)

Para clarificar ms el cronograma, en la figura 11.8 se han separado los cronogramas


segnquinponeelvalor.Eneldearribayenrojosehanpuestolosvalorespuestospor
la computadora y abajo en azul las del ratn. Para ver mejor las relaciones entre las
seales,encadacronogramaseincluyeenlneapunteadalosvaloresdelasealqueson
puestosporelotrodispositivo.
Computadora o FPGA

clkps2

dataps2 b0 b1 b2 b3 b4 b5 b6 b7 P

clkps2
Ratn

dataps2 b0 b1 b2 b3 b4 b5 b6 b7 P

Figura 11.8: Cronogramas separados de la transmisin de datos desde la computadora hacia el ratn

Paramayorclaridad,acontinuacinseexplicaconmsdetalleelcronograma:
Lacomputadoratomaelcontroldelalneadelrelojponindolaacerodurantealmenos
100s.Conestoseinhibelaactividaddelratn.Estosepuedeinterpretarcomoquela
computadorasolicitarealizarunenvo
Pasados 100 s, la computadora libera la lnea de reloj y pone un cero en la lnea de
datos.Estecerosepuedeconsiderarcomoelbitdeinicio.
Lacomputadoramantieneelceroenlalneadedatoshastaqueelratntomaelcontrol
delalneaderelojylaponeacero.Estatransicindeunoacero(flancodebajada)se
puedeconsiderarcomounreconocimientoporpartedelratndequeharecibidoelbit
deinicio,yelindicaalacomputadoraqueenveelprimerbitdeldato(elbit0)
La computadora pone el bit nmero cero cuando detecta el flanco de bajada del reloj
puesto por el ratn. El ratn indica con cada flanco de bajada del reloj que est
preparadopararecibirelsiguientebit.Porlotanto,cadavezquelacomputadoradetecta

Departamento de Tecnologa Electrnica 199


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

unnuevoflancodebajadadelrelojpondrunnuevobit.Estaoperacinserepitecon
todoslosbitsdeldatohastallegaralbitdeparidad.
La computadora, una vez que detecta el flanco de bajada de reloj despus del bit de
paridad,liberalalneadedatos,loquehacequesepongaauno.Estoseraelbitdefin.
Unavezliberadalalneadedatosporlacomputadora,elratnpondrlalneadedatos
acero,indicandoquehareconocidolatransicin81.
La computadora podr verificar el bit de reconocimiento en la lnea de datos cuando
detecteunnuevoflancodebajadadelalneadereloj82.
Para terminar, el dispositivo liberar la lnea de datos y de reloj, ponindose ambas a
uno
Esteprotocoloesvlidotantoparaelratncomoparaelteclado,peroparaeltecladono
lohemosnecesitamosporqueporahoranohemosqueridoenviarleningncomando.
Conestainformacinyconladelapartadoanterioryapodramosprocederarealizar el
interfazconelratn.
Sin embargo, puede que te hayas estado preguntando, cmo puede haber una lnea
bidireccional.Hastaahorahemosseguidolaregladequeunasealnopuedeserasignada
desde dos sitios diferentes y hemos usado puertos que son o bien de entrada o bien de
salida.
A continuacin veremos cmo funcionan y cmo se implementan los puertos
bidireccionales.

11.2.3. Puertos bidireccionales


Las lneas de reloj y dato del PS/2 son en drenador abierto83, esto permite realizar
conexionesbidireccionalessobreelmismocable.Lafigura11.9muestraunesquemamuy
simplificadodelaconexinendrenadorabiertoentrelaFPGAyelratn.Elesquemaest
muysimplificadoyslopretendeexplicarelconcepto,ademsdequeelesquemareales
diferenteparalaXUPV2PylaNexys2.
FPGA
VDD

ratn Resistencia
de pull-up
FPGA

clkps2_r clkps2_f


Figura 11.9: Esquema simplificado de la conexin en drenador abierto delPS/2

La figura 11.10 esquematiza el funcionamiento de un transistor en drenador abierto


conectadoaunaresistenciadepullup.Elinversorquesehacolocadodespusdelaseal
AesparaquelasalidaLineatengaelmismovalor,sino,Lineaestarainvertida.

81Eninglssellamaacknowledgebit(ack)
82EstereconocimientonoesnecesarioimplementarloenlaFPGA
83OcolectorabiertoencasodequeseacontransistoresbipolaresenvezdeconMOSFET

200 Universidad Rey Juan Carlos


11. Puerto PS/2

La resistencia de pullup hace que la salida Linea est a VDD cuando el transistor no
conduce.Cuandoeltransistorconduce,lasalidaLineatieneunatensincasicero.

VDD VDD
VDD VDD

Linea='0' Linea='1'
0V 5V

A='0' A='1'
transistor transistor
conduce no conduce
A='1' A='0'

Figura 11.10: Funcionamiento de un transistor en drenador abierto con resistencia de pull-up

La figura 11.11 muestra el funcionamiento de dos transistores conectados en drenador


abierto.Observandolafiguravemosquesiningunoponeuncero,lasalidaesuno.Pero
desde que uno ponga un cero, la salida ser cero. Esta configuracin tambin se llama
andcableada(wiredand),porquefuncionacomounapuertaand.
VDD

A B Linea
Linea 0 0 0
0 1 0
A B 1 0 0
1 1 1

Los dos transistores conducen Un transistor conduce Ningn transistor conduce


VDD VDD VDD
A='1' A='1'
A='0'
B='0' B='1'
B='0'
Linea='0' Linea='1'
Linea='0' Linea=0V Linea=0V Linea=VDD

A B A B A B


Figura 11.11: Funcionamiento de dos transistores conectados en drenador abierto con resistencia de pull-up

Sepuedenconectarmsdedossealesendrenadorabiertoyelfuncionamientoserael
mismo,comosifueseunapuertaanddemsdedosentradas.
DeestamaneraescomofuncionanlaslneasPS/2.Enreposo,cuandonadieponeningn
valor, la lnea est a uno por la resistencia de pullup. Cuando uno de los dos pone un
cero,lalneaseponeacero.
AhoraquedavercmosedescribenestospuertosenVHDL

11.2.4. Puertos bidireccionales en VHDL


ParadescribirunpuertobidireccionalenVHDLseutilizanpuertosdetipoinoutyseales
triestado.Unasealtriestadopuedevaler '0', '1'puedeestarenaltaimpedancia.En
VHDLelvalordealtaimpedanciaserepresentacomo'Z'.
Unasealtriestadoseimplementaconunbuffertriestado(figura11.12).Estebuffertiene
unasealdehabilitacin(en)quecuandoestacerolasalidaestdeshabilitada,oloque
eslomismo,estarenaltaimpedancia.

Departamento de Tecnologa Electrnica 201


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

EN
EN I S
I S 0 0 Z
deshabilitada
0 1 Z
1 0 0
1 1 1
S <= I when EN = '1' else 'Z';

Figura 11.12: Buffer tri-estado

LadescripcindeunbuffertriestadoenVHDLtambinsemuestraenlafigura11.12.
EnVHDL,paralospuertosdeentradaysalida(inout)serecomiendasepararlaentrada
delasalidaenlaunidaddemsaltoniveldemodoquenoestemosmanejandosealesde
entrada y salida en todo el diseo. La figura 11.13 muestra un ejemplo para un diseo
estructural,endondeelpuertodeentradaysalidaclkps2seseparaenlasealdeentrada
clkps2_inyladesalidaclkps2_out.Estaltima,habilitadaporlasealen_clkps2.
TOP_RATON entity TOP_RATON is
port (
INTERFAZ_RATON clkps2 : inout std_logic;
en_clkps2 puerto ...
en_clkps2 inout end TOP_RATON;
puertos
de salida clkps2_out architecture ESTRUCTURAL of TOP_RATON is
clkps2_out clkps2 signal en_clkps2 : std_logic;
signal clkps2_out, clkps2_in: std_logic;
clkps2_in ...
clkps2_in
begin
clkps2_in <= clkps2;
clkps2 <= clkps2out when en_clkps2 = '1'
puerto de entrada
else 'Z';
...

Figura 11.13: Separacin de un puerto de entrada y salida en seales

Unavezquehemosseparadoelpuertodeentradaysalida clkps2,enelrestodeldiseo
no usaremos el puerto clkps2 sino que usaremos clkps2_in para leer y clkps2_out para
escribir,comosifuesensealesdistintas.Estaeslaformaalaqueestamosacostumbrados
adisear,lanicadiferenciaesquecuandoqueremosescribiralgoenlasealdesalida
clkps2_outtenemosqueponerlasealdehabilitacinen_clkps2auno.

Conestasindicacionesyapodrasrealizarelinterfazconelratn.Paradepurarlainterfaz
puedesenviarporlaUARTlosdatosrecibidosdelratn.Unavezquefuncione,puedes
probarapintaruncursorenlaVGAsegnelmovimientodelratn.
Enestecaptulohemosvistolainformacinnecesariapararealizarinterfacesbsicoscon
el teclado y el ratn. Para ampliar la informacin sobre el protocolo PS/2 y los distintos
tiposdecomandosquetiene,puedesconsultarlasreferencias[4chu,6ceng,23qihw].

202 Universidad Rey Juan Carlos


12. Memorias
Elobjetivodeestecaptuloesaprenderausarlosbloquesdememoriainternos(BRAM)
delasFPGAsdeXilinx,yengeneral,aaprenderadescribiryusarmemoriasenVHDL.
El captulo se organizar de la siguiente manera: primero veremos los bloques de
memoria internos de las FPGA de Xilinx, luego aprenderemos a describir una memoria
ROM de modo que podamos mostrar en la VGA una imagen guardada en este tipo de
memorias. Por ltimo aprenderemos a describir una memoria RAM, para ello
propondremosuncircuitoquerecibaunaimagenporlaUART,laguardeenlamemoria
RAMylamuestreporlapantalla.

12.1. Bloques de memoria RAM (BRAM)


LaFPGAdelaXUPV2Ptiene136 bloquesdememoriaRAM(BRAM)internos,mientras
quelaSpartan3edelaNexys2tiene 20bloques84.Cadabloquetiene18Kbits85deloscuales
16 Kbits son para guardar datos y 2 Kbits son para bits de paridad. Estos bloques se
puedenconfigurarcon distintosanchosdepalabra,pudiendopasarde16Kposiciones86
de memoria con un bit de ancho de palabra, hasta 512 posiciones de memoria con
palabrasde32bits(con4bitsde paridadopcionales).Losbitsdeparidadsepuedenusar
comobitsadicionalesdedato,perosolamenteenciertasconfiguraciones.Enlatabla12.1
se muestran las distintas configuraciones. Las 3 configuraciones de la derecha
(sombreadas)incluyenelbitdeparidad, poresosuman18Kbits,mientrasquelasdela
izquierda,quenolousan,suman16Kbits.
Posicionesdememoriaxnmerodebitsdelapalabra
16Kx1bit 8Kx2bits 4Kx4bits 2Kx9bits 1Kx18bits 512x36bits
Tabla 12.1: Configuraciones de las BRAM

Siimplementamosunamemoriaconotroanchodepalabra,perderemosbits.Siqueremos
una memoria de tres bits de ancho de palabra, usaramos la configuracin 4K x 4 bits,
peroperderamoselcuartobit(ademsdelbitdeparidadquepierdeestaconfiguracin).
El tamao total de la memoria interna de las FPGAs usando las BRAM lo calculamos
multiplicando el nmero de posiciones de memoria de una BRAM por el nmero de
bloquesBRAMquehay.Esteclculosemuestraenlatabla12.2.
1bit 2bits 4bits 9bits 18bits 36bits
XUPV2P(136) 2176K 1088K 544K 272K 136K 68K
Nexys2(20) 320K 160K 80K 40K 20K 10K
Tabla 12.2: Tamao mximo de la memoria usando todas las BRAM de la FPGA segn el ancho de palabra

84 EstosbloquesdememoriaestndentrodelaFPGA,nosonlasmemoriasdelasplacas,poresoson
memoriaspequeas.
85 1Kbit=210bits=1024bits
86 Estas16Kposicionesenrealidadson16x1024posiciones.

Departamento de Tecnologa Electrnica 203


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

As,porejemplo,conunanchodepalabrade9bits,lamemoriamximaquepodremos
usarenlaXUPV2Ptendr272Kposiciones(278528),ylaNexys2tendr40Kposiciones
(40960).
Veamos con un ejemplo el tamao mximo de memoria que disponemos en las FPGAs.
Supongamosquequeramosguardarunaimagencuadradaenescaladegrisescon8bits
de profundidad de color, es decir 256 niveles de gris87. Para este tipo de imgenes
utilizaramos un ancho de palabra de 9bits (tabla 12.2). El tamao mximo de las
imgenes segn el nmero de imgenes que queremos guardar se muestra en la tabla
12.3.
8bits/pxel 1imagen 2imgenes 3imgenes 4imgenes
XUPV2P 527x527 373x373 304x304 263x263
Nexys2 202x202 143x143 116x116 101x101
Tabla 12.3: Tamao mximo de las imgenes segn el nmero de imgenes que se van a guardar en las
BRAM. Para imgenes de 8 bits por pxel.

Realmente no es mucha cantidad de memoria, si quisisemos guardar imgenes ms


grandestendramosquerecurriralamemoriaexterna.LaXUPV2PpuedellevarunaDDR
SRAMde256512MB;laNexys2tieneunamemoriaSDRAMyotraflashde16MBcada
una,estasmemoriassontresrdenesdemagnitudmayoresquelamemoriainternadela
FPGA.Sinembargo,estasmemoriasexternassonmsdifcilesdeusar,especialmentela
delaXUPV2P,ytambinsonbastantemslentasquelasBRAMinternasdelasFPGAs.
Las memorias BRAM son de doble puerto, esto es, se puede acceder a ellas desde dos
puertos independientes, incluso estos puertos pueden funcionar con relojes diferentes.
Adems,estasmemoriassonmuyrpidasyaquedevuelveneldatosolicitadoenunciclo
dereloj.
Comoejemplo,enlafigura12.1semuestraelbloquedeunaBRAMdedoblepuertoycon
relojesdiferentes.Estamemoriaeslamsgeneral,yaquetienedoblepuertodeentraday
salida y relojes independientes para cada puerto. No es necesario incluir todos estos
puertos al describir una memoria. En este ejemplo la longitud de palabra (dina, douta,
dinby doutb)esde8bitsyelbusdedirecciones(addray addrb)tiene17bits.Con17bits
sepuedeaccedera131072direcciones88,asqueconestamemoriapodramosguardaruna
imagen de 362x362 pxeles de 8 bits cada pxel. Segn la tabla 12.3, en la XUPV2P
podramos tener dos memorias de este tipo, sin embargo, esta memoria no cabra en la
Nexys2.

87EstaimagenlapodramosmostrarcompletamenteconelconversorVGAdelaXUPV2P,yaquelaVGAde
estaplacatiene8bitsparacadacolor.SinembargolaNexys2slotiene8bitsparalostrescolores(recuerda
elapartado9.2),porloqueestaramosguardandoinformacinquenopodramosmostrar.Enelcasodela
Nexys2,siqueremosaprovecharmejorlamemoria,podramosguardarunaimagenencolorde8bits(256
colores).Estoloveremosenelapartado12.2.5.Enamboscasos,estaramosguardandounaimagenenlaque
usamos8bitsparacadapxel.
88217=131072

204 Universidad Rey Juan Carlos


12. Memorias

BRAM
1 1
enb ena

1 1
web wea
8 8
dinb dina
17 17
addrb addra

8 8
doutb douta

clkb clka

Figura 12.1: Bloque de memoria RAM de doble puerto

Enlatabla12.4seresumeelsignificadodelospuertos.
Seal bits I/O Descripcin
clka 1 I SealderelojparaelpuertoA
ena 1 I HabilitacindelpuertoA,sinhabilitacinnosepodrleerniescribirenelpuertoA
wea 1 I WriteEnabledeA:Habilitacinparaescrituradeldatodinaenladireccinde
memoriaaddra
dina 8 I DatodeentradaparaescribirenmemoriaporelpuertoA
addra 17 I Direccindememoriaquesequiereleer/escribirparaelpuertoA
douta 7 O Lecturadeldatoquehayenlaposicindememoriaaddra(tardaunciclodereloj)
clkb 1 I SealderelojparaelpuertoB
enb 1 I HabilitacindelpuertoB,sinhabilitacinnosepodrleerniescribirenelpuertoB
web 1 I WriteEnabledeB:Habilitacinparaescrituradeldatodinbenladireccinde
memoriaaddrb
dinb 8 I DatodeentradaparaescribirenmemoriaporelpuertoB
addrb 17 I Direccindememoriaquesequiereleer/escribirparaelpuertoB
doutb 7 O Lecturadeldatoquehayenlaposicindememoriaaddrb

Tabla 12.4: Listado de puertos de la BRAM de doble puerto

12.2. Dibujar una imagen guardada en una ROM


Enesteapartadovamosadisear varios circuitosquedibujenunaimagenguardadaen
distintas memorias ROM. Empezaremos con un diseo muy sencillo y luego lo iremos
complicando. Consideraremos las diferencias entre las placas XUPV2P y la Nexys2. El
esquemageneraldeloquequeremoshacersemuestraenlafigura12.2.

Departamento de Tecnologa Electrnica 205


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

TOP_PINTA_ROM
ROM_IMG PINTA_IMG
c_nb_datmem
dout datmem
c_nb_dirmem
addr dirmem
clk 10 8
pxl_num red red
10 8
line_num green green
visible 8 blue
SINCRO_VGA blue
pxl_num clk
rst
line_num
visible vga_blank
hsynch hsynch
vsynch vsynch
pxl_clk pxl_clk
clk clk comp_synch comp_synch
rst

rst

Figura 12.2: Esquema de bloques del circuito que pinta en la pantalla una imagen guardada en una ROM

PodemosverqueelesquemaseparecealcontroladorVGAquevimosenlafigura9.10,la
diferenciaestenlaintroduccindelbloquedelamemoriaROM(ROM_IMG).
ObservaqueelbloquedelamemoriaROMesmuchomssencilloqueeldelamemoria
RAMdedoblepuerto(figura12.1).Porunlado,estamemoriaROMslotieneunpuerto,
as que con esto se han quitado la mitad de los puertos (enb, web, dinb, addrb, doutb y
clkb).Porotrolado,porserunamemoriadeslolectura,sequitaeldatodeentrada dina
ylahabilitacindeescritura wea.Tampocosehaincluidolasealdehabilitacin ena.As
queslonosquedaelreloj(clk),ladireccinde memoriaquequeremosleer(addr)y el
datodevueltoporlamemoria(dout).
Observaqueelnmerodebitsdeladireccindememoria(c_nb_dirmem)yelnmerode
bitsdeldato89(c_nb_datmem)estnconconstantes.Ytambinqueelnmerodebitsdelos
colores(red,greenyblue)sonocho,peroparalaNexys2sern3,3y2respectivamente.
AhoraveremoscmosepuededescribirunamemoriaROM.

12.2.1. Memoria ROM de un bit de ancho de palabra


EnVHDL,unamemoriaROMessimplementeunaconstantedetipovectorialalaquese
accedemedianteunprocesoconreloj.LadireccindememoriadelaROMeselndicedel
vector.Enelcdigo12.1semuestraunmduloquedescribeunamemoriaROMde256
posicionesycondatosdeunnicobit.EstamemoriaROMrepresentaunaimagende16
filas y 16 columnas. Por eso se ha llamado ROM1b_16x16, sin embargo la memoria es
unidimensional,esdecir,accedemosporunndice(addr)quevadesde0a255ynoporla
filaycolumna.Comoson255posicionesdememoriaaddresde8bits.

89Elanchodepalabra

206 Universidad Rey Juan Carlos


12. Memorias

entity ROM1b_16x16 is
port (
clk : in std_logic;
addr : in std_logic_vector(7 downto 0);
dout : out std_logic
);
end ROM1b_16x16;

architecture BEHAVIORAL of ROM1b_16x16 is


signal addr_int : natural range 0 to 2**8-1;
type memostruct is array (natural range<>) of std_logic;

constant img : memostruct := (


-- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 0
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 1
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 2
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 3
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 4
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 5
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 6
'1','0','1','0','1','0','1','0','1','0','1','0','1','0','1','0', -- 7
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1', -- 8
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', -- 9
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1', --10
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', --11
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1', --12
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', --13
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1', --14
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' --15
);
begin

addr_int <= TO_INTEGER(unsigned(addr)); -- pasar a entero la direccion

P_ROM: process (clk)


begin
if clk'event and clk='1' then
dout <= img(addr_int);
end if;
end process;

end BEHAVIORAL;
Cdigo 12.1: Memoria ROM de 256 posiciones y un bit de ancho de palabra90

En el cdigo 12.1 podemos ver que el dato de salida dout se obtiene un ciclo de reloj
despusdehaberintroducidoladireccinquequeremos.Estotieneimplicacionesporque
retrasaruncicloderelojlassalidasquedependendeestedato.

12.2.2. Circuito que dibuja la imagen de la ROM de un bit de ancho


Queremos dibujar la imagen de 16x16 de la ROM (cdigo 12.1) en la esquina superior
izquierdadelaVGA.Elrestodelapantallaestarencolorazul.
La imagen de la ROM slo tiene un bit por pxel, por tanto, ser una imagen de dos
colores:blancoynegro91.Siconsideramoslosunoscomoblancoylosceroscomonegro,la
imagenseracomolamostradaenlafigura12.3.Enlaimagensehanpintadolosbordes
decadapxelconlneadiscontnuagrisparaapreciarmsfcilmentesusdimensiones.

90 Elcdigodeestamemoriasepuededescargardelareferencia[28web]
91 Enrealidadpodemoselegirotrosdoscolorescualquiera,peroslodos.

Departamento de Tecnologa Electrnica 207


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 12.3: Imagen de la ROM del cdigo 12.1

Dibujaremos la imagen en la esquina superior izquierda de la pantalla. Como es una


imagende16x16,estardibujadaentrelascolumnas0y15,yentrelasfilas0y15dela
pantalla. Esta ser la condicin que tendremos que poner en el proceso del mdulo
PINTA_IMG (figura 12.2), que es el encargado de pintar92. El resto de la pantalla la
pintaremosdeazul.
Para mostrar la imagen tendremos que pedir el dato de la memoria, esperar a que la
memoria devuelva el dato y dibujar el pxel en la VGA. Todo este proceso se tiene que
hacer rpido, ya que la VGA no espera. La VGA tiene que mostrar los pxeles
consecutivamenteenlostiemposdeterminadosporsufrecuenciaderefresco(recuerdala
tabla9.1).Porsuerte lasmemorias BRAMson rpidasyslotardanunciclode relojen
devolvereldatosolicitado.EnnuestraVGAcadapxelsemuestraaunafrecuenciade25
MHz,ylosrelojesdelasplacasvancuatrovecesmsrpidoenlaXUPV2Podosveces
msrpidoenlaNexys2.Asqueenprincipionodeberadehaberproblemaporretrasar
unciclodereloj.
Enlafigura12.4semuestracmorealizarelclculodeladireccindememoria(dirmemo
addr)apartirdelnmerodepxel(pxl_num)yelnmerodelnea(line_num)delaVGA.

LafigurarepresentalaesquinasuperiorizquierdadelaVGA,dondequeremosdibujarla
imagende16x16.LosnmerosenazulrepresentanlascolumnasopxelesdelaVGA,que
aunquevande0a639,enlafiguraslosehandibujadolosprimeros18(de0a17).Los
nmeros rojos representan las lneas (filas) de la VGA, que slo se han dibujado de la
lnea cero a la cuatro. Los cuadrados representan los pxeles de la imagen, de todos los
pxelesdelaimagenslosehandibujadolosdelasprimerasfilas,aunqueenstassse
muestran las 16 columnas de cada fila. Por eso la imagen no se ve cuadrada, aunque lo
sea.Dentrodecadapxelsehaindicadoelnmerodepxeldelaimagen.Estenmerode
pxel se corresponde con la direccin de memoria que hay que solicitar para obtener el
colordelpxel.

92seraelprocesoequivalentealdelcdigo9.2,peroparaestediseoelprocesosermspequeo

208 Universidad Rey Juan Carlos


12. Memorias

pxeles (columnas) de la pantalla (pxl_num)


lneas 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
de la pantalla
(line_num) 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 pxeles de la
imagen (dirmem)
3 48 49 50 ... ... ... 63

4 64 ...
... ...

...

38 = (2x16)+6
pxl_num
dirmem o addr
c_ncol
line_num nmero de columnas
de la imagen
Figura 12.4: Clculo de la direccin de memoria a travs del nmero de pxel y nmero de lnea de la VGA

En la parte inferior de la figura 12.4 se muestra cmo calcular la direccin de memoria


correspondientealpxelquetenemosquemostrarencadamomento.Laformulaes:
dirmem = (line_num c_ncol) + pxl_num (12.1)

Donde dirmem es la direccin de memoria (tambin la hemos llamado addr); pxl_num y


line_numsonelnmerodepxel(columna)yelnmerodelneadelaVGA,generadosen
elsincronizadordelaVGA(SINCRO_VGA);y c_ncolesunaconstantequedefineelnmero
decolumnasdelaimagenqueestamosdibujando,queenelejemplovale16.
Recuerda que para realizar una multiplicacin las dimensiones de los factores y el
producto son muy importantes, si no, se sintetizarn multiplicadores muy grandes que
consumirnmuchosrecursos.Asquetenemosqueanalizarlasoperacionesimplicadas,y
especialmentelamultiplicacin:
Elproductonopodrsermayorque255(8bits),pueseselnmerodedireccionesdela
memoria,ynopodemosaccederaunaposicindememoriamayor.
Aunqueline_numtieneunrangode0a519(10bits),enrealidad,paranuestraimagenel
mximonmerodefilasson15(4bits).Porlotanto,envezdeusarline_numensurango
completo,usaremosline_num(3 downto 0).
Algosimilarocurrecon pxl_num,aunquesu rangoesde0a799,paranuestraimagen
slonecesitamosloscuatroprimerosbits:pxl_num(3 downto 0).
El resultado de multiplicar el valor mximo de line_num(3 downto 0) por 16, es un
nmerode8bits(15x16=240).
Sumandoelnmeroanteriorconelmayornmeroquepuedetener pxl_num(3 downto
0)resultaen255=240+15.
Asquelafrmula12.1quedar93:
dirmem = (line_num(3:0) c_ncol) + pxl_num(3:0) (12.2)
Sinembargo,sipasamosestamultiplicacindirectamenteaVHDLnosesintetizarcomo
queremos. Recuerda los cdigos 8.20 y 8.21, en los que veamos que no podemos
multiplicar una seal por una constante de mayor rango. En nuestro caso, n_col tiene 5
bitsmientrasqueline_num(3:0)tienecuatrobits.EnVHDLtendramosquehacerlocomo

93 Estoesunafrmula,notienelasintaxisdelVHDL

Departamento de Tecnologa Electrnica 209


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

muestraelcdigo12.2.Sehatenidoquecrearlasealintermedia line_numx16,porqueel
productotendr diezbits.Tienequetener diezbitsporqueelfactortienecincobits yal
multiplicar por una constante el producto tendr el doble de bits que el factor no
constante. Posteriormente, en lasuma se trunca line_numx16 ya que hemos visto que en
nuestrocasoelproductonuncavaatenermsdeochobits.
...
signal line_numx16 : unsigned (9 downto 0);
begin
line_numx16 <= ('0'&line_num(3 downto 0)) * 16;
dirmem <= line_numx16(7 downto 0) + pxl_num(3 downto 0);
...
Cdigo 12.2: Clculo de la direccin de memoria con multiplicacin

Haciendolamultiplicacindeestamaneraevitamosquesesinteticenmultiplicadoresms
grandesdelonecesarioyobtenemosunrangoacordeconladireccindememoria.
El clculo de la direccin de memoria no hace falta que se haga nicamente cuando
estemosenelrecuadrodelaVGAquecorrespondeconlaimagen,esdecirentrelasfilasy
columnas 0 y 15. Este mdulo puede estar constantemente calculando la direccin de
memoriaysolicitandoalamemoriadatos,perolosdatosdevueltosslolosutilizaremos
cuando estemos pintando la imagen (esquina superior izquierda). Esta es una de las
diferenciasentreelsoftwareyelhardware.Elcircuitoencargadodecalcularladireccin
de memoria es independiente del resto y el que est calculando la direccin
constantementenohacequeelrestodelcircuitovayamslento94.
Conestasindicacionespuedesrealizarelcircuito.Cuandolapantallamuestrelaimagen,
debes de comprobar que se dibuja una imagen cuadrada de 16x16 como la de la figura
12.3.Diecisispxelesdeanchonosonmuchosparaunapantallayporesolaimagenes
pequea,peroqueramosevitarincluirunaROMmuygrandeenelcdigo12.1.Debesde
comprobar que las lneas son rectas y continuas; que tienen el mismo ancho,
especialmenteenlosbordesyesquinas;yquelaimagenescuadrada.
Sinosemostrasecorrectamente,debersdesimularyverlosvaloresdelospuertos red,
green y blue en los pxeles y lneas de la VGA donde se pinta la imagen. Haz las
comprobacionesunavezquehayapasadolaprimerasincronizacinvertical(hsynch='0').
Leerelsiguienteapartadotambintepuedeayudaraencontraralgnfallo.

12.2.3. Mejoras y variantes del circuito que dibuja la imagen de la ROM


En este apartado veremos algunas mejoras y variantes del circuito anterior. Estas
variantespodrnsertilesparaentenderlossiguientesapartadosycaptulos.
Hazestasmodificacionesenotrascarpetasyproyectos,copiandolosficherosVHDL.Es
muy importante que cuando realices modificaciones de un circuito que funciona
mantengaslaversin original.As,encasodequenadafuncionesiemprepuedasvolver
atrs.
12.2.3.1. Retraso de las salidas de la VGA
Hemosvistoquealsolicitarlosdatosalamemoriavamosatenerunretrasodeunciclo
de reloj en las seales que se generan en el mdulo PINTA_IMG: red, green y blue. Sin
embargo, el resto de seales de la VGA no tienen retraso. Esto no es un gran problema

94Sinembargo,enelcasodequequeramosquenuestrocircuitoconsumapocaenergaesconvenienteparar
loscircuitosquenoestnhaciendonadatil.

210 Universidad Rey Juan Carlos


12. Memorias

porque la frecuencia de la FPGA es mayor que la de la VGA. Sin embargo, a veces da


problemas,especialmenteenlosprimerospxelesdecadafila95.Debidoaesto,puedeser
quelasprimerascolumnasnosemuestrenbien.
Como solucin se puede retrasar el resto de seales de la VGA haciendo que estn
sincronizadasconlassealesquesegeneranen PINTA_IMG.Realizandoestamodificacin,
el esquema de la figura 12.2 se transformara en el de la figura 12.5, en donde el nico
cambio es la inclusin del mdulo VGA_REG para registrar las seales de la VGA. Al
registrar las seales (cdigo 2.13), en el reset se debera de asignar el valor que haga
inactivalaseal96.
TOP_PINTA_ROM

ROM_IMG PINTA_IMG
c_nb_datmem
dout datmem
c_nb_dirmem
c_nb_dirmem
addr dirmem
clk 10 8
pxl_num red red
10 8
line_num green green
visible 8 blue
SINCRO_VGA blue
pxl_num clk
rst
line_num VGA_REG
visible vga_blank
hsynch hsynch
vsynch vsynch
pxl_clk pxl_clk
clk clk comp_synch comp_synch
rst clk
rst
rst

Figura 12.5: Esquema de bloques del circuito que pinta en la pantalla una imagen guardada en una ROM
retrasando las seales de la VGA

Tantosiseproducealgndefectodeestetipocomosino,terecomendamosquecambies
el circuito y registres las salidas. Esto, adems de sincronizar las seales, registra los
puertos de salida. Registrar los puertos de salida es una prctica muy recomendada
porque la seal no tendr los retardos ni las transiciones espurias debidas a la lgica
combinacional.
Las transiciones espurias se producen por los retardos de las puertas (y tambin las
interconexiones). En la figura 12.6 se puede ver cmo al cambiar la entrada A y D, se
produceunatransicinespuriaenlasalidaS3.Latransicinesespuriaporquedespusde
los retardos debidos a la propagacin de las seales, la salida S3 mantendr su valor
original,porlotantosontransicionesnodeseadas.Siregistramosestasalida,latransicin
espurianosetrasladaralasalidadelbiestable(PO)porqueeltiempodeestatransicines
menorqueelperiododelreloj.

95 Ennuestrodiseolasegundacolumna(lanegra)delaimagen(figura12.3)seveablanca,porloqueseuna
conlaprimerayterceracolumna,pareciendounacolumnamsgruesaqueelresto.Estoseproducaenla
XUPV2PperonoenlaNesys2
96 Porejemplo,elvalorinactivodelassealeshsynchyvsynch,sueleser1ylodefinimosporlaconstante
c_synch_actinvertida(recuerdaelcdigo9.1).

Departamento de Tecnologa Electrnica 211


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Tg Tg Tg

t0 t1 t2 t3
t0 t1 t2 t3
A retardo S1
Tg
B=1 S2 t0 t1 t2 t3
retardo
C=1 Tg PO
retardo
D Tg S3 sin transiciones
Tg Tg Tg espurias

transiciones
espurias
D t0 t1 t2 t3 t0 t1 t2 t3
t0 t1 t2 t3
Tclk Tclk
periodo de reloj periodo de reloj
Figura 12.6: Eliminacin de transiciones espurias con un biestable

Siimplementaselcircuitopropuestoenesteapartado(figura12.5)ytesalebien,mantenlo
comocircuitobaseparalosdemscambios.Esdecir,partedeesteparahacerloscambios
propuestosenlossiguientesapartados.
12.2.3.2. Clculo de las direcciones sin multiplicador
Enlafrmuladelclculodeladireccindememoriavemosquehayunamultiplicacin.
Delcaptulo8,sabemosquelasmultiplicacionesconsumenbastantesrecursosysonms
lentas.Unaalternativaalamultiplicacinesutilizarunregistroqueseinicialiceenlafila
ceroy que aumenteen16(c_ncol)cadavez queseincrementeunafila.Hacerlo deesta
manera requiere un poco ms de cuidado en las sumas y las inicializaciones de este
registro,peroahorraunmultiplicador.Siquieres,puedeshacerunaprimeraversincon
lamultiplicacinyluegoprobararealizarlodeestamanera.
12.2.3.3. Dibujar la imagen en otro lugar de la pantalla
Envezdedibujarlaimagenenlaesquinasuperiorizquierda,empezandoporelpxelde
laposicin(0,0),ahorarealizaremoselmismocircuitoperodibujandolaimagenapartir
delafila100ycolumna200.
La solucin es fcil, en el proceso de pintar hay que cambiar las condiciones que sitan
dnde se pintan los pxeles de la imagen (proceso P_pinta). Por otro lado, hay que
cambiarlaecuacindelclculodelasdirecciones.Ahorayanosecalculancon pxl_numy
line_num, sino que hay que hacer un cambio de ejes restando 200 y 100 a estas seales
respectivamente.
Puedespensarqupasarcuandoalrealizarestasrestaspxl_numyline_numseanmenores
quelossustraendos(200y100).Enrealidadnonosimportaporqueenelproceso P_pinta
se controla que slo se pinte cuando sean mayores. Pero no est mal que pienses qu
pasarasinosecontrolase.
12.2.3.4. Repeticin de la imagen
Hemosrealizadoelcircuitodemodoqueelclculodeladireccindememoriaserealiza
constantemente y en el proceso de pintar (proceso P_pinta) es donde se incluyen las
condicionesqueindicandndesepintalaimagen.Enestapropuestavamosaquitarlas
condiciones enel proceso P_pintaque hacen que la imagen se dibuje slo en la esquina
superiorizquierda.Asqueelprocesodepintarquedaracomomuestraenelcdigo12.3.

212 Universidad Rey Juan Carlos


12. Memorias

P_pinta: Process (visible, datmem)


begin
red <= (others=>'0');
green <= (others=>'0');
blue <= (others=>'0');
if visible = '1' then
red <= (others => datmem);
green <= (others => datmem);
blue <= (others => datmem);
end if;
end process;
Cdigo 12.3: Dibujar la imagen de manera repetida

El resultado ser que la imagen se dibuja de manera repetitiva por toda la pantalla.
PuedesprobaracambiaramanolaimagendelaROMdelcdigo12.1paraponerotras
formas.
EntiendesporquseformaesaimagenenlaVGA?
12.2.3.5. Ampliacin por dos
En esta variante vamos a volver a pintar una sola imagen en la esquina superior
izquierda,perolaqueremospintaraldobledetamao.Envezdedibujarlaimagenensu
tamaooriginalde16x16,lapintaremosatamao32x32.Seteocurrecmohacerlo?
PorunladotienesquecambiarelprocesoP_pintademodoqueahoraelcuadradodonde
sepintalaimagenseade32x32(esquinasuperiorizquierdadelapantalla).Porotrolado
queremos pintar el mismo pxel de la imagen en la interseccin de dos columnas y dos
filasdelapantalla.Paraello,alcalcularladireccinde memoriatendremosquedividir
entredoslosnmerosdecolumnayfilaenlaqueestamos.
Lafigura12.7muestracmosecalcularanlasdireccionesdememoria.Adiferenciadela
figura 12.4, para evitar una imagen muy grande, en esta figura no se muestran las 32
columnasdelaimagen.
Loscuadrosconbordeverderepresentancadapxeldelaimagen.Estoscuadrosabarcan
cuatro pxeles de la pantalla (borde negro). Observa que quitando el bit menos
significativo de pxl_num obtenemos la columna de la imagen en la que estamos. Y lo
mismosucedeconlafila,porejemplo,lospxelesdelafilacerodelaimagenestnenlas
filas cero y uno de la pantalla. Como ya sabemos, quitar el bit menos significativo es
dividirpordos.

Departamento de Tecnologa Electrnica 213


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

columna 6 de la imagen
columnas 12 y 13 de la pantalla
pxeles (columnas) de la pantalla (pxl_num)

....
0000
0001
0010

1000
1001
1010

1100
1101
1110
0100
0101
0110

1011

1111
0011

0111
lneas
de la pantalla pxl_num/2
(line_num) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

fila 0 de la imagen 0000 0 0 1 2 3 4 5 6 7 8 ...


filas 0 y 1 de la pantalla 1
0001

fila 1 de la imagen 0010 2 16 17 18 19 20 21 22 23 24 ...


filas 2 y 3 de la pantalla 0011 3

0100 4 pxeles de
fila 2 de la imagen 32 33 34 35 36 37 38 39 40
filas 4 y 5 de la pantalla la imagen
0101 ... ... ... (dirmem)
.... 48 ...

line_num / 2 ...
19 = (1x16)+3
pxl_num/2
dirmem o addr
c_ncol
line_num/2 nmero de columnas
de la imagen
Figura 12.7: Clculo de la direccin de memoria para pintar una imagen el doble de grande

Ahora,envezderealizarlasoperacionescon pxl_num(3 downto 0)y line_num(3 downto


0)comosehicieronenelcdigo12.2,lasharemoscon pxl_num(4 downto 1)y line_num(4
downto 1).Conestoconvertimoslainterseccindedosfilasydoscolumnasdelapantalla
enunslopxeldelaimagen,dibujandolaimagencontamao32x32.
Cuando hayas dibujado la imagen al doble de tamao puedes probar a realizar la
ampliacin por cuatro, ocho,... Ampliaciones que no sean potencias de dos no son tan
fciles,aunquenotandifcilescomolasampliacionesdenumerosfraccionarios.
12.2.3.6. Uso de las potencias de dos
Quizyatehayasdadocuentaqueparalaimagenqueestamosutilizandohayunaforma
msfcildecalcularlasdireccionesdememoria.Comolaimagenesde16x16,y16esuna
potencia de 2, las multiplicaciones son mucho ms sencillas. Lo que hemos hecho
anteriormente es vlido para cualquier tipo de imagen, pero para imgenes con un un
nmero de columnas que sea potencia de dos hay maneras ms sencillas de realizar los
clculos.
Multiplicarunnmeroporunapotenciadedos(2n)esequivalenteadesplazarelnmero,
n veces a la izquierda. Como el nmero de columnas de la imagen es 16 (24), hay que
desplazarcuatrovecesalaizquierdaelnmerodelneadelapantalla(equivalenteala
multiplicacin por 16 del cdigo 12.2) y sumarle los cuatro bits menossignificativos del
nmerodepxel(columna)delapantalla.Comodelnmerodepxelcogamosloscuatro
bits menos significativos y ahora desplazamos el nmero de lnea de la pantalla cuatro
bitsalaizquierda,alfinalnoesnecesariosumarsinoquebastaconconcatenar,pueslas
lneasocupanlos4bitsmssignificativosylascolumnas(pxelesdelapantalla)los4bits
menossignificativos.Lafigura12.8muestrademaneraesquemticalaoperacinquehay
quehacer.

214 Universidad Rey Juan Carlos


12. Memorias

dirmem = (16 x line_num(3 downto 0)) + pxl_num(3 downto 0)

x16: desplazado
4 posiciones
16 x line_num(3 downto 0)

+ pxl_num(3 downto 0)

dirmem(7 downto 0)

&

line_num(3 downto 0) & pxl_num(3 downto 0)

dirmem: 8 bits (4 + 4) 256 posiciones de memoria (16x16)


Figura 12.8: Esquema del clculo de la direccin de memoria para imgenes de 16x16

Porlotanto,enestecasoelclculodeladireccindememoriasereduceaconcatenarlos
cuatrobitsmenossignificativosdelaslneasylospxelesdelapantalla.
As que en estos casos el clculo de la direccin de memoria resulta muy fcil. Para
ayudaraentendermejorporquestanfcil,enlafigura12.9sehamodificadolafigura
12.4poniendolosnmerosdelneasypxelesenhexadecimal.Hacindoloas,sepuede
verquelaobtencindelnmerodepxeldelaimagen(direccindememoria)seconsigue
concatenandoelnmerodelneaconelnmerodepxeldelapantalla.
pxeles (columnas) de la pantalla (pxl_num)

....
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
lneas binario
de la pantalla
(line_num) 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 ... hexadecimal
0000 0 0 1 2 3 4 5 6 7 8 9 A B C D E F
0001 1 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

0010 2 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F

0011 3 30 31 32 ... ... ... 3F pxeles de


0100 4
la imagen
40 ...
(dirmem)
0101 ... ... en hexadecimal

...

26h = 0010 0110 = 3810


dirmem o addr en decimal: 38 = 2x16 + 6
line_num pxl_num en hexadecimal: 26 = 2x10 + 6

Figura 12.9: Clculo de la direccin de memoria aprovechando que la imagen tiene un nmero de columnas
potencia de dos

Haz un nuevo proyecto incorporando esta forma de calcular la direccin de memoria.


Emplearemos mucho esta forma de clculo en el captulo 15 en el que disearemos el
videojuegoPacman.

12.2.4. Memoria ROM de varios bits de ancho de palabra


Cuando cada pxel de la imagen es de un nico bit97 se pueden agrupar todas las
columnasdeunalneaenunanicadireccindememoria.Porejemplo,envezdedefinir

97 Esunaimagenenblancoynegro

Departamento de Tecnologa Electrnica 215


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

lamemoriacomolohicimosenelcdigo12.1,podemosdescribirlaROMcomolohaceel
cdigo12.4,endondetodoslosbits/pxelesdeunafilaestnenunvectorqueseguarda
enunanicaposicindememoria.
entity ROM16b_16 is
port (
clk : in std_logic; -- reloj
addr : in std_logic_vector(3 downto 0);
dout : out std_logic_vector(15 downto 0)
);
end ROM16b_16;

architecture BEHAVIORAL of ROM16b_16 is


type memostruct is array (natural range<>) of std_logic_vector(15 downto 0);

constant img : memostruct := (


-- FEDCBA9876543210
"0111111111111110",-- 0
"1111111111111111",-- 1
"1111000000001111",-- 2
"1110000000001111",-- 3
"1110001111111111",-- 4
"1110011111111111",-- 5
"1110011111111111",-- 6
"1110011111111111",-- 7
"1110011111111111",-- 8
"1110011111111111",-- 9
"1110011111111111",-- A
"1110001111111111",-- B
"1110000000001111",-- C
"1111000000001111",-- D
"1111111111111111",-- E
"0111111111111110" -- F
);
begin

P_ROM: process (clk)


begin
if clk'event and clk='1' then
dout <= img(to_integer(unsigned(addr)));
end if;
end process;

end BEHAVIORAL;
Cdigo 12.4: Memoria ROM de 16 posiciones y 16 bits de ancho de palabra98

Posiblemente habrs notado que la imagen de la memoria es distinta a la que hemos


estado usando, esto lo hemos hecho para incluir algo de variedad e mostrar nuevas
posibilidades. Para distinguir mejor la imagen en el propio cdigo se han puesto en
negritalosceros.
Observa cmo han cambiado los anchos de los puertos, ahora la memoria slo tiene 16
posiciones (las 16 filas de la imagen) y por tanto bastan cuatro bits para acceder a
cualquierposicin.Porotrolado,eldatotiene16bits(las16columnasdelaimagen).
Guardar todos los pxeles de una fila en una misma direccin de memoria puede tener
ventajas:
Normalmentenohaymemoriasconunslobitdeanchodepalabra.Siusamosunslobit
enunamemoriademayoranchodepalabra,estaramosdesperdiciandoelrestodelosbits.
Las memorias tienen tiempos de acceso relativamente largos, si estos tiempos fuesen
crticos, obtener toda una fila con un nico acceso a memoria podra hacer aumentar la
velocidaddelsistema.

98 Elcdigodeestamemoriasepuededescargardelareferencia[28web]

216 Universidad Rey Juan Carlos


12. Memorias

En nuestrocasonohaygrandiferenciaentreestasconfiguracionesdelaROM,yaquelas
BRAMsonmuyrpidasysepuedenconfigurardecualquieradelasmaneras.
Cmocalcularamosahoraladireccindememoriaparaobtenercadapxel?
La direccin de memoria es muy fcil de calcular ya que las filas de la imagen se
correspondenconlasfilasdelapantalla99,portantobastaraconasignaradirmem/addrlos
cuatrobitsmenossignificativosdeline_num.
Paraobtenerelpxelapartirdeldatodevueltoporlamemoria,tendremosqueseleccionar
elbitcorrespondientealacolumnadelapantallaenlaqueestamos.Sinembargo,como
los ndicesdelamemoriasondescendentes100ylascolumnasdelapantallaaumentande
izquierdaaderecha,tendremosquerealizarunadelassiguientesopciones:
Invertirelordendelosbits(apartado8.8.3.1)
Realizarunarestadelndiceparanoverlaimagensimtricadelaimagenoriginal
Guardarlaimagensimtricaenlamemoria.
En la figura 12.10 se muestra cmo realizar la resta del ndice para obtener el ndice
complementarioalanchodelaimagen.
pxeles (columnas) de la pantalla (pxl_num)
lneas
de la pantalla 0 1 2 3 4 5 6 7 8 9 A B C D E F
(line_num)
0
1 dirmem <= line_num(3 downto 0)
2
3 pedimos el elemento 3 de la memoria
4
5 la memoria devuelve datmem ndices de
datmem
6
7 F E D C B A 9 8 7 6 5 4 3 2 1 0
8 3
9
A 2 = F-D
B
C Por ser descendente, si queremos pintar la columna D
D tenemos que coger el elemento F-D
E
index <= 15 - pxl_num(3 downto 0);
F

Figura 12.10: Clculo de la direccin de memoria y del ndice del pxel en memorias que guardan toda la
fila en una direccin

Realiza el diseo paramostrar esta imagen y comprueba que obtienesla misma imagen
queladibujadaenlafigura12.10,verificaquenosalelaimagensimtricayqueloscuatro
puntosnegrosdelasesquinassedibujancorrectamente.
Dibujar esta imagen nos puede abrir las posibilidades para dibujar caracteres de una
manera ms eficiente que llenando los procesos VHDL con condiciones if y elsif. Por
ejemplo,siquisisemosincluirunmarcadordegolesenelvideojuegoPongdelcaptulo
10,seramseficienteutilizarmemoriasROMconlosmapasdebitsdeloscaracteres.Esto
loveremosenelcaptulo13,peroestbienquevayaspensandocmoloharas.

99 Encasodequeestemospintandolaimagenenlaesquinasuperiorizquierda,sino,tendremosquehacer
unarestaparatrasladarlosejesdecoordenadas.Comohicimosenelapartado12.2.3.3
100 Enestecaso15 downto 0

Departamento de Tecnologa Electrnica 217


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

12.2.5. Memoria ROM para imagen con mayor profundidad de color


En este ejercicio pintaremos imgenes en escala de grises o en color. La imagen se
guardarenunamemoriasimilaraladelcdigo12.4conladiferenciadequeahoracada
direccindememoriaguardaunpxelynounafiladelaimagen.Lamemoriatendrun
anchodepalabrademsdeunbitenlaqueseguardanlosdistintostonosdegrisolos
distintoscolores.
Porejemploelcdigo12.5describeunamemoriaROMdeunaimagende10x10pxelesen
escaladegrises.Portantotendr100posicionesdememoriayencadaposicinseguarda
unpxel.Estoproporcionaochobitsdeinformacinsobresucolor,loqueda256niveles
degris.
entity ROM8b_pacman10x10 is
port (
clk : in std_logic;
addr : in std_logic_vector(7-1 downto 0);
dout : out std_logic_vector(8-1 downto 0)
);
end ROM8b_pacman10x10;

architecture BEHAVIORAL of ROM8b_pacman10x10 is


type memostruct is array (natural range<>) of std_logic_vector(8-1 downto 0);
constant filaimg : memostruct := (
"00000111", "00001000", "01001011", "10011110", "11011011", "11100111", "11000010",
"01111111", "00011101", "00001001", "00001000", "01111101", "11010100", "11101010",
"11011110", "11001111", "11100110", "11101000", "10111010", "00111101", "01000110",
"11010110", "11101011", "11101000", "11100111", "11100100", "11101011", "11100100",
"11110010", "10111001", "10100111", "11101011", "11100011", "11010011", "11100111",
"11101001", "11100100", "11000000", "01010010", "00010110", "11011111", "11100010",
"11100011", "11100011", "11100101", "11000010", "01101010", "00100010", "00011110",
"00000011", "11100011", "11010111", "11100000", "11100011", "11100111", "11000111",
"01011010", "00001101", "00000101", "00000100", "10101010", "11101001", "11101000",
"11011100", "11100101", "11100111", "11100000", "11011100", "01110111", "00011001",
"01001000", "11100011", "11101000", "11010111", "11100110", "11100101", "11100111",
"11011110", "11011111", "10111001", "00001000", "01100111", "11011000", "11101010",
"11010110", "11011001", "11101001", "11011101", "10111100", "00111001", "00000101",
"00010100", "01001001", "10011110", "11010010", "11100101", "11001101", "01110110",
"00110011", "00000111");
begin
P_ROM: process (clk)
begin
if clk'event and clk='1' then
dout <= filaimg(to_integer(unsigned(addr)));
end if;
end process;
end BEHAVIORAL;
Cdigo 12.5: Memoria ROM de 10x10 y 256 colores grises101

Esta memoria es similar a la del cdigo 12.1, la diferencia es que en el cdigo 12.1 cada
pxel tena un bit (blanco o negro) y ahora se guarda mucha ms informacin de la
intensidaddelgrisdecadapxel.
El clculo de la direccin de memoria para mostrar el pxel en la VGA se realiza de
manerasimilaraldelamemoriadelcdigo12.1.Aunqueahora,porserunamemoriade
10x10,nosepuedecalcularconcatenandofilaycolumnadelaVGAcomoseproponaen
elapartado12.2.3.6.
Como la memoria guarda ocho niveles de gris, en la XUPV2P la asignacin del dato
devueltoporlamemoriaalospuertosdeloscoloresesdirecta(cdigo12.6),mientrasque
en la Nexys2 hay que truncar porque su conversor VGA tiene menos niveles de color
(cdigo12.6).

101 Elcdigodeestamemoriasepuededescargardelareferencia[28web]

218 Universidad Rey Juan Carlos


12. Memorias

... ...
red <= datmem; red <= datmem (7 downto 5);
green <= datmem; green <= datmem (7 downto 5);
blue <= datmem; blue <= datmem (7 downto 6);
... ...
Cdigo 12.6: Asignacin del valor del dato de la Cdigo 12.7: Asignacin del valor del dato de la
memoria de 8 bits de gris a los colores de la XUP memoria de 8 bits de gris a los colores de la Nexys2

Comoalternativa,siqueremosmostrarlaimagenencolorusandolamismacantidadde
memoriapodramosguardarenlosochobitslostrescoloresRGB.Estoesespecialmente
convenienteparalaNexys2yaquelamemoriaqueacabamosdedescribirguardamsbits
decolorquelosquesepuedenmostrarporlaVGAdelaNexys2.
El cdigo 12.8 muestra una ROM que es igual que la anterior (cdigo 12.5) pero con la
diferenciadequeahoracadaelementodememorianoguardaelcolorenescaladegrises
sino representa su combinacin RGB en ocho bits. La distribucin de los colores es la
siguiente:lostresbitsmssignificativossonderojo(7:5),lostressiguientes(4:2)sonde
verde,ylosdosmenossignificativos(1:0)sondeazul.
entity ROM_RGB_8b_pacman10x10 is
port (
clk : in std_logic;
addr : in std_logic_vector(7-1 downto 0);
dout : out std_logic_vector(8-1 downto 0)
);
end ROM_RGB_8b_pacman10x10;

architecture BEHAVIORAL of ROM_RGB_8b_pacman10x10 is


type memostruct is array (natural range<>) of std_logic_vector(8-1 downto 0);
constant filaimg : memostruct := (
--"RRRGGGBB"
"00000000", "00000000", "01001000", "10110100", "11111100", "11111100", "11011000",
"10010000", "00100100", "00000000", "00000000", "10010000", "11111101", "11111101",
"11111100", "11111100", "11111100", "11111101", "11011001", "01001000", "01001000",
"11111101", "11111101", "11111100", "11111100", "11111100", "11111101", "11111101",
"11111110", "11011001", "10111000", "11111101", "11111100", "11111100", "11111100",
"11111100", "11111101", "11011001", "01101000", "00000000", "11111100", "11111100",
"11111100", "11111100", "11111100", "11011000", "01101100", "00100100", "00100000",
"00000000", "11111100", "11111100", "11111100", "11111100", "11111100", "11011000",
"01101100", "00000000", "00000000", "00000000", "10111000", "11111101", "11111100",
"11111100", "11111100", "11111100", "11111100", "11111101", "10010000", "00000000",
"01001000", "11111101", "11111101", "11111100", "11111100", "11111100", "11111100",
"11111101", "11111101", "11011001", "00000000", "01101100", "11111101", "11111101",
"11111100", "11111100", "11111101", "11111101", "11011001", "01001000", "00000000",
"00000000", "01001000", "10110100", "11111100", "11111100", "11111100", "10010000",
"00100100", "00000000");
begin
P_ROM: process (clk)
begin
if clk'event and clk='1' then
dout <= filaimg(to_integer(unsigned(addr)));
end if;
end process;
end BEHAVIORAL;
Cdigo 12.8: Memoria ROM de 10x10 y 256 colores102

De esta manera tenemos 256 colores y podemos aprovechar mejor la memoria con las
capacidades de la Nexys2. Tambin para la XUPV2P puede ser conveniente porque no
siempreesnecesariomostrarlosmsde16millonesdecoloresqueseguardancon24bits.
Deestamaneraseahorramemoria103.

Elcdigodeestamemoriasepuededescargardelareferencia[28web]
102

Quiz,comolaXUPV2Ppuedemostrarmscolores,seramsconvenienteusarnuevebits,utilizandoelbit
103

deparidaddelasBRAMcomoeltercerbitdelazul,yaquedecualquiermanerasedesperdiciaraal
emplearlaconfiguracindeochobits(recuerdalatabla12.1)

Departamento de Tecnologa Electrnica 219


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Ahoralasasignacionesdeloscoloresserndiferentes.Enelcdigo12.9semuestranlas
asignacionesparalaXUPV2P.Estasasignacionesestn dentrodeunprocesosecuencialy
poresosepuedeasignardosveceslamismaseal.Como sabemos,cuandoseasignauna
seal dos veces en un proceso, la seal recibe el ltimo valor asignado. La primera
asignacinesparaasignaralosbitsmenossignificativoselvalordelbitmssignificativo
de datmem(tambinsepodahaberasignadouncerooun uno).Enlasegundaasignacin
seasignanlosbitsmssignificativosysesobreescribelaanteriorasignacindeestosbits.
Enelcdigo12.10semuestralaasignacinparalaNexys2.
... ...
red <= (others=>datmem(7)); red <= datmem(7 downto 5);
green <= (others=>datmem(4)); green <= datmem(4 downto 2);
blue <= (others=>datmem(1)); blue <= datmem(1 downto 0);
red (7 downto 5) <= datmem(7 downto 5); ...
green(7 downto 5) <= datmem(4 downto 2);
blue (7 downto 6) <= datmem(1 downto 0); Cdigo 12.10: Asignacin del valor del
... dato de la memoria de 8 bits de color a
Cdigo 12.9: Asignacin del valor del dato de la memoria de 8 los colores de la Nexys2
bits de color a los colores de la XUP (en proceso secuencial)

Si implementas estos circuitos deber salir el mueco del videojuego Pacman . Saldr
muypequeo,yaqueslotienediezpxelesdeanchoyalto.Sehaescogidountamao
tanpequeoparapoderincluirelcdigoVHDLdelasROMenestelibro.

12.2.6. Memorias ROM grandes: convertir imgenes


Losejemplosdeimgenesquehemosvistosecorrespondenconimgenespequeas.De
hecho, estas imgenes han sido tan pequeas que el sintetizador no ha utilizado las
BRAM sino que las ha guardado en la lgica distribuida de la FPGA. Una imagen
pequea como la del cdigo 12.8 tiene cien elementos pero casi no se ve en la pantalla.
PasarmanualmenteunaimagenmayoraunaROMdescritaVHDLesuntrabajotediosoy
estril.Enlapginawebdeestelibro[28web]hayunprogramaqueconvierteunaimagen
enunaROMdescritaenVHDL.
EneseenlacetambinhaymemoriasROMdemayortamaodescritasenVHDLporsino
puedesconvertirlasimgenesyquiereshacerpruebas.PruebaadibujarenlaVGAuna
imagen de mayor tamao (por ejemplo 100x100) guardada en una ROM descrita en
VHDL.

12.3. Memorias RAM


UnamemoriaRAMsepuededescribirdemuchasmanerasenVHDL.ParalasFPGAsque
estamosusando,XilinxproponevariosmodelosdedescripcinparausarlasBRAM.Las
descripcionescambiansegnelnmerodepuertos, losmodos defuncionamientoysise
quierenusarlasBRAMolalgicadistribuida.Enestelibroslosedescribirndostipos
dedescripcindememoriasRAM,enlareferencia[30xst]sepuedenconsultartodaslas
descripcionespropuestas.
Enelcdigo 12.11semuestraunamemoriadedoblepuerto.ElpuertoAes deescritura
ylectura,paraescribirhayqueactivarelwriteenable(wea).ElpuertoBesslodelectura.
Siquisisemosunamemoriadeunnicopuerto,bastaraconquitarlospuertos addrby
doutbylassentenciasrelacionadasconellos.Enesteejemplosehahechounamemoriade
noventamilposicionesyochobitsdeanchodepalabra.Ladireccindememoriatiene17
bits,yaque217eslaprimerapotenciadedossuperior(oigual)a90000.

220 Universidad Rey Juan Carlos


12. Memorias

entity BRAM_DUAL is
port(
clk : in std_logic;
wea : in std_logic;
addra : in std_logic_vector(17-1 downto 0);
addrb : in std_logic_vector(17-1 downto 0);
dina : in std_logic_vector(8-1 downto 0);
douta : out std_logic_vector(8-1 downto 0);
doutb : out std_logic_vector(8-1 downto 0)
);
end BRAM_DUAL;

architecture BEHAVIOURAL of BRAM_DUAL is


type memostruct is array (natural range<>) of std_logic_vector(8-1 downto 0);
signal memo : memostruct(0 to 90000-1);
signal addra_int, addrb_int : natural range 0 to 2**17 -1;
signal addra_rg_int, addrb_rg_int : natural range 0 to 2**17 -1;

begin
addra_int <= TO_INTEGER(unsigned(addra));
addrb_int <= TO_INTEGER(unsigned(addrb));

P: process (clk)
begin
if clk'event and clk='1' then
if wea = '1' then -- si se escribe en a
memo(addra_int) <= dina;
end if;
addra_rg_int <= addra_int;
addrb_rg_int <= addrb_int;
end if;
end process;

doutb <= memo(addrb_rg_int);


douta <= memo(addra_rg_int);
end BEHAVIOURAL;
Cdigo 12.11: Memoria RAM de doble puerto, uno de escritura y lectura (modo write first) y el otro de slo
lectura

Estamemoriaesdetipowritefirst(seescribeprimeroyluegoseleeloquesehaescrito),
quesignificaquesecuandoseescribeundato(wea='1'),enelsiguientecicloderelojla
memoria devuelve el dato que se est introduciendo por douta, es decir no devuelve el
datoquehabaenlaposicindememoriaantesdelaescritura.
Elotrocasoesquelamemorialeyeseeldatoantesdeescribir:readfirst(primeroseleey
luegoseescribe).Elcdigo12.12muestraelprocesosiqueremosquelamemoriasearead
first(primerolectura).ParaalgunasFPGAs,estetipodememorianosiempresesintetizan
usandoBRAM,porloquedebesdemirarelinformedesntesis.Elrestodelaarquitectura
serasimilaraldelcdigo12.11.
...
P: process (clk)
begin
if clk'event and clk='1' then
if wea = '1' then -- si se escribe en a
memo(addra_int) <= dina;
end if;
douta <= memo(addra_int);
doutb <= memo(addrb_int);
end if;
end process;
...
Cdigo 12.12: Proceso de la memoria RAM de doble puerto, uno de escritura y lectura (modo read first) y el
otro de slo lectura

Elcdigo12.11noestdescritoconconstantesparaponerlasdimensionesdelamemoria
con un ejemplo concreto, pero sera ms conveniente haberlo descrito con genricos o
constantesdeclaradasenlospaquetes.

Departamento de Tecnologa Electrnica 221


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

HaymanerasvlidasdedecribirunamemoriaenVHDLqueelsintetizadordeXilinxno
reconocecomodescripcionesquesepuedanmapearenunaBRAM.Siestefueseelcaso,el
sintetizador podra estar mucho tiempo intentando mapear la memoria en la lgica
distribuidadelaFPGA.Sivesqueestsintetizandodurantemuchotiempo:
Revisaladescripcindelamemoria
Mira el informe de sntesis (apartado 8.5.1), comprobando los recursos de la FPGA
utilizados,verificandosiestusandolosBRAMolalgicadistribuida
Comprueba que el tamao de la memoria no supera la cantidad de BRAM de tu FPGA
(tabla12.2)
Pruebaarealizarmemoriasmspequeasycompruebalosrecursosutilizadosenellas

12.4. Uso de memorias usando el Coregen *


UnaalternativaadescribirlamemoriaenVHDLesutilizarelCoregendeXilinx.ElCoregen
permitecrearncleos(cores)demdulossintenerquedescribirlosenVHDL.Estoporun
lado es una ventaja, aunque por otro, puede hacer ms complicada la visibilidad de la
simulacin. An as, lo veremos en este apartado para saber que existe la posibilidad y
ademsaspodemosverlasdistintasposibilidadesdelasmemoriasconlosBRAM.
EnelproyectoquetengamosdelISEabrimoslaventanadecreacindeunanuevafuente
(Create New Source),yseleccionamosIP(Coregen & Architecture Wizard).IPeselacrnimo
deIntellectualProperty,queserefiereauncomponentequesepuedeutilizarbajociertas
condicioneslegales.


Figura 12.11: Creacin de un IP Figura 12.12: Seleccin de Block Memory
Generator

DespusdepincharenNextaparecerunmendedirectorioparaseleccionareltipodeIP
que queremos implementar. Entramos en Basic Elements Memory Elements y
seleccionamos Block Memory Generator(lasopcionesde Dual y Single Port Block Memoryno
sedebenusaranoserpormotivosdecompatibilidadcondiseosanteriores).
En la siguiente ventana pinchamos en finalizar, y posteriormente nos aparecer una
ventana del generador de memoria, en la cual tendremos que introducir las
especificaciones de la nuestra. En la primera ventana pondremos el nombre del
componente y seleccionamos el tipo de memoria. La memoria (bram_ini) la haremos
Single Dual Port. Esta opcin permite escribir desde el puerto A y leer por el puerto B.
Otra opcin (True Dual Port RAM) permite leer y escribir desde los dos puertos.
ElegiremosSingleDualPortqueescomolaRAMdelcdigo12.11,quetieneunpuerto
deescrituraylectura,yelotropuertodeslodelectura.

222 Universidad Rey Juan Carlos


12. Memorias


Figura 12.13: Seleccin de opciones de la memoria (I)

Enlasiguienteventana(figura12.14)seleccionamoselanchodelaspalabras(8bits)yla
profundidaddelamemoria(90000300x300).Elmododeoperacin(Write First)yelresto
deopcioneslasdejamosigual.


Figura 12.14: Seleccin de opciones de la memoria Figura 12.15: Seleccin de opciones de la memoria
(II) (III)
En la siguiente ventana (figura 12.15) aparecern las opciones para el puerto B, en ella
ponemoselWrite Widtha8(elmismoqueparaelA),verificamosquelaprofundidadsalga
la misma. En el modo de operacin (Operating Mode) se indica qu dato se obtiene de
lectura cuando se est escribiendo, as que este modo slo afecta cuando se est
escribiendo.Sepuedeseleccionarquesea:
Deprimeroescritura(Write First):seobtendrcomodatodelecturaelmismoqueseescribe.
De primero lectura (Read First): se obtendr como dato de lectura el que haba antes de
escribir.
Sincambio(NoChange):seobtendrcomodatodelecturaelltimoqueseleyantesde
empezarlaescritura.
Elrestodeventanasqueaparezcansedejarnconlosvalorespordefecto.Paraterminar
sepinchaen finishenlaltimaventana(n5),ylaherramientadedicarciertotiempoa
generarelcomponente.
La memoria generada ser similar a la descrita en el cdigo 12.11. El cronograma de
lecturayescrituradelaRAMsemuestraenlafigura12.16(ennuestrocasohemoscreado
lamemoriasinsealdehabilitacin ENA).Elmododelamemoriadeestecronogramaes
deprimeroescritura,porloquesiseestescribiendo(WEA='1'),eldatoqueseobtieneen
DOUTAeselmismoqueseestescribiendo(DINA).

Departamento de Tecnologa Electrnica 223


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011


Figura 12.16: Cronograma de con la lectura y escritura de la BRAM (modo write first)

En la figura 12.17 se muestra un cronograma de una memoria con modo de primero


lectura.

Figura 12.17: Cronograma de con la lectura y escritura de la BRAM (modo read first)

12.5. Guardar y mostrar una imagen que llega por el puerto serie
Para terminar proponemos un diseo en el que enviemos una imagen de un tamao
determinadodesdenuestroordenadorporelpuertoseriealaFPGAylamostremospor
pantalla. Para simplificar el circuito, previamente hay que determinar el tamao de la
imagen,elnmerodecolores,laprofundidaddecolorylavelocidaddetransmisindela
UART. El diagrama de bloques de un diseo que implementa esta funcionalidad se
muestraenlafigura12.18.

RS-232
escritura lectura VGA

UART_RX GuardaImg BRAM PintaImg SincroVGA


Figura 12.18: Diagrama de bloques de la prctica

224 Universidad Rey Juan Carlos


12. Memorias

Terecomendamosqueparaempezarrealicesprimerolapartedeladerechadelcircuito
(bloques BRAM, PintaImgy SincroVGA)ycompruebesquefuncionebien.Estoseharacon
unaROMquetendrelmismotamaodelaRAMqueusaremosparaguardarlaimagen
delaUART.LaROMguardarlaimagenquesevaaenviarporlaUART104

lectura VGA

ROM PintaImg SincroVGA


Figura 12.19: Primera versin del circuito

Unavezquelapartederechafuncionebien,cambiaremoslaROMporunaRAMdedoble
puerto. El puerto de escritura A estar conectado con el bloque GuardaImg, e ir
guardandocadapxelquellegadesdelaUART.Estebloqueiraumentandoladireccin
dememoriacadavezquellegaunnuevodatodelaUART.ElpuertodelecturaBestara
conectado con PintaImg, y funcionara exactamente igual que la primera versin (figura
12.19).
Acontinuacinveremosenquformatoenviaremoslaimagenycmolaenviaremos.

12.5.1. Conversin de la imagen


Hay multitud de formatos para guardar una imagen, muchos de ellos comprimen la
imagenparareducirsu tamao.Anosotrosnosinteresatenerlaimagenenformatoraw
(encrudo),estoesunformatobinariosincomprimirysincabeceras,enlaquelospxeles
estnconsecutivos.Silaimagenestenescaladegrises,cadabytecorresponderconun
pxel y si est en color, cada pxel tiene tres bytes correspondientes con los colores rojo,
verde y azul. Este es el formato ms sencillo aunque los tamaos de las imgenes son
grandespornousarcompresin.
Podramos realizar un circuito que incluya la conversin de una imagen en un formato
habitual(jpeg,png,gif)araw,inembargoestocomplicaramuchoelcircuito.Asqueser
mssencilloenviarlaimagendirectamenteenformatoraw.
ParaconvertirunaimagenaformatorawpodemosusarlosprogramasgratuitosIrfanview
[15irfan] o ImageMagik [14imag]. En la conversin, las imgenes raw las guardamos sin
cabeceras (hay algunos programas que permiten cabeceras en los ficheros raw). Si las
imgenessonencolor,lasguardamosentrelazandoloscoloresRGB,esdecirqueprimero
vaelpxelrojo,luegoelverdeyfinalmenteelazuldelprimerpxel,posteriormentevael
segundopxelenlamismasucesindecoloresyashastaelfinal.
Comolasimgenesrawnotienencabecerasniningunaotrainformacin,alabrirlascon
unprogramadedibujotenemosquedarlelasdimensionesylascaractersticasdelcolor
(cuantosbytesdecolorporpxel).Poresoesconvenientequeenelnombredelaimagen
incluyassusdimensionesyelnmerodecolores.

Puedesusarelprogramadelareferencia[28web]
104

Departamento de Tecnologa Electrnica 225


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Laimagenrawseguardarsegnloscoloresdefinidosdelaimagen.Silaimagenesten
escaladegrisesseguardarconochobitsporpxel,ysiestencolorseguardarcon24
bits por pxel. Sin embargo esto a veces puede llevar a confusin ya que una imagen
puede tener slo colores en escala de grises, pero estar definida con 24 bits de color. Al
guardarla en formato raw podra suceder que no la estuvisemos guardando con los
coloresquepensamos.
Poresoesimportanteverificareltamaodelaimagenunavezcreada.Laspropiedades
del archivo te indicarn el nmero de bytes de la imagen. Por ejemplo, si tienes una
imagen de 10x10, tendr 100 pxeles. Si esta imagen tiene un tamao de 300 bytes, ser
quetiene3bytesporpxel,porloqueestacolor(24bits).Siporelcontrarioeltamaode
la imagen es de 100 bytes, implica que slo tiene un byte por pxel, por lo que est en
escaladegrises.
Si no quieres tener problemas en la conversin a raw, te recomendamos que antes de
convertirunaimagenarawlaconviertasprimeroa:
PGM:silaquieresenescaladegrises(1byte:8bits)
PPM:silaquieresacolor(3bytes:24bits)
Y luego conviertas una de estas dos a raw. Esto te da la seguridad de saber siempre
cuantosbytesseestnusandoparacadapxel.Adems,apartirdelformatoPGMyPPM
puedes convertir la imagen a una ROM en VHDL usando el programa disponible en
[28web]

12.5.2. Envo de la imagen


Siqueremoshacerelcircuitolomssencilloposible,sermejorenviarlaimagenenescala
degrises.Mstardepodremosmodificareldiseo,enviandounaimagenencolor(3bytes
por pxel) y guardando los tres colores en un byte, como vimos al final del apartado
12.2.5. Tambin se podr guardar la imagen en color en tres memorias de un byte cada
una.
ParaenviarlaimagendesdeelordenadorpuedesutilizarelprogramaRealTerm[24realt],
que en la pestaa Send tiene un botn llamado Send File para enviar ficheros. Si la
velocidad de transmisin es muy baja (9600 baudios) el envo de la imagen completa
tardar bastante. Una velocidad de envo de 115200 es razonable. Recuerda que la
velocidaddeenvodelordenadordebeserlamismaquelavelocidaddelreceptordela
UARTquehasimplementado.
SivesquenosemuestrabienlaimagendesdelaFPGA,pruebaarealizarelenvocondos
bitsdeparada(Port -> Stop Bits),yaquepuedeserqueseestnenviandolosbytesmuy
seguidosunosdeotros.Siestofueseas,tendrasquecambiarelestadodelbitdefindel
receptorparaquenoduretanteo.
Si sigue sin funcionar, comprueba que la frecuencia de envo de la UART coincide.
Cambiaestoenlapestaa Port -> Baudypinchaenelbotn Change,porquesino,nose
actualiza.Compruebaenlaparteinferiordelaventanaquelavelocidadeslacorrecta.Si
an as no sale, y has seguido todos los pasos (haciendo el circuito simplificado con la
ROMdelafigura12.19)tendrsquesimular.

226 Universidad Rey Juan Carlos


13. Mostrar caracteres por pantalla
Enestaprcticamostraremospor pantallaloscaracteresqueseescribandesdeelteclado.
Paraello,necesitaremostenerunamemoriaROMenlaquetendremoselmapadebitsde
loscaracteres.Enunaversininicial,elcircuitosimplementeseencargardemostrarpor
pantalla los caracteres introducidos. Posteriormente se podrn incluir acciones como el
borradodecaracteresyelretornodecarro.
Parafacilitareldiseousaremoscaracteresdelmismotamao,demodoquecadacarcter
tienereservadoelmismoespacio.Estonospermitirdividirelespaciodenuestrapantalla
en una especie de tablero de ajedrez. En cada casilla de este tablero podr ir cualquier
caracter. Esto har reducir la complejidad del circuito. As, por ejemplo, la letra A
ocuparlomismoquelaletrai,yambaspodrnocuparlamismacasilla.
Asimismo, cada casilla del tablero formar una cuadrcula en la que cada celda de esta
cuadrcula representa un pxel. Las celdas de esta cuadrcula se pintarn de tal manera
queformenelcaracterdeseado.Todasestascuadrculastendrnelmismotamao.Para
ayudaracomprenderesto,lafigura13.1muestraejemplosdelascuadrculas(mapasde
bits)paralasletrasA,Bei.Observaquetodosloscaracteresestninscritosenuna
cuadrculade8x16pxeles.Comonuestrapantallaesde640x480,podremosescribir80x30
caracteres.
8 pxeles 8 pxeles 8 pxeles
16 pxeles
16 pxeles

16 pxeles


Figura 13.1: Mapa de bits de la "A", la "B" y la "i"

Unmismocarcterpuededibujarsedemuydiferentesmaneras,tantomscuantomayor
sea el tamao de la cuadrcula, y es por eso que hay tantos tipos de fuentes. Adems,
normalmenteuncarctertambinsepuedeescribirennegrita,cursiva,subrayado,...Los
mapasdebitsdeloscaracteressepuedenguardarenunamemoriaROM(astambinlo
hacanlasimpresorasmatriciales).TambinsepuedenusarmemoriasRAMparapermitir
cargarfuentesdistintas.
Uncircuitoqueescribeloscaracteresenpantallasepodrarealizarcomomuestralafigura
13.2.

Departamento de Tecnologa Electrnica 227


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

HOLA

PS/2 VGA

Teclado CtrlTxt RAM PintaChars SincroVGA

escritura lectura
lectura

ROM

Figura 13.2: Diagrama de bloques del circuito que escribe los caracteres por pantalla

Delosbloquesdelafigura13.2,elinterfazconeltecladoylasincronizacindelaVGAya
sabemoscmosehacen.Comoalternativaaltecladosepodraemplearelreceptordela
UARTyescribirdesdeelhiperterminal.Acontinuacinseexplicarcmorealizarelresto
debloques.

13.1. Memoria ROM


En la memoria ROM deberan estar los 128 caracteres ASCII (aunque no todos son
imprimibles), por tanto, nuestra memoria ROM tendr 128 cuadrculas similares a las
mostradasenlafigura13.1.SiobservsemosunfragmentodelamemoriaROMtendrael
aspecto mostrado en la figura 13.3. El fragmento del ejemplo se corresponde con los
caracteresAyB.Lapartesombreadasecorrespondeconun1ylasinsombrearun0.
Este valor nos indicar si tenemos que pintar el pxel de la pantalla en blanco (1) o en
negro(0),suponiendoqueescribimosloscaracteresenblancosobrefondonegro.
LaROMtieneunanchodepalabrade8bits(unbyte)paraguardarlos8pxelesdeancho
delacuadrcula,similaraladelapartado12.2.4perocon128imgenesenvezdeconuna.
Lacuadrculadeloscaracterestiene16filasdealto,portanto,cadacarcterocupar16
posiciones de memoria. Como la ROM tiene que guardar los 128 caracteres ASCII, el
tamao de la memoria ser de 128x16=2048 bytes. Para acceder a las 2048 posiciones de
memoria necesitamos 11 bits (211 = 2048), por lo tanto, el puerto de la direccin de
memoria(dirmem/addr)tendr11bits.

228 Universidad Rey Juan Carlos


13. Mostrar caracteres por pantalla

Palabra
Direcciones
de 8 bits
de memoria
Carcter A: 0000 100 0001 0000 : 410h
ASCII 65 41h Cada carter
0001
0010 n de fila del carcter
0011
100 0001 16 filas: 0100
0101 n de de carcter ASCII
16 posiciones 0110
0111
de memoria: 1000
1001
128 caracteres x 16 filas:
4 bits de 1010
1011
ROM de 2048 palabras de 8 bits
direcciones 1100
128 caracteres ASCII 1101
1110 Bus de direcciones: 11 bits
7 bits de direcciones 1111 100 0001 1111 : 41Fh
Carcter B: 100 0010 0000 : 420h de 000h a 7FFh
ASCII 66 42h
100 0010
carcter
ASCII n de fila
7 bits 4 bits

Carcter C: 100 0010 1111 : 42Fh


ASCII 67 43h 100 0011 0000 : 430h

100 0011

Figura 13.3: Configuracin de la ROM para guardar la informacin de los pxeles de los 128 caracteres
ASCII

Elhechodequecadacarcterocupeunacuadrculade8x16esmuyconvenienteparala
implementacin del circuito. Estos nmeros son potencias de dos, es decir, nmeros
redondos en binario y, por tanto, las divisiones y multiplicaciones se podrn realizar
desplazandolosbits.
Por esto, de los 11 bits de direcciones que necesitamos para las acceder a las 2048
direcciones de memoria, los siete ms significativos indicarn el carcter ASCII al que
queremos acceder, mientras que los cuatro menos significativos indicarn la fila de la
cuadrculadedichocarcter.Observaquesielaltodelacuadrculanofueseunapotencia
dedos,estonosepodrarealizartanfcilmente(habraquerealizarladivisin).
Finalmente, al acceder a la posicin de memoria deseada, la memoria nos devolver un
datode8bits.Dependiendodelbit,escogeremosunacolumnadiferentedelacuadrcula.
Esto ya lo hemos visto en el apartado 12.2.4, y cmo evitar que pintemos la imagen
simtricadelcaracter.

13.2. Memoria RAM


LamemoriaRAMvaaserunamemoriasimilaralaqueusamosenelapartado12.5.Ser
unamemoriaRAMdedoblepuerto.ElpuertoAconectadoalmdulo CtrlTxtserde
escriturayenlseescribirnloscaracteresquellegandelteclado.ElpuertoBserde
lecturayestarconectadoalmdulo PintaChars,quemostrarporpantallaloscaracteres
escritos.
Lamemoriamemoriatendrcomomnimo2400posiciones(80x30).Cadaposicintendr
almenos7bitsparapoderguardarlos128caracteresASCII.Lamemoriasepodrampliar
encasodequesequieraincluirunscroll.

13.3. Control del texto


Elmdulodecontroldeltexto CtrlTxt seencargardeguardarenlamemoriaRAMlos
caracteresquellegandelteclado.Enunaprimeraversinsimplementerealizaresto,en

Departamento de Tecnologa Electrnica 229


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

versiones ms avanzadas del diseo se podr analizar qu tipo de caracteres se estn


recibiendo y realizar las acciones correspondientes. Por ejemplo, si se pulsa la tecla de
borrar,sepodraborrarelltimocarcterescrito,oalpulsarelEntersepodrarealizarun
retorno de carro. En un diseo todava ms avanzado, se podra incluir una lnea de
comandosendondeseinterpretenciertoscomandospreestablecidos.
La pantalla tiene 640 pxeles de ancho y cada carcter tiene un ancho de 8 pxeles, por
tantodisponemosde80columnasparaescribircaracteres.Encuantoafilasdisponemos
de30,yaqueson480pxelesdealtoentrelos16pxelesdealtodecadacarcter.Aspues,
entotalnecesitamos80x30=2400caracteres.
Para empezar se puede utilizar una memoria que, cuando est llena, ya no se puedan
aadir ms caracteres. Posteriormente se podr realizar con una FIFO105, de modo que
conforme lleguen nuevos caracteres se vayan incluyendo al final y que si est llena se
vayan eliminando los que hayan entrado al principio. Sera conveniente realizarla por
filas (80 caracteres), para que eliminase una fila entera. Tambin se podran hacer de
mayortamaoypermitirlaposibilidaddescroll.
As que en su versin ms sencilla, este circuito simplemente va a ir escribiendo en la
memoria los caracteres ASCII que van entrando desde el teclado. El circuito llevar la
cuentadelaposicindelamemoriadondedebedeentrarelsiguientecarcter.

13.4. Bloque que escribe los caracteres en la pantalla


Estebloquerecibedelmdulodesincronizacinlacolumnayfilaqueseestmostrando
enpantalla(pxl_numy line_num).Apartirdeestacolumnayfila,elmdulodeberealizar
lossiguientescalculos:
CalcularlacuadrculaquecorrespondeconlacolumnayfiladelaVGA
Hallar el caracter que est escrito en dicha cuadrcula. Esto se hace accediendo a la
memoriaRAMconelnmerodecuadrcula
Apartirdelcaracter queestescritoendichacuadrculaylafiladelaVGA,obtenerde
lamemoriaROMelmapadebitsdelafila.
Seleccionarelpxeldelafilaquehayquepintarapartirdelnmerodecolumnadela
VGA
Debido a que hay dos accesos a distintas memorias (la RAM y la ROM), y stas tienen
retardos, se debe prestar especial atencin a la sincronizacin para mostrar el pxel
adecuado en cada momento. Como solucin, podramos retrasar dos ciclos de reloj las
sealesdelaVGA106comosehizoenelapartado12.2.3.1.Enaquelcasoseretrasaronlas
sealesunciclodereloj,peroahorasedebenretrasardosciclosporquehaydosaccesos
secuencialesamemorias.
De manera imaginaria, la pantalla VGA estar dividida en cuadrculas de 8x16. Como
hemosdicho,resultan80columnasx30filas,loquehacen2400cuadrculas.Loprimero
que tenemos que hacer es averiguar en qu cuadrcula de la VGA estamos segn la fila

105 DelinglsFirstIn,FirstOut,quetraducidoesprimeroenentrar,primeroensalir
106 Aunqueprobablementenoseanecesarioporquelosmapasdebitsdeloscaracteressuelentenercerosenla
primerayltimacolumna,queesdondepodrahaberproblemas.Portanto,sisontodosiguales,nose
notarasiestamospintandoelpxeldeotrocaracter.Osino,saldrantodosloscaracteresdesplazasosunoo
dospxelesaladerecha.Encualquiercaso,lomejorseraretrasarlassealesdelaVGAparasincronizarlas

230 Universidad Rey Juan Carlos


13. Mostrar caracteres por pantalla

(line_num) y la columna (pxl_num) de la VGA que estemos. El nmero de la cuadrcula


(cuad_num) se corresponde con la numeracin de las cuadrculas mostrada en la figura
13.4.
640 pxeles : 80 caracteres

0 1 2 3 79

80 81 82 83 159
480 pxeles : 30 caracteres

160 161 162 163 239

240 241 242 243 319

... ...

2320 2399


Figura 13.4: Divisin de la pantalla en cuadrculas y numeracin de las cuadrculas

Paraobtener el nmero de lacuadrculatenemosquedividirelnmero decolumnadela


VGA (pxl_num) entre 8 (ancho de la cuadrcula), con esto tendremos la columna de la
cuadrcula(col_cuad:entre0y79),ydividirelnmerodefiladelaVGA(line_num)entre
16(altodelacuadrcula),astendremoslafiladelacuadrcula(fila_cuad:entre0y29).
Elnmerodecuadrcula(cuad_num)seobtendr:
cuad_num = (80 x (line_num/16)) + pxl_num/8
cuad_num = (80 x fila_cuad) + col_cuad
Sin embargo, en el captulo de operaciones matemticas (cap. 8) se vio que la
multiplicacin y sobre todo la divisin, no son operaciones inmediatas de realizar en
hardware. Afortunadamente107, las divisiones que hay que realizar son entre nmeros
redondos en binario, pues 16 y 8 son potencias de 2, y esto lo va a simplificar
enormemente.
En la figura 13.5 se muestra cmo se pueden calcular fcilmente la columna y fila de la
cuadrcula.Paralacolumna,comohayque dividirentre8,bastaconnotomarlos3bits
menossignificativos.Paralafilahabrquequitarlas4bitsmenossignificativos.Conesto
nosahorramosladivisin.Siqueremosevitarlamultiplicacin80xfila_cuad,podramos
tener un registro que vaya aumentando en 80cada vez que se pasa a una nueva fila de
cuadrcula(similaracomosepropusoenelapartado12.2.3.2).Sino,sepuederecurrirala
multiplicacin.

107 Notanafortunadamente,sinoquestehasidoelmotivodeescogeresasdimensionesdelacuadrcula

Departamento de Tecnologa Electrnica 231


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

columna del pxel:


col_cuad = 0 col_cuad = 1 col_cuad = 2 col_cuad = 3

01 0102 : 1010
01 0112 : 1110

10 0012 : 1710
10 0102 : 1810
10 0112 : 1910
10 1002 : 2010
10 1012 : 2110
10 1102 : 2210
10 1112 : 2310
11 0002 : 2410
01 1002 : 1210
01 1012 : 1310
01 1102 : 1410
01 1112 : 1510
10 0002 : 1610
00 0012 : 110
00 0102 : 210
00 0112 : 310
00 1002 : 410
00 1012 : 510
00 1102 : 610
00 1112 : 710
00 0002 : 010

01 0002 : 810
01 0012 : 910
pxl_num
fila del pxel:
line_num
fila_cuad = 0 00 00002 : 010: 00h
00 00012 : 110: 01h
00 00102 : 210: 02h
00 00112 : 310: 03h
00 01002 : 410: 04h
00 01012 : 510: 05h
00 01102 : 610: 06h
00 01112 : 710: 07h
00 10002 : 810: 08h
00 10012 : 910: 09h
00 10102 : 1010: 0Ah
00 10112 : 1110: 0Bh
00 11002 : 1210: 0Ch
00 11012 : 1310: 0Dh
00 11102 : 1410: 0Eh
00 11112 : 1510: 0Fh
01 00002 : 1610: 10h
fila_cuad = 1
01 00012 : 1710: 11h
01 00102 : 1810: 12h
01 00112 : 1910: 13h
01 01002 : 2010: 14h
01 01012 : 2110: 15h
01 01102 : 2210: 16h
01 01112 : 2310: 17h
01 10002 : 2410: 18h
01 10012 : 2510: 19h
01 10102 : 2610: 1Ah
01 10112 : 2710: 1Bh
01 11002 : 2810: 1Ch
01 11012 : 2910: 1Dh
01 11102 : 3010: 1Eh
01 11112 : 3110: 1Fh
fila_cuad = 2 10 00002 : 3210: 20h


Figura 13.5: Clculo de la fila y columna de la cuadrcula a partir de la fila y columna de la VGA

Ahora ya tendremos el nmero de la cuadrcula (cuad_num) en la que estamos. Con este


ndiceaccedemosalamemoriaRAMdondeelmdulodecontroldeltextohaguardado
loscaracteresescritosenelteclado.Elaccesoalamemoriaconelnmerodecuadrcula
nosdevolverelcdigoASCIIdelcarcterdeesacuadrcula.
Asqueyatenemoslos7bitsdelasealdelcdigoASCII,estos7bitssonlos7bitsms
significativos de la direccin de la memoria ROM donde est el mapa de bits de los
caracteres. Recuerda la figura 13.3, los 7 bits ms significativos seleccionan el cdigo
ASCII.
Los4bitsmenossignificativosdelbusdedireccionesdelaROMindicanenqufiladelas
16 filas de la cuadrcula se estamos. Estos 4 bits los tomamos de los 4 bits menos
significativoslafiladelpxelenqueestamos(line_num),quesonlosquenoseusaronpara
calcularlacolumnadelacuadrcula(figura13.5).
Ahorayatenemoslos11bitsdedireccionesconlosqueobtendremoslos8pxelesdela
filaquequeremosdelcarcter.Deestos8bitsseleccionaremoselbitdelacolumnaenque
estemos.Estacolumnalaobtendremosconlos3bitsmenossignificativosdelpxeldela
columna (pxl_num), estos son los que no habamos usado para calcular la cuadrcula

232 Universidad Rey Juan Carlos


13. Mostrar caracteres por pantalla

(figura 13.5). Recuerda que hay que obtener el complementario del ndice para que no
salgalaimagensimtrica.
Segnseaelbitobtenido01tendremospintarelpxelnegrooblancoenlapantalla.
Lafigura13.6muestraelesquemadelosclculosdelasdireccionesdelasmemoriaspara
obtener el color del pxel. En estos esquemas y explicaciones hay que tener en cuenta
ademslosrangosresultantesdelasmultiplicaciones.Porejemplo,paralamultiplicacin
de line_num(8 downto 4) x 80sedebeaumentareltamaode line_num(8 downto 4),tal
comosehaexplicadoenelapartado12.2.2yelcdigo12.2.
line_num pxl_num
9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

0:520 0:800

line_num(8 downto 4) pxl_num(9 downto 3) dirram


8 7 6 5 4
x 80 + 9 8 7 6 5 4 3 11 10 9 8 7 6 5 4 3 2 1 0

0:29 0:79 0:2399

pxl_num(2 downto 0)
line_num(3 downto 0)
3 2 1 0 2 1 0
RAM
12
0:16 0:7 addr
7 dout
clk

datoram line_num(3 downto 0)


6 5 4 3 2 1 0 3 2 1 0
&
0:127 0:16

dirrom
seleccin 10 9 8 7 6 5 4 3 2 1 0
del pxel
0:2048
ROM
11
addr
7 6 5 4 3 2 1 0
datorom 8 dout

El bit nos dir si debemos pintar el pxel blanco o negro clk



Figura 13.6: Esquema de los clculos de las direcciones de memoria para la obtencin del color del pxel

Con estas explicaciones pensamos que tendrs informacin suficiente para disear el
circuito. Si te sale bien, puedes probar a hacer alguna variante de las que se han
propuesto. Este tipo de diseos en los que utilizamos las cuadrculas, los emplearemos
paraeldiseodevideojuegos(captulo15).
Sitienesproblemasenlaimplementacinynosabesquhacerparasolucionarlos,puedes
probar a implementar el circuito con una ROM en vez de la RAM. En la ROM habr
caracteres fijados por t que se tendrn que mostrar por pantalla. Para este ejemplo, no
harafaltaquehicieseslaROMcon2400posicionesdememoria,bastaracondosotres
filas(unas200posicionesseramsquesuficiente).

Departamento de Tecnologa Electrnica 233


14. Procesamiento digital de imgenes
En esta prctica realizaremos un procesamiento sencillo de una imagen. Primero
realizaremosuncircuitomssencilloenelquelaimagenaprocesarestarguardadaen
una memoria ROM, posteriormente ampliaremos el circuito para que reciba la imagen
desde el puerto serie del ordenador. En ambos casos se mostrar en pantalla la imagen
originalylaprocesada.
Antes de analizar el circuito, veremos en qu consiste el procesamiento que queremos
realizar.

14.1. Procesamiento de imgenes


A una imagen se le pueden aplicar muchos tipos de procesamientos diferentes. Un
procesamiento habitual es aplicar una convolucin de ventana 3x3 sobre la imagen
original. Estas ventanas tendrn distintos valores segn el procesamiento. En la figura
14.1se muestranlosoperadoresdeconvolucindetresfiltros.Enlafiguravemosquelos
filtrosdePrewittySobeltienendosoperadores:elhorizontalyelvertical.
Media Prewitt Sobel

1 1 1 -1 -1 -1 -1 0 1 -1 -2 -1 -1 0 1
1/9 x 1 1 1 0 0 0 -1 0 1 0 0 0 -2 0 2

1 1 1 1 1 1 -1 0 1 1 2 1 -1 0 1

Figura 14.1: Distintos operadores de convolucin

Losoperadoressevanaplicandopxelapxelyelresultadoseasignaalpxeldelanueva
imagen.Enlaimagen14.2semuestracmoseaplicaraeloperadorhorizontaldeprewitt
al pxel (1,1) de la imagen original. La figura incluye la frmula resultante de aplicar el
operador,cuyoresultadoserelvalordelpxel(1,1)delaimagenprocesada.

-1 -1 -1

0 0 0

1 1 1

Aplicado al pixel (1,1)


(0,0) (0,1) (0,2)

A B C D E F -1
A -1
B -1
C D E F
(1,0)

G H I J K L 0G 0H 0I J K L

M N O P Q R 1M 1N 1O P Q R

S T U V W X S T U V W X

Y Z ... ... ... ... Y Z ... ... ... ...

... ... ... ... ... ... ... ... ... ... ... ...

Pixel (1,1) = | A B C + M + N + O |

Figura 14.2: Aplicacin del operador horizontal de Prewitt al pxel (1,1)

Departamento de Tecnologa Electrnica 235


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Conelfindeaclararcmoserealizaelprocesamiento,sevan p1 p2 p3
amostrarlasecuacionesquedefinenlostresoperadoresdela p4 p5 p6
figura14.1. p7 p8 p9

Enlafigura14.3semuestralanumeracindelospxelespara Figura 14.3: Numeracin de
identificarlosenlasecuaciones. los pxeles de la ventana

Lasecuacionesdelpxelcentralp5son:
Media:p5media =(1/9) (p1+p2+p3+p4+p5+p6+p7+p8+p9)
Prewitt:p5prewitt = |(p7+ p8+ p9) - (p1+ p2+ p3)| + |(p3+ p6+ p9) - (p1+ p4+ p7)|
Sobel:p5sobel = |(p7+ 2 p8+ p9) - (p1+ 2 p2+ p3)| + |(p3+ 2 p6+ p9) - (p1+ 2 p4+ p7)|
Estasoperacionessedebenrealizarparatodoslospxelesdelaimagenexceptoparalos
bitsdelborde.Lospxelesdelbordedelaimagenresultantesepuedenponerennegro(a
cero) para que las imgenes original y procesada tengan el mismo tamao. Por tanto la
imagenresultantetendrunrecuadronegrodeunpxeldeancho.

14.2. Circuito que procesa una imagen guardada en una ROM


Queremos implementar un circuito que procese una imagen guardada en una memoria
ROM y guarde la imagen procesada en una memoria RAM. El circuito mostrar ambas
imgenesporpantalla.Lasimgenesestarnenescaladegrisescon256nivelesdegris,
por lo tanto necesitaremos dos memorias de ocho bits de ancho de palabra. En la tabla
12.3 se anotaron los tamaos mximos de las imgenes de 8 bits/pxel que se podan
guardar segn el nmero de imgenes que se tenan. En nuestro caso, como queremos
guardar dos imgenes, para la XUPV2P podramos usar imgenes de 350x350 y para la
Nexys2lasimgenespodranserde120x120108.
Eldiagramadebloquesdeuncircuitoqueharalafuncionalidaddeseadasemuestraenla
figura14.4.

original prewitt

ProcVentana

lectura lectura VGA

CtrlMem ROM PintaImgs SincroVGA

RAMproc

escritura lectura
Figura 14.4: Diagrama de bloques del circuito que procesa y muestra una imagen guardada en una ROM

La mayora de los bloques los sabemos implementar, a continuacin se resume su


funcionalidad:
SincroVGA:elgeneradordesincronismosdelaVGA(apartado9.3)

108 Sonvaloresorientativos,nopuedensuperarlosvaloresdelatabla12.3paradosimgenes

236 Universidad Rey Juan Carlos


14. Procesamiento digital de imgenes

ROM:memoriaROMconlaimagenquequeremosprocesar.CrearemoslaROMapartirde
unaimagenenescaladegrises(apartado12.2.6).Paraestecircuitoqueremosunamemoria
ROM de doble puerto, por lo que tendremos que modificarla para aadir el puerto B
(addrby doutb).LospuertosAyBtendrnelmismoreloj.Esmsconvenientequesea
de doble puerto para que los accesos a memoria para el procesamiento sean
independientesdelosaccesosamemoriaparamostrarlaimagenporpantalla.
RAMproc:memoriaRAMdedoblepuerto(apartado12.3).IgualquelamemoriaROM,esta
memoriatambinserdedoblepuertoparaindependizarlapartequemuestralaimagen
procesadaenlaVGAdelapartequeguardalaimagenprocesada.
PintaImgs: es un proceso parecido al que vimos en el captulo de dibujar imgenes por
pantalla(cap.12),peroconladiferenciadequeahoratenemosquedibujardosimgenes.
Este mdulo calcular de manera independiente las direcciones de memoria de ambas
imgenes.Porlotanto,encadamomentoseobtendrndospxeles:unodecadamemoria.
Segnlafilaycolumnadela VGA,elprocesoquepintalospxelesseleccionarqupxel
va a mostrar, que podr ser el pxel de la imagen original (ROM), el pxel de la imagen
procesada(RAMproc)oelpxeldelcolordelfondo.Lasimgenessemostrarnendistintas
zonasdelapantalla,demanerasimilaracomosehizoenelapartado12.2.3.3.
MsadelantesepodrincluirunamemoriaROMdecaracteresparaincluiruntexto
indicativodelasimgenes,porejemplo:ImagenoriginaleImagenprocesadaPrewitt.
CtrlMem: este mdulo se encarga de obtener los pxeles necesarios de la imagen original
parapoderaplicarlasconvolucionesdelaventana3x3explicadasenelapartado14.1.Esto
seharparacadaunodelospxelesdelaimagenyelresultadoseguardarenlamemoria
RAM(RAMproc).Estemdulodeberdeterminarqupxelescorrespondenconlosbordes
delaimagenparanoaplicarlaconvolucinenellosyponerlosdirectamenteanegroenla
imagenprocesada.
ProcVentana: este mdulo recibe de CtrlMem los nueve pxeles de una ventana para ser
procesados(figura14.3delapartado14.1)ydevuelveelvalordelpxelresultantedespus
deaplicarlelasecuacionesdelprocesamiento.Comohayquerealizarmuchasoperaciones,
es posible que no d tiempo realizarlas todas en el mismo ciclo de reloj. Por tanto se
recomiendaalmenosregistrarlasentradasylassalidas,yanalizarsilosretardossonlo
bastantegrandescomopararealizarsegmentacininsertandoalgnregistroms(recuerda
elapartado8.9.1.2).
Debidoaquesehanintroducidoregistros,convendraincluiruncontrolparaavisara
CtrlMem de cundo se ha terminado la operacin (finproc_vent) y por tanto, cundo
est disponible el resultado para ser guardado en la memoria RAM. Asimismo,
tambin habra que incluir una seal (inicproc_vent) que le indicase a este mdulo
cundo estn los pxeles preparados para iniciar el procesamiento. Estos controles
sern ms necesarios en el procesamiento de la media, ya que hay que realizar una
divisin y sta puede durar varios ciclos de reloj. En la figura 14.5 se muestran las
entradasysalidasdeestemduloparaelcasodelprocesamientodePrewittoSobelya
questosnonecesitanelpxelnmerocinco.

Departamento de Tecnologa Electrnica 237


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

ProcVentana
orden de iniciar
el procesamiento inicproc_vent
8
p1
8
p2 finproc_vent fin del procesamiento,
8
p3 resul est disponible
pxeles de la ventana 8
p4 8
resul resultado del
p1 p2 p3 8 procesamiento
p6
p4 p5 p6 8
p7
p7 p8 p9 8
p8
8
p9

clk
rst

Figura 14.5: Entradas y salidas del mdulo ProcVentana que realiza la convolucin de ventana 3x3

Por ltimo, debes recordar lo explicado en el captulo 8 de circuitos aritmticos para


implementar las operaciones de la convolucin (apartado 14.1). Debes tener en cuenta
que, al realizar las sumas, el resultado aumentar de rango, y por lo tanto, el resultado
total tendr ms de ocho bits. Cuando haya desbordamiento (cuando el resultado sea
mayorque255),elcircuitodeberponerelresultadoablanco(255).Sinotienesestoen
cuenta,losresultadosconvalormsalto(msblancos)quedarnconvaloresmuybajos
(cercadelnegro)poreltruncamientodelosbitsmssignificativos.
En la figura 14.6 se muestra el esquema de las operaciones que hay que realizar para
calcular el resultado de la convolucin de ventana 3x3 del operador de Prewitt. Este
esquema opera con nmeros enteros positivos y antes de restar se compara cul es el
mayor, otra alternativa sera realizar las operaciones en complemento a dos. Al final, el
resultadoesunnmerode10u11bitsquehabraqueconvertiraochobits.Aldescribir
el circuito en VHDL debes de analizar los rangos. Tambin hay que considerar los
tiemposyversiesnecesariointroducirbiestablesparasegmentar(apartado8.9.1.2).
p1 p2 p3 p4 p6 p7 p8 p9

p1 p4 p7 p3 p6 p6
8 8 8 8 8 8

co + (8bits) co + (8bits)
+ (8bits) + (8bits) 8
1 1 1 1
8 8 8 8

9 9 9 9
co (acarreo) co (acarreo)

co co co co
+ (9bits) + (9bits) + (9bits) + (9bits)
1 1 1 1
9 9 9 9

sumafila3 sumacol3
sumafila1 sumacol1
10 10

10 10

A B A B
comparador comparador
A>B 0 1 0 1 A>B 0 1 0 1

p1 p2 p3
M S M S
p4 p5 p6
- (10bits) - (10bits)
p7 p8 p9 10
restafilas restacols

co
+ (10bits)
10
resul considerar
desbordamiento

Figura 14.6: Esquema de las operaciones de la convolucin 3x3 de Prewitt

238 Universidad Rey Juan Carlos


14. Procesamiento digital de imgenes

14.3. Circuito que procesa una imagen que llega por la UART
Queremos hacer un circuito similar al anterior con la diferencia de que ahora la imagen
originallavamosarecibirporlaUARTenvezdetenerlaguardadaenlaROM.Lafigura
14.7muestraeldiagramadebloquespropuestoparaelcircuito.

original prewitt

ProcVentana

escritura lectura VGA


RS-232 / lectura

CtrlMem RAMorig PintaImgs SincroVGA


UART_RX

RAMproc

escritura lectura
Figura 14.7: Diagrama de bloques del circuito que procesa y muestra una imagen recibida por la UART

Aparte del receptor de la UART, que ya sabemos cmo se implementa, las nicas
diferenciasconelcircuitoanteriorson:
RAMorig:ahoraesunamemoriaRAMenvezdeunaROM,tendrelmismotamao,pero
sepodrescribirenella.ElbloqueCtrlMemguardarlospxelesquelleguendelaUART.
CtrlMem:estemduloesmscomplejoqueeldelcircuitoanterior.Puesantesdeempezara
procesarlaimagendebedehaberrecibidolaimagendesdelaUART.Asquedeberde
tenerunosestadosquepodranserlossiguientes:
Espera:elmduloestalaesperadeempezararecibirlosdatosdelaUART

Guarda:elmduloguardalospxelesquellegandelaUARTenlamemoria RAMorig.En
esteestadoactademanerasimilaralmduloGuardaImgdelapartado12.5(figura12.18)
Procesa:una vez guardados todos los pxeles de la imagen, comienza a realizar el
procesamientodemanerasimilaralapartadoanterior.
Como mejora se podra aadir que el circuito devolviese por la UART la imagen
procesada.Enestecasohabraqueincluirunprogramaenlacomputadoraparaguardar
laimagenrecibidaycomprobarqueseharecibidobien.

14.4. Acelerar el procesamiento


Sihasimplementadoyprobadoelcircuitodelapartadoanteriorhabrspodidonotarque
enloquemssetardaesenlatransmisinporlaUARTyqueelprocesamientoesmucho
rpido. As que lo que convendra mejorar sera la transmisin, por ejemplo,
transmitiendo por un puerto USB o por Ethernet. Sin embargo, estos diseos son ms
complejosyestnfueradelosobjetivosdeestelibro.Portanto,apesardequeelcuellode
botellanoestenelprocesamiento,enesteapartadoveremoscmoacelerarlo.
Propondremos dos mejoras, una consiste en disminuir los accesos a memoria y la otra
realizaelprocesamientodurantelarecepcin(alvuelo).

Departamento de Tecnologa Electrnica 239


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

14.4.1. Disminuir los accesos a memoria


Es probable que ya hayas tenido en cuenta esta mejora al realizar los diseos previos.
Cada vez que se realiza el procesamiento de una convolucin de ventana 3x3 hay que
tener los nueve109 pxeles de la ventana. Por tanto, habra que realizar nueve accesos a
memoria.EnnuestrocasonoesmuchoproblemaporquelasmemoriasBRAMsonmuy
rpidas,peronosiempreesas.
Sin embargo, como el procesamiento se va realizando con pxeles consecutivos, cuando
nosmantenemosenlamismafila,slohacefaltapedirtresnuevospxeles,yaquelosseis
restantes los tenamos de la ventana anterior. La figura 14.8 muestra un ejemplo
sealandolospxelesrepetidos.Slocuandohayuncambiodefilasenecesitapedirtodos
lospxeles.
Procesamiento del pxel 7 Procesamiento del pxel 8
(0,0) (0,1) (0,2) (0,0) (0,1) (0,2)

0 1 2 3 4 5 0 1 2 3 4 5
(1,0) (1,0)

6 7 8 9 10 11 6 7 8 9 10 11

12 13 14 15 16 17 12 13 14 15 16 17

18 19 20 21 22 23 18 19 20 21 22 23

24 25 26 27 28 29 24 25 26 27 28 29

30 31 32 33 34 35 30 31 32 33 34 35

pxeles necesarios: pxeles necesarios:


0, 1, 2 1, 2, 3
6, 7, 8 7, 8, 9
12, 13, 14 13, 14, 15
slo hace falta
repetidos pedir estos tres

Figura 14.8: Pxeles repetidos en el clculo de la convolucin 3x3 para el procesamiento de dos pxeles
consecutivos

Por tanto, aprovechando los pxeles que ya tenemos del procesamiento anterior,
conseguimosreducirlosaccesosamemoriadenueveatres.

14.4.2. Procesamiento "al vuelo"


ElcircuitoquerecibelaimagendelaUARTrealizaelprocesamientounavezqueseha
recibido y guardado la imagen. Una alternativa es realizar el procesamiento al mismo
tiempoqueseestrecibiendolaimagen.Estaopcintodavamsinteresanteenelcasode
quenoseanecesarioguardarlaimagenoriginalyaqueestaalternativanoslorealizael
procesamientomsrpidamentesinoqueademsprescindedelamemoriaRAMorig.
El mtodo consiste en guardar los pxeles que van llegando de la UART en registros de
desplazamiento de modo que en cada momento se tengan tres filas de la imagen110. La
figura 14.9 muestra el esquema de estos registros. Para simplificar se ha escogido una
imagendesloseispxelesdeancho.Enlafigurasepuedeverqueenlafiladearribaslo
hacen falta tres registros, mientras que las otras dos filas tienen tantos registros como
columnastienelaimagen(enesteejemploseis).

109 NuevepxelesenelprocesamientodelamediayochopxelesenPrewittySobel
110 Encasodequelaventanadelaconvolucinseade3x3

240 Universidad Rey Juan Carlos


14. Procesamiento digital de imgenes

ancho de la ventana

p9 p8 p7
UART_RX
14 13 12

nmero de pxel
p6 p5 p4
de la ventana
11 10 9 8 7 6 alto de la
p1 p2 p3 ventana
p4 p5 p6
p3 p2 p1
p7 p8 p9 5 4 3 2 1 0

nmero de
pxel de la
imagen ancho de fila de la imagen
(n de columnas)
Figura 14.9: Registros que guardan tres filas de la imagen

Podemos ver que los tres registros de la derecha de las tres filas forman los nueve
registrosquesenecesitanparaelprocesamientodelaventana.
Para poder empezar a procesar los registros, stos deben haberse llenado, es decir, el
registro p1 (abajo a la derecha) debe de haber recibido el pxel cero de la imagen. En la
figura 14.9 se ha mostrado este caso, en el que ya se han recibido los primeros quince
pxeles(de0a14)111yyasepuedeiniciarelprocesamiento.Unavezquesehanllenadolos
registros,lospxelesseseguirndesplazandoaladerecha.
En la figura 14.10 se muestra qu sucede cuando llega el pxel nmero quince. Con la
llegadadelpxelnmeroquince,elpxelnmeroceroqueestabaenelregistrodeabajoa
laderechasepierdeysereemplazaporelpxelnmerouno,yascontodos:sedesplazan
aladerechaconlallegadadecadanuevopxeldesdelaUART.
p9 p8 p7 p9 p8 p7
14 13 12 15 14 13

al recibir
el pxel 15
p6 p5 p4 de la UART p6 p5 p4
11 10 9 8 7 6 12 11 10 9 8 7

p3 p2 p1 p3 p2 p1
5 4 3 2 1 0 6 5 4 3 2 1

Figura 14.10: Desplazamiento de los registros al recibir un nuevo pxel de la UART

Esinteresanteobservarquocurreenlospxelesdelosbordesdelaimagen.Enlafigura
14.11semuestraquocurreconlosregistroscundosellegaaunpxeldelborde.Como
sepuedeobservar,laventanaestencolumnasnoconsecutivasyportantoenestoscasos
sepondrcomoresultadounpxelnegro.

Antesdequelleguenlosquincepxelesescomosiseestuviesenprocesandolospxelesdelborde,queirn
111

acero(negro)enlaimagenprocesada

Departamento de Tecnologa Electrnica 241


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

p9 p8 p7 p9 p8 p7 El pxel 11 no se procesa
17 16 15 18 17 16
0 1 2 3 4 5

6 7 8 9 10 11
p6 p5 p4 p6 p5 p4
12 13 14 15 16 17
14 13 12 11 10 9 14 14 13 12 11 10

18 19 20 21 22 23

p3 p2 p1 p3 p2 p1 24 25 26 27 28 29
8 7 6 5 4 3 9 8 7 6 5 4 30 31 32 33 34 35

Figura 14.11: Desplazamiento de los registros: llegada de un pxel del borde

Algosimilarocurrecuandoseestenunpxeldelaprimeracolumna,comosemuestra
enlafigura14.12.Enestaimagensepasadeestarprocesandoelpxelnmerodoce,que
no se puede procesar por estar en un borde, a procesar el pxel trece, que s se puede
procesar.Elpxelqueseestprocesandocoincideconelpxelqueestenelregistro p5,
sealadoenrojoenlasimgenes.
El pxel 12 no se procesa p9 p8 p7 p9 p8 p7
19 18 17 20 19 18
0 1 2 3 4 5

6 7 8 9 10 11
p6 p5 p4 p6 p5 p4
12 13 14 15 16 17 16 15 14 13 12 11 17 16 15 14 13 12

18 19 20 21 22 23

24 25 26 27 28 29 p3 p2 p1 p3 p2 p1
30 31 32 33 34 35 10 9 8 7 6 5 11 10 9 8 7 6

Figura 14.12: Desplazamiento de los registros: salida de un pxel del borde

Cuando se han enviado todos los pxeles (en este caso los 36), se estar procesando el
pxel 28, que es el ltimo pxel procesable. A partir de este pxel, el resto de pxeles
correspondenconbordesyestarnennegroenlaimagenprocesada.Detodosmodos,si
sequieranvaciarlosregistros,habrquecontinuardesplazandolosregistroshastaquese
vacen.
Asqueenelcircuitohayqueincluiruncontrolparaindicarsilospxelescorresponden
conpxelesdelborde,paradarlaordenderealizarlaconvolucinono.Encasonegativo,
deber de poner el pxel resultante en negro. Este control deber contar el nmero de
pxelqueseestprocesandoydeterminartambincundoseterminaelprocesamiento
de la imagen. El control indicar cundo se deben desplazar los registros, que en lneas
generalescoincideconlasealdeavisodelaUART(aviso_rx).
Hay varias formas de implementar este control y el circuito de los registros de
desplazamiento.Enlafigura14.13semuestraunesquemasimplificadodelosbloquesde
estecircuitoysurelacinconotrosmdulos.Sinembargo,esteesquemaessimplificadoy
puede haber seales que debas incluir, dependiendo de ciertas decisiones de
implementacin que tendrs que tomar. Por ejemplo, no se ha incluido la seal de
habilitacindeldesplazamientodelosregistros.

242 Universidad Rey Juan Carlos


14. Procesamiento digital de imgenes

BufferImg
ctrl_dsplz
ProcVentana
inicproc_vent
desplaza
UART_RX p9
aviso_rx p8
p9 p8 p7
8
dato_rx_out 14 13 12 p7

p6
p5
p6 p5 p4
11 10 9 8 7 6 p4
finproc_vent
p3
8
p2 resul
p3 p2 p1
8
5 4 3 2 1 0 p1


Figura 14.13: Diagrama de bloques simplificado del mdulo de los registros de desplazamiento

14.4.3. Uso de un bfer circular


Envezdeponerregistrosdedesplazamientoenelcircuitoanterior,sepuedeimplementar
usandobferes112circulares.Silaimagentieneungrannmerodecolumnas,puedeser
mejordescribireldiseoconbferescircularesenvezdeconregistrosdedesplazamiento,
yaqueelbfercircularsepuedeimplementarconunamemoriaypodramosutilizarlos
bloquesBRAM.
Conceptualmente, un bfer circular es una memoria sin comienzo ni fin, es decir, el
ltimoelementoesconsecutivoconelprimero.
Noseentrarendetalleconelfuncionamientodelbfercircular,perosedarnalgunos
conceptos de su funcionamiento bsico. En la figura 14.14 se han capturado tres
momentos en donde se han aadido tres elementos en el bfer. Para facilitar el
entendimiento, estos elementos se han llamado consecutivamente con el orden de
entrada:0,1y2.

fin
fin 2
1
fin 1
0 0 0
principio principio principio


Figura 14.14: Esquema de la escritura de tres elementos en el bfer circular

Normalmente el bfer circular tiene dos punteros que indican el primer elemento del
bfer(principio)yelltimo(fin)113.Cadavezqueseintroduceunnuevoelementoenel
bfer se incrementa el puntero de fin, ya que este puntero indica el ltimo elemento
introducido.

Adaptacinalespaoldelapalabrainglesabuffer
112

Alternativamente,envezdelpunterodefinsepuedeponerladireccinsiguiente,queeselpunteroala
113

direccindondeentrarelnuevoelementoqueseintroduzca.

Departamento de Tecnologa Electrnica 243


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

LosbferescircularesfuncionancomounaFIFO.ElnombreFIFOvienedelasinicialesen
ingls: first in first out, y son un tipo de pilas en las que el primer elemento que ha
entrado es el primero en salir. Si se saca un elemento del bfer saldr el elemento
apuntado por el puntero de principio (que apunta al primer elemento) y el puntero de
principioseincrementar.
Si el bfer est lleno y se introduce un nuevo dato se sobreescribe el primer elemento
introducido (sealado por el puntero de principio), y los punteros de principio y fin se
incrementanunaposicin(verfigura14.15).
8 9 8 9 8 9
6 7 10 6 7 10 6 7 10
5 11 5 11 5 11
4 12 4 12 principio 4 12
3 13 3 13 3 13
14 principio 2 14 14
2 fin 2
1 15 1 15 33 15
principio 0 16 fin 32 16 32 16
fin 31 17 31 17 31 17
30 18 30 18 30 18
29 19 29 19 29 19
28 20 28 20 28 20
27 21 27 21 27 21
26 25 22 26 25 22 26 25 22
24 23 24 23 24 23

Figura 14.15: Llenado del bfer circular y escritura con el bfer lleno

Elbfercircularsepuedesimplificarennuestrocircuito,yaquesepuedetrabajarconun
nico puntero. En nuestro caso no vamos a introducir y sacar elementos en el bfer de
formaindependiente.Siemprequeseintroduceundatonuevosepondrenlasalidael
valoranteriorquehabaenladireccindememoriadondeseescribe.
Enlafigura14.16muestraelmovimientodelpunterocuandoelbfernoestlleno.

puntero

puntero
puntero 2
1 1
0 0 0


Figura 14.16: Bfer circular con un nico puntero

Cuandoelbferestlleno,alintroducirunnuevoelemento,debersacarelelementoque
haba.Porejemplo,enlafigura14.17,cuandoseintroduceel32,elbfersacael0.Yas
sucesivamente, cuando se introduzca un nuevo elemento, el bfer sacar el uno. En
realidad,estoesloqueocurrecuandoelbfernoestlleno,perolosvalorespreviosque
tengalamemoriasonindefinidos(ocerosilamemoriasehainicializado).

244 Universidad Rey Juan Carlos


14. Procesamiento digital de imgenes

8 9 8 9
6 7 10 6 7 10
5 11 5 11
4 12 4 12
3 13 3 13
2 14 puntero 2 14
1 15 1 15
puntero
0 16 32 16
31 17 31 17
30 18 30 18
29 19 29 19
28 20 28 20
27 21 27 21
26 25 22 26 25 22
24 23 24 23

Al escribir un nuevo dato en el bfer, el bfer sacar el elemento que tena (el cero)

Figura 14.17: Funcionamiento del bfer circular con un nico puntero cuando est lleno

Eldiagramadebloquessimplificadoimplementadoconbferescircularessemuestraen
lafigura14.18.Estediagramaeslaadaptacinconbferesdelaversindelafigura14.9
que tena registros de desplazamiento. Los tres registros de la derecha de cada fila se
mantienen fuera de los bferes para tenerlos disponibles para el procesamiento. Por lo
tanto, las bferes tendrn tantos elementos como columnas tenga la imagen menos tres
(lostresquesehansacado).
ancho de la ventana

UART_RX p9 p8 p7
8
dato_rx_out

Bufer p6 p5 p4
alto de la
ventana

Bufer p3 p2 p1

Bufer de tantos elementos como


columnas de la imagen menos 3
Figura 14.18: Variante del circuito de la figura 14.9 implementado con bferes

Elbferquetenemosquerealizaressencilloyaquecadavezqueentraundatotieneque
salirotro(queserelprimeroquehaentrado).Asqueslotienetrespuertos(ademsdel
relojyreset),queson:elpxelqueentra(pxl_in),elpxelquesale(pxl_out)ylasealque
avisa que va a entrar un nuevo pxel (metepxl). La figura 14.19 muestra un posible
esquemadelbfer.EnelcircuitohayunaRAMdeunnicopuertoyconmododelectura
primero (read first). Las memorias RAM de este tipo se vieron en el cdigo 12.12. En el
esquema tambin hay un contador, que es un contador circular que simplemente va
aumentandolacuentacadavezquellegaunnuevopxel.Elfindecuentacoincideconel
tamaodelaRAM.Cuandolacuentallegaasufin,vuelveaempezardesdecero.

Departamento de Tecnologa Electrnica 245


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

FIFO

RAM_rf pxl_out
8
pxl_in dout 8
din
1
metepxl we
contador RAM read first

incr addr

clk rst clk


Figura 14.19: Diagrama de bloques de la FIFO

Comosiempre,eldiagramadelafigura14.19esunapropuestaquepuedevariarsegn
como implementes el diseo. Siempre debes comprobar mediante simulacin que
funcionacorrectamente.
Si no fuese posible utilizar una memoria con modo de primero lectura, habra que
modificar el circuito. Por ejemplo utilizando una memoria RAM con dos puertos, uno
paraleeryotroparaescribir.Lacuentadelalecturaestaraadelantadarespectoalade
escritura,ylamemoriatendraquetenerunelementoms.Sinoesposibleutilizaruna
memoriadedoblepuerto,habraquerealizarlaoperacinendosciclosdereloj,ohabra
que tener preparado el pxel que se va a leer en un registro auxiliar antes de realizar la
escritura.Comoyasabemos,existenmuchasposibilidadeseneldiseodigitalyeslatarea
deldiseadorelegirentreellassegnlosrequisitosdelsistemayeltiempoquetienepara
realizareldiseo.

246 Universidad Rey Juan Carlos


15. Videojuego Pac-Man
Terminaremos este libro haciendo una versin simplificada del videojuego PacMan,
tambin conocido en Espaa por comecocos. En este diseo no haremos nada que no
hayamoshechoenlosanteriores,peronospermitirvolverautilizaryafianzarmuchos
de conceptos vistos. Al terminar la prctica podrs intentar implementar otros
videojuegos clsicos en la FPGA, tal como han realizado los alumnos de DCSE en
prcticas:SuperMarioBros,SpaceInvaders,Tetris,Arcanoid,Frogger,Zelda...
Todava se nos quedarn temas por tratar en este libro, como seran profundizar en la
optimizacin, diseos con varios relojes, uso de memorias externas, microprocesadores,
buses,otrostiposdeperifricos,...quizparaotrolibro,anas,conelconocimientoque
puedeshaberadquiridoseguramentetendrslabasesuficienteparaafrontardiseosms
complejosyseguiraprendiendoportimismo.

15.1. Videojuego Pac-Man


ElvideojuegoPacMansecreen1980.Eljuegotranscurreenunlaberinto,elpacmanes
unacabezaamarillaconbocaquetienequecomerlasbolitasquehayporellaberintosin
queseacomidoporlosfantasmas.Hayciertotipodebolitasquesonmgicasypermiten
alpacmancomersealosfantasmas.
Haymuchasversionesdelvideojuego,lafigura15.1muestralaversindelasmquinas
recreativas.Enlafigura15.2semuestralaadaptacinparaAtaricreadaen1981.


Figura 15.2: Versin del Pac-Man para Atari
Figura 15.1: Videojuego Pac-Man

No pretendemos implementar todas las funcionalidades del videojuego. Haremos una


versinmssimplequetepermitir,silodeseas,implementarelvideojuegocompletopor
timismo.
Comohemosidohaciendoenellibro,implementaremoseldiseopasoapaso.Primero
crearemos el campo de juego, luego el mueco del pacman con su movimiento a travs
del campo de juego. Posteriormente limitaremos el campo de juego con las paredes del
laberinto. A continuacin crearemos las bolitas que se come el pacman, incluyendo la
puntuacin.Porltimo,crearemosalosfantasmas.

Departamento de Tecnologa Electrnica 247


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Antesdeempezaraleer,teanimamosaquepiensescmoimplementaraselvideojuego.
Luego,comparaloquehaspensadoconlaspropuestasquesevanhaciendoenestelibro,
yencasodequeseandiferentes,podrasimplementarambasycompararculteparece
mejor. Tambin te recomendamos que hagas lo mismo con cada uno de los apartados.
Antes de leer el apartado, dedica un tiempo a pensar tu manera de implementarlo. Un
diseo que parece obvio, puede haber requerido mucho tiempo en su elaboracin y
estructuracin,yenfrentarseaestaprimerafaseesunadelastareasmsimportantesdel
diseador.

15.2. El campo de juego


Elcampodejuegovaaserunamatrizde32columnasy30filas.Enprincipio,elpacman
podrtenerunadeestas960posiciones(32x30=960).Cadaelementodelamatriz(celda)
tendr 16 pxeles de ancho y 16 de alto114. Por lo tanto, el campo de juego tendr 512
pxeles de ancho y 480 pxeles de alto, estas dimensiones hacen que quepa en nuestra
pantallaVGAquetiene640x480pxeles.Comoelaltodelcampodejuegomidelomismo
queeldelapantalla,sisequiereincluirunmarcadoroalgunaotrainformacin,comoel
nmerodevidasdelpacman,setendrnqueponeraloslados.Pondremoselcampode
juegoalaizquierdadelapantallaylapartedelainformacin(marcador)aladerecha.La
figura15.3muestralamatrizdelcampodejuegoysurelacinconlapantallaVGA.
lneas columnas del campo de juego/laberinto (col_cuad)
del campo Zona del marcador
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
fila_cuad
0 16
pxeles
1
2
3
4
5
6
7
8
zona del
9
marcador
A
B
C
D 480
E pxeles
F cuadrcula del
campo de juego 30
10 cuadrculas
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D

16 pxeles

32 cuadrculas 512 pxeles 128 pxeles


Figura 15.3: Cuadrcula del campo de juego y su relacin con la pantalla de 640x480

Conestasdimensionesylaresolucindelapantallalosmuecossalengrandes,puedesoptarareducirlas
114

celdasa8x8yasinclusopoderhacerellaberintomsgrande.

248 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

Podemos apreciar la similitud con el circuito que dibuja los caracteres por pantalla
(captulo 13 y su figura 13.4). En este caso, las celdas son de 16x16 pxeles. Ya sabes la
importanciadeelegirnmerosqueseanpotenciasdedos.Elclculodelacolumnayfila
de la cuadrcula (col_cuad y fila_cuad) se realiza dividiendo el pxel de la pantalla
(pxl_num) y la lnea de la pantalla (line_num) entre 16, esto es lo mismo que quitar los
cuatro bits menos significativos. Esto es similar al clculo realizado en el apartado 13.4,
peroenaquelcasoserealizabaconcuadrculasde8x16.
En este caso hemos elegido un campo de juego de 32 columnas para calcular por
concatenacinelnmerodelacuadrcula(lacelda: cuad_num).Puedeselegirotronmero
distintoyrealizarlasoperacionesrealizadasenelapartado13.4.Sinembargo,sieliges32
columnastebastarconcatenaradecuadamentefila_cuadconcol_cuad,comosehacaen
elapartado12.2.3.6(teniendoencuentaqueeneseapartadoseconcatenaban line_numy
pxl_num).

Antesdeseguir,terecomendamosquepruebeslacuadrcula,paraellopuedesdibujarun
tablerodeajedrezconlascuadrculas,porejemplo:
Lasfilasdelacuadrculaqueseanpares,fila_cuad(0)='0',tendrn:
lasceldaspares(col_cuad(0)='0')enblanco
lasceldasimparesennegro
Lasfilasdelacuadrculaqueseanimparestendrn:
lasceldasparesennegro
lasimparesenblanco
Lazonadelmarcadorestarenazul
Una vez que tengas la cuadrcula puedes pasar al siguiente apartado. Recuerda realizar
copias de los proyectos y trabajar con las copias, de modo que siempre tengas los
proyectos de los apartados anteriores disponibles, por si todo va mal o por si decides
retomarlos.

15.3. El jugador sin rostro


Queremos mover el pacman por el tablero de ajedrez (cuadrcula) que hemos hecho. El
pacmantendrunascoordenadas(col_pacman fila_pacman)referidasalacolumnayfila
delacuadrcula(col_cuadyfila_cuad),porloquetendrnlasmismasdimensiones.
Antesdeempezaradisear,mejorquecreesunproyectonuevoycopialosarchivosdel
anterior.
Tendremosqueaadiralproyectounmdulodeinterfazconlospulsadores115paradirigir
elmovimientodelpacman.Serunmdulosimilaralexplicadoenelapartado10.1,pero
ahora el pacman se mueve de celda en celda, por lo tanto, de 16 en 16 pxeles. Si en el
interfaz con los pulsadores eliges el modo de movimiento continuo (apartado 10.1), la
velocidad de movimiento deber ser unas 16 veces ms lenta que la que hiciste en el
diseo del Pong. Si el movimiento es por pulsaciones, ir de celda en celda y no habr
problema,aunquequizseademasiadolento.Otraopcinesqueelpacmansiempreest
en movimiento, y su direccin venga determinada por el ltimo pulsador que se haya
presionado.

115 Tambinpuedeshacerinterfazconelteclado

Departamento de Tecnologa Electrnica 249


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Encualquiercaso,elinterfazconlospulsadoresproporcionarlassealesdemovimiento
delpacmanencuatroposiblesdirecciones:arriba,abajo,derechaeizquierda.Estasseales
debern de ser lo suficientemente lentas para que los movimientos sean visibles y
controlables. Slo una de estas seales podr estar activa en cada momento, o si no,
establecerprioridadesentreestasseales.
Estassealesdelasdireccionesharncambiarlascoordenadasdelpacman(col_pacman
fila_pacman). En el caso de que se superen los bordes del campo de juego, el pacman
aparecer por el otro extremo. Esto es, si est en la primera fila (la de arriba) y tiene la
orden de subir, aparecer por la ltima fila (la de abajo) sin cambiar de columna. Lo
mismoocurrirenelotrosentidoyenlascolumnas.
En este diseo, adems de mostrar por la VGA el tablero de ajedrez que hiciste en el
apartadoanterior,debermarcarenamarillolaceldadondeestelpacman.Recuerdaque
laceldadondeestelpacmanvienedeterminadapor col_cuady fila_cuad.Estasseales
tendrn que ser registros y los tendrs que inicializar mediante el reset al valor que
estimes conveniente dentro de la cuadrcula. En la pantalla deber aparecer la celda del
pacmanpintadacompletamentedeamarillo.Alpresionarlospulsadoreslaceldaamarilla
deber moverse por la pantalla. Comprueba que se mueve a una velocidad adecuada y
quealatravesarlosbordesapareceenelladocontrario.

15.4. El pac-man
El jugador del diseo anterior no tena mucha gracia ya que no tena rostro, queremos
mostraralverdaderopacman.Realmentenohacefaltamuchaexplicacinparaestatarea,
yaquehashechoalgomuyparecidoenelcaptulodeescribircaracteresporpantalla.En
aquelcaptulopintbamosloscaracterescorrespondientesalasceldas,ahoratenemosque
pintarlafiguradelpacmanenunaceldadeterminada.
TenemosquecrearunaROMconlaimagendelpacman,puedesescogereltipodeROM
queprefieras:enblancoynegro,escaladegrisesoatrescolores.Cmopintarestetipode
memoriaslovimosenelcaptulo12.
Partiremos del caso que consideramos ms sencillo, que es tener la ROM de ancho de
palabraigualalospxelesdelanchodelaceldaytantasposicionesdememoriacomoel
alto de la celda. Esto lo hicimos en el cdigo 12.4 y en la escritura de caracteres por
pantalla.Elcdigo15.1muestralaconstantequetienelosvaloresdelaROM,parahacer
la ROM simplemente tendras que copiar esa constante en una arquitectura como la del
cdigo12.4yverificarquelosrangosdelassealessoncorrectos.

250 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

constant img : memostruct := (


-- FEDCBA9876543210
"0000000111100000",-- 0
"0000011111111000",-- 1
"0000111111111100",-- 2
"0001111011111110",-- 3
"0011111111111100",-- 4
"0011111111110000",-- 5
"0111111110000000",-- 6
"0111111000000000",-- 7
"0111111000000000",-- 8
"0111111110000000",-- 9
"0011111111110000",-- A
"0011111111111100",-- B
"0001111111111110",-- C
"0000111111111100",-- D
"0000011111111000",-- E
"0000000111100000" -- F
);
Cdigo 15.1: Constante de la ROM para dibujar el pac-man a dos colores

Asquepruebaaimplementarelcircuitoconelmuecodelpacmancomoprotagonista.Si
hascogidolamemoriadelcdigo15.1,pintarasdeamarillocuandolamemoriadevuelve
un uno y cuando la memoria devuelve un cero, lo mejor sera pintar el fondo. Esto es,
cuando hay un cero, no pintar nada en la condicin (en el if del proceso) que pinta el
pacman y dejar que la condicin que pinta el fondo ponga el color116, as parece que el
pacmansemuevesobreelfondo.Sinohacesestoasyloscoloresdelfondonocoinciden
conlosdelfondodelpacman,pareceraquestellevaseunaespeciedesombraincmoda.
Una vez que lo tengas, comprueba que el mueco del pacman y no el cuadrado que
tenamosantes,semuevebienporeltablerodeajedrez.
En qu sentido te ha salido la boca del pacman? mira a la derecha o a la izquierda?
recuerda del apartado 12.2.4 y del captulo 13 que si no cambibamos los ndices se
dibujaba la imagen simtrica. En realidad te debera salir mirando a la derecha, pero el
hecho de que se pueda cambiar tan fcilmente es una ventaja. Podemos hacer que mire
hacia un lado o hacia el otro segn el sentido que tenga el pacman. Slo habra que
guardarenunregistroelsentidodelltimomovimiento.
Si quisisemos hacer que el pacman mire para arriba y para abajo, con la misma figura
podramos hacer una trasposicin de filas por columnas. Aunque requiere un poco de
anlisisyseguramentenecesitarsalgunaspruebas,staeslaopcinmsrecomendada.
Otraalternativaseracrearotrasdosimgenesconelpacmanmirandoarribayabajo.Las
imgenessepodranguardarenlamismaROMtriplicandoelnmerodedireccionesde
memoria117.Laseleccindelaimagenseharaigualquelaseleccindeloscaracterescon
laROMqueguardabaloscaracteresASCII.
Una vez hecho todo esto, tendremos al pacman movindose por el tablero de ajedrez y
mirandoenelsentidoenelquesemueve.

Portanto,lacondicinquepintaelpacmanylaquepintaelfondonodebenserexcluyentes,estoes,no
116

debenestarenifelsif,sinoquedebenserdosifenelqueelpacmansobreescribealfondo.
CreartresmemoriasROMesmenosrecomendableporquehaceaumentarelnmerodeconexiones
117

internasdelcircuito.Adems,nuncasevanlasdistintasimgenesdelpacmansimultneamenteporloque
nohayquegestionarlosaccesosindependientemente.

Departamento de Tecnologa Electrnica 251


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

15.5. El laberinto
Hastaahoraelpacmansemuevelibrementeporeltablerodeajedrez.Queremoscrearun
laberintoyhacerqueelpacmanvealimitadasulibertaddemovimientoporlasparedes
dellaberinto.
Ellaberintotambinlovamosacrearconunaimagenenblancoynegro,dondelosunos
vanaserlasparedesdellaberintoyloscerossernlospasillospordondepuedepasarel
pacman.Laimagentendrquetenerlasmismasdimensionesdelacuadrculadelcampo
dejuego.Perolasdimensionesestarnencuadrculasynoenpxeles,esdecir,laimagen
ser de 32x30 en vez de 512x480 (recuerda las dimensiones en la figura 15.3). Con esto
ahorramosmuchamemoria.
Lo que haremos es pintar cada elemento de la imagen del laberinto (cada pxel) en una
cuadrcula.Comolascuadrculassonde16x16,seracomoampliarlaimagenpor16.En
apartado 12.2.3.5 vimos cmo mostrar una imagen ampliada por dos. Ahora, en vez de
quitar el bit menos significativo (ampliacin por dos), quitaremos los cuatro bits menos
significativos(ampliacinpor16).Odichodeotramanera,usaremoslascoordenadasde
lacuadrcula col_cuady fila_cuadparacalcularladireccindememoriay,ensucaso,el
ndicedeldatodelamemoria.
Asqueslohacefaltacrearlaimagendellaberinto.Enelcdigo15.2estlaconstantede
laROMparaellaberinto(puedescrearotrolaberintosilodeseas).LaROMesdelmismo
tipo que la del pacman: cada fila de la imagen se corresponde con una direccin de
memoria,ycadaelementodeldatocontienetodaslascolumnas.
constant img : memostruct := ( -- los unos son las paredes
-- FEDCBA9876543210
"1111111111111111",-- 0
"1000000000000001",-- 1
"1011110111111101",-- 2
"1011110111111101",-- 3
"1011110111111101",-- 4
"1000000000000000",-- 5
"1011110110111111",-- 6
"1011110110111111",-- 7
"1000000110000001",-- 8
"1111110111111101",-- 9
"1111110111111101",--10
"1111110110000000",--11
"1111110110111100",--12
"0000000000100000",--13
"1111110110100000",--14
"1111110110111111",--15
"1111110110000000",--16
"1111110110111111",--17
"1111110110111111",--18
"1000000000000001",--19
"1011110111111101",--20
"1011110111111101",--21
"1000110000000000",--22
"1110110110111111",--23
"1110110110111111",--24
"1000000110000001",--25
"1011111111111101",--26
"1011111111111101",--27
"1000000000000000",--28
"1111111111111111" --29
);
Cdigo 15.2: Constante de la ROM para dibujar el laberinto (mitad)

Siobservaslamemoriapodrsverqueelanchodepalabradelamemoriaesdeslo16
bits, mientras que el campo de juego tiene 32 columnas. Lo hemos hecho as porque el

252 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

campo es simtrico, entonces para pintar el lado derecho slo tenemos que poner la
imagenespeculardelladoizquierdo.Asslonecesitamoslamitaddelamemoria.
Peroantesdepintarlaimagenespecular,mejorserprobarsipodemospintarlamitadde
la izquierda118. Haz una copia del proyecto anterior que pintaba el pacman e incluye la
memoria del cdigo 15.2. Haz que se pinte la imagen de modo que cada pxel de la
imagentengaeltamaodeunacuadrcula.Elpacmandeberaparecerporencimadela
imagen de fondo. La imagen slo aparecer en la mitad izquierda del campo, en las
primeras16columnasdelacuadrcula(256pxelesdelaVGA).
Cuandolotengashecho,ahoravamosrepetirlaimagenenlassiguientes16columnasde
lacuadrcula(lospxelesdel256al511).Enelapartado12.2.3.4vimoscmorepetiruna
imagen.Ahoraenvezderepetirlaentodalapantallalalimitaremosalcampodejuego.
Si simplemente repites la imagen no quedar la imagen simtrica por el lado derecho,
tendrsquecambiarlosndicesdelascolumnas.Estoloacabamosdehacerconelpacman
paraquemirasehaciaelladoquecaminaylovimosenelapartado12.2.4.Enrealidadlo
quetenemosquehaceresdeshacerelcambiodendicesparaqueahorassalgalaimagen
especular,puesesloquequeremos.Enresumen:
Enlaparteizquierdadelcampodejuegoharemoselcambiodendices(apartado12.2.4).
Quesonlasceldas0ala15,olospxeles0a255.
Enlapartederechanoharemoselcambiodendices.Celdas16a31pxeles256a511.
Noteolvidesdeelegircoloresdistintosparalasparedesdellaberintoylospasillos.

15.6. Recorrer el laberinto


Tenemos el pacman y el laberinto, pero el pacman cruza las paredes del laberinto sin
problema.Enesteapartadoresolveremosestacuestin.
Para tener en cuenta las paredes del laberinto, cada vez que se recibe una orden de
movimiento,elcircuitodebedecomprobarsilanuevaposicinestpermitida.Siparala
nuevaposicinenlaROMhayununoindicarqueesunapared,yporlotantoelpacman
nosepodrmoverenesadireccin.Parahacerlacomprobacinhabrqueaccederala
memoriaycomprobarelelementodelamemoriacorrespondientealaposicindeseada.
ComotambinseaccedealaROMparapintarelcampodejuego,tendramosquerealizar
uncontroldelosaccesos,yaquequeremosaccederaelladesdedossitiosdiferentes:para
pintaryparacomprobarlanuevaposicin.Realmentenoesmuchoproblemayaquelos
movimientosdeljugadorsonmuylentoscomparadosconlasfrecuenciasdelaplaca.Sin
embargo,paraahorrarnosesecontrol,podemoshacerquelamemoriaROMdelcampode
juegoseadedoblepuertoyaccederaelladeformaindependiente119.
Parahacerlacomprobacinesconvenientequehagasunamquinadeestados,yaquelos
accesos a memoria no son instantneos ni tampoco la actualizacin del registro que
tendrsqueescribirparaindicaralamemorialadireccinquequieresleer.Porltimo,si
laceldaesaccesible,tendrsqueactualizarlasnuevascoordenadasdelpacman.

118 Siquieres,tambinpuedeshacerlaimagencompletaynorecurriraestostrucosparadibujarlaimagen
especular
119 Realmenteestasmemoriassonmuypequeaseinclusosepuedendefinircomoconstantesenelcdigo
VHDL.Estosimplificaraenormementeelcircuito,peroloestamoshaciendoasparafamiliarizarnosconel
usodelasmemorias.

Departamento de Tecnologa Electrnica 253


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Esimportantetambinquelaposicininicialdelpacmanseaunaposicinpermitida(sea
unceroenlaROMdellaberinto).
Implementa el circuito y comprueba que el pacman slo se mueve por los pasillos,
comprueba tambinqueentrapor elpasadizoquehayenloslateralesy quesale por el
ladoopuesto.

15.7. Control del movimiento del pac-man *


Elmovimientodelpacmannoesmuysuave.Siescogemoselmovimientoporpulsacin,
es decir, cada vez que presionamos el pulsador se mueve una celda, el movimiento es
muylento.Porotrolado,siescogemoselmovimientocontinuoavecespuedeserdifcil
desviar el rumbo por pasillos laterales. Podemos implementar un movimiento ms
sofisticadoquehagalosiguiente:
Alpresionarunpulsadorelpacmansigueladireccinfijadademaneraindefinidahasta
que encuentre una pared que le impida continuar. Es decir, no hace falta mantenerlo
pulsadoparaquecontineelmovimiento.
Sielpacmansemueveenunadireccinypresionamosunpulsadordeotradireccin,el
pacmancontinuarmovindoseenladireccininicialhastaqueencuentreunpasilloquele
permitacambiaralanuevadireccin.
Esta manera de moverse resulta ms fcil para controlar el movimiento del pacman y
podermeterseporpasilloslaterales.
Para implementar este movimiento necesitars crear una mquina de estados y un
temporizadorquegenerepulsosparaordenareldesplazamientoperidicodelpacman.El
temporizadordeterminarlavelocidaddelpacman.Otraalternativaespermitirpresionar
dos pulsadores simultneamente siempre que no sean de direcciones opuestas. Sera
similaraunmando(joystick)quepermitedireccionesoblicuas.
La implementacin de este control de movimiento no es necesaria, pero mejora
enormementeelcontroldelpacman.

15.8. La comida y los puntos


Elpacmantienequecomersetodaslasbolitasdecomidaquehayenellaberintoyestole
permite pasar de nivel. Cada bolita de comida le da un punto. Para implementar la
comida puedes crear una memoria RAM del tamao de la cuadrcula (32x30). Esta
memoria RAM tendr todos sus valores a cero (hay comida) y cada vez que el pacman
paseporunacelda,seescribirununoenlaposicindememoriacorrespondiente.Porlo
tanto,unceroenlamemoriaRAMsignificaraquehaycomidaoloqueeslomismo,que
elpacmannohapasadoporall.Yununosignificarquenohaycomidaoqueelpacman
hapasado.
Sielpacmanpasadosvecesporlamismaceldasepuedevolveraescribirununoenla
memoria,nopasanadaporescribirdenuevoununoenlamemoriacuandoyahabaun
uno.Loquesesimportanteesnovolverasumarpuntos.Tendrsquecrearuncontador
depuntosquesevayaincrementandocuandoelpacmanentreenunaceldaconcomida
(conunceroenlamemoriaRAMdelacomida).

254 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

Si se hace de esta manera habr puntos que nunca se podrn comer, pues la memoria
RAM de la comida contiene todas las celdas de la cuadrcula, incluyendo las celdas de
pared del laberinto por donde el pacman nunca podr transitar. No pasa nada, lo
importanteestenerencuentaelnmeromximodeceldastransitablesdeunlaberinto.
Tendremos que crear un contador para cada laberinto que cuente el nmero de bolitas
que se han comido (celdas transitadas), cuando se llegue al nmero mximo de celdas
transitablessehabrterminadolapantalla.Estenmeromximodeceldastransitableslo
podrscalcularamanoyponerlocomoconstanteparacadalaberinto,otambinpuedes
crear un circuito que en la inicializacin cuente las celdas transitables del laberinto. La
primeraopcinesmsfcildehacerparaunapantalla,mientrasquelasegundaopcines
msgeneralizableyproducemenoserrores.
Demanerasimilarala memoriaROMdel laberinto,seaccedealamemoriaRAMdela
comidadesdedossitiosdiferentes.Porunladoseaccedealdibujarlapantallayporotro
ladoseaccedeparacontabilizarlospuntosyescribircundosetransitaporlasceldas.Por
lo tanto podemos implementar la memoria RAM con doble puerto para independizar
estasdospartes.
Cuando se pinta el laberinto en la pantalla, entre otras, hay que hacer las siguientes
comprobaciones:
Siespared:sepintalaparedcomosehahechohastaahora.Nosemirasihaycomida,pues
enlaparednosepintalacomida.
Siespasillo:
Sinohaycomida:sepintaelpasillocomohemoshechohastaahora
Sihaycomida:sepintaunabolitadecomidaconelmismocolordefondoqueelpasillo.
Paralabolitadecomidapuedescrearunaimagendelamismamaneraqueelpacman,
tambinpuedescrearimgenesmssofisticadasconmscolores,osimplementepintar
deuncolordistintolospxelescentralesdelacelda.
Porltimo,puedesincluirunmarcadoraladerechaqueindiqueelnmerodepuntosdel
pacman,queporahoraeslacuentadelnmerodebolitasquesehacomido.

15.9. Las paredes del laberinto *


Hemos pintado las paredes del laberinto de un color, coloreando toda la cuadrcula del
mismocolor.Hacindoloas,lasparedesseparecenmsalaversindeAtari(figura15.2)
quealaversindelasmquinasrecreativas(figura15.1).Podemosdejarlasparedescomo
estn,perosiqueremosunacabadomssimilaraldelasmquinasrecreativaspodemos
pintarlasparedes.
Enlafigura15.4semuestranlasparedescomoestnahora.Paranodibujarelcampode
juegoentero,slosemuestralaesquinasuperiorizquierda.Enlafigurasehaescogidoel
negrocomoparedyelblancocomopasillo,perocualquierotracombinacindecoloreses
vlida. En la figura 15.5 se muestra el diseo cuadriculado que dibujara bordes
redondeados.Estediseoserasimilaraldelaversindelasmquinasrecreativas(figura
15.1), aunque en el dibujo se ha escogido una combinacin de colores distinta para
facilitarlavisualizacin.

Departamento de Tecnologa Electrnica 255


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

contina contina
... ...

contina contina
... ...
Figura 15.4: Paredes rellenas con un slo color Figura 15.5: Paredes rellenas con dibujos

Observandolafigura15.5podemosverquehaysietetiposdeceldasparapintarlapared.
Estasceldassemuestranenlafigura15.6.Recordemosqueennuestrodiseolasceldas
sonde16x16,porlotanto,lasformascircularesaparecernunpocopixeladas,igualque
lo era la imagen del pacman. El ancho de la lnea puede ser de dos pxeles y estarn
centradosenlacuadrcula.

1 3 5

0 2 4 6

Figura 15.6: Tipos de celdas para pintar las paredes del laberinto

Por tanto se podra crear una memoria ROM que tuviese las imgenes de los tipos de
celdadelasparedesdellaberinto.Lostiposdeceldaapintarsepuedenreducirados,ya
que el tipo cero (figura 15.6) no necesita memoria; los tipos uno y dos, son el mismo
dibujocambiandofilasporcolumnas;ylostipostres,cuatro,cincoyseis,sonelresultado
dedistintoscambiosdefilasycolumnas(similaralasdeldibujodelpacmanvistoenel
apartado15.4).Puedeselegirloqueteseamsfcil:incluirenlaROMdostiposdeceldas
yhacercambiosdefilasycolumnas,oincluirseistiposdeceldas.
Eltipode celdadelaparedviene determinadaporlascuatroceldasadyacentes(arriba,
derecha,abajoeizquierda).Dependiendodesilasceldasadyacentessondepasilloode
pared, el tipo de celda a dibujar en la pared ser distinto. Tambin hay que considerar
comocasosespecialeslosbordesdelcampodejuego.Elclculoparaobtenerdeltipode
pared que hay que pintar es sencillo, la figura 15.7 muestra cuatro de las 16 posibles
combinaciones120 (sin contar los bordes del campo de juego). Hay un caso que no se ha
considerado, que es la pared rodeada de pasillo en las cuatro direcciones y su
implementacinpodraseruncrculo.

Sincontarlosbordesdellaberinto.Adems,estoseneljuegooriginal(figura15.1)tienenunalneadoble,
120

igualqueelcuartocentraldedondesalenlosfantasmas.

256 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

0 1 2 3

pasillo pared pared a la que se le calcula el tipo de celda para pintar



Figura 15.7: Obtencin del tipo de celda para pintar las paredes a partir de las celdas adyacentes

Parasaberqutipodeparedhayquepintarencadacasohayvariasalternativas:
UsarotramemoriaROMquenosindiqueparacadaceldadeparedqutipoes.Losvalores
deestamemorialoscalcularamosmanualmente121segnlosvaloresdelamemoriaROM
del laberinto (apartado 15.5). Como el nmero de tipos de pared son ms de dos, la
memoria necesitara ms de un bit por celda, y por tanto, la memoria deber de tener
tantasposicionesdememoriacomoceldasdellaberinto.Esdecir,nosepuedeponertoda
unafilaenunaposicindememoriacomohemosestadohaciendoconlasmemoriasdel
pacmanydellaberinto.
Porotrolado,recuerdaquelamemoriadellaberintoestabaalamitad,porquelaparte
derecha es simtrica a la izquierda. Esto se puede seguir haciendo para esta nueva
memoriaROMsabiendoquealahoradepintarlasparedesdelaizquierdaquesean
deltipo3y4enlapartederechasecambiarnporlasdeltipo5y6respectivamentey
alainversa(lasdel5y6secambiarnporlasdel3y4).Losotrostiposdeparedesson
simtricos.
Lasceldasquesondepasillosepuedendejarcomodetipocero(figura15.6).Lopeor
deestemtodoesquerequierehaceramanolaROMcadavezquesecreaunnuevo
laberinto.
OtraalternativasimilaralaanteriorescrearunanicamemoriaROMparaellaberintoyel
tipodepared.Bastarasimplementeconincluiruntipodeceldamsquefuesepasillo.
Conestotendramosochotiposdeceldas(recuerdalafigura15.6),quejustamentecabran
enunbyte.
Se puede realizar un mdulo al empezar que calculase el tipo que se pintar para cada
celdadepared.SecalcularaapartirdelaROMdelpasilloyseguardaraenunamemoria
RAM.UnavezguardadoslosdatosenlamemoriaRAMestemduloquedarainactivoy
lamemoriaRAMfuncionarademanerasimilarlaROMdelasalternativasanteriores.La
gran ventaja de este mtodo es que si se implementan varios niveles con distintos
laberintos, el circuito se encarga de realizar los clculos, sin tener que realizarlos
manualmente. Por otro lado, en los casos anteriores se necesita una ROMcon el tipo de
celda de pared para cada laberinto, en este caso slo se necesita una RAM, en la que se
guardan losdatos de lasceldas al principio de cada laberinto. El tiempo empleado para
realizar el clculo es insignificante y el jugador no se dara cuenta. Este mdulo tendra
muchas caractersticas similares a los mdulos de procesamiento de imgenes que
realizamosenelapartado14.2.

121 Tambinsepodracrearunejecutablequegenerelasmemoriasapartirdeunaimagen,similaraldescrito
enelapartado12.2.6

Departamento de Tecnologa Electrnica 257


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Porltimo,tambinsepodracalculareltipodeceldadeparedenelmismomomentoque
se est pintando. La dificultad de este mtodo es que para el clculo se necesitan cinco
pxelesdelamemoriadellaberinto(cdigo15.2),quesonelpxeldelaceldaqueseest
pintando ms los cuatro pxeles adyacentes. Esto hace que se requieren varios accesos a
memoria,porloquehayqueanticiparseparaquelosretardosnohaganquenosemuestre
el pxel correcto. La ventaja de esta implementacin es que no se necesita una memoria
paraguardarlostiposdeimgenesapintar.Estemdulotendraalgunassimilitudesconel
procesamiento al vuelo del apartado 14.4.2, pero ahora resulta ms sencillo porque cada
fila est enuna posicin de memoria, y en el apartado 14.4.2tenamos un pxel en cada
posicindememoria.
Paraterminar,sepuedencrearparedesdellaberintomssofisticadasconmuypococoste,
yaqueslosenecesitanunospocostiposdeceldas.Envezdelossencillosdibujosdela
figura15.6sepuedencrearceldascontrescoloresymsprofundidaddecolor.

15.10. El tamao del pac-man *


Si has implementado la propuesta del apartado anterior, el pacman quedar pequeo
frentealanchodelpasillo.Estoesporquelasparedesdelpasillonoocupantodalacelda
sinolazonacentral.Enlafigura15.8sepuedecomparareltamaodelospasillosconla
figuradelpacman.


Figura 15.8: Tamao del pac-man comparado con el antiguo y el nuevo pasillo

As que opcionalmente se puede ampliar el tamao del pacman al doble del tamao
originalparaqueocupelamayorpartedelpasillo.Lafigura15.9muestracmoquedara
elpacmanenrelacinconelnuevopasillo.


Figura 15.9: Pac-man ampliado para que ocupe la mayor parte del pasillo

La implementacin de esta variante es fcil. Hay que crear una memoria ROM para el
pacmanquetengaeldobledeltamaodelanterior,ennuestrocasode32x32.Podramos
tambinutilizarlaquetenamos,mostrndolaaldobledetamao.Sinembargo,comoel
pacmanesredondo,quedarmejorsilodibujamosa32x32delo contario quedar muy
pixelado.
Por ltimo slo queda pintarlo. En el proceso que asigna los colores de la VGA ya no
podemosseleccionarelreadelpacmanbasndonosenlafilaycolumnadelacuadrcula
(fila_cuad=fila_pacmanycol_cuad=col_pacman)yaqueahoraelpacmanocuparatambin
partedelasochocuadrculasadyacentes,talcomosepuedeverenlafigura15.10.Porlo
tanto, ahora tenemos que calcular los pxeles y lneas de la pantalla donde empezara a
dibujarselaimagen(referidosalapantallaynoalacuadrcula).
Lafigura15.10muestraenqupxeldelapantallahayqueempezaramostrarelpacman,
simplementehayquerestar8(lamitaddeunacelda)alacolumnayalafiladelaVGA

258 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

dondecomienzalacuadrculadelpacman.Lacolumnaylafiladelpacman(col_pacmany
fila_pacman)semultiplicanpor16porquestassonlacolumnayfiladelacuadrcula,y
queremosobtenerlacolumnaylafiladelaVGA.

16 col_pacman - 8 32
pxeles

16 fila_pacman - 8
32 fila_pacman
pxeles

col_pacman
Figura 15.10: Coordenadas del pac-man ampliado

Ahora slo queda dibujar una imagen de 32x32 a partir del pxel de la pantalla que
acabamosdecalcular.Estoyalohemoshechovariasveces(recuerdaelapartado12.2.3.3).

15.11. Movimiento continuo del pac-man *


Nuestro pacman se mueve dando saltos de celda en celda, es decir, de 16 en 16 pxeles.
Esto no es un gran problema, pero es ms agradable verlo mover de un modo ms
continuo. Para ello podemos implementar un movimiento que vaya de pxel a pxel.
Aunque el pacman se mueva de pxel en pxel, esto slo ser una apariencia ya que
realmente el pacman se seguir moviendo de cuadrcula en cuadrcula. Es decir, las
posiciones del pacman seguirn estando referidas a la cuadrcula (col_pacman y
fila_pacman).

Este movimiento del pacman slo tiene sentido si hemos implementado un movimiento
continuo del pacman. Si el movimiento del pacman viene determinado por pulsaciones
individuales de los pulsadores, no tiene mucho sentido, aunque tambin se podra
implementaryseguramentequedaramejor.
Sielmovimientonoestgeneradoporlaspulsacionesdelospulsadores,elpacmantiene
una velocidad de movimiento determinado por un contador que, o bien muestrea los
pulsadores(apartado15.3)obiengenerapulsosqueordenanelmovimientodelpacman
(apartado15.7).
Lo que habra que hacer es establecer otra cuenta 16 veces menor que ordene el
movimiento aparente del pacman de pxel en pxel. Habr muchas maneras de
implementarestecontrol,porejemplo,sepodrahacerunacuentanuevaquesea16veces
menorquelacuentaoriginal,yahora,lacuentaoriginal,envezdecontarciclosdereloj,
contar 16pulsosdelanuevacuenta.Llamaremosaestacuenta pacm_pxlmovyharemos
que esa cuenta sea descendente, de quince a cero. La figura 15.11 muestra de manera
esquemticaelmovimiento.

Departamento de Tecnologa Electrnica 259


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

Posicin Inicial Posicin Final


16 col_pacman - 8 16 col_pacman - 8 16 col_pacman - 8
16 col_pacman - 8
16 col_pacman - 8
15 14 8
0
Cambio de
posicin

... ...

col_pacman=1 col_pacman=2 col_pacman=2 col_pacman=2 col_pacman=2

pacm_pxlmov=0 pacm_pxlmov=15 pacm_pxlmov=14 ... pacm_pxlmov=8 ... pacm_pxlmov=0

Comienza la Se resta a
cuenta atrs la posicin

Figura 15.11: Movimiento del pac-man pxel a pxel hasta llegar a la posicin final

Analicemoselmovimientodelpacman:
El pacman parte de la posicin inicial estando en la columna uno de la cuadrcula
(col_pacman=1).
Elpacmanrecibelaordendemoversealaderecha,porlotantopasaaestarenlacolumna
dos(col_pacman=2).
En este momento comienza la cuenta atrs de pacm_pxlmov y vale quince. El valor de
pacm_pxlmovsepuedeentendercomoelnmerodepxelesquelequedanparallegarasu
destino.
Parapintarelpacmansecalculansuscoordenadascomosehizoenlafigura15.10peroal
valordelacolumnaselerestaelvalordepacm_pxlmov.
Se contina haciendo lo mismo, y el pacman se ir acercando a su destino pxel a pxel,
hastaquepacm_pxlmovseacero,yentonceselpacmanyadibujarcentradoessucelda.
En el ejemplo de la figura 15.11 el pacman se est moviendo a la derecha, por lo tanto
pacm_pxlmovserestaalacolumna.Enelcasodequeelpacmanseestuviesemoviendoala
izquierda,elvalordepacm_pxlmovsesumaraalvalordelacolumna.Yenloscasosenlos
queelmovimientofuesehaciaarribaohaciaabajo,elvalorde pacm_pxlmovsesumarao
restaraalascoordenadasdelafila.

15.12. El pac-man comiendo *


Nuestropacmanvaconlabocaabiertaportodaspartes,podemoshacerqueabraycierre
labocamientrascaminaysecomelasbolitasdecomida.Incluirestotambinessencillo,
sobretodosihasimplementadoelmovimientocontinuodelapartadoanterior.Solamente
tenemos que incluir en la ROM una imagen del pacman con la boca cerrada (un crculo
completo)quealcombinarlaconladelabocaabiertaparecerqueabreycierralaboca.
Sisedeseaunmayorrealismosepuedencrearvariasimgenesconlabocamsomenos
abierta e irlas combinando durante el movimiento. La cuenta pacm_pxlmov del apartado
anteriorvienemuybienparalaimplementacindeestemovimientodelaboca.Segnel
valordelacuentaseseleccionarnunasuotrasimgenesdelpacmanconlabocamso
menosabierta.Elcambiodelasimgenesdependerdelavelocidaddemovimientodel
pacman y del nmero de imgenes que se tengan. Cuanto mayor nmero de imgenes,
ms similares sern las imgenes contiguas y por lo tanto ms rpidamente se podrn

260 Universidad Rey Juan Carlos


15. Videojuego Pac-Man

cambiar.Perohayquetenerencuentaquecambiosmuyrpidosnosonperceptiblespor
elojo/cerebrohumano.

15.13. Los fantasmas


Llegaelmomentodeincluiralosmalosdeljuego.Paralosfantasmastendrsquecrear
imgenes de ellos, si has ampliado el pacman como se sugera en el apartado 15.10,
tendrsquecrearlosfantasmasdelmismotamao.Nohacefaltacrearunaimagenpara
cadafantasma,bastaconusarlamismaimagenypintarladedistintocolor.Esos,cada
fantasmadebertenersuspropiascoordenadas.
Losojosdelosfantasmasmiranhaciadondecaminan,puedesimplementarestousando
cuatro imgenes distintas con cuatro direcciones de ojos, o mejor an, puedes crear
imgenes de los ojos independientes. Estos ojos se superpondrn a los fantasmas y as
tambinpodremostenerlosojossinfantasma,queesloqueocurrecuandosoncomidos
por el pacman y tienen que volver a su casa. Esto ser en caso de que implementes las
bolitas de comida mgicas. En caso de que superpongas los ojos tendrs que definir un
colortransparenteparaquesepinteelfondo(elfantasma).
Ademsnohacefaltacrearimgenesdeojosde32x32122,sinoquecomolosojossiempre
estarnenlamitadsuperior,podemosolvidarnosdelamitadinferior.Eincluso,comolos
ojos son iguales, podemos guardar un slo ojo y repetirlo en la otra mitad. As que la
imagendelosojospuedeserdelamitad:16x16,silosfantasmassonde32x32.
Ynosloesto,sinoquecomolosojosquemiranaladerechasonsimtricosconlosojos
que miran a la izquierda (simetra vertical); e igual con los que miran arriba y abajo
(simetrahorizontal),nospodrabastarcondosimgenesdeunsloojo.
De la misma manera que el pacman, los fantasmas tambin tendrn unas coordenadas
basadas en la cuadrcula pero los fantasmas podrn simular un movimiento continuo
similaraldelpacmanquevimosenelapartado15.11.
Elmovimientodelosfantasmasnoestdirigidoporlospulsadores,asquetenemosque
crear nosotros el movimiento. Este movimiento debe ser ms o menos aleatorio. El
movimiento no debe ser muy aleatorio porque si no sera muy errtico, los fantasmas
debentenerunaciertacontinuidadenelmovimiento.Paraintroduciraleatoriedadpuedes
basarlatomadedecisionesensucesosexternos,porejemplo,elnmerodeciclosdereloj
que han pasado desde la ltima vez que se ha presionado/soltado un pulsador. O por
ejemplo,basarloenelnmerodeceldadondeestelpacman.Porejemplo,tomandolos
ltimosbitsdelafilaycolumnadelacelda,ybasandolanuevadireccinenlosvalores
deestosbits.Tambinpuedesdotarlosdeciertainteligenciaparaqueintentenencontrar
alpacman.
Porltimo,hayquecontrolarsielfantasmamataalpacman,ylasvidasdelpacman.

15.14. Otras mejoras *


Si has implementado todas las propuestas es ms que suficiente. Pero igual que sucede
concasitodoprogramainformtico,siemprehayalgoquesepuedemejorarenuncircuito

Oimgenesde16x16enelcasodequelosmantengasdeltamaodelacuadrcula
122

Departamento de Tecnologa Electrnica 261


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

digital.Llegadosaestepuntocreemosque,silodeseas,puedesimplementarportimismo
elrestodecaractersticasdeljuego.
Puedesincluir:
Lascuatrobolitasdecomidamgicasquehacenqueelpacmantengapoderesduranteun
tiempoypuedacomersealosfantasmas.Incluirparpadeo,cambiodecoloreincluirboca
enlosfantasmasduranteeltiempoenelquesonvulnerables.Eincluso,combinarelcolor
normalconelcolorvulnerableparaavisardequequedapocotiempodesuvulnerabilidad
Incluirelmovimientodelasfaldasdelosfantasmas
Hacerquelosfantasmasvuelvanacasacuandosoncomidos
Controlarlapuertadelacasadelosfantasmasyevitarqueelpacmanpuedaentrar.No
incluircomidaenlacasadelosfantasmas
Incluir los premios que aparecen en las pantallas: cerezas, fresas, naranjas,... y asignar
puntoscuandoseloscomaelpacman
Incluirvariaspantallasyniveles,condiferenteslaberintos
Aadirvidascuandosesuperaciertapuntuacin
Escenificarlamuertedelpacman
Incluirpantallasinicialesyfinales
Memoriaconlamximapuntuacinconseguida
Hacerqueelpacmanvayamsdespaciocuandoestcomiendo
Implementarelcontroldelmovimientodesdeeltecladoynodesdelospulsadores
Ytodoloqueveasquefaltaytegustaraincluir,estujuego

15.15. Conclusiones
Eneldiseodeestevideojuegohemosvistoquecadacaractersticapodaimplementarse
demuchasmaneras.Algunassonclaramentemseficientes,peroenotrasnospodemos
plantearsivalelapenaelahorroconsiderandolosrecursosquetenemos.Porejemplo,si
tenemosencuentalosrecursosdelaFPGAylospequeostamaosdelasmemoriasde
los personajes (pacman, fantasmas,...) los ahorros son insignificantes. Sin embargo no
siempre es as, y por ejemplo en otros diseos, las memorias son un factor limitante.
Recuerda por ejemplo la tabla 12.3 en donde se mostraban las limitaciones para usar
imgenesgrandes.
As que estas cuestiones siempre tienen que estar presentes en la mente del diseador:
mejorar las prestaciones y valorar si merece la pena el ahorro conseguido frente al
esfuerzodeimplementardichasmejoras.
Paraterminar,comodijimosalcomienzodeestecaptulo,quedamuchoporaprendery
dehechopensamosqueeldiseadornuncadejadeaprender,peroesperamosquelovisto
enestelibrotevalgaparaquepuedascontinuarelaprendizajeportimismo.Esperamos
tambinquetehayasdivertidomientrashasestadoaprendiendooquealmenosquehaya
sidoentretenido.

262 Universidad Rey Juan Carlos


Referencias
[1adept] AdeptdeDigilent.ProgramagratuitoparaprogramarlasFPGAsporUSB:
http://www.digilentinc.com/Products/Detail.cfm?Prod=ADEPT
H H

[2ash] P.Ashenden,DigitalDesign,AnEmbeddedSystemsApproachUsingVHDL,Ed.
MorganKaufmann,2008
[3basys] Basys,tarjetaconFPGAfabricadaporDigilent.
ManualdereferenciadelaversinE:
http://www.digilentinc.com/Data/Products/BASYS/BASYS_E_RM.pdf
H H

Pginawebdelatarjeta:
http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,791&Prod=BASYS
H H

[4chu] P.Chu,FPGAPrototypingUsingVHDLExamples,Willey,2008
[5cc] CreativeCommons.http://creativecommons.org/H H

Licenciadeestemanual:http://creativecommons.org/licenses/byncnd/3.0/
H H

[6ceng] ComputerEngineering:http://www.computerengineering.org/ps2protocol/
H H

[7desch] JP.Deschamps,Sntesisdecircuitosdigitales,unenfoquealgortmico,Thompson
2002.
[8digi] DigilentInc.http://www.digilentinc.com/
H H

[9dte] DepartamentodeTecnologaElectrnica,UniversidadReyJuanCarlos.
http://gtebim.es
H H

[10dcse] DiseodeCircuitosySistemasElectrnicos.http://gtebim.es/docencia/DCSE
[11ed2] ElectrnicaDigitalII.http://gtebim.es/docencia/EDII
H H

[12educ] F.Machado,N.Malpica,J.Vaquero,B.Arredondo,S.Borremeo,Aprojectoriented
integralcurriculumonElectronicsforTelecommunicationEngineers,EDUCON
Conference,Madrid,abril2010
[13ieee] IEEE,InstituteofElectricalandElectronicsEngineers.http://www.ieee.org H H

[14imag] ImageMagik:http://www.imagemagick.org
H H

[15irfan] IrfanView:http://www.irfanview.com
H H

[16ise] ISEWebPackdeXilinx.http://www.xilinx.com/tools/webpack.htm
H H

Paradescargarversionesantiguas:
http://www.xilinx.com/webpack/classics/wpclassic/index.htm
H H

[17mach] F.Machado,S.Borromeo,DiseodecircuitosdigitalesconVHDL,2010.Libro
ElectrnicodisponibleenelarchivoabiertodelaUniversidadReyJuanCarlos.
http://hdl.handle.net/10115/4045
H H

[18mach] F.Machado,S.Borromeo,N.Malpica,DiseodigitalavanzadoconVHDL,Ed.
Dykinson,2009.
[19mach] F.Machado,S.Borromeo,N.Malpica,DiseodigitalconesquemticosyFPGA,Ed.
Dykinson,2009.
[20model] Modelsim,http://www.model.com
H H

[21nexys] Nexys2,tarjetaconFPGAfabricadaporDigilent.Manualdereferencia:
http://www.digilentinc.com/Data/Products/NEXYS2/Nexys2_rm.pdf
H H

Pginawebdelatarjeta:
http://www.digilentinc.com/Products/Detail.cfm?Prod=NEXYS2
H H

[22openc] Opencores.http://www.opencores.org
H H

[23qihw] Qihardware:http://en.qihardware.com/wiki/Teclado
H H

[24realt] RealTerm.http://realterm.sourceforge.net/
H H

[25rtl] IEEEStandardforVHDLRegisterTransferLevel(RTL)Synthesis,IEEEStd1076.6
[26spart3] Spartan3EFPGAFamily:DataSheet.DS312,Xilinx

Departamento de Tecnologa Electrnica 263


Diseo de sistemas digitales con VHDL - v1.00 - 28/10/2011

[27urjc] UniversidadReyJuanCarlos,http://www.urjc.es
H H

[28web] PginawebconcdigoVHDLcomplementarioaestelibro:
http://gtebim.es/~fmachado/electronica
H H

[29xilinx] Xilinx,http://www.xilinx.com
H H

[30xst] XSTUserGuide9.2i.Xilinx,http://ww.xilinx.com/itp/xilinx92/books/docs/xst/xst.pdf
H H

[31xup] XilinxUniversityProgramVirtexIIProDevelopmentSystem.Hardwarereferencemanual.
UG069v1.09marzo2005.http://www.xilinx.com/univ/xupv2p.html
H H

264 Universidad Rey Juan Carlos

También podría gustarte