За сколько циклов выполняются команды микроконтроллера

За сколько циклов выполняются команды микроконтроллера thumbnail

При программировании AVR (ATmegaXX, ATtinyXX) необходимо знать, сколько времени будет выполняться код. Здесь описываются простые правила для расчета этого времени.

Время выполнения ассемблерных инструкций строго привязано к тактовой частоте микроконтроллера AVR, поэтому первое, что нужно узнать – какая у Вас установлена частота ядра F, т. е. на какой частоте работает внутренний тактовый генератор. Обычно частота тактового генератора задается кварцем, тогда она равна частоте, написанной на кварце. Иногда кварц не используется, и запускается не очень точный внутренний RC генератор (никакие внешние компоненты для генератора не нужны), тогда обычно генератор работает на частоте 1 МГц (можно настроить и на частоту 8 МГц). Какой режим используется – определяется внутренними настройками fuses (они еще называются перемычками). Например, для чипа ATmega16 по умолчанию (когда чип приходит чистый с завода) перемычки настроены на работу без кварца, от внутреннего RC генератора на частоте 1 МГц.

Итак, частоту ядра F в Герцах мы знаем. Теперь можно узнать время одного такта TCLK = 1 / F (в секундах). Каждая команда выполняется строго определенное количество тактов (какое количество – зависит от команды). Например, команды ANDI и ORI (которые часто используются при управлении ножками портов) выполняются за 1 такт. Пример расчета длительности выполнения команды ANDI:

F = 12 МГц

TCLK = 1/12000000 = 0.000000083(3) сек = 0.083(3) мкс

Время выполнения команды 0.083 * 1 = 0.083 микросекунды (команда ANDI выполняется за 1 такт).

Таблицу соответствия между командами микроконтроллера и количеством тактов можно найти в даташите на микроконтроллер, см. раздел Instructions Set Summary в конце даташита. В последнем столбце таблицы #s указано число тактов, за которое выполняется команда. Если там стоит одна цифра – например 2, тогда все понятно, команда выполняется 2 такта. Но иногда там стоит 1/2 или 1/2/3. Это означает для примера 1/2, что команда может выполнится за 1 или 2 такта, что зависит от условия выполнения команды. Например, команда BREQ выполнится за 1 такт, если нет ветвления по условию, и за 2 такта, если произойдет условный переход.

[Расчет выполнения команды на языке Си]

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

Есть также способ прямого измерения длительности выполнения кода с помощью осциллографа. Для этого выбирают свободную ножку у микроконтроллера, и в начале измеряемого кода ставят установку ножки в 1, а по окончании измеряемого кода устанавливают ножку в 0. Запускают программу на выполнение и осциллографом измеряют длительность импульса.

[Вычисление константы для таймера/счетчика]

Таймеры/счетчики часто используются в программе для отсчета задержек времени. Я обычно настраиваю счетчик таким образом, чтобы его прерывание срабатывало примерно раз в 1 миллисекунду. В этом случае в программе удобно отсчитывать время относительно глобального счетчика (об этом далее). Покажу на таймере 1, как это настраивается и как используется.

//[r.c]

u32 stamp=0;

u32 up=0;

#define F_CPU 12000000L //частота кварца, Гц

#define TCNT1_1MS (65536-(F_CPU/(256L*1000))) // столько тиков будет делать T/C1 за 1 мс

void SetupR1 (void)

{

// 1<

TCCR1B = (1<<CS12);

TCNT1 = TCNT1_1MS;

// Enable r 1 overflow interrupt.

TIMSK = (1<<TOIE1);

}

void Poll (void)

{

ic u16 cnt = 100;

if (TIMSK & (1<<TOIE1))

return;

TCNT1 = TCNT1_1MS;

TIMSK = (1<<TOIE1);

stamp++;

if (cnt < 1000)

{

cnt++;

return;

}

cnt = 0;

up++;

}

//[rint.S]

#include <avr/io.h>

.text

.global R1_OVF_vect

R1_OVF_vect:

;cbi _SFR_IO_ADDR(PORTB), PB7

push R24

;ldi R24, ~(1<<TOIE1)

ldi R24, 0

out _SFR_IO_ADDR(TIMSK), R24

;out 0x39, R24

pop R24

;sbi _SFR_IO_ADDR(PORTB), PB7

reti

//[main.c]

int main(void)

{

SetupR1();

while (true)

{

Poll();

}

}

Немного комментариев к коду. Константа F_CPU задает частоту микроконтроллера в Гц (обычно частота кварца). Её удобно задать в makefile, если у Вас проект GCC для AVR Studio (тогда в коде её задавать не нужно). Процедура SetupR1 настраивает предделитель частоты тактов для таймера 1 (частота микроконтроллера делится на 256, и получается частота тактов для таймера 1). Макрос TCNT1_1MS задает константу, которая загружается в таймер после срабатывания прерывания, её значение задается таким образом, что прерывание будет происходить каждую 1 мс. Обычно константу загружают в счетчик таймера при срабатывании прерывания, но в этом примере сделано несколько по-другому – обработчик прерывания таймера просто запрещает прерывание таймера (обработчик прерывания написан на ассемблере), а основная программа процедурой Poll проверяет – запрещено ли прерывание, и по этому событию снова загружает константу TCNT1_1MS, разрешает прерывание и ведет отсчет глобального времени (в тиках 1 мс – счетчик 32-разрядный счетчик stamp, в тиках 1 с – 32-разрядный счетчик up). Такой вариант обработки прерывания таймера максимально разгружает процессор для выполнения остальных прерываний, что лучше всего подходит для ресурсоемких приложений (например, с применением библиотеки V-USB).

[Отсчет времени в программе с точностью 1 мс]

Если у Вас имеется организованный таким образом глобальный счетчик миллисекундных отсчетов stamp, то отсчет времени в программе становится тривиальной задачей. Вот пример вычисления задержки в 0.5 секунды:

u32 cnt = stamp+500;

while (stamp<cnt){}

[Ссылки]

1. Что такое перемычки fuses, как определять их значения.

2. AVR Studio: как написать обработчик прерывания.

3. Как определить тактовую частоту микроконтроллера?

Источник

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

Читайте также:  Составление задач с использованием цикл for

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

В свою очередь, рабочий цикл микроконтроллера или ПЛК можно разделить на следующие этапы:

  • Начало цикла;
  • Обработка входов (чтение информации из внешних источников);
  • Выполнение пользовательской программы;
  • Установка выходов (запись выходов);
  • Обслуживание аппаратных ресурсов ПЛК;
  • Монитор исполнения;
  • Контроль времени цикла;
  • Переход на начало цикла;

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

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

После выполнения кода программы выходы ПЛК устанавливаются в соответствии с полученными расчетными значениями.

Обслуживание аппаратных ресурсов – это обеспечение работы оперативного самотестирования, системных таймеров, индикации состояния, часов реального времени и других функций.

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

Программа, загруженная пользователем или пользовательская программа, работает только с мгновенными копиями входов. Соответственно значения входов в процессе выполнения одного цикла изменятся не будут. Этот принцип является фундаментальным для построения ПЛК сканирующего типа. При использовании данного подхода исключается неоднозначность алгоритма обработки данных в разных его ветвях. Более того, процесс чтения значения входа производится из ОЗУ, а не непосредственно с самого входа, что значительно ускоряет процесс обработки данных.

Временем сканирования называют общую продолжительность рабочего цикла микроконтроллера. Время сканирования во многом зависит от длины фазы пользовательской программы. Время, которое занимается остальными фазами рабочего цикла практически всегда остается постоянным. Для задач среднего объема в ПЛК с системой исполнения CoDeSys время распределится примерно таким образом – 98% программа пользователя и 2% остальные задачи.

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

Источник

В данной статье будут рассмотрены циклы в языке программирования Си для микроконтроллеров AVR. Будут рассмотрены циклы типа “для” (for) и циклы типа “пока” (while), будет показано как осуществить принудительное прерывание цикла и организовать бесконечный цикл. Рассмотрены вопросы вложенных циклов и формирования длительных временных задержек.

Структура цикла с предусловием

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

В языке С есть две разновидности циклов: циклы со счетчиком (типа “для” или for) и цикл с условием (типа “пока” или while). В других языках программирования, например Pascal, циклы с условием разделялись на циклы с предусловием (типа while) и циклы с пост условием (типа repeat until), но в современных языках программирования циклы с пост условием постепенно отмирают.

Циклы типа “для” (for)

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

За сколько циклов выполняются команды микроконтроллера

В данном примере тело цикла повторится столько раз, сколько значений “пробежит” переменная цикла i от своего начального значения, задаваемого операцией присваивания i = a, до конечного значения, задаваемого условием i < b. Изменение переменной i определяется условием присваивания вида i = i + c. Но чаще всего в циклах типа for в языке С переменная цикла изменяется за одно повторение цикла на +1 или -1, поэтому используется запись вида i++ (инкремент переменной цикла) или i– (декремент переменной цикла). В рассмотренном примере при i = b цикл завершается и выполняется оператор, следующий за закрывающей скобкой цикла.

Рассмотрим пример цикла for, приведенный на следующем рисунке.

За сколько циклов выполняются команды микроконтроллера

В этом примере на первом шаге цикла переменная i будет равна 1, перед вторым шагом произойдет ее увеличение на 1 в результате инкремента (i++) и она станет равной 2. На третьем шаге значение переменной цикла i будет равно 3. И так до тех пор, пока на пятом шаге цикла она не станет равной 5. В результате следующей операции инкрементирования (i++) переменная цикла получит значение 6, но условие i <= 5 уже не будет истинным, поэтому цикл завершится. Таким образом, тело цикла будет выполнено 5 раз.

Читайте также:  Что такое цикл эвуляции

Язык С допускает инициализацию переменной цикла в его оглавлении как показано на следующем рисунке.

За сколько циклов выполняются команды микроконтроллера

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

Усовершенствуем программу управления миганием светодиода, рассмотренную в статье про программирование портов микроконтроллеров AVR, с помощью цикла типа “для” (for). Заставим светодиод мигать 10 раз.

Пример подобной программы представлен на следующем рисунке.

Программа для мигания светодиодом 10 раз

Циклы типа “пока” (while)

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

while (условие)

{

// тело_цикла

}

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

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

Пример:

int y;

y = 50;

while (y > 0)

{

y = y – 1;

}

В этом примере тело цикла будет повторено (выполнится) 50 раз, до тех пор пока переменная y будет больше нуля. На каждом шаге цикла значение переменной y будет уменьшаться на 1. И когда оно станет равным 0, цикл завершится.

Оператор break

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

В большинстве случаев он используется следующим образом:

if (условие1) break;

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

Бесконечные циклы

Бесконечный цикл в языке программирования С можно осуществить как с помощью цикла “для” (for), так и с помощью цикла “пока” (while). Синтаксис подобных циклов выглядит следующим образом.

for(;;)

{

// тело_цикла

}

или

while (1)

{

// тело_цикла

}

Чаще применяется способ с циклом типа while – он более нагляден. Выйти из подобных циклов можно единственным образом – применив рассмотренный в предыдущем разделе оператор break.

Бесконечные циклы находят широкое распространение в программах для микроконтроллеров, потому что данные программы должны, как правило, работать постоянно до тех пор, пока устройство не обесточат. Много примеров подобных программ вы можете найти на нашем сайте в рубрике “схемы и устройства на микроконтроллерах AVR”.

Вложенные циклы

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

Пример вложенного цикла в языке С

Рассмотрим пример двух вложенных друг в друга циклов “для”. Тело вложенного цикла в общей сложности будет повторено 200 раз.

В этом примере тело вложенного цикла будет выполнено 200 раз.

Формирование задержки

Аппаратные средства микроконтроллеров AVR не могут формировать длительные задержки – но это, собственно говоря, не очень и нужно потому что сколь угодно длительную задержку можно организовать с помощью циклов (лишь бы имелась возможность формирования хотя бы небольшой задержки). Пример организации задержки длительностью 10 минут с помощью цикла и функции _delay_ms() представлен на следующем рисунке:

Пример организации длительной задержки для микроконтроллеров AVR

Источник

5.2. Микроконтроллеры подгруппы PIC16F8X

5.2.1. Основные характеристики

Микроконтроллеры подгруппы PIC16F8X относятся к семейству 8-разрядных КМОП микроконтроллеров группы PIC16CXXX, для которых характерны низкая стоимость, полностью статическая КМОП-технология и высокая производительность.

В состав подгруппы входят МК PIC16F83, PIC16CR83, PIC16F84 и PIC16CR84. Основные характеристики МК подгруппы PIC16F8X приведены в табл. 5.1.

Все микроконтроллеры подгруппы PIC16F8X используют гарвардскую архитектуру с RISC-процессором, обладающую следующими основными особенностями:

  • используются только 35 простых команд;
  • все команды выполняются за один цикл (400 нс при частоте 10 МГц), кроме команд перехода, которые требуют 2 цикла;
  • рабочая частота 0 Гц … 10 МГц;
  • раздельные шины данных (8 бит) и команд (14 бит);
  • 512 х 14 или 1024 х 14 память программ, выполненная на ПЗУ или электрически перепрограммируемой Flash- памяти;
  • 15 восьмиразрядных регистров специальных функций (SFR);
  • восьмиуровневый аппаратный стек;
  • прямая, косвенная и относительная адресация данных и команд;
  • 36 или 68 восьмиразрядных регистров общего назначения (GPR) или ОЗУ;
  • четыре источника прерывания:
    • внешний вход RB0/INT ;
    • переполнение таймера TMR0 ;
    • изменение сигналов на линиях порта B ;
    • завершение записи данных в память EEPROM ;
  • 64 x 8 электрически перепрограммируемая EEPROM память данных с возможностью выполнения 1000000 циклов стирания/записи;
  • сохранение данных в EEPROM в течение как минимум 40 лет.

Таблица 5.1. Основные характеристики МК подгруппы PIC16F8X.

ПараметрPIC16F83PIC16CR83PIC16F84PIC16CR84
Максимальная частота, МГц10101010
Flash-память программ, слов5121K
ПЗУ программ, слов5121K
Память данных, байт36366868
Память данных в РПЗУ (EEPROM), байт64646464
ТаймерыTMR0TMR0TMR0TMR0
Число источников прерываний4444
Число линий ввода/вывода13131313
Диапазон напряжений питания, В2,0 – 6,02,0 – 6,02,0 – 6,02,0 – 6,0
Число выводов и тип корпуса18 DIP, SOIC18 DIP, SOIC18 DIP, SOIC18 DIP, SOIC

Микроконтроллеры подгруппы PIC16F8X обладают развитыми возможностями ввода/вывода:

  • 13 линий ввода-вывода с индивидуальной установкой направления обмена;
  • высокий втекающий/вытекающий ток, достаточный для управления светодиодами:
  • максимальный втекающий ток – 25 мА;
  • максимальный вытекающий ток – 20 мА;
  • 8-битный таймер /счетчик TMR0 с 8-битным программируемым предварительным делителем.
Читайте также:  Почему может болеть поясница в середине цикла

Специализированные микроконтроллерные функции включают следующие возможности:

  • автоматический сброс при включении (Power-on-Reset);
  • таймер включения при сбросе (Power-up r);
  • таймер запуска генератора (Oscillator Start-up r);
  • сторожевой (Watchdog) таймер WDT с собственным встроенным генератором, обеспечивающим повышенную надежность;
  • EEPROM бит секретности для защиты кода;
  • экономичный режим SLEEP ;
  • выбираемые пользователем биты для установки режима возбуждения встроенного генератора;
  • последовательное встроенное устройство программирования Flash / EEPROM памяти программ и данных с использованием только двух выводов.

КМОП технология обеспечивает МК подгруппы PIC16F8X дополнительные преимущества:

  • статический принцип работы;
  • широкий диапазон напряжений питания: 2,0 … 6,0 В;
  • низкое энергопотребление:
  • менее 2 мА при 5В и 4МГц;
  • порядка 15 мкА при 2В и 32КГц;
  • менее 1 мкА для SLEEP -режима при 2В.

Микроконтроллеры подгруппы PIC16F8X различаются между собой только объемом ОЗУ данных, а также объемом и типом памяти программ. Наличие в составе подгруппы МК с Flash-памятью программ облегчает создание и отладку прототипов промышленных образцов изделий.

5.2.2. Особенности архитектуры

Упрощенная структурная схема МК подгруппы PIC16F8X приведена на рис. 5.1.

Рис. 5.1. Структурная схема МК подгруппы PIC16F8X.

Архитектура основана на концепции раздельных шин и областей памяти для данных и для команд (гарвардская архитектура). Шина данных и память данных (ОЗУ) – имеют ширину 8 бит, а программная шина и программная память (ПЗУ) имеют ширину 14 бит. Такая концепция обеспечивает простую, но мощную систему команд, разработанную так, что битовые, байтовые и регистровые операции работают с высокой скоростью и с перекрытием по времени выборок команд и циклов выполнения. 14-битовая ширина программной памяти обеспечивает выборку 14-битовой команды в один цикл. Двухступенчатый конвейер обеспечивает одновременную выборку и исполнение команды. Все команды выполняются за один цикл, исключая команды переходов.

Микроконтроллеры PIC16F83 и PIC16CR83 адресуют 512х14 памяти программ, а PIC16F84 и PIC16CR84 – 1Кх14 памяти программ. Вся память программ является внутренней.

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

Назначение выводов МК подгруппы PIC16F8X приведено в табл. 5.2.

Таблица 5.2. Назначение выводов МК подгруппы PIC16F8X.

ОбозначениеТипБуферОписание
OSC1/CLKINIТШ/КМОП1Вход кристалла генератора, RC-цепочки или вход внешнего тактового сигнала
OSC2/CLKOUTOВыход кристалла генератора. В RC-режиме – выход 1/4 частоты OSC1
/MCLRI/PТШСигнал сброса/вход программирующего напряжения. Сброс низким уровнем.
RA0I/OТТЛ

PORTA – двунаправленный порт ввода/вывода

RA4/T0CKI может быть выбран как тактовый вход таймера/счетчика TMR0. Выход с открытым стоком.

RA1I/OТТЛ
RA2I/OТТЛ
RA3I/OТТЛ
RA4I/OТШ
/T0CKI
RB0/INTI/OТТЛ/ТШ2PORTB – двунаправленный порт ввода/вывода. Может быть запрограммирован в режиме внутренних активных нагрузок на линию питания по всем выводам. Вывод RB0/INT может быть выбран как внешний вход прерывания. Выводы RB4…RB7 могут быть программно настроены как входы прерывания по изменению состояния на любом из входов. При программировании МК RB6 используется как тактовый, а RB7 как вход/выход данных.
RB1I/OТТЛ
RB2I/OТТЛ
RB3I/OТТЛ
RB4I/OТТЛ
RB5I/OТТЛ
RB6I/OТТЛ/ТШ3
RB7I/OТТЛ/ТШ4

Таблица 5.2. Назначение выводов МК подгруппы PIC16F8X (продолжение).

ОбозначениеТипБуферОписание
VddPПоложительное напряжение питания
VssPОбщий провод (земля)
В таблице использованы следующие обозначения: I – вход; O – выход; I/O – вход/выход; P – питание; – – не используется; ТТЛ – ТТЛ вход; ТШ – вход триггера Шмитта.

Микроконтроллер содержит 8-разрядное АЛУ и рабочий регистр W. АЛУ является арифметическим модулем общего назначения и выполняет арифметические и логические функции над содержимым рабочего регистра и любого из регистров контроллера. АЛУ может выполнять операции сложения, вычитания, сдвига и логические операции. Если не указано иное, то арифметические операции выполняются в дополнительном двоичном коде.

В зависимости от результата операции, АЛУ может изменять значения бит регистра US: C (Carry), DC (Digit carry) и Z (Zero).

5.2.3. Схема тактирования и цикл выполнения команды

Входная тактовая частота, поступающая с вывода OSC1/CLKIN, делится внутри на четыре, и из нее формируются четыре циклические не перекрывающиеся тактовые последовательности Q1, Q2, Q3 и Q4. Счетчик команд увеличивается в такте Q1, команда считывается из памяти программы и защелкивается в регистре команд в такте Q4. Команда декодируется и выполняется в течение последующего цикла в тактах Q1…Q4. Схема тактирования и выполнения команды изображена на рис. 5.2.

Цикл выполнения команды состоит из четырех тактов: Q1…Q4 . Выборка команды и ее выполнение совмещены по времени таким образом, что выборка команды занимает один цикл, а выполнение – следующий цикл. Эффективное время выполнения команды составляет один цикл. Если команда изменяет счетчик команд (например, команда GOTO ), то для ее выполнения потребуется два цикла, как показано на рис. 5.3.

Рис. 5.2. Схема тактирования и выполнения команды.

Рис. 5.3. Выборка команд.

Цикл выборки начинается с увеличения счетчика команд в такте Q1. В цикле выполнения команды выбранная команда защелкивается в регистр команд в такте Q1. В течение тактов Q2, Q3 и Q4 происходит декодирование и выполнение команды. В такте Q2 считывается память данных (чтение операнда), а запись происходит в такте Q4.

Источник