Видео в конце...
Всем привет! В прошлом выпуске мы начали разбирать довольно интересную проблему, касающуюся соединения шин разной разрядности между собой. Напомню в общих чертах, что довольно большая доля задач, стоящих перед разработчиком аппаратной части информационных систем сводится к взаимным соединениям уже давно разработанных модулей. Далеко не всегда разрядность шин входов и выходов модулей будет совпадать. В рассматриваемом случае модули контроллера интерфейса передачи данных RS-232 работают 8-битными данными, система цифровой обработки сигнала (пока что в виде одного интегратора) работает с 16-битными словами. Пришло время собрать все прошлые мысли в одно целое.
Структура проекта
На данном этапе мы пока не рассматриваем архитектурные вопросы. Немного подкачаем мышцы (мозговые) и только тогда задумаемся о красотах решения и в чем эти красоты вообще выражаются. Сейчас главное - чтобы все заработало и для этого мы стараемся контролировать каждую мелочь. А мелочь самая ответственная - это как не заработать гонку сигналов (signal race).
Приемная часть
Условно нашу простейшую систему цифровой обработки сигнала (ЦОС) можно разбить на приемную часть, саму часть ЦОС и передающую часть.
Приемная часть ЦОС состоит из приемника байт с интерфейса передачи данных RS-232 (RS232Receiver), однобитного счетчика из сумматора Add, регистров cntS и cntR. Регистра два потому как формирование 16-битного слова и отправка его на обработку происходят с разностью во времени в полтакта.
Счет в разных регистрах происходит одновременно, но с разностью фаз в полтакта. Это обход стороной той самой гонки сигналов.
В регистре sampleLow запоминается младший байт слова, старший байт соединяется с младшим в 16-битную шину. Запись в младшего байта в регистр и самого 16-битного слова в интегратор ведутся по управляющим сигналам, генерирующимся в вентилях LowByteWrite и ModuleWork соответственно.
Модуль ЦОС в лице интегратора рассматривался в этой статье.
Передающая часть
Теперь сосредоточимся на том, что происходит после модуля ЦОС.
Интегратор (integrator) выставляет на свой выход y 16-битное число, которое для передачи требуется разбить на два 8-битных. Это делается при помощи мультиплексора. Все те же 1-битные счетчики управляют тем, какую часть слова подать на модуль отправки данных (RS232Send) по интерфейсу RS-232.
Да, тут важный момент в том как именно работает модуль отправки. В этом знании нет абсолютно никакой науки. Как работает модуль это знание документации. А модуль этот самописный и все подробности в этой статье. При подаче на вход модуля высокого уровня на линии dataReady начинается считывание бит, выставленных на шине данных data. Если состояние бит в шине изменится, то модуль его и отправляет. Для того чтобы во время отправки байта можно было спокойно манипулировать мультиплексором, добавлен еще один регистр для временного хранения отправляемого байта (delay).
Что получилось?
Для начала, убедимся, что приемная часть отрабатывает штатно. Подаем на вход приемного модуля последовательно и побайтно число 0x0001. Это 1 в 16-битном слове. Эта единица доставляется ко входу x интегратора, что приводит к росту на его выходе y.
Теперь посмотрим на этот процесс поближе:
Приемник байт с последовательного интерфейса по очереди выставляет на свой выход 0х01 и 0х00, сопровождает каждый байт сигналом о готовности данных dataReady. В период подготовки данных (слово пришло не полностью) на входе интегратора неверное значение, однако, и управляющий сигнал интегратора clk имеет низкий уровень. Это означает, что некорректное слово не пройдет в систему ЦОС.
Когда 16-битное слово готово, то возрастающий фронт clk отправляет его на обработку.
Что делается у модуля отправки данных? С выхода интегратора y 16-битное слово делится на 2 слова по 8 бит при помощи мультиплексора, которые записываются на временное хранение. Оттуда байты попадают на вход модуля отправки, где превращаются во фреймы, снабженные старт и стоп битами. Эти фреймы передаются через линию tx.
Исходный код - на удивление коротко и лаконично (модули были описаны в ранних постах):
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.