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.