4924 subscribers

Микроконтроллеры для начинающих. Часть 3. Процессор микроконтроллера. Тактирование и синхронизация.

2k full reads
3,7k story viewsUnique page visitors
2k read the story to the endThat's 55% of the total page views
3 minutes — average reading time

Это третья статья цикла. Предыдущая, вторая, статья цикла Микроконтроллеры для начинающих. Часть 2. Процессор микроконтроллера

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

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

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

В результате, у нас может оказаться, что сигнал выбора местоположения результата уже добрался до демультиплексора, а вот результат из АЛУ еще нет. А время формирования результата в АЛУ зависит от выбранной операции. Когда же мы получим результат вполне может оказаться так, что сигнал выбора местоположения результата уже неверен.

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

  • Получить из памяти очередную команду
  • Получить требуемые для выполнения команды данные
  • Выполнить команду и сохранить результат
  • Перейти к выполнению следующей команды

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

Формирование тактовых и синхронизирующих импульсов. Иллюстрация моя
Формирование тактовых и синхронизирующих импульсов. Иллюстрация моя
Формирование тактовых и синхронизирующих импульсов. Иллюстрация моя

Все очень просто. Тактовый генератор G формирует импульсы Т на каждый такт работы процессора. Двоичный (2-разрядный, в данном случае) счетчик CT2 вместе с дешифратором DC из тактовых импульсов формируют сигналы состояний процессора, или фаз, F1-F4. Все эти сигналы поступают на узлы процессора и упорядочивают их работу. Вот такую, очень простую, временную диаграмму одного машинного цикла мы получим.

Временная диаграмма сигналов синхронизации
Временная диаграмма сигналов синхронизации
Временная диаграмма сигналов синхронизации

А теперь посмотрим, какие узлы процессора будут работать во время разных фаз.

Работа процессора в фазе F1, получение команды из памяти. Иллюстрация моя
Работа процессора в фазе F1, получение команды из памяти. Иллюстрация моя
Работа процессора в фазе F1, получение команды из памяти. Иллюстрация моя

Работающие, активные, узлы процессора и задействованные сигналы я выделил красным цветом. Адрес команды у нас хранится в регистре PC, а полученная команда в регистре CMD.

Работа процессора в фазе F2, получение операндов. Иллюстрация моя
Работа процессора в фазе F2, получение операндов. Иллюстрация моя
Работа процессора в фазе F2, получение операндов. Иллюстрация моя

Теперь из кода команды мы получаем информацию об операнде (или операндах) и обеспечиваем их подачу на входы АЛУ. Здесь я отметил все возможные комбинации сигналов, так как не указываю, что за команда будет выполняться.

Работа процессора в фазе F3, выполнение команды и сохранение результата. Иллюстрация моя
Работа процессора в фазе F3, выполнение команды и сохранение результата. Иллюстрация моя
Работа процессора в фазе F3, выполнение команды и сохранение результата. Иллюстрация моя

Теперь процессор готов выполнить команду (АЛУ выполняет заданную операцию) и поместить результат на место. Обратите внимание, шина памяти у нас использовалась и в фазе 1 и в фазе 2 для получения информации. А в фазе 3 мы используем шину памяти для сохранения информации. Таким образом у нас операции с памятью оказываются разнесенными во времени и не мешают друг другу.

Работа процессора в фазе F4, переход к следующей команде. Иллюстрация моя
Работа процессора в фазе F4, переход к следующей команде. Иллюстрация моя
Работа процессора в фазе F4, переход к следующей команде. Иллюстрация моя

Наконец мы можем сформировать адрес команды, которая будет выполняться в следующем машинном цикле. Это не обязательно следующая команда, если мы выполнили команду перехода.

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

Латентность

Но почему предыдущая статья была иллюстративной, а эта уже имеет отношение к практике? Дело в том, что микроконтроллеры обычно применяются для управления какими либо объектами и процессами, а это иногда требует точного соблюдения времени реакции и временных параметров сигналов управления. И вот тут схема тактирования и синхронизации начинает иметь значение.

Давайте забежим немного вперед. Предположим, что у нас один машинный цикл состоит из 4 тактов, как мы и рассматривали. А частота тактовых импульсов равна 4 МГц. Тогда мы получаем, что один такт занимает 250 нс, а один машинный цикл 1 мкс. Пусть нам нужно обрабатывать поступление сигнала на вход микроконтроллера.

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

Через какое время мы сможем выдать выходной сигнал после получения входящего? Два такта, плюс полный цикл, плюс три такта? То есть, 9 тактов, что составляет 2,25 мкс? Ответ неверный. А что, если у нас входящий сигнал появился во время первого такта? Мы получим дополнительный такт задержки, что даст нам уже 2,5 мкс между входящим и выходным сигналами.

А если входящий сигнал появился в третьем такте? Мы получим 1 или 2 такта в цикле, в котором наш сигнал запоздал. Плюс, мы пропустим весь следующий цикл, так как сигнал будет считан только во втором такте и еще не будет доступен. Таким образом, дополнительная задержка составит 5 или 6 тактов. А время нашей реакции на сигнал составит уже 3,25 мкс.

Таким образом, время нашей реакции, в этом очень простом примере, будет колебаться между 2,25 мкс и 3,25 мкс. В некоторых случаях это может быть очень критично. Такие вот неявные, или скрытые, задержки называют латентностью. И избежать их невозможно, но можно учитывать. Причем не спасут и прерывания, о которых мы будем в дальнейшем говорить, там латентность может быть даже больше.

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

Заключение

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

В следующей статье я кратко коснусь понятия микропрограммы, как средства и принципа реализации процессора. Тот процессор, который мы рассматривали в последних двух статьях был построен на жесткой логике. Эта статья будет факультативной, то есть, не обязательной. Но надеюсь, что она все таки будет интересной и полезной (хотя бы для общего развития).