У нас был очень короткий курс FPGA/Verilog в университете (5 лет назад), и мы всегда везде использовали часы.
Теперь я снова начинаю работать с ПЛИС в качестве хобби, и я не могу не задаться вопросом об этих часах. Являются ли они абсолютно необходимыми, или конструкция на основе ПЛИС может быть полностью асинхронной? Можно ли построить сложную связку логики и заставить ее работать так быстро, как только возможно?
Я понимаю, что с этим связано много ошибок, например, знание того, когда сигнал распространился по всем частям схемы и выходной сигнал стабилизировался. Это не относится к делу. Дело не в том, что я действительно хочу построить полностью асинхронный дизайн, а просто в том, чтобы лучше понять возможности.
На мой взгляд новичка кажется, что единственной конструкцией, которая абсолютно требует часов, является reg
, и я понимаю, что типичная FPGA (скажем, Cyclone II) будет иметь свои триггеры, предварительно подключенные к определенным тактовым сигналам. Это правильно? Существуют ли какие-либо другие неявные часы, подобные этому, и могут ли они обычно управляться вручную в соответствии с дизайном?
Короткий ответ: да; более длинный ответ был бы: это не стоит вашего времени.
Сама FPGA может без проблем запускать полностью асинхронную конструкцию. Результат, который вы получаете, является проблемой, поскольку синхронизация через любую FPGA не очень предсказуема. Более серьезная проблема заключается в том, что ваше время и итоговый дизайн почти наверняка будут различаться в зависимости от места и маршрута. Вы можете наложить ограничения на отдельные асинхронные пути, чтобы они не занимали слишком много времени, но я не совсем уверен, что вы можете указать минимальную задержку.
В конце концов, это означает, что ваш дизайн будет непредсказуемым и потенциально полностью изменчивым даже при незначительном изменении дизайна. Вам придется просматривать весь отчет о времени каждый раз, когда вы что-то меняете, просто чтобы убедиться, что он все еще работает. С другой стороны, если дизайн синхронный, вы просто ищете проход или отказ в конце места и маршрута (при условии, что ваши ограничения настроены правильно, что совсем не займет много времени).
На практике люди стремятся к полностью синхронным схемам, но если вам нужно просто буферизовать или инвертировать сигнал, вам не нужно использовать триггер, если вы правильно ограничиваете его.
Надеюсь, это немного прояснит ситуацию.
«Можно ли построить сложную связку логики и заставить ее работать так быстро, как только возможно?» Да. Были построены целые ЦП, полностью асинхронные — по крайней мере, один из них был самым быстрым ЦП в мире. http://en.wikipedia.org/wiki/Асинхронная_схема#Асинхронный_ЦП
Меня раздражает, что люди отвергают методы асинхронного проектирования, хотя теоретически они имеют ряд преимуществ по сравнению с методами синхронного проектирования, просто потому, что (как говорили другие здесь) асинхронные проекты не так хорошо поддерживаются доступными инструментами.
Для меня это все равно, что рекомендовать делать все мосты из дерева, потому что больше людей имеют инструменты для обработки дерева, чем инструменты для обработки стали.
К счастью, некоторые из преимуществ асинхронного проектирования можно получить, используя в основном методы синхронного проектирования, используя глобальный асинхронный локальный синхронный (GALS) проект.
Еще не упомянутый фактор - метастабильность. Если в схему фиксации попадает последовательность входов/переходов, так что результирующее состояние будет зависеть от задержек распространения или других непредсказуемых факторов, нет гарантии, что результирующее состояние будет чистым «высоким» или «низким». Рассмотрим, например, триггер, запускаемый фронтом, который в настоящее время выдает «низкий уровень», а его входной сигнал меняется с низкого на высокий почти одновременно с приходом фронта тактового сигнала. Если фронт тактового сигнала происходит достаточно долго до изменения входа, выход просто будет оставаться на низком уровне до следующего фронта тактового сигнала. Если фронт тактового сигнала происходит достаточно долго после изменения входа, выход быстро переключится один раз с низкого на высокий и останется там до следующего фронта тактового сигнала. Если ни одно из этих условий не применимо,. Он может оставаться низким или быстро переключаться один раз и оставаться высоким, но он может оставаться низким некоторое время, а затем переключаться, или переключаться, а затем некоторое время спустя переключаться обратно, или переключаться туда и обратно несколько раз и т. д.
Если конструкция полностью синхронна и все входы синхронизированы дважды, очень маловероятно, что синхронизирующий импульс ударит по первой защелке синхронизатора таким образом, что заставит ее переключиться в нужное время, чтобы сбить с толку вторую защелку. защелка. В общем, можно с уверенностью относиться к таким вещам как к «просто не будет». Однако в асинхронном дизайне часто гораздо сложнее рассуждать о таких вещах. Если ограничение по времени для схемы фиксации (не только триггеров, но и любой комбинации логики, которая будет действовать как защелка) нарушается, невозможно сказать, что будет делать выход, пока в следующий раз не появится допустимое входное условие, которое вызывает защелку. до известного состояния. Вполне возможно, что задержанные выходные данные приведут к нарушению временных ограничений нисходящих входных данных, что приведет к непредвиденным ситуациям.
Самый безопасный способ смоделировать асинхронную схему состоит в том, чтобы почти каждая выходная схема на некоторое время выдавала выход «X» всякий раз, когда она переключается между «0» и «1». К сожалению, этот подход часто приводит к тому, что почти все узлы показывают «X», даже в случаях, которые в действительности почти наверняка привели бы к стабильному поведению. Если система может работать при моделировании, когда все выходы становятся «X» сразу после изменения входа и остаются «X» до тех пор, пока входы не стабилизируются, это хороший признак того, что схема будет работать, но заставить асинхронные схемы работать при таких ограничениях. часто трудно.
На самом деле существует ТРИ типа конструкций.
В общем, при синтезе/оптимизации комбинаторной логики инструменты будут исходить из того, что все, что имеет значение, это конечный результат и максимальное время, необходимое для получения этого результата.
Вы можете построить чисто комбинаторный дизайн, и он приведет к правильному результату. Выходы могут изменяться в любом порядке и могут изменяться несколько раз, прежде чем достигнут своих окончательных значений. Такие конструкции очень расточительны для логических ресурсов. Большинство логических элементов будут проводить большую часть своего времени бездействуя, тогда как в последовательной системе вы могли бы повторно использовать эти элементы для обработки нескольких элементов данных.
В последовательной синхронной системе все, что имеет значение, это то, что выходы комбинаторного блока перешли в свое правильное состояние, когда они синхронизируются со следующим триггером. Неважно, в каком порядке они меняются и являются ли они сбоями по пути. Опять же, инструменты могут легко превратить это в логику, которая при условии, что часы достаточно медленные, дает правильный ответ (и они могут сказать вам, достаточно ли медленны часы, которые вы хотите использовать).
В асинхронной последовательной системе эти предположения не учитываются. Глюки могут иметь значение, порядок изменений вывода может иметь значение. И инструменты, и сами ПЛИС были разработаны для синхронных проектов. Было много дискуссий (погуглите дизайн асинхронных FPGA, если хотите узнать больше) о возможности реализации асинхронных систем либо на стандартных FPGA, либо на специально разработанных, но это все еще выходит за рамки общепринятой практики проектирования.
Конечно, если ваши требования к дизайну достаточно медленные, и многие внутренние задержки по-прежнему на несколько порядков больше, чем время, которое вас волнует, то это не проблема, и вы можете посмотреть отчет о времени, чтобы следить за этим, но есть предел тому, что вы можете с пользой делать без информации о внутреннем состоянии. Если вы просто хотите сделать что-то вроде мультиплексора на 100 входов, тогда все в порядке, просто помните, что каждый вход будет иметь разную задержку распространения. На самом деле вы можете получить некоторые интересные и хаотичные эффекты с большим количеством колеблющихся петель обратной связи с непредсказуемой задержкой - возможно, полностью асинхронный синтезатор на основе FPGA может стать следующим «аналогом».
Да, ты можешь. Вы можете полностью игнорировать триггеры и построить все это из LUT. И/или вы можете использовать элементы состояния большинства Xilinx FPGA в качестве (управляемых уровнем) защелок вместо (управляемых фронтом) триггеров.
X=(someComplexFormula)
и Y=X & D
, и если компилятор подставит эту формулу вместо X и определит, что X & D
она эквивалентна A & D
, компилятор может заменить вычисление Y в терминах A и D, а не в терминах X, что позволит вычислить Y выполняться быстрее, чем в X. Такие замены допустимы для комбинаторной логики, но наносят ущерб асинхронной последовательной логике.lpm_ff
, может реализовать триггер d- или t-типа с синхронной нагрузкой. Используя этот модуль, я могу быть уверен, что эти функции будут точно сопоставлены с низкоуровневыми функциями устройства без возможности их оптимизации.Как отметил @Andrey, это не стоит вашего времени. В частности, инструменты этого не делают, поэтому вы будете полностью предоставлены сами себе. Кроме того, поскольку у них есть встроенные регистры, вы ничего не сэкономите, не используя их.
Да. Если у вас нет конструкций типа процесса, он не должен делать такие вещи, как вывод регистров. Будут такие вещи, как встроенная память, для которых требуются часы, хотя, если вы действительно хотите, вы, вероятно, могли бы генерировать их асинхронно.
FWIW Я подумал, что должен добавить, что одной очевидной целью асинхронных логических решений будет глобальное снижение энергопотребления.
Эти глобальные часы/PLL/буферы сжигают много джоулей.
По мере того, как решения FPGA переходят на арены с батарейным питанием (например, Lattice Icestick), этому аспекту будет уделяться гораздо больше внимания.
pjc50