У нас уже было несколько проектов для платы Марсоход, когда мы подключали ее к ПК. Это были интерфейсы USB, PS/2, Ethernet. Теперь я подумал: "А почему бы не подключить нашу плату по последовательному порту RS232?".
Последовательный интерфейс, конечно, довольно старый и довольно примитивный, но, как ни странно, не собирается уходить со сцены. Даже когда настольные ПК и ноутбуки стали выпускаться без разъемов последовательных портов тут же появились в продаже шнуры USB-to-Serial. Они по прежнему позволяют подключать устройства по последовательному интерфейсу.
В чем же такая привлекательность этого интерфейса? Главные преимущества - это простота реализации в аппаратуре и простота программирования. Даже повсеместный USB несомненно проигрывает по этим критериям.
Итак, мы решили подключить плату Марсоход к персональному компьютеру по последовательному интерфейсу. Что нам нужно знать для этого?
1. Сигналы последовательного порта.
Давайте рассмотрим сигналы 9-ти контактного разъема последовательного порта, того, что на материнской плате или в шнуре USB-to-Serial.

Как видите на этой картинке - сигналов довольно много. Когда-то последовательный интерфейс использовался для подключения модемов - устройств передачи данных через телефонные линии. Поэтому тут есть например сигнал RI, Ring Indicator - сигнал о входящем телефонном звонке. Другие сигналы, такие как RTS/CTS позволяли управлять потоками данных, разрешать или запрещать передачу.
Для реализации простейшей передачи нам будут нужны всего 3 провода: Земля, TX (передача от ПК) и RX (ПК принимает данные по нему).
2. Преобразование уровней.
К сожалению и тут не обходится без ложки дегтя. Уровни сигналов в последовательном интерфейсе RS232 это +12В и -12В относительно Земли. Причем +12В это логический ноль, а -12В это логическая единица. Понятно, что подключать такие сигналы напрямую к ПЛИС платы Марсоход "не желательно". Существует довольно много схем преобразования уровней, но пожалуй самые простые те, которые используют специализированные микросхемы. Их преимущество в том, что они требуют только одного напряжения питания +5В.
Я использовал первую микросхему, что попалась мне по руку HIN202. описание на эту микросхему можно взять здесь
.Это не единственная микросхема такого рода. Есть еще MAX232 (https://ru.wikipedia.org/wiki/Max232) или SP230 и многие другие. Микросхемы эти в общем похожи друг на друга и зачастую имеют одинаковое расположение выводов и похожие схемы включения:

3. Изготовление преобразователя уровней для платы Марсоход.
Я изготовил преобразователь уровня, который подключается к плате через ее разъем Right motor. Схема преобразователя уровней вот такая:

Я использовал SMD конденсаторы 1Мф - они нарисованы синими прямоугольничками.
А вот несколько фото моей платы:

Вот так подключаем к плате:

4. Протокол передачи данных.
При последовательной передаче по RS232 данные передаются очень просто. В исходном состоянии линия находится в логической единице. При передаче байта сперва идет старт бит - ноль, затем 8 бит данных (младшими битами вперед), затем бит четности и стоп бит - это единица.
Контроллер последовательного приемопередатчика можно программировать так, что бит четности не передается. Тогда еще проще: старт бит, 8 бит данных и стоп бит.

После этой последовательности можно посылать следующий байт. Скорость передачи может программироваться. Стандартные значения скорости передачи, например 9600, 19200, 38400 или 115200 бит в секунду.
5. Проект для платы Марсоход.
Теперь, когда преобразователь уровней сигналов у нас уже есть, нужно заняться самим проектом для ПЛИС. Я написал простейший приемопередатчик ня языке Verilog. Его исходный текст вот здесь. Прием и передача осуществляется на скорости 38400 бит/секунду без бита четности.
Ну а весь проект для платы Марсоход можно взять здесь:
Этот проект делает следующее:
- принимает байты и показывает последний принятый байт на светодиодах платы;
- при нажатии на кнопочки платы посылает код 0x30+N, где N четырехбитный код кнопочек платы.
6. Испытание.
Подключаю плату Марсоход через преобразователь уровней и шнур USB-to_Serial.

В диспетчере устройств ноутбука смотрим номер порта, назначенный моему шнуру USB-to-Serial. Вижу, что у меня COM6.

Подаем питание на плату Марсоход:

Запускаем программу HyperTerminal (или любую другую). Настраиваем ее на скорость 38400, без бита четности и без аппаратного управления.
Нажимая кнопки на плате видим как появляются цифры в окне терминала. Когда печатаем в окне терминала - загораются светодиоды платы.

Там на фото плис питается от аккумулятора. Нет там никаких 5 вольт.
в проекте модуль верхнего уровня - это схема max2.bdf. На ней используются два верилог модуля key_poll и serial
verilog не похож на другие языки тем, что в нем возможно описание одновременных событий. Почитайте про неблокирующее присвоение marsohod.org/.../... Строки кода могут выполняться не последовательно а как бы параллельно
Зачем в формировании сигнала send используется выражение prev_key (не равно) keyn, если чуть выше в блоке if при проверке шины на "свободно/занят о" и так выполняется присваивание?
сигнал отправки send это не нажатая кнопка, а момент, когда состояния кнопок поменялись.
По каждому клоку keyn записывается в prev_key вот так: prev_key
send
send
нет нужен еще третий провод - земля.
always @(posedge clk5 or posedge reset)
if(reset)
prev_key
Выходы посаженные на землю не нужны.
Просто проект переделывался из другого ("почти пустого проекта"), где эти выходы были. Вот их и посадили на землю. Можете их удалить.
Те выходы которые объединены по 10 - это чтобы сделать один мощный сигнал - к нему в других проектах моторы подключались. Они, эти выходы и на плате объединены для этих же целей.
разные партии ПЛИС к сожалению имеют разную частоту встроенного генератора, от этого и проблема.
5000000/38400 = 130 ,а parameter RCONST = 128;
В таком варианте - на прием модуль не работал. Исправил переменную на 130 и все заработало.
???
скорее всего можно
Неполярные керамические на 1мф.