Respuesta corta: podría ser posible, pero hay algún que otro "pero":
Los transmisores TMDS que se necesitan para la serialización y salida a altísima velocidad, y que hay integrados en la Spartan 6, están en los bancos 0 y 2. El banco 0 cubre desde el pin 111 a 144, y el banco 2 desde el pin 37 al 72. Nosotros, el conector de expansión lo tenemos cubriendo los pines desde el 11 al 35, y desde el 40 al 58 (excepto el pin 55 que es el reloj general). Esto nos da un tottal de 6 pares diferenciales para usar: L14, L31, L48, L49, L62, y L64. Para HDMI necesitamos 4 pares, así que de momento vamos bien.
El recuadro grande a la derecha lo pone en hardware la Spartan 6. El recuadro de la izquierda (Fabric) es lo que tenemos que poner nosotros en código.
El primer problema viene porque los pines que conforman cada par diferencial, y que van al conector de expansión, no se han rutado como corresponde a un par diferencial. Esto es: las dos pistas del par deben ir una junto a otra (esto más o menos se cumple según qué par se considere), y ambas han de ser de la misma longitud de extremo a extremo (esto definitivamente no se cumple).
Por ejemplo, un par en el que se cumple bien lo primero pero no lo segundo es el par L64, resaltado a continuación:
En el siguiente par, que serían las dos pistas a la izquierda de éstas dos, no se cumple ni lo primero ni lo segundo.
El otro pero viene del hecho de que esas señales van al conector de expansión, y serían recibidas por otro conector, que las llevaría a otro circuito impreso con el addon HDMI. Todo esto hace que esas señales sufran constantes cambios en el medio físico lo que provoca todo tipo de reflexiones.
Con todo, hay algo de esperanza: las señales que circularán por esas pistas tienen una frecuencia máxima de 280MHz. Es una frecuencia alta, sí, pero no estamos hablando de los 1600MHz que se necesitan para llevar resoluciones HD a un monitor. En concreto, 280MHz viene de usar un reloj de pixel de 28MHz, que es lo más cercano a los 27MHz de reloj de pixel de una de las resoluciones estándar del HDMI. El reloj de pixel se multiplica por 10 ya que cada dato que se envía a un canal TMDS es de 10 bits, y su transmisión debe durar lo mismo que dura un pixel, así que si un pixel debe durar el periodo correspondiente a 28MHz, los 10 bits deben transmitirse en el periodo correspondiente a 28MHz también, lo que significa que cada bit de datos se debe transmitir en el periodo correspondiente a 280MHz.
Los cálculos vienen del autor del Pipistrelo ZX, que implementó un ZX Spectrum usando la descripción de la ULA de Opencores. Respecto a la frecuencia HDMI, él comentaba lo siguiente:
http://joco.homeserver.hu/zxpipi/
A 280MHz no tengo idea de cuán graves puedan ser las reflexiones provocadas por los cambios de medio en la placa. No tengo experiencia en ello. Tampoco soy capaz de calcular exactamente el retardo de propagación en un medio como un circuito impreso a esas frecuencias, por lo que no puedo saber qué máxima diferencia de longitud entre pistas del par diferencial es admisible antes de que se produzcan errores al traducir una señal diferencial a otra en modo común.Jozsef Laszlo escribió:Well, old spectrum funs know, that timing is really important for special effects. Unfortunately, the original spectrum only had PAL composite video output (or U-V-Y), and it used 7MHz as pixel clock. It isn’t compatible with any HDMI resolution or frame rate, but close enough to one, that is 720x576@50Hz. According to the standard, this one uses 27MHz pixel clock. Which sucks, because we’d need something “compatible” with 7MHz. I took the definitions for 27MHz, and calculated everything for 28MHz (because 4*7=28, so that would be a perfect clock). I have found that HDMI TVs can handle 28MHz without any issue. (There is also a slight difference in vertical timing, because I produce 624 lines instead of 625, but the TV is happy with it, too.)
Parto de un dato muy general, que es el retardo de progagación de una señal eléctrica en un cable de cobre, y que vienen a ser unos 200.000 km/s (2/3 partes de la velocidad de la luz). A 280 MHz, el periodo de reloj es de 3,571428 ns. Tomando como aceptable un par diferencial en donde las dos señales estén retrasadas una respecto de la otra un máximo de tiempo igual a medio periodo de reloj, esto es, 1,7857142 ns . Durante ese tiempo y a la velocidad de propagación indicada, una señal tendría tiempo de recorrer 35 centímetros. Si todos estos cálculos son correctos, se podría dar por bueno un par diferencial en donde la diferencia de longitud entre sus dos componentes no exceda de 35 cm, lo cual en la placa del ZX-Uno es trivial conseguirlo. Pero claro, repito que no tengo experiencia en este tipo de cosas y los cálculos indicados podrían ser completamente falsos.
Con todo, las diferencias de longitud entre la dos señales de un par se pueden compensar en la placa addon, pero mi principal temor son las reflexiones causadas por los cambios de medio al pasar de una placa a otra. Claro que también pienso que incluso en un sistema HDMI en el que todo se haya medido al milímeto no puedes evitar tener cambios de medio de la pista al conector, del conector al cable, del cable al otro conector, del otro conector a otra pista, etc.
Creo que merece la pena coger y sacar una partida de 20 (10x2) pequeñas plaquitas en donde los chicos de DirtyBoards, buscar una partida barata de conectores hembra HDMI para PCB, diseñar la placa y ver qué pasa. No creo que sea un gasto tremendo de dinero.