Tiene problemas para sincronizar datos en serie de FPGA a script de python

1

Tengo un Spartan 6 que está recolectando algunos datos que necesito enviar en serie a un script de Python donde se pueden mostrar en mi PC.

Esta es en realidad la primera vez que entro en comunicaciones en serie (no cuento con los arduinos de programación)

Básicamente, estoy especificando el formato de datos del FPGA, lo que me hace pensar que debería poder sincronizar fácilmente esta comunicación, pero parece un poco más difícil de lo que pensaba.

Este es mi enfoque actual:

Los datos que estoy enviando tienen una longitud de 16 bits, y asumí que necesitaba enviar los bits de inicio / parada manualmente, por lo que mi módulo VHDL en serie solo lee el valor de 16 bits y concatena de esta manera:

output_vector <= '1' & din & '1'

A partir de ahí, un contador simplemente realiza un bucle desde 0 to 17 , asignando la línea Tx al índice actual de output_vector

Así que no estoy seguro de si mi suposición es correcta aquí. ¿Los bits de inicio y parada deben transmitirse manualmente de esta manera? ¿Y cómo sabe el extremo receptor un inicio / parada 1 de cualquier otro 1 en la señal de datos?

Velocidad de transmisión

El contador que mencioné anteriormente se desplaza a una tasa de 195.3125 kHz , así que agregué 16 bits para los datos + 2 bits de inicio / parada = 18 bits en total.

195312.5 / 18 = 10,850.694444444

Entonces, en mi script de python, establezco la velocidad en baudios a 10,851 ya que es el valor entero más cercano. Aun así, no entiendo cómo el extremo receptor se sincroniza con el lado de transmisión, por lo que está en línea y obtiene los datos correctos.

Mi script en python es bastante simple:

import serial

def convert_to_ascii(text):
    return " ".join(str(ord(char)) for char in text)

ser = serial.Serial(12)
ser.baudrate = 10851

print ser.name


while(True):
    data = ser.read(2)

    print(convert_to_ascii(data))

En última instancia, necesito alguna forma de combinar los 2 bytes que se leen en un solo valor entero, pero tampoco lo he averiguado. El script está recibiendo datos, pero no puedo verificar que sea correcto.

También se menciona algún tipo de transmisión Xon/Xoff relacionada con software flow control en la guía del usuario de mi placa FPGA (Digilent Nexys 3), pero realmente no tengo idea de cómo usarla. Estoy totalmente perdido aquí sobre cómo sincronizar esta simple conexión serial.

    
pregunta krb686

1 respuesta

4

En pocas palabras, no está transmitiendo una serie UART válida.

La serie consta de un bit de inicio, 7 u 8 bits de datos, 1 o 0 bits de paridad y un bit de parada.

En total son 10 bits. El arreglo más común de eso es 1 inicio, 8 datos y 1 parada.

TengaencuentaqueelUARTtieneunestado"inactivo": ALTO en este caso. El bit de inicio es el opuesto al nivel inactivo, y el bit de parada lo regresa a ese nivel. El receptor espera la transición de inactivo a inactivo para saber cuándo comienza a recibir.

Para transmitir 16 bits de datos, debe transmitirlos como dos bytes separados. Eso sería 1 inicio, 8 datos, 1 parada, 1 inicio, 8 datos y 1 parada. Eso es un total de 20 bits.

La velocidad en baudios es el número de símbolos por segundo, es decir, el número de 1 o 0 bits, no el número de paquetes completos. Entonces, si está cambiando los datos a 195312.5Hz, entonces la velocidad en baudios es 195312.5

Por supuesto, ahora necesita una forma de saber cuáles de sus bytes son cuáles, y ahora está en el reino de los paquetes de datos y los protocolos de nivel superior.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas