КРАМ писал(а):То есть система построена на "гонках" фронтов...
Время распространения больше, чем время переключения счетчика команд...
А как же конвейер?
Ниччего не понимаю

Какие гонки, время распространения чего?
ЗЫ. Только мне не понятно, а зачем все это? Если схемотехника и топология столь быстры, что способны за время одного периода частоты тактирования перенести сигнал на выход, то что мешает его тактировать с необходимой частотой? Есть архитектуры, где за два периода тактирования исполняется машцикл. Т.е. тактовая вдвое выше. Ну и что?
Без конвейера работа получается строго последовательная:
1. Прочитать очередную команду из памяти и сохранить её во внутреннем регистре команд.
2. Выполнить прочитанную команду.
3. При необходимости проанализировать её результаты, определить адрес следующей выполняемой команды и соответствующим образом модифицировать счётчик команд (из-за наличия условных переходов это не обязательно команда, следующая за только что исполненной). Выполнить эти действия до завершения шага 2 нельзя из-за условных переходов.
Эти действия могут быть выполнены за один длинный такт, при этом потребуются внутренние сигналы синхронизации (формируемые, например, линиями задержек). Можно их выполнить и за несколько тактов -- именно так, собственно, и работали простые процессоры типа 8080, 8086 и т.д. Более того, при достаточно сложной системе команд число тактов, необходимых для выполнения команды, может сильно различаться -- в том же 8086 самые быстрые, если память не изменяет, выполнялись за два такта, а самые медленные (деление) могли выполняться несколько десятков тактов.
Конвейер позволяет совместить стадии выборки и выполнения команды
в предположении, что следующая выполняемая команда располагается прямо за текущей. Для простого процессора (вроде AVR8) каждый такт
одновременно выполняются такие действия:
1. Выборка команды по адресу, находящемуся на начало такта в счётчике команд, и запоминание её в регистре кода команды для исполнения во время следующего такта.
2. Увеличение адреса в счётчике команд, чтобы он указывал на команду, следующую за выбираемой в п. 1.
3. Исполнение команды, код которой был загружен в
предыдущем такте. Если ей окажется команда успешно выполняемого перехода (т.е. безусловного перехода либо условного, условие для которого выполнено), то модификация поведения процессора для пп. 1 и 2: 1) в регистр кода команды будет загружен код команды "нет операции", благодаря которому в следующем АЛУ процессора никакой полезной работы выполнять не будет; 2) в счётчик команд будет занесён адрес не следующей команды, а той, что указана в команде перехода.
Таким образом, физически каждая команда выполняется два такта: на первом -- её выборка, на втором -- собственно исполнение. Однако логически при отсутствии переходов команды выполняются по одной за такт, поскольку АЛУ выполняет операции на каждом такте. Именно поэтому для сложения указывается длительность 1 такт, а вот для условного перехода -- 1 или 2 такта: второй такт для случая, когда переход произошёл.
Если несколько модифицировать эту схему, становится возможным обслуживать прерывания: при их возникновении опять-таки модифицируются пп. 1 и 2: в регистр кода команды помещается код "нет операции", а в счётчик команд -- адрес точки входа в обработчик прерывания. На следующем такте АЛУ ничего не делает, а блок выборки команд считает из памяти эту команду, и дальше начнётся выполнение обработчика.
P.S. Естественно, эта схема организации конвейера является простейшей и применима к процессорам типа AVR8, но не к более сложным. Там конвейеры бывают посложнее и позапутаннее. Например, у большинства процессорных ядер ARMов конвейер трёхступенчатый (хотя есть и пятиступенчатые ядра, а может, и другие -- я этот вопрос специально не изучал). Первый конвейер, с которым я столкнулся на практике, в ЕС-1130, был тоже трёхступенчатым (меня тогда поразило, как просто и элегантно удалось резко поднять производительность процессора по сравнению с, например, ЕС-1035, используя, в общем-то, ту же самую элементную базу -- ЭСЛ-"рассыпуху" 500-й серии). А вот в MIPS, чтобы не тормозить конвейер из-за условных переходов, сделали так, что для анализа на переход берутся результаты не команды, непосредственно предшествующей команде перехода, а более ранней -- только не помню, второй или третьей. Ну а во всяких современных Core и прочих архитектуры IA-32 конвейер намного сложней (собственно, их там даже несколько на разных уровнях).
P.S. В некоторых архитектурах, чтобы исключ