Память программ
В памяти программ хранится двоичный код, составляющий программу, или программное обеспечение (software). Это слово созвучно термину hardware (аппаратные средства) и отражает тот факт, что данный код не связан с каким-либо физическим изменением схемы устройства. В идеале память, в которой находится программа, должна быть такой же быстрой, как и ЦПУ, поэтому для данных целей обычно используется полупроводниковая память, созданная при помощи технологий, подобных рассмотренным в предыдущей главе[47].
Память данных
В памяти данных хранятся данные, используемые во время работы программы. И опять же быстродействие этой памяти обычно сравнимо с быстродействием ЦПУ. Также в адресном пространстве памяти данных могут располагаться специальные регистры, например порты ввода/вывода.
Независимо от своего назначения компьютер должен иметь возможность взаимодействовать с окружающим миром. Хотя обычно вспоминаются такие устройства, как клавиатура и монитор, можно считывать и изменять состояние практически любого физического устройства. Так, данные об объеме топлива, впрыскиваемого в цилиндр двигателя, в совокупности со значением скорости вращения вала могут использоваться для управления моментом зажигания искры в камере сгорания бензинового двигателя.
Все элементы фон-неймановского компьютера соединяются между собой одной общей магистралью передачи данных, или шиной (понятие шины было введено во 2-й главе, см. Рис. 2.4 на стр. 34). Вся информация передается по этим общим линиям в обоих направлениях, при этом ЦПУ играет роль главного контроллера. В компьютере с гарвардской архитектурой память программ имеет отдельную шину данных, что позволяет осуществлять выборку команд одновременно с действиями на шине данных памяти программ. Другие шины используются для передачи адресов различным областям памяти, а также управляющей информации и информации о состоянии (см. Рис. 3.4).
* * *
Микроконтроллеры, которым посвящена эта книга, имеют гарвардскую архитектуру, поэтому дальше мы будем рассматривать только ее. Взяв за основу ЦПУ, показанный на Рис. 2.20 (стр. 49), и добавив к нему память программ, память данных, а также схемы управления и дешифрации, мы получим примитивный компьютер с гарвардской архитектурой (Рис. 3.3). Серым цветом на рисунке выделены элементы исходной схемы с Рис. 2.21, приведенного на стр. 50.
Благодаря подключению шины данных АЛУ к памяти данных, мы получаем возможность считывать из памяти первый операнд, а также при необходимости помещать в нее результат операции. Адрес этого операнда является частью кода команды, считанного из памяти программ и дешифрованного устройством управления. Это же устройство управления формирует сигналы выбора режима АЛУ, который зависит от текущей команды. Результат, получаемый на выходе АЛУ, может быть загружен либо в рабочий регистр (устройство управления формирует импульс на линии W), либо обратно в ту же ячейку памяти, откуда был считан операнд (устройство управления формирует импульс на линии F). Информация об адресате результата операции также содержится в коде команды.
Команды (в виде кодовых слов) обычно располагаются в памяти программ последовательно. Для поочередной адресации каждой команды используется двоичный суммирующий счетчик (см. Рис. 2.24 на стр. 53). Если, предположим, при сбросе компьютера счетчик команд (Program Counter — PC) обнуляется, то первая команда будет расположена по адресу h’000’ памяти программ, вторая — по адресу h’001’ и т. д. (см. Рис. 3.4). Устройство управления просто инкрементирует счетчик после выборки каждой команды. Непосредственно загружая новый адрес в счетчик команд, можно осуществить переход к другому участку кода.
Рис. 3.3. Структура элементарного гарвардского компьютера на системном уровне
47
Однако это не всегда верно — самые первые быстродействующие устройства памяти программ были построены на ферритовых кольцах, которые могли намагничиваться в одном из двух направлений. Память на магнитных сердечниках использовалась с 50-х годов вплоть до начала 70-х, но и до сих пор в литературе можно встретить термин