Зачем микроконтроллерам нужны часы

Почему инструкции должны обрабатываться через заданные промежутки времени (т. е. с использованием часов)? Разве они не могут выполняться последовательно - сразу после завершения предыдущей инструкции?

Аналогия с необходимостью часов в микроконтроллерах оказалась бы особенно полезной.

Есть асинхронные процессоры.
Как бы вы определили, «когда предыдущая инструкция завершилась»? Если вы думаете об этом, вам нужно знать, когда «Выполнена ли предыдущая инструкция?» вычисление завершено, и когда завершено вычисление «Выполнена ли предыдущая инструкция?», и........ Гораздо проще просто сказать: «Выполнение инструкции занимает 0,4 наносекунды».
Логические ворота не говорят, когда они сделаны. Сигнал просто неопределенен в течение некоторого периода времени, прежде чем установить стабильное значение. По сути, часы позволяют проекту узнать, когда логика установила правильное значение. Расширенные стратегии, такие как микроинструкции, помогают разбивать машинные инструкции на более мелкие части, поэтому ADD может выполняться за 4 тактовых импульса, а доступ к памяти может занимать сотни тактов.

Ответы (8)

Наглядный пример или два могут помочь здесь. Взгляните на следующую гипотетическую схему:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Предположим, что для начала и A, и B высокие (1). Таким образом, на выходе операции И 1, а поскольку оба входа XOR равны 1, на выходе 0.

Логические элементы не меняют свое состояние мгновенно — существует небольшая, но значительная задержка распространения, когда обрабатывается изменение входных данных. Предположим, что B становится низким (0). XOR мгновенно видит новое состояние на своем втором входе, но первый вход все еще видит «устаревшую» 1 из логического элемента AND. В результате выход ненадолго становится высоким, но только до тех пор, пока сигнал не пройдет через логический элемент И, установив низкий уровень на обоих входах XOR и заставив выход снова стать низким.

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

Один действительно простой способ справиться с этим — поместить триггер, запускаемый фронтом, на выходе вашей комбинаторной логики, например:

схематический

смоделируйте эту схему

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

Спасибо, что почти сразу упомянули о задержке распространения, это, вероятно, 99% ответа.
Рабочий пример этого в действии можно наблюдать на цифровых периферийных устройствах ввода-вывода Microchip (и других) микроконтроллеров. Если вы используете регистры PORT для обновления выходов (а не LATCH) с помощью последовательных инструкций Read-Modify-Write, можно считывать состояние вывода во время его изменения. Подробнее см. в разделе 10.2.2 документации dsPIC33E/24E .
Правильно ли я понимаю, что последовательные схемы критически нуждаются в тактировании не только потому, что у них будут сбои, но и потому, что из-за этого сбоя некоторые триггеры могут в конечном итоге сохранить неправильное значение?

Я чувствую, что многие из этих ответов не совсем соответствуют основному вопросу. Микроконтроллер имеет часы просто потому, что он выполняет (и управляется) последовательной логикой .

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

Также:

Основным преимуществом синхронной логики является ее простота. Логическим элементам, которые выполняют операции с данными, требуется конечное количество времени, чтобы отреагировать на изменения на их входах. Это называется задержкой распространения. Интервал между тактовыми импульсами должен быть достаточно длинным, чтобы все логические элементы успели отреагировать на изменения и их выходы «установились» на стабильные логические значения до того, как произойдет следующий тактовый импульс. Пока это условие соблюдается (без учета некоторых других деталей), схема гарантированно будет стабильной и надежной. Это определяет максимальную рабочую скорость синхронной цепи.

Краткий ответ: менеджеры хотят получить простое, проверяемое, ДОКАЗАТЕЛЬСТВО функционирования, прежде чем тратить миллионы (или более) долларов на разработку. Текущие инструменты просто не дают асинхронным проектам таких ответов.

Микрокомпьютеры и микроконтроллеры обычно используют схему синхронизации для обеспечения управления синхронизацией. Все углы процесса должны поддерживать синхронизацию при всех воздействиях напряжения, температуры, процесса и т. д. на скорость распространения сигнала. Текущие логические вентили не меняются мгновенно: каждый вентиль переключается в зависимости от подаваемого на него напряжения, привода, который он получает, нагрузки, которую он управляет, и размера устройств, которые используются для его создания (и, конечно, узла процесса). (размер устройства), в котором он сделан, и насколько быстро ЭТОТ процесс на самом деле выполняется --- ЭТО проходит через производство). Чтобы перейти к «мгновенному» переключению, вам придется использовать квантовую логику, а это предполагает, что квантовые устройства могут переключаться мгновенно; (Я не уверена).

Тактовая логика ДОКАЗЫВАЕТ, что синхронизация всего процессора работает с ожидаемым напряжением, температурой и переменными обработки. Существует множество доступных программных инструментов, которые помогают измерить это время, и сетевой процесс называется «закрытием времени». Тактирование может (и, по моему опыту, потребляет ) от 1/3 до 1/2 мощности, используемой микропроцессором.

Итак, почему бы не асинхронный дизайн? Существует несколько инструментов закрытия времени, поддерживающих этот стиль дизайна, если они вообще есть. Есть несколько автоматизированных инструментов размещения и маршрутизации, которые могут работать с большими асинхронными проектами и управлять ими. Во всяком случае, менеджеры НЕ одобряют ничего, что не имеет прямого, сгенерированного компьютером, ДОКАЗАТЕЛЬСТВА функциональности.

Комментарий о том, что асинхронный дизайн требует «тонны» синхронизирующих сигналов, что требует «гораздо большего количества транзисторов», игнорирует затраты на маршрутизацию и синхронизацию глобальных часов, а также стоимость всех триггеров, которые требуются системе синхронизации. Асинхронные конструкции меньше и быстрее своих аналогов с тактовой частотой (или должны быть такими). (Один просто выбирает ОДИН самый медленный путь сигнала и использует его для возврата «готового» сигнала к предыдущей логике).

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

Можно ли это сделать? Конечно, даже на миллиардной конструкции транзистора. Это сложнее? Да, но только потому, что ДОКАЗАТЕЛЬСТВО того, что это работает на всем чипе (или даже в системе), гораздо сложнее. Получить время на бумаге достаточно просто для любого блока или подсистемы. Контролировать это время в автоматизированной системе мест и маршрутов намного сложнее, потому что инструментарий НЕ настроен для обработки гораздо большего потенциального набора временных ограничений.

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

Достижение механизма сигнала «блокировки» «первого прибытия» - это проблема проектирования схемы, и существуют известные способы решения этой проблемы. Условия гонки являются признаком 1). плохая практика проектирования; или 2). внешние сигналы, поступающие в процессор. Синхронизация фактически вводит состояние гонки сигнала и тактовой частоты, которое связано с нарушениями «настройки» и «удержания».

Я лично не понимаю, как асинхронный дизайн мог зайти в тупик или в любое другое состояние гонки. Это вполне может быть моим ограничением, но если это не происходит при вводе данных в процессор, это НИКОГДА не должно быть возможным в хорошо спроектированной логической системе, и даже тогда, поскольку это может произойти при поступлении сигналов, вы проектируете, чтобы справиться с этим.

(Надеюсь, это поможет).

Все это говорит о том, что если у вас есть деньги...

Конечно, это зависит от чипа, который вы создаете — например, аппаратное обеспечение нейронных сетей имеет тенденцию быть асинхронным, потому что на самом деле это самое простое — то, что они эмулируют , является асинхронным . В основном мы создаем синхронное последовательное оборудование, потому что программное обеспечение/микропрограммное обеспечение также в основном синхронное и последовательное (особенно в «последовательной» части — асинхронный код используется все чаще и чаще). На самом деле гораздо проще разобраться в последовательной синхронной системе, особенно когда большая часть программирования выполняется на языках, поддерживающих последовательный код.
События в реальном мире происходят в непредсказуемое время. Если устройство имеет кнопку и должно выполнять один путь кода, если он нажат «достаточно скоро», и выполнять другой путь кода, если это не так, то при отсутствии квантово-механических ограничений между моментом нажатия кнопки где нажатие кнопки произойдет достаточно скоро, чтобы вызвать альтернативный путь кода, и момент, когда нажатие кнопки будет «слишком поздно», будет некоторый точный момент, когда нажатие кнопки вызовет некоторое поведение «между» двумя (например, что приводит к изменению некоторых битов счетчика программ...
...но не другие). В отсутствие квантово-механических ограничений время между последним моментом, когда толчок вызовет разветвление, и первым моментом, когда толчок явно не сможет этого сделать, можно сделать сколь угодно малым, но не свести к нулю. Квантово-механические ограничения могут сделать вероятным, что любое нажатие кнопки произойдет либо достаточно рано, чтобы зарегистрироваться, либо достаточно поздно, чтобы безошибочно потерпеть неудачу, но доказательство того, что никогда не будет квантового состояния, которое позволяло бы нажимать кнопку в мертвое промежуточное время, как правило, было бы невыполнимо.
Использование синхронной логики значительно упрощает анализ ситуаций, когда системе необходимо реагировать на действительно асинхронное событие, гарантируя, что условия гонки будут иметь очень низкую вероятность выхода из очень небольшой части всего устройства. Анализ этой небольшой части устройства, чтобы гарантировать, что условия гонки маловероятны, может быть гораздо более решаемой проблемой, чем допускать возникновение условий гонки практически в любом месте и пытаться проанализировать их последствия, чтобы доказать, что они вряд ли вызовут проблемы.

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

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

Конечно, можно спроектировать полностью асинхронные системы, которые работают «как можно быстрее», но если система не является чрезвычайно простой, будет трудно избежать того, что проект споткнется из-за состояния гонки. Хотя существуют способы разрешения условий гонки без использования часов, условия гонки часто могут быть решены намного быстрее и проще с использованием часов, чем без них. Хотя асинхронная логика часто может разрешать условия гонки быстрее, чем тактовая логика, случаи, когда она не может этого сделать, представляют собой серьезную проблему, особенно с учетом сложности достижения консенсуса частей системы относительно того, достигли они консенсуса или нет .. Система, которая может последовательно выполнять один миллион инструкций на секцию, как правило, будет более полезной, чем система, которая иногда может выполнять четыре миллиона инструкций в секунду, но потенциально может останавливаться на миллисекунды (или дольше) за раз из-за условий гонки.

Стоит отметить, что определяемые состояния также могут быть внутренними, например, результатом арифметической операции. Задержки из-за длины линии могут привести к тому, что одна часть MCU увидит результат и, без часов, воздействует на него раньше других частей.
@NickJohnson: если последовательность, в которой выполняются операции, никогда не зависит от вещей, которые еще не вычислены, эти проблемы можно решить без труда, если каждая секция, такая как ALU, имеет «действительные» входы и «действительные» выходные данные, и все можно расположить так, чтобы они происходили в детерминированной последовательности. Когда колеса отваливаются, это когда порядок выполнения операций должен зависеть от времени (например, если у одной есть несколько параллельных операций, которые должны использовать общую шину памяти, и две из них выдают почти одновременные запросы, арбитраж какой из них надо идти первым...
... и какой из них следует ждать, может быть неразрешимым. Если заранее решить, какой из них пойдет первым, таких проблем можно избежать, но если выяснится, что отряд, назначенный идти первым, не готов до тех пор, пока другой не будет готов, в результате производительность может сильно пострадать. .
Вот почему отправиться в космос так сложно, вероятности меняются неблагоприятно.

Микроконтроллеры — это только один очень сложный пример синхронной последовательной логической схемы. Простейшей формой, вероятно, является синхронизируемый D-триггер (D-FF), то есть синхронный 1-битный элемент памяти.

Есть элементы памяти, которые являются асинхронными, например D-защелка, которая является (в некотором смысле) асинхронным эквивалентом D-FF. MCU — это не что иное, как куча миллионов таких базовых элементов памяти (D-FF), склеенных вместе с кучей логических элементов (я упрощаю).

Теперь давайте перейдем к сути: почему микроконтроллеры используют D-FF вместо D-защелки в качестве элементов памяти внутри? В основном это сделано для надежности и простоты конструкции: D-защелки реагируют, как только их входы изменяются, а их выходы обновляются как можно быстрее. Это допускает неприятные нежелательные взаимодействия между различными частями логической схемы (непреднамеренные петли обратной связи и гонки). Разработка сложной последовательной схемы с использованием асинхронных строительных блоков по своей природе более сложна и подвержена ошибкам. Синхронные схемы избегают таких ловушек, ограничивая работу строительных блоков моментами времени, когда обнаруживаются фронты тактовых импульсов. Когда приходит фронт, синхронная логическая схема получает данные на своих входах, но еще не обновляет свои выходы.. Как только входы получены, выходы обновляются. Это позволяет избежать риска того, что выходной сигнал будет возвращен на вход, который не был полностью получен, и все испортится (просто говоря).

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

То, что вы описываете, называется асинхронной логикой . Он может работать, и когда он работает, он часто быстрее и потребляет меньше энергии, чем синхронная (тактовая) логика. К сожалению, у асинхронной логики есть некоторые проблемы, препятствующие ее широкому использованию. Главное, что я вижу, это то, что для реализации требуется гораздо больше транзисторов, так как вам нужна масса независимых сигналов синхронизации. (Микроконтроллеры выполняют большую часть работы параллельно, как и центральные процессоры.) Это приведет к увеличению стоимости. Отсутствие хороших инструментов для проектирования — большое препятствие.

Микроконтроллерам, вероятно, всегда будут нужны часы, поскольку их периферийные устройства обычно должны измерять время. Таймеры и ШИМ работают с фиксированными интервалами времени, частота дискретизации АЦП влияет на их полосу пропускания, а асинхронные протоколы связи, такие как CAN и USB, нуждаются в эталонных тактовых частотах для восстановления тактовой частоты. Обычно мы хотим, чтобы процессоры работали как можно быстрее, но это не всегда так для других цифровых систем.

На самом деле вы видите MCU как законченный блок, но правда в том, что он сам состоит из разных вентилей и логики TTL и RTL, часто массива FF, всем нужен тактовый сигнал по отдельности.

Чтобы быть более конкретным, подумайте о простом доступе к адресу. из памяти, эта простая задача сама по себе может включать в себя несколько операций, таких как обеспечение доступности BUS для линий данных и адресных линий.
Лучший способ сказать, что сами инструкции выполняются в небольших единицах работы, которые требуют тактов, которые объединены для машинных циклов , которые учитывают различные свойства MCU, такие как скорость (FLOPS ** в сложных MCU), футеровка трубы и т. д.

Ответ на Комментарий ОП.

Чтобы быть точным, я привожу вам пример, есть чип под названием ALE .(включение защелки адреса) обычно с целью мультиплексирования нижней адресной шины для передачи адреса и данных на одних и тех же контактах мы используем генераторы (intel 8051 использует локальный генератор 11,059 МГц в качестве часов) для получения адреса, а затем данных.

Как вы, возможно, знаете, основными частями MCU являются CPU, ALU, внутренний регистр и т. д. CPU (управляющий s/g) отправляет адрес на все адресные контакты 16 в случае 8051, это происходит в момент времени T1 и после него. адрес соответствует соответствующей матрице хранения конденсатора (заряд как сигнал) ( *отображение памяти * ) активируется и выбирается.

После выбора активируется сигнал ALE, т. е. вывод ALE становится высоким на следующем такте, скажем, T2 ( обычно высокий сигнал, но изменяется в соответствии с конструкцией процессорного блока ), после этого шины нижнего адреса действуют как линии данных, и данные записываются или считываются. (в зависимости от выхода на выводе RD/WR микроконтроллера).
Вы можете четко видеть, что все события своевременной последовательности

Что произойдет, если мы не будем использовать часы . Тогда нам придется использовать асинхронный метод синхронизации ASQC , это сделает каждый вентиль зависимым от другого и может привести к аппаратным сбоям. время выполнить задание.
Так что это что-то нежелательное

В этом есть смысл. Но почему для работы этих различных частей микроконтроллера нужен тактовый сигнал? Что теоретически произошло бы, если бы они не использовали часы?
@Martin, логические вентили меняют состояние сразу же при изменении их входа. Синхронизированная последовательная логика оценивает свои входы только во время события часов. Это основной принцип, который управляет схемами цифровой памяти. Это дает нам возможность выборочно перемещать данные из одного места в другое с абсолютным контролем, позволяя создавать аппаратное обеспечение общего назначения, которое можно запрограммировать с помощью программного обеспечения для чего угодно.
@SeanBoddy: Логические вентили не изменяются сразу, есть небольшая задержка, которую можно увидеть на осциллографе. Если бы мы не использовали часы, различия в этих таймингах между компонентами могли бы привести к неправильным результатам в условиях гонки.
@BlueRaja - ну, черт возьми, леденцы, как насчет этого. Может быть, я вернусь к 4 годам заметок по силовой электронике и 8 годам обучения военно-морскому флоту, чтобы выяснить, где я упустил одну вещь.

Фундаментальная проблема, которую решают часы, заключается в том, что транзисторы в действительности не являются цифровыми устройствами: они используют аналоговые уровни напряжения на входах для определения выходного сигнала, и для изменения состояния требуется конечное время. Если, как уже упоминалось в другом ответе, вы не попадете в квантовые устройства, будет период времени, в течение которого вход переходит из одного состояния в другое. На время, необходимое для этого, влияет емкостная нагрузка, которая будет отличаться от одного устройства к другому. Это означает, что разные транзисторы, составляющие каждый логический вентиль, будут реагировать в несколько разное время. Часы используются для «фиксации» выходов компонентных устройств после того, как они все стабилизируются.

В качестве аналогии рассмотрим транспортный уровень связи SPI (Serial Peripheral Interface). Типичная реализация этого будет использовать три линии: Data In, Data Out и Clock. Чтобы отправить байт через этот транспортный уровень, мастер установит свою линию вывода данных и установит линию синхронизации, чтобы указать, что линия вывода данных имеет допустимое значение. Ведомое устройство будет производить выборку своей линии Data In только в том случае, если это будет проинструктировано тактовым сигналом. Если бы не было тактового сигнала, как ведомое устройство узнало бы, когда производить выборку данных в строке? Он мог сэмплировать его до того, как линия была установлена ​​мастером или во время перехода между состояниями. Асинхронные протоколы, такие как CAN, RS485, RS422, RS232 и т. д., решают эту проблему, используя предопределенное время выборки, фиксированную скорость передачи данных и (служебные) биты кадрирования.

Другими словами, требуется какое-то общее знание , чтобы определить, когда все транзисторы в наборе вентилей достигли своего конечного состояния и инструкция завершена. В головоломке (100 голубых глаз), указанной в ссылке выше и подробно объясненной в этом вопросе на Maths Stack Exchange, «оракул» действует как часы для людей на острове.