Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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
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
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
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
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
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
1Esteplandeestudiosempezaextinguirseapartirdelcurso20092010conlaimplantacindelosgradosde
Boloniaenelprimercurso
2Enlareferencia[12educ]seresumeelcurrculumenelectrnicaqueadquierenlosalumnosendichoplande
estudios
3FSM:acrnimodelingls:FiniteStateMachine:Mquinadeestadosfinitos
4InstituteofElectricalandElectronicsEngineers
Figura 2.1: Lista de palabras reservadas del 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:
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:
Elnombredelaarquitecturaes BEHAVIORAL(comportamental).Normalmenteseponeun
nombre que describa el nivel de abstraccin de la descripcin, que puede ser dataflow,
functional,RTL,...Peronotieneporquserunodeestos.
Delcdigopodemosdeducirquelaasignacindesealesserealizamedianteeloperador:
<=".
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.
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
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
5Aunquesepuedeponerunndicedistintodecero,noesrecomendable.
6Unlatchesunelementodememoriacondosposiblesestados(biestable)queesactivopornivel.Lasealque
hacequeellatchestactivosesueledenominarenable(habilitacin).
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.
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
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).
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;
7 Loscircuitosdetectoresdeflancoseexplicanenlareferencia[17mach]
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;
Enelcdigo2.17hayunnuevoconceptoquesedebetenerencuentaaldisearenVHDL:
Lospuertosdesalidanosepuedenleer.Porestosehatenidoquecrearlasealauxiliar
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
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,
begin
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.
8UnaceldalgicaconsisteenunaLUT(LookUpTable)de4entradas,unbiestableylgicadeacarreo
Alimentacin
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]
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
10 AlosconectoresPMODselepuedenconectardispositivosmuyvariados:pantallasdecristallquido,
circuitoscontroldemotores,antenas,joysticks,amplificadoresdeaudio,micrfonos,etc.Sepuedenveren
http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,401&Cat=9
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.
'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
11 Puedeserquealgunadelasventanasmostradasseandelaversin8.2.Estadiferencianodeberadeser
transcendente
12 Sieststrabajandoenellaboratorio,alterminarlasesinnoolvidescopiarlosficherosconextensin.vhd
y.ucfentumemoriaUSBoentucorreoelectrnico(ocupanmuypoco).Delocontrario,elprximoda
puedeserquelosficheroshayandesaparecido.
13 HDL:delingls:HardwareDescriptionLanguage
Figura 3.5: Ventana para crear un nuevo proyecto
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
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
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
14LospuertossehannombradosiguiendolosnombresdelospulsadoresdelaplacaXUPV2P,encasodeque
estsusandolaplacaNexys2,puedesnombrarlospulsadorescomoPB_0(envezdePB_ENTER),PB_1(en
vezdePB_UP)yPB_2 (envezdePB_RIGHT).Elrestomantienesusnombres.
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.
Cabecera
Bibliotecas
y paquetes
Entidad
Arquitectura
Figura 3.12: Apariencia de la herramienta al aadir la nueva fuente led1.vhd
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.
Larepresentacinesquemticadeestasentidadessemuestraenlasfiguras3.13y3.14.La
entidaddefinelasentradasysalidasdelcircuito,peronohacereferenciaacmofunciona
osuestructurainterna.Escomosifueseunacajanegra.
LED1 (XUPV2P) LED1 (NEXYS2)
Una vez que hayas incluido el cdigo 3.5, guarda el fichero y comprobamos si hemos
tenidoalgnerrordesintaxispinchandoenSynthesize - XSTCheck Syntax.Estoestenla
subventanadeProcesses.Observalafigura3.15paralocalizarlo.
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).
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.
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.
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).
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
Figura 3.22: Programacin de la FPGA de la XUPV2P
18 Avecesseatascaelratn,siesaspinchaconelbotnizquierdodelratnfueradelostresdispositivos(en
laparteblanca),despusdeestoseguramenteyapuedaspincharconelbotnderechosobreeldispositivo.
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.
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
Figura 3.26: Pantalla del Adept que ha detectado algn dispositivo conectado
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.
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.
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
relojpuedehabercambiado,lalgicadelospulsadores,perifricos,...portantoavecesel
cambionoestanfcil.
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
ficheroshaymsinformacin,queindicaeltipodelgicadecadapin(LVTTL,LVCMOS,...)y,
enelcasodel.ucfdelosrelojes(CLOCKS.UCF)lafrecuenciadecadareloj.
Portanto,paraevitarequivocarnosalasignarlospines,envezdeutilizarlaherramienta
PACEpodemoscopiarypegardelosficheros.ucf.Esos,lospuertosdebenllamarseigual
queenelfichero.ucfysino,cambiarlosnosotrosconeleditor.
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
Recuerdaquesehatenidoquecrearlasealauxiliarled0aux yaquelospuertosdesalida
nosepuedenasignar.
Enelcdigo4.2semuestralaversin(tambinconalgnfallo)paralaNexys2.
entity SEG1_NEXYS is
Port (
rst : in std_logic;
clk_50mhz : in std_logic;
led0 : out std_logic
);
end SEG1_NEXYS;
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
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.
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);
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
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.
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).
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
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.
Figura5.4: Compilando los ficheros del proyecto de Modelsim
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.
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
Ahoraqueremossimularelcircuitodurante1400ms(unpocomsdeunsegundo).Esto
lo indicamos en la ventanita para poner el tiempo de simulacin (ver figura 5.8). Y
pinchamosenelbotndeladerecha(Run).Seleccionamoslapestaawavesinoestuviese
seleccionada.
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.
Pestaa de las
formas de onda
Aviso de error
Figura 5.9: Resultado de la simulacin
Encaptulosposterioresiremosprofundizandoenlosbancosdepruebasylasimulacin.
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.
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).
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
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.
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;
entity led is
Port ( ld0 : out STD_LOGIC;
ld1 : out STD_LOGIC);
end led;
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.
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.
22 FSM:delingls:FiniteStateMachine
(cables) imprescindibles:
Tres lneas (cables)
2
RxD RxD 3
TxD TxD
3 2
5
GND 5
DCE DTE
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
Existendistintasvelocidadesdetransmisin,quesedefinenenbitsporsegundo(bps)o
baudios(921600,460800,230400,115200,57600,38400,19200,9600,4800,).Tambinse
23 EnlaNexys2nohaymspinesdisponiblesparalaUART
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'
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.
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.
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
end UART_PKG;
Cdigo 7.1: Paquete con la declaracin de constantes
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
rst
Figura 7.5: Diagrama de bloques preliminar del transmisor de la UART
Acontinuacinexplicaremoscadaunodelosbloques.
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.
clk
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,
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.
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
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
Cdigo 7.6: Ejemplo de la utilizacin del resultado de la funcin log2i para los rangos de las seales
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
25 Importante:Enalgunossimuladores(porejemplo,laversin6.0deModelsim),nosepuedeusaruna
funcinantesdetenerdeclaradosucuerpo.Sitienesesteproblemaconsultaelapartado7.4.1.3
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;
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
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;
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.
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
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
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
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 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.
Unavezquehayasrealizadoeldiseo,compruebaquelasintaxisestbien(Check Syntax),
inclusopruebaasintetizarlo(Synthesize - XST),peroantesdeimplementarloenlaFPGA
convendrsimularlo.
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.
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.
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)
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.
Simulacin: 1000 ns
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
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
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
30EnModelsim:ViewZoomZoom In
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.
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
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)
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
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)
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'
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.
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'
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.
33 TenencuentaqueenelsimuladordelISE,cuandoestsviendotodalasimulacin(nohasampliadoconel
zoom)avecesnosemuestrantransicionesdesealesqueduranpocotiempo(unciclodereloj).Enel
Modelsimsisemuestranestastransicionesconunalnea.
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
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
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 ...
fpga_tx
3. Leemoselvalordelbitdeinicio:Estandoenmediodelbitdeinicio,procedemosaleersu
valor.Aunqueparaelbitdeinicionoesnecesarioleersuvalor,porqueyalosabemos('0'),
lalecturalahacemosparacomprobarsiefectivamenteelbitdeinicioescero.Encasode
quenoseacero,enVHDLexistelasentencia assert quenospermiteavisardeerrorese
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
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 ...
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
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
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
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
P_Receptor: Process
variable numenvio : natural := 0;
begin
....
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.
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
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.
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
TOP_UART_TX:esunbloqueestructuralquevadefinirlasentradasysalidas,yestablecer
lasconexionesentrelosdosmdulosanteriores.
Acontinuacinsedanguasparadisearestosmdulos
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]
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.
Seleccin del
mdulo de ms
alto nivel
Figura 7.28: Cmo indicar el mdulo de mayor nivel
39Deberaestaractivaloqueduraunatransmisin,perolopuedesdejarencienciclosderelojparasimplificar
yreducireltiempodesimulacin.
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.
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
41ElVHDLavecesesflexibleensucodificacin.Porejemplo,lapalabraisquevadespusdelnombredel
componente(enlaprimeralnea)esopcional.Otroejemploesquedespusdelend componentsepuede
incluirelnombredelcomponente(antesdelpuntoycoma).
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)
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
);
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.
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
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
1
Ventana del
3 Pinchar para
resumen
del diseo ver los
warnings
Figura 7.35: Resumen del diseo en el ISE
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).
42 Revisaelcaptulo3delmanualdeED2[17mach]
43 Revisaelcaptulo5delmanualdeED2[17mach]
44 Probablementenohayasrealizadoelprocesoigual,perofjateenestosejemplosparaentenderloquese
intentaexplicar,yluegocompralocontudiseo.
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
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]
buclescombinacionales.Unbuclecombinacionalseformacuandoelrecorridodeunaseal
sepropagahacasmismasinquehayanelementosdememoriaenmedio.Enlafigura7.40
semuestraelesquemadeunlazocombinacionalyelVHDLquelogenera.
Lazo
combinacional
s_lazo
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;
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).
TOP_TX
INTERFAZ TRANSMISOR
pb pb transmite transmite
transmite tx tx
transmitiendo transmitiendo
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'
Por la rapidez, el estado no habr cambiado, estado=e_init y pulso_pb todava estar a '1'
Siobservaslosprocesos,ambossoncombinacionales.Lasealtransmitiendodepende
delaseal transmiteyviceversa.Porlotantoambasformanunlazocombinacional.
Este lazo combinacional hara que en cuanto la seal transmite se pusiese a uno se
volveraaponeracerocasiinstantneamentedebidoaque transmitiendo sepondra
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.
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.
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
clk
Acontinuacinsedescribenbrevementecadaunodelosbloques.
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
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
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
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.
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.
49 Enlareferencia[19mach]seexplicacmodescribirelhardwaredesumadoresyrestadoresusando
esquemticos.
50 Estodependedelpaquete.Elpaquetenumeric_stdnolaspermite,peroelpaquete
std_logic_unsignedslaspermite,aunqueestopuedellevaraerror.Poreso,comoveremos,se
recomiendaelpaquetenumeric_std.
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
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.
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
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
Acontinuacinveremosrealizarconversionesentrelostiposnumricos.
Cdigo 8.4: Conversin directa entre elementos (bits) de vectores y con std_logic
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
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.
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
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);
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
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.
52Elwarningquedadiceas:Widthmismatch.<resul_us5>hasawidthof5bitsbutassignedexpressionis4bitwide.
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
53 LUT:LookUpTable,tablasdeconsultaqueenlasFPGAsseutilizanparaimplementarlasfuncioneslgicas
54 Recuerdalospasos1y2delafigura7.35
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.
Comolarestadenmerospositivosenlaqueelminuendoeselmayorestacotadaentre
elvalordelminuendoycero,enestecasonotendremosdesbordamiento.
-- 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) );
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
55Recuerdaqueenlarepresentacinencomplementoados,cambiarelsignodeunnmeroescalcularsu
complementoados
56Ylaresta,quecomoyahemosdichonoesmsqueunasumacambiandoelsignodelsustraendo
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.17: Suma de tipos signed considerando el acarreo y utilizando la funcin resize
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
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.
+ + - No desborda - + + No desborda
+ + + = + 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
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
Siobservamoslafigura8.6podemosverquelosmecanismosdelamultiplicacindecimal
ybinariasonsimilares:semultiplicacadacifradelfactordeabajoporelfactordearriba.
Elresultadodelamultiplicacinsedesplazatantascifrasalaizquierdacomolacifradel
factordeabajo.Recuerdaquedesplazaralaizquierdaesequivalenteamultiplicarporla
base, en decimal 10 y en binario 2. Por ltimo se suman todas las multiplicaciones
parcialesyseobtieneelproducto.
+
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)
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.
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;
Fjatequelassentenciasdelcdigo8.22sonconcurrentes,esdecir,noestndentrodeun
proceso.
58Tambinsellamamultiplicador4x4
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.
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;
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.
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;
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.
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;
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
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
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
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)
);
61Elconsumoenergticotambinesuncomponentemuyimportanteenlasprestacionesdeuncircuito.Un
circuitoconbajoconsumoenergticonecesitarmenosenerga(menortamaodelabateraomayor
duracin),disiparmenoscalorysermsfiableporquenosecalentartanto.Elanlisisdelconsumoest
fueradelosobjetivosdeestelibro
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.
A0 A2
A1 A B
superficie
superficie
x0 S1 y1
S0 y0
S0
x1 y2
S1 S2
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
50 ns
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
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
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
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.
64 CLB:ConfigurableLogicBlock
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
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.
fact1 fact2
3 0 3 0
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)
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.
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;
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.
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)
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;
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)
66 Dependiendodeltipodecontrolyeltipodemquinadeestadoselnmerodeciclospuedepuedevariar.
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
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.
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
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)
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
divisor.Sinembargo,podraseruninteresanteproyectoqueunificaratodoloquehemos
vistohastaahora.
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)
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
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
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
69RGB:delassiglaseninglsdeloscolores:red,greenyblue
70Independientementedelniveldelossincronismoshsynchyvsych
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.
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).
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
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
71indicadoenlasegundacolumnadelatabla9.3
cont_clk 0 1 2 3 0 1 2 3 0 cont_clk 0 1 0 1 0
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.
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 -------------------------->|
-- 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
-- frecuencia de la VGA
constant c_freq_vga : natural := 25*10**6; -- VGA 25MHz
Observaenelpaquetedelcdigo9.1quelacuentaestreferidaapartirdelvideoactivo,
envezdeempezarlalneaconelsincronismohorizontal(comosemostrabaenlafigura
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
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.
72 Ylacuentadelneasapartirdelaslneasvisibles
73 Considerandolacolumnaceroladelaizquierdaylafilaceroladearriba(figura9.2)
74 Estasrestastampocosonungranproblema,peroalfinalelcdigoquedamenosclaroyeldiseoms
sencillo
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)));
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.
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
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.
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.
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.
78Tambinhicimosundetectordeflancoeneltransmisor,recuerdalafigura7.27
79Estassealesson:jugizq_sube,jugizq_baja,jugdcha_subeyjugdcha_baja
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:
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
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
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.
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].
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,....
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.
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.
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
80RecuerdaquenoesrecomendableconectarelratnoeltecladoPS/2conlaplacadelaFPGAencendida.
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)
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
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.
ratn Resistencia
de pull-up
FPGA
clkps2_r clkps2_f
Figura 11.9: Esquema simplificado de la conexin en drenador abierto delPS/2
81Eninglssellamaacknowledgebit(ack)
82EstereconocimientonoesnecesarioimplementarloenlaFPGA
83OcolectorabiertoencasodequeseacontransistoresbipolaresenvezdeconMOSFET
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
A B Linea
Linea 0 0 0
0 1 0
A B 1 0 0
1 1 1
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
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].
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.
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.
87EstaimagenlapodramosmostrarcompletamenteconelconversorVGAdelaXUPV2P,yaquelaVGAde
estaplacatiene8bitsparacadacolor.SinembargolaNexys2slotiene8bitsparalostrescolores(recuerda
elapartado9.2),porloqueestaramosguardandoinformacinquenopodramosmostrar.Enelcasodela
Nexys2,siqueremosaprovecharmejorlamemoria,podramosguardarunaimagenencolorde8bits(256
colores).Estoloveremosenelapartado12.2.5.Enamboscasos,estaramosguardandounaimagenenlaque
usamos8bitsparacadapxel.
88217=131072
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
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.
89Elanchodepalabra
entity ROM1b_16x16 is
port (
clk : in std_logic;
addr : in std_logic_vector(7 downto 0);
dout : out std_logic
);
end ROM1b_16x16;
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.
90 Elcdigodeestamemoriasepuededescargardelareferencia[28web]
91 Enrealidadpodemoselegirotrosdoscolorescualquiera,peroslodos.
Figura 12.3: Imagen de la ROM del cdigo 12.1
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
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
93 Estoesunafrmula,notienelasintaxisdelVHDL
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.
94Sinembargo,enelcasodequequeramosquenuestrocircuitoconsumapocaenergaesconvenienteparar
loscircuitosquenoestnhaciendonadatil.
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).
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.
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.
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 ...
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
x16: desplazado
4 posiciones
16 x line_num(3 downto 0)
+ pxl_num(3 downto 0)
dirmem(7 downto 0)
&
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
...
97 Esunaimagenenblancoynegro
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;
end BEHAVIORAL;
Cdigo 12.4: Memoria ROM de 16 posiciones y 16 bits de ancho de palabra98
98 Elcdigodeestamemoriasepuededescargardelareferencia[28web]
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
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]
... ...
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;
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)
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.
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;
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;
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.
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
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.
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).
Figura 12.16: Cronograma de con la lectura y escritura de la BRAM (modo write first)
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
Figura 12.18: Diagrama de bloques de la prctica
Terecomendamosqueparaempezarrealicesprimerolapartedeladerechadelcircuito
(bloques BRAM, PintaImgy SincroVGA)ycompruebesquefuncionebien.Estoseharacon
unaROMquetendrelmismotamaodelaRAMqueusaremosparaguardarlaimagen
delaUART.LaROMguardarlaimagenquesevaaenviarporlaUART104
lectura VGA
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.
Puedesusarelprogramadelareferencia[28web]
104
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]
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.
HOLA
PS/2 VGA
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.
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
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.
105 DelinglsFirstIn,FirstOut,quetraducidoesprimeroenentrar,primeroensalir
106 Aunqueprobablementenoseanecesarioporquelosmapasdebitsdeloscaracteressuelentenercerosenla
primerayltimacolumna,queesdondepodrahaberproblemas.Portanto,sisontodosiguales,nose
notarasiestamospintandoelpxeldeotrocaracter.Osino,saldrantodosloscaracteresdesplazasosunoo
dospxelesaladerecha.Encualquiercaso,lomejorseraretrasarlassealesdelaVGAparasincronizarlas
0 1 2 3 79
80 81 82 83 159
480 pxeles : 30 caracteres
... ...
2320 2399
Figura 13.4: Divisin de la pantalla en cuadrculas y numeracin de las cuadrculas
107 Notanafortunadamente,sinoquestehasidoelmotivodeescogeresasdimensionesdelacuadrcula
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
(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
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
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
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).
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
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
... ... ... ... ... ... ... ... ... ... ... ...
Pixel (1,1) = | A B C + M + N + O |
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.
original prewitt
ProcVentana
RAMproc
escritura lectura
Figura 14.4: Diagrama de bloques del circuito que procesa y muestra una imagen guardada en una ROM
108 Sonvaloresorientativos,nopuedensuperarlosvaloresdelatabla12.3paradosimgenes
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.
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
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
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
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.
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
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.
109 NuevepxelesenelprocesamientodelamediayochopxelesenPrewittySobel
110 Encasodequelaventanadelaconvolucinseade3x3
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
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.
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
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.
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).
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
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.
FIFO
RAM_rf pxl_out
8
pxl_in dout 8
din
1
metepxl we
contador RAM read first
incr addr
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.
Figura 15.2: Versin del Pac-Man para Atari
Figura 15.1: Videojuego Pac-Man
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.
16 pxeles
Conestasdimensionesylaresolucindelapantallalosmuecossalengrandes,puedesoptarareducirlas
114
celdasa8x8yasinclusopoderhacerellaberintomsgrande.
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.
115 Tambinpuedeshacerinterfazconelteclado
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.
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.
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
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.
118 Siquieres,tambinpuedeshacerlaimagencompletaynorecurriraestostrucosparadibujarlaimagen
especular
119 Realmenteestasmemoriassonmuypequeaseinclusosepuedendefinircomoconstantesenelcdigo
VHDL.Estosimplificaraenormementeelcircuito,peroloestamoshaciendoasparafamiliarizarnosconel
usodelasmemorias.
Esimportantetambinquelaposicininicialdelpacmanseaunaposicinpermitida(sea
unceroenlaROMdellaberinto).
Implementa el circuito y comprueba que el pacman slo se mueve por los pasillos,
comprueba tambinqueentrapor elpasadizoquehayenloslateralesy quesale por el
ladoopuesto.
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.
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.
0 1 2 3
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
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.
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
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).
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.
... ...
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.
cambiar.Perohayquetenerencuentaquecambiosmuyrpidosnosonperceptiblespor
elojo/cerebrohumano.
Oimgenesde16x16enelcasodequelosmantengasdeltamaodelacuadrcula
122
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.
[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
[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