Рис. 4.1. Архитектура микроконтроллера PIC16F84
Блок выборки, показанный отдельно на Рис. 4.2, предназначен для выборки команд из памяти программ и загрузки их в конвейер. Адрес каждой извлекаемой команды задается счетчиком команд. В свою очередь код операции, выделенный из кода команды, подается на вход дешифратора команд, который активирует в требуемой последовательности соответствующие узлы исполнительного блока.
Рис. 4.2. Блок выборки микроконтроллера PIC16F84
Память программ
Основным элементом блока выборки является память программ. Программное обеспечение во встраиваемых системах фиксировано, поскольку после включения питания микроконтроллер должен сразу же приступить к выполнению своих задач, не тратя время на загрузку программы. Поэтому память программ, как правило, реализуется в виде ПЗУ какого-либо типа. В большинстве микроконтроллеров PIC используется многократно-программируемое ПЗУ; если в обозначении модели присутствует буква «F», то это FLASH-память. В памяти программ микроконтроллера PIC16F84 может храниться до 1024 команд, размер каждой из которых составляет 14 бит (см. Рис. 3.5 на стр. 68). В новых микроконтроллерах семейства среднего уровня размер памяти программ колеблется от 1024 (например, PIC16F627) до 8192 (PIC16F876/7) команд.
Счетчик команд
Счетчик команд (Program Counter — PC) используется для адресации, или указания, считываемой из памяти программ команды. Этот 13-битный регистр обычно инкрементируется после каждой выборки, функционируя как двоичный счетчик. Однако, как мы с вами увидим в следующей главе, существует ряд команд, таких как команда goto, выполнение которых вызывает переход к другому месту в памяти программ. Соответственно, нормальное функционирование счетчика команд нарушается. Кроме того, программист может напрямую обращаться к счетчику команд через память данных (см. Рис. 4.8).
Несмотря на то что показанный на Рис. 4.3 счетчик команд является 13-битным регистром, способным адресовать 213 = 8192 команды, в микроконтроллере PIC16F84 задействованы только младшие 10 бит (210 = 1024). Если программа попытается перейти по адресу, находящемуся вне этого диапазона, то адрес «свернется» по границе памяти программ. В любом случае счетчик команд очищается при сбросе микроконтроллера, т. е. первая выполняемая команда всегда располагается по адресу h’000’. Этот адрес называется вектором сброса.
Рис. 4.3. Память программ микроконтроллера PIC16F84
Конвейер
Конвейер реализован в виде двух 14-битных регистров. В первом регистре хранится команда, только что считанная из памяти программ по адресу, определяемому значением счетчика команд. Второй регистр подключен к дешифратору команд и соответственно содержит исполняемую в данный момент команду. Такое решение позволяет осуществлять выборку команды одновременно с исполнением команды, выбранной в предыдущем цикле. Естественно, при этом предполагается, что последовательность выполнения команд имеет линейный характер. Для команд, выполняющих переход к другому месту памяти программ, команда, находящаяся на вершине конвейера, должна быть заменена на другую. Этот процесс называется сбросом конвейера и увеличивает время исполнения команды на один цикл. Как видно из Рис. 4.4, обычно команда выполняется за один машинный цикл.
Рис. 4.4. Фазы машинного кода
Дешифратор команд
Дешифратор команд представляет собой логическую схему, которая декодирует каждое поле 14-битного слова команды и управляет передачей соответствующих адресов и данных на требуемые входы исполнительного блока, а также конфигурирует АЛУ.
Все модели микроконтроллеров PIC имеют встроенный генератор, задающий последовательность выполнения внутренних микроопераций в соответствии с сигналами, поступающими от дешифратора команд. В качестве времязадающего элемента обычно используется внешний кварцевый резонатор, подключаемый к выводам OSC1 и OSC2 микроконтроллера (Рис. 4.2). Именно этот резонатор определяет тактовую частоту микроконтроллера fOSC. Более подробно о генераторе мы поговорим в главе 10. Максимальная тактовая частота большинства моделей среднего уровня составляет 20 МГц, однако в некоторых ранних моделях частота не могла превышать 10, а то и 4 МГц. Минимальная тактовая частота ничем не ограничена.