Найти тему
IT. Как это работает?

RS232. Прием данных на ПЛИС

Оглавление

Видео в конце...

Как мы ранее выяснили, с передачей данных при помощи асинхронного последовательного интерфейса проблем нет. Посмотрим как обстоят дела с приемом данных. На этот раз разработаем приемный модуль на базе программируемой логической интегральной схемы (ПЛИС).

Структура сигнала

Всю основную подготовительную работу мы сделали ранее, но совсем немного подробностей не помешают. Нам предстоит принять сигнал, имеющий конкретную структуру.

Структура фрейма
Структура фрейма

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

Автомат состояний

В начальном состоянии считаем, что фрейм еще не пришел и приемник находится в ожидании Idle. Пока на линии данных единица — состояние ожидания продолжается.

Состояния автомата
Состояния автомата

Как только обнаружен переход линии данных в нулевое состояние (состояние StartBit), то приводится в действие счетчик, задачей которого является подождать центральную часть бита.

Если стартовый бит оказался нулем, то после того как досчитаем до конца стартового бита, будет переход в состояние приема информационных бит DataBit. Но если в этом месте оказалась единица, то это значит произошла ошибка. Необходимо вернуться в состояние ожидания Idle.

При приеме информационных бит никакой проверки корректности не происходит, однако происходит проверка на предмет того сколько бит уже пришло. Если их уже столько как было предварительно оговорено, то будет переход на прием стоп бита (состояние StopBit). Каждый информационный бит считывается в своем центре. За это отвечает счетчик импульсов кварцевого генератора, установленного на отладочном комплекте.

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

Пишем код

Приступаем к написанию кода. Входами и выходами модуля являются тактовый сигнал, линия данных интерфейса передачи данных, принятый байт, линия готовности байта и сигнал ошибки. Перечисляем все состояния автомата. Ожидание, старт бит, бит данных, стоп бит. Делитель счетчика как и раньше 5208. Это позволит получить скорость передачи данных 9600 бит в секунду.

Внутренними регистрами модуля являются состояния. Текущее state и следующее nextState. Также это счетчик бит, счетчик импульсов кварцевого генератора и регистр где собирается принятый байт. Указываем начальные состояния регистров.

По переднему фронту тактового сигнала присваиваем текущему состоянию следующее. В состоянии ожидания сбрасываем регистр принятого байта и другие регистры. Если на входной линии ноль, то следующим состоянием будет стартовый бит.

В состоянии стартового бита считаем импульсы. Если их насчитали половинку от всей длительности бита, то проверяем состояние линии данных. Если ноль, то ошибки нет, иначе выставляем ошибку и переходим в состояние ожидания. А если досчитали до конца бита, то сбросим счетчик и перейдем в состояние приема информационных бит.

В состоянии приема бит информации, также как и раньше, считаем до центра бита. В регистр принятого байта укладываем каждый считанный бит. Не забываем считать эти биты. Как только доходим до конца бита, то сбрасываем счетчик и проверяем сколько бит уже пришло. Если еще не 8, то остаемся в этом же состоянии, иначе переходим к приему стоп бита.

В состоянии приема стоп бита в самом его центре проверим состояние входной линии. Если оно единичное, то никакой ошибки нет, выставляем на выход регистр принятого байта, также выставляем сигнал о его готовности. Но если стоп бит не единица, то сигнализируем об ошибке и никакой байт не выставляем на выход. Просто переходим в состояние ожидания.

Моделируем работу приемника

Сразу создадим модуль для теста приемника. Описываем провода и регистры для связи с разработанным модулем. Внутри модуля теста модуль передатчика, входы и выходы которого соединяем с проводами и регистрами теста. Создаем бесконечный тактовый сигнал. Описываем начальные состояния регистров. Отдельное внимание тестовому сигналу на линии данных. Так как биты данных приходят довольно медленно в сравнении с тактирующими импульсами, то длительности состояний на входной линии будут довольно большими. Этот момент стоит тщательно подсчитать с калькулятором в руке.

Посмотрим результаты моделирования.

Результат моделирования приемника
Результат моделирования приемника

На входной информационной линии rx появился стартовый бит, что сразу перевело модуль в нужное состояние. Он как положено нулевой, поэтому следующее состояние это прием бит информации. Сначала ноль, потом единицы. Каждый входящий бит увеличивает счетчик bitCount на единицу. Так до самого стоп бита. В нем на выход модуля rData выставляется принятый байт. Он сопровождается сигналом о готовности dataReady. Вроде все как надо.

Проверить работу модуля на реальном железе сможем как только напишем программу отправки данных с компьютера. Постараемся избавиться от необходимости обращения к интерфейсу прикладных приложений Windows. А пока подготовим наш приемник к испытаниям.

Подготовка к испытаниям

Завернем разработанный модуль в удобную оболочку. Оставим только самые необходимые линии и не забудем о вспомогательных сигналах, необходимых микросхемам индикаторов на отладочном комплекте. Для корректной индикации принятого байта нужно будет инвертировать его содержимое.

Вписываем передатчик в модуль обертку и соединяем его входы и выходы с сигналами обертки. Часть выходов при этом никак не задействуем. Аппаратная часть стенда теперь полностью готова к эксперименту. В следующем выпуске он будет завершен. Делаем ставки, будет ли дребезг на информационной линии? Пригодится ли нам разработанный ранее модуль антидребезга?

Исходный код

Видео-обзор с канала YouTube


Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.