Почему запуск по фронту предпочтительнее запуска по уровню?

Я пытаюсь понять, почему запуск по фронту предпочтительнее запуска по уровню. В моей книге это не объяснено ясно. После поиска в Интернете я узнал, что запуск по фронту нечувствителен к сбоям, тогда как запуск по уровню чувствителен. Что это означает?

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

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

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

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

«Как только будет применен запуск по фронту, выход будет распространяться через все вентили, а следующие входы будут учитываться только на следующем фронте тактового сигнала» - яблочко !!

Ответы (5)

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

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

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

Первое очевидное решение, которое напрашивается само собой, укоротить уровень до невозможности возникновения нежелательной обратной связи (и оставить уровень «включено» коротким, даже если мы произвольно замедляем тактовый период). Предположим, что мы очень быстро пульсируем часы от 0 до 1 и обратно до 0, так что синхронизированные устройства принимают свои входы, но у выходов нет достаточно времени, чтобы пройти через петлю обратной связи, чтобы изменить эти входы. Проблема в том, что узкие импульсы ненадежны и в основном требуют отклика, который может быть на несколько порядков быстрее, чем тактовая частота. Мы можем обнаружить, что нам нужен импульс шириной в наносекунду, даже если система работает на частоте всего 1 МГц. Таким образом, у нас возникает проблема распределения чистых, четких, достаточно длинных наносекундных импульсов по шине, рассчитанной на 1 МГц.

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

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


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

Простейшим примером этого является триггер master-slave . Он состоит из двух D-триггеров, запускаемых по уровню, соединенных каскадом. Но тактовый сигнал инвертирован, поэтому вход одного включен, а другого отключен, и наоборот. Это как дверь воздушного шлюза. В целом триггер никогда не открывается, чтобы сигнал мог свободно проходить. Если у нас есть обратная связь от выхода триггера к входу, нет проблем, потому что она переходит на другую фазу тактового сигнала. Конечным результатом является то, что триггер ведущий-ведомый демонстрирует поведение, запускаемое фронтом! Полезно изучить триггер ведущий-ведомый, потому что он может что-то сказать о взаимосвязи между запуском по уровню и фронту.

Многофазные часы, чувствительные к уровню, позволяют избежать проблемы «хаоса», если выходной сигнал защелки не возвращается к его входу, не проходя через защелку, которая отбирается на другой фазе тактового сигнала. Такие конструкции могут иметь некоторые преимущества при сопряжении процессоров с такими вещами, как асинхронная память, поскольку время между передним фронтом одной фазы тактового сигнала и задним фронтом следующей может быть произвольно разделено на время, необходимое для маршрутизации и вывода адреса, время доступа время оперативной памяти и время настройки для ввода данных процессором.
@supercat В качестве знакомого примера триггер ведущий-ведомый можно рассматривать как пример многофазной синхронизации. Ведущий и ведомый находятся на противоположных фазах, поэтому при наличии обратной связи выполняется одно и то же условие: она переходит на другую фазу. Я должен добавить это к ответу, чтобы завершить его.
+1 аналогия с воздушным шлюзом. Я никогда не слышал, чтобы кто-то объяснял это таким образом, но это имеет смысл.
@ ajs410: Еще одна аналогия, которая мне нравится, - это часовой спуск. Маятник соединен с двумя плечами, каждое из которых может либо позволить спусковому механизму свободно двигаться, либо заблокировать его в следующий раз, когда он достигнет определенной «фазы». Для правильной работы рычаги должны быть отрегулированы так, чтобы не было моментов, когда оба рычага будут пускать шестеренку. Без этого ограничения механизм вышел бы из-под контроля.

Чтобы понять, почему запуск по фронту предпочтительнее, представьте себе 8-битный сумматор, подключенный к регистру, постоянно добавляющий 1 к значению регистра, с кнопкой, подключенной к выводу разрешения регистра.

Если вывод включения регистра чувствителен к уровню, то содержимое регистра будет постоянно увеличиваться в течение всего времени нажатия кнопки. Следующее состояние регистра не будет детерминированным для данного нажатия кнопки. Это связано с тем, что сумматор может увеличивать регистр много раз, прежде чем вы уберете палец — другими словами, обратная связь покидает регистр и возвращается к сумматору слишком быстро.

Если бы вместо этого вывод включения был чувствительным к фронту, содержимое регистра увеличивалось бы ровно один раз при каждом нажатии кнопки, независимо от того, как долго кнопка была нажата (при условии, что вход правильно устранен). Было бы невозможно, чтобы вывод регистра вовремя вернулся к сумматору из-за любого недетерминированного поведения.

Около двух дней я пытался понять /зачем/ нам нужны схемы, запускаемые по фронту. Это был пост, который заставил меня начать понимать, почему. Большое спасибо! Единственное, что я хотел бы добавить, это что-то о том, почему «детерминированная» часть — то есть вы никогда не сможете создать последовательную операцию «добавить один».

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

Напротив, построение схемы для подсчета импульсов на одном входе без использования триггерных защелок потребовало бы определенных гарантий в отношении относительных скоростей некоторых частей схемы. Обычный подход заключался в преобразовании входящего тактового сигнала (ClkIn) в неперекрывающуюся пару тактовых сигналов (Phi1 и Phi2). Phi1 истинен, когда ClkIn высокий и был высоким в течение некоторого гарантированно-минимального времени . Phi2 высокий, когда ClkIn низкий и был низким в течение некоторого гарантированного минимального времени .. Когда ClkIn переключается с низкого уровня на высокий, Phi2 становится низким раньше, чем Phi1 становится высоким; аналогично, когда он переключается с высокого на низкий. Можно построить счетчик, имея два набора защелок (которые я назову Count1 и Count2). Всякий раз, когда Phi1 имеет высокий уровень, Count1 фиксирует Count2. Всякий раз, когда Phi2 имеет высокий уровень, Count2 фиксируется (Count1+1). Если бы Phi1 и Phi2 одновременно достигли высокого уровня или если бы между ними было слишком мало времени, значение счетчика стало бы неопределенным, но при соблюдении надлежащего разделения счетчик будет работать очень хорошо. Системы с двухфазной тактовой частотой часто имеют довольно большое разделение; при условии, что все происходит достаточно быстро, такое разделение позволяет избежать проблем с рассогласованием часов.

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

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

Хотя другие ответы охватывают почти все, что можно сказать о вашем вопросе, чтобы сделать его более понятным, я добавил несколько диаграмм и краткое объяснение.

Представьте, что вы хотите спроектировать схему, которая включает какую-то обратную связь. Скажем A = A.B(в основном логический элемент И с обратной связью). Если вы реализуете его с помощью простой защелки, чувствительной к уровню, которая хранит значение A, ваша схема будет выглядеть примерно так:введите описание изображения здесь

Это может создать проблему. Когда часы имеют высокий уровень, защелка становится прозрачной, и логический элемент И вычисляет новое значение A and B. Но значение возвращается обратно в защелку, и, поскольку защелка по-прежнему прозрачна (CLK все еще высокий), A AND Bвычисляется новое значение. Это то, что обычно называют состоянием гонки , которое создает сбои (неожиданные максимумы и минимумы на выходе), о которых вы упомянули.

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

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

введите описание изображения здесь

В основном, когда CLKсигнал высокий, защелка U1 прозрачна, что приводит логическое значение на входе A к выходу защелки U1, когда CLKсигнал низкий, защелка U2 становится прозрачной, и A AND Bвычисляется новое значение. Но это значение будет распространяться на вход логического элемента И только тогда, когда защелка U1 станет прозрачной (CLK ВЫСОКИЙ), и, следовательно, защелка U1 станет прозрачной (CLK НИЗКИЙ). Что в основном эквивалентно утверждению, что схема теперь чувствительна к фронту (выходное значение изменяется только при отрицательном фронте тактового сигнала).

Это позволяет избежать описанной ранее проблемы Race Condition , и именно поэтому запуск по уровню предпочтительнее, чем запуск по фронту.

Спасибо! Итак, в первом примере проблема в том, что они будут циклом: после того, как первое И будет вычислено, оно перейдет к А и будет сохранено в защелке, а затем защелка подаст новый ввод в логический элемент И. , который будет отправлен в A и сохранен в защелке, а затем защелка будет ... как бы долго ни был тактовый цикл?

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

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