Hola de nuevo!
Antes de comenzar agradece a Jesús y Obijuan por probar los esquemas y tener la amabilidad de poner el código en otro lenguaje de programación (Python en este caso), de esta manera alcanzamos a más gente! A Jesús comentarle que la idea de poder tener la opción de colorear las pistas en icestudio, por mi parte me parece una idea genial; es otra manera de visualizar un esquema sin necesidad de nodos de unión. A mí personalmente me gusta las imágenes con colores porque las encuentro más pedagógicas, cercana y le quita ese aire de solemnidad o seriedad a los esquemas: La electrónica es para divertirse (jugar) y mola un montón!
Os presento otra manera y mucho más sencilla y comprensible de poder recibir datos con nuestra FPGA. He hecho innumerables pruebas buscando ver por dónde peta, pero hasta el momento todo los ICEs que he adjuntado funcionan de maravilla. También comentaré las limitaciones y pormenores que me he encontrado. Para mí es muy importante detallarlo todo y que si alguien ve alguna anomalía que yo no haya percibido lo comente sin tapujos. Al fin y al cabo la electricidad y la electrónica es una rama de la física y como tal hemos de estar seguros desde qué punto hasta que otro punto podemos dar por bueno algo.
Aunque he puesto muchos ICEs con distintas velocidades (9600, 115200, 230400, 460800, 921600 y 12000000) exceptuando el último, todos los esquemas son exactamente iguales y lo único que cambia es el valor del prescaler.

Lo que cambia con respecto a anteriores esquemas, es que en este no me baso en procurar que la señal de clock (luego lo verás con más detalles) tenga que caer obligatoriamente en medio de la señal que entra por TX, sino que ahora uso otra filosofía y es que esa señal de clock esté siempre fija en el mismo lugar y siempre comience con un flaco ascendente. Esto se consigue inyectando la señal de 12MHz de forma indirecta, en el sentido de que una puerta AND (izquierda) sea la que permita el paso o no de esa señal. Como ya se explicó en un anterior post, un DFFcpn (flip-flop tipo D con entrada de clock negada) es el detector de entrada de datos. Justo al bajar TX pone a '1' la 'q' del DFFcpn y se mantendrá así hasta que hayan pasado todos los datos al registro de desplazamiento, es decir, 10 pulsos de clock; el contador (counter_4bits) se encarga de resetear dicho flip-flop para volver a ponerlo en estado de alerta para el siguiente paquete de bits que entre. De hecho ese flip-flop es el que permite la entrada de pulsos. Si no estuviera recibiendo datos, el flip-flop "cortaría" la señal de entrada al clock del prescaler. Esto es todo el secreto que tiene el circuito. ¿¿¿A qué es super mega sencillo??? Lo demás ya lo conocerás de anteriores esquemas, y es la obligación de contar esos pulsos para tenerlo todo sincronizado. La puerta NOT que ves a la entrada del clock del registro de desplazamiento sirve para invertir la señal que le llega y lo que se consigue es que haya un espacio entre ese clock y la señal TX antes de guardar ese dato en el registro de desplazamiento.
Las imágenes valen más que mil palabras. Ahora veamos en acción, desde un osciloscopio, cómo se valida la información dentro del registro de desplazamiento (son las entradas a éste). Recuerda que siempre, siempre, siempre verás que la señal de clock (y siempre, siempre, siempre es flaco de subida) está después del cambio (o no) de la señal TX. Voy a poner todas las pruebas que he hecho y más abajo explico por qué no funciona con todas las frecuencias pero sí con estas que veremos ahora.
En esta primera, explica gráficamente detalles del funcionamiento, en las siguientes lo omito porque era mucho curro y es información redundante. Todas las imágenes representa, para mejor comprensión y sencillez, el número 170.
A 9600 baudios.

Observa que en todas las imágenes el flaco de subida del clock (en verde) está después de la señal TX (la que entra en el registro de desplazamiento, "Din", en amarillo).
A 115200 baudios.

Las imágenes que vienen a continuación se van poniendo tétricas... En realidad son ondas perfectamente cuadradas, pero mi osciloscopio (USB) es de gama baja y los cables para tomar las señales tienen efecto capacitivo, a mayor frecuencia, más terrorífica se ponen las ondas. Pero eso no es del todo malo, pega con la fecha en las que estamos; Halloween es dentro de pocos días!
A 230400 baudios.

A 460800 baudios.

A 921600 baudios.

Hasta aquí todo perfecto, pero hay baudios que podríamos considerar estándar y que no funciona. Pongo una imagen de un pequeño programa (está adjunto en este post) donde verás en rojo esas frecuencias con las que no funciona.

Como puedes apreciar en la imagen, las opciones de color amarillo funcionan perfecto, pero las que son
rojas no funcionan. Me hice ese programa (en
FreeBASIC) con todo detallado para además de enviar datos en forma de serie de números (0..255, repetidamente), que también tuviera la información, de por ejemplo, el valor que ha de ir en el prescaler en el esquema. La razón de por qué no funciona a esas otras frecuencias (en
rojo) es sólo una opinión mía y que si alguien tiene más conocimientos, por favor, que me corrija. Pienso que se trata, como en un anterior post comenté, de que es necesario de que las frecuencias sean lo más "enteras" posibles (en el sentido de los decimales). A esas frecuencias no se corresponde con la que puede dar el prescaler y no puede ir sincronizada, porque es más ancha o estrecha de lo normal. Y esto se hace más patente en frecuencias altas, o dicho de otra manera, a medida de que nos acercamos a los 12MHz.
Pero... ¿¿¿¿cómo es posible que haya puesto un código que permita enviar información a 12 millones de baudios???? Pues... yo soy el primer sorprendido!!! Tiene otro esquema, no es como los anteriores. He de advertir que en este caso no puedo garantizar el perfecto funcionamiento. Dentro de las pruebas que le he realizado, en este caso ha funcionado todo bien, con excepción de una cosa extraña, y me explico: Al ejecutar mi programa hace bien la cuenta. Del programa puedes salir de 3 maneras; dándole a escape, enter (o return) y a la X de la ventana (no le des ahí pensando que te llevará a páginas eróticas!). Pues si salgo del programa con enter o escape y vuelvo a ejecutar el programa, todo funciona correctamente. Pero si le doy a la X y vuelvo a ejecutar el programa, entonces falla un bit (el más bajo no se enciende) como si se hubiese desplazado los número y comenzase a contar a partir del segundo led. Esto tiene una solución muy sencilla a través de programación y hacer que cierre bien el programa, pero lo he dejado como curiosidad de lo que sucede, porque en los otras frecuencias (en una imagen anterior en color amarillo) con esas no importa lo que hagas que siempre va bien.
Es un pasote poder alcanzar esas velocidades porque permite hacer experimentos muy interesantes en tiempo real. Si no me equivoco (y por favor, corregidme si no es cierto) 12000000/10=1200000 es decir, 1,2 mega bytes por segundo. El número 10 es el paquetes de información, es decir, los 8 bits de datos, más el bit de inicio, más el bit de stop, todo eso junto es lo que llamamos baudio (en este caso 1 baudio = 10bits, si tuviera además un bit de paridad entonces sería 11bits para un baudio). Y aunque fuese un poquito menos no dejaría de ser menos interesante! En cuanto envíe el presente post probaré si es posible enviar (al menos con ordenadores modernos) a cualquier baud rate no estándar, porque da la sensación de que se puede hacer.
Antes de terminar, comentar que hubo un chico hace unos meses que subió a GitHub una historia que a mí me sobrepasa y todavía no he visto su trabajo. Pero comentaba de cómo aumentar los 12MHz a 275MHz si mal no recuerdo. Su intención era fabricarse una tarjeta de adquisición de datos para programarse un osciloscopio. Todo lo que digo es impreciso porque lo leí hace tiempo (no mucho), cuando todavía me peleaba con las
configuraciones de apio para hacer funcionar icestudio. Dejo el enlace de lo que comentaba sobre
over clocking a los 12MHz a través de unos PLLs.
Saludos!