Frecuencia de muestreo del receptor UART

3

Estoy intentando crear un receptor UART en Verilog para mi FPGA. Seguí esta guía enlace

De acuerdo con esto, la práctica estándar para la comunicación asíncrona es sobre-muestrear la señal a 16 veces la tasa de BAUD. Esto tiene sentido para mí, ya que tendría que hacer esto para detectar la primera gota rápidamente y sincronizar con el reloj de transmisión.

Lo que me pregunto es por qué no solo muestrear a la misma frecuencia que el reloj de mi FPGA, que es mucho más rápido que 16 veces el BAUD (mi reloj es de 100 MHz). ¿Hay algún daño en hacer esto? Sé que probablemente solo consumirá más energía, pero ¿funcionaría o hay algo que me falta?

    
pregunta chasep255

3 respuestas

2

He probado 8 veces en un trabajo y estaba bien, por lo que no hay una regla que establezca que 16 es el número mágico, por lo que un muestreo más alto no es un problema, aparte de manejar números más grandes en hardware. Aquí hay una idea contraria de 16x: -

Desdeelbordedescendentedelbitdeinicio,"encuentra" el "medio" del bit de inicio contando hasta 8 y luego, cada conteo de 16 "muestrea" los datos recibidos de UART para recrear el byte (o bytes) transmitido . Claramente, si tuviera un contador de 32x, obtendría un poco más de precisión para determinar el punto central de la broca y contar a una velocidad mayor funcionará, pero los números aumentan y el consumo de energía aumenta.

    
respondido por el Andy aka
2

Para un receptor UART muy simple, realmente no importa tanto hacia dónde vayas.

Sin embargo, muchos diseños de UART deben ser robustos y flexibles, y eso lleva al diseño a crear una señal de reloj de 16x (o habilitación de reloj).

Por su robustez, es ventajoso muestrear cada bit varias veces cerca del centro del bit y luego realizar una votación entre las múltiples muestras para minimizar los efectos del ruido. Por ejemplo, es común tomar muestras en 7/16, 8/16 y 9/16 a través del bit y tomar el valor que aparezca con mayor frecuencia. Si intentaste tomar tres muestras adyacentes a 100 MHz, es casi seguro que tienen el mismo valor, incluso si son un problema técnico, por lo que debes separarlas más.

Para mayor flexibilidad, por ejemplo, la necesidad de admitir diferentes velocidades de transmisión posibles, desea tener un solo parámetro que controle la velocidad de transmisión. Si tiene varios retardos internos diferentes que dependen de la velocidad en baudios (es decir, 1 período de bits, 1/2 período de bits, 7/16 bits, etc.), la lógica se vuelve más compleja que si tiene una máquina de estados que se ejecuta en, digamos, 1/16 el período de bits. En ese caso, todos los diferentes retrasos se escalan con un solo parámetro automáticamente.

    
respondido por el Dave Tweed
1

Debido a que UART es asíncrono, solo se puede muestrear mediante muestreo excesivo.

Hay un límite inferior para el sobremuestreo definido por el posible error cometido al faltar el borde descendente del bit de inicio. Por lo tanto, mediante un muestreo excesivo de 8x, un posible desajuste del borde descendente provoca un máx. error del 12,5%. 16x sobre el muestreo reduce el error al 6%.

El límite superior está limitado por su inversión en recursos de hardware. Nadie quiere usar un contador de 32 bits :).

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas