У меня есть 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
, но я действительно понятия не имею, как ее использовать. Я совершенно не понимаю, как синхронизировать это простое последовательное соединение.
Проще говоря, вы не передаете действительный серийный номер 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.
Конечно, теперь вам нужен способ узнать, какие из ваших байтов являются какими - и теперь вы находитесь в сфере пакетов данных и протоколов более высокого уровня.
686 крб
baud rate
это числоsymbols/sec
. В моем случае, несмотря на то, что каждый из нихvalue
8 бит, все равно только 1 символ на бит? Наверное, я думал, что символ означает значение.Маженко
686 крб
Маженко
686 крб
Маженко
686 крб