Как стать автором
Обновить

Полигон для творчества за 1500 р. Часть 2. Структура платы, 256 UARTов и расширение спектра

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.9K
Всего голосов 31: ↑30 и ↓1+40
Комментарии10

Комментарии 10

Удачная находка, девборда с 4 циклоном и кучей периферии и даже микроконтроллерами.

Но мне кажется, это была не случайность, вы знали, что ищете)

Без сюрпризов не обошлось.) Опыт получился весьма интересный и полезный, а процесс увлекательный.

А ещё через плату познакомился с человеком, который её тоже покупал. Подружились.) И это, пожалуй, самое неожиданное, забавное и приятное в этой истории.

А вот число 170 = 0b1010_1010 терминал принимает неправильно.

А откуда уверенность, что именно осцилл принял правильно, а не терминал?)

Осцилл и UART-приёмник просто не понимают, где именно старт- и стоп- биты, поэтому ставят их рандомно. Тот же паттерн 0.01010101.1 любой приёмник имеет право принять с циклическим сдвигом:
001010101100101010110010101011 или
001010101100101010110010101011 или
001010101100101010110010101011 или
001010101100101010110010101011, и это всё разные цифры. Короче:

Давайте делать паузы в словах... (с)

И не надо мутить воду:

Можно попробовать реализовать UART как кольцевой регистр сдвига

Tx <= uart_data[i]; //отправили 1 бит данных

То, что в коде записано, это селектором называется. Или мультиплексором.

Полноценны UARTовский регистр сдвига в этой задаче занял бы намного больше ресурсов ПЛИС. А так выходит, что каждому паттерну достаточно храниться в одной LUT. Метод весьма хорош.

А откуда уверенность, что именно осцилл принял правильно, а не терминал?)

Чётко знаю, на какой вывод какое число я назначил. В осциллографе можно сдвинуть момент синхронизации, тогда меняется и число.

Осцилл и UART-приёмник просто не понимают, где именно старт- и стоп- биты

Понятное дело. Можно пробовать паузы. Об этом написал.

Идея пришла пришла именно про регистр сдвига. Такой вариант тоже есть.

Да, про мультиплексор вы правы. Спасибо за замечание.

Но если точнее, то у нас регистр с записанным числом+старт/стоп битами (uart_data,8+2 бит). К нему подключены информационные входы мультиплексора. К адресным входам мультиплексора подключается счётчик (i).

Конечно, это не полноценный UART (как приёмопередатчик). Это лишь любопытный эксперимент.

Я больше вот про что:
Ну как-бы изначально цель работы-то была - выяснить распиновку. А с текущим кодом выходит, что группы из 2-4 ног выдают наружу одинаковые паттерны. Цель-то в итоге достигнута?

//с каждым тактом

//Записываем начальное значение регистра

Других значений в uart_data не записывается. Сброса нет, начального значения сигнала uart_data хотя-бы для симулятора - тоже нет. И компилятор такой думает: "А нахера он это сделал? Что он имел в виду? А он ещё и варнинги игнорирует? Тогда пох, сделаю сигнал константой, имею право!".

Нет там регистра, короче. Был бы - появился бы в списке занятых ресурсов в Total registers. А сейчас там чётко:
256 шт. cycled_uart_transmitter.Tx +
8 шт. clk_div_250.count +
4 шт. cycled_uart_transmitter.i +
1 шт. clk_div_250.clk_out = 269

Баланс сошёлся прямо по-бухгалтерски)

Для выяснения распиновки нужно идеально отладить код, чтобы можно было быть уверенным в его верной работе и полагаться на полученные результаты. Пока есть недочёты в виде неоднозначного приёма посылок, конечно, использовать код рано. Но в статье и не предлагается использовать код как есть. Указывается на проблемы неверного приёма посылок, причины и предлагается возможное (и как видится, вполне рабочее) решение: ввести паузы между посылками.

Способ с UART на каждом выводе вполне можно использовать для определения распиновки. На момент проведения этого эксперимента распиновка уже была найдена генерацией частот (описано в Ч1). Но некоторый интерес в проведении эксперимента оставался.

Реализация далека от идеала, но идея ясна и может кому-то помочь.

Хорошо, когда расчёты сходятся.)

Как бы вы записали код, реализующий подобную (или чётко эту) идею?

Нет там регистра, короче. Был бы - появился бы в списке занятых ресурсов в Total registers.

Убедили.) Получается, информационные входы мультиплексора подключены просто к уровням напряжения, соответствующим 0 и 1, а не к выходам регистра (ведь его нет).

Способ с UART на каждом выводе вполне можно использовать для определения распиновки.

На самом деле идея очень крута. Компилируется это всё за секунды, и не нужно специализированное оборудование за $∞ для тестов. Спасибо, буду пользовать.

У меня один раз была похожая задачка - собрать тест для многопроводного кабеля между двумя платами с ПЛИС. Я тогда нагенерил PRBS и тестеров к ним. Про UART не догадался, хотя в загашнике уже имелось всё необходимое.

Рад что, на пользу. Вам спасибо за дельные замечания и обратную связь.)

Под тестерами псевдослучайных последовательностей (ПСП) вы имеете в виду модули, каждый из ктр настроен на приём своей последовательности? Опишите, пожалуйста, подробнее.

У меня как раз есть удобная программка генератор ПСП (М-последовательностей) с настраиваемыми параметрами. Настраиваем, а на выходе код Verilog/VHDL и сама последовательность.

Например
module LFSR8_129(
  input clk,
  output reg [7:0] LFSR = 255
);

wire feedback = LFSR[7];

always @(posedge clk)
begin
  LFSR[0] <= feedback;
  LFSR[1] <= LFSR[0];
  LFSR[2] <= LFSR[1];
  LFSR[3] <= LFSR[2] ^ feedback;
  LFSR[4] <= LFSR[3];
  LFSR[5] <= LFSR[4] ^ feedback;
  LFSR[6] <= LFSR[5];
  LFSR[7] <= LFSR[6];
end
endmodule

Называется lfsr testbench 1.3

Смотрю на этот код и вспоминаю, что у меня были проблемы как записать начальное значение для ЮАРТов, чтобы это было удобно для последующей передачи параметра (числа от 0 до 255) в цикле "штамповки" экземпляров передатчика. Пробовал разные варианты. В итоге заработал тот, что в статье. Работает и хорошо.) Менять не стал.

Мне кажется, что вариант с делением частоты и получением разных частот даже проще. Тоже мог сгодиться для проверки кабеля. Разве что частот поменьше выходит (в Ч1 использовал 22 разных). А Юартов гораздо больше можно сделать.

Но есть ещё более интересный способ. Мне кажется, он был бы значительно проще. Подошёл бы для выяснения разводки шариковых корпусов, для проверки кабеля и вообще много для чего ещё. Надеюсь, напишу про это как-нибудь.

Под тестерами псевдослучайных последовательностей (ПСП) вы имеете в виду модули, каждый из ктр настроен на приём своей последовательности? Опишите, пожалуйста, подробнее.

Да, как раз через те самые LFSR. Схема скремблер-дескремблер. Если на вход скремблера подать "1", то при отсутствии ошибок на выходе дескремблера тоже будет "1".

"Полином", который задаёт схему скремблирования - это просто побитовое представление мест в LFSR, где установлен XOR. Поэтому модуль со своим полиномом генерится автоматически в коде, без использования сторонних программ.

Оставалось только сделать список "хороших" полиномов. И в электронной таблице сгенерить текстовый файл распиновки. Это всё автоматизируется.

Кстати, можно было так и реализовать регистр сдвига, как в примере для ПСП. Только убрать лишние XOR.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий