Обновление ячейки памяти/синхронизация с часами

Мне интересно, как компьютеры на самом деле работают на уровне ворот. Я вижу, как можно построить механизм хранения из логических вентилей (например, защелки SR NOR ). Что меня интересует: как обновляются значения в ячейках памяти, если новое значение зависит от старого?

Пример: у меня есть однобитная ячейка хранения, и я хочу построить логику, инвертирующую значение в ячейке. Легко - прочитать старое значение - инвертировать его - активировать соответствующий вход в ячейку памяти, чтобы установить новое значение (R или S). Но это просто вызовет петлю обратной связи, переключающую бит как можно быстрее.

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

Иными словами: при наличии RS-триггера и линии тактового сигнала существует ли устройство затвора, которое переворачивает триггер один раз за такт? Если это на самом деле не решаемо на уровне ворот, как это решается на реальных микросхемах?

Ответы (1)

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

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

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

С несколькими триггерами в цикле каждый триггер будет добавлять 1 к общему значению деления. С двумя триггерами вы получите тактовую частоту / 3, с тремя — тактовую частоту / 4 и т. д.