Возникли проблемы с синхронизацией последовательных данных из FPGA в скрипт Python.

У меня есть Spartan 6, который собирает некоторые данные, которые мне нужно отправить по последовательному каналу в скрипт Python, где их можно отобразить на моем ПК.

На самом деле это первый раз, когда я копался в последовательной связи (я не считаю программирование arduinos)

Таким образом, я, по сути, сам указываю формат данных из FPGA, что заставляет меня думать, что я должен легко синхронизировать эту связь, но это кажется немного сложнее, чем я думал.

Это мой текущий подход:

Данные, которые я отправляю, имеют длину 16 бит, и я предположил, что мне нужно отправить стартовые/стоповые биты вручную, поэтому мой последовательный модуль VHDL просто считывает 16-битное значение и объединяется следующим образом:

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

Оттуда счетчик просто переходит от 0 to 17, назначая Txстроку текущему индексуoutput_vector

Так что я не уверен, что мое предположение верно здесь. Нужно ли вручную передавать стартовые и стоповые биты? И как принимающая сторона узнает старт/стоп 1 от любой другой 1 в сигнале данных?

Скорость передачи данных

Счетчик, о котором я упоминал ранее, выполняет цикл со скоростью 195.3125 kHz, поэтому я добавил 16 бит для данных + 2 стартовых/стоповых бита = всего 18 бит.

195312.5 / 18 = 10,850.694444444

Поэтому в моем скрипте Python я установил скорость передачи данных, 10,851поскольку это ближайшее целочисленное значение. Тем не менее, я не понимаю, как принимающая сторона синхронизируется с передающей стороной, поэтому она фактически находится в очереди и получает правильные данные.

Мой скрипт на Python довольно прост:

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))

В конечном итоге мне нужен какой-то способ объединения двух считываемых байтов в одно целое значение, но я еще не совсем понял это. Скрипт получает данные, но я не могу проверить их правильность.

В руководстве пользователя для моей платы FPGA (Digilent Nexys 3) упоминается какая-то Xon/Xoffпередача software flow control, но я действительно понятия не имею, как ее использовать. Я совершенно не понимаю, как синхронизировать это простое последовательное соединение.

Ответы (1)

Проще говоря, вы не передаете действительный серийный номер UART.

Последовательный состоит из одного стартового бита, 7 или 8 битов данных, 1 или 0 битов четности и стопового бита.

Всего это 10 бит. Наиболее распространенное расположение: 1 запуск, 8 данных и 1 остановка.

введите описание изображения здесь

Обратите внимание, что UART находится в «холостом» состоянии — в данном случае ВЫСОКИЙ. Стартовый бит противоположен уровню ожидания, а стоповый бит возвращает вас к этому уровню. Получатель ожидает перехода из состояния ожидания в состояние отсутствия ожидания, чтобы узнать, когда он начинает прием.

Чтобы передать 16 бит данных, вы должны передать их как два отдельных байта. Это будет 1 запуск, 8 данных, 1 остановка, 1 запуск, 8 данных и 1 остановка. Всего 20 бит.

Скорость передачи — это количество символов в секунду, то есть количество битов 1 или 0, а не количество целых пакетов. Таким образом, если вы передаете данные с частотой 195 312,5 Гц, тогда скорость передачи данных будет равна 1 95 312,5.

Конечно, теперь вам нужен способ узнать, какие из ваших байтов являются какими - и теперь вы находитесь в сфере пакетов данных и протоколов более высокого уровня.

Итак, я прочитал, что baud rateэто число symbols/sec. В моем случае, несмотря на то, что каждый из них value8 бит, все равно только 1 символ на бит? Наверное, я думал, что символ означает значение.
Один бит — это один символ, но один символ — это не бит. Символ — это передаваемая 1 или 0, бит — одна из 8 частей порции данных. Таким образом, 8-битная передача составляет 10 символов. Это терминология.
Хорошо спасибо. Надеюсь, это возможно, не углубляясь в более высокие протоколы и пакеты.
В разных системах кодирования бит может состоять из нескольких символов, таких как Манчестерский код, где бит может быть комбинацией символов ВЫСОКИЙ-НИЗКИЙ или МАЛЫЙ-ВЫСОКИЙ.
На самом деле мои выборки данных на самом деле 12-битные, но они передаются как 16-битные значения с моего периферийного устройства SPI с 4 дополнительными 0 с. Таким образом, биты с 0 по 7 — это младшие 8, а с 8 по 11 — старшие 4, а с 12 по 15 — все 0. Как вы думаете, можно ли, используя эту информацию, определить, какие байты объединять?
Итак, вместо того, чтобы разбивать 16 бит на 2x 8-битных значений, вместо этого разделите их на 2x 6-битных значений. Имейте каждую половину в байте, а затем установите старший бит первого отправленного значения. Затем вы можете узнать, какая половина какая, изучив старший бит. Таким образом, значение, которое вы отправите, будет выглядеть как 0b10xxxxxx, 0b00xxxxxx.