Глава 17
Автоматизация
Род человеческий наделен удивительной смекалкой и усерди-
ем, но в то же время чудовищно ленив. Не открою страшной
тайны, сказав, что работать люди не любят. Наше отвращение
к труду столь сильно, а ум столь изобретателен, что мы гото-
вы посвящать бесчисленные часы проектированию и сборке
устройств, которые на пару минут сократят рабочий день. И
ошеломляюще воздействует на мозговой центр удовольствий
волшебная греза: я блаженно раскачиваюсь в гамаке, а агрегат,
только что собранный мною по последнему слову техники,
подстригает лужайку перед домом.
Не надейтесь, что на ближайших страницах вам попадутся
чертежи автоматической газонокосилки. Вам предстоит позна-
комиться с набором устройств куда более сложных, посред-
ством которых я намерен автоматизировать сложение и вы-
читание. Знаю: звучит это не слишком внушительно. И все же
к концу главы в нашем распоряжении появится устройство,
способное решить практически любую задачу, в которой ис-
пользуется сложение и вычитание, а круг таких задач гораздо
шире, чем вы представляете.
Конечно, разнообразие внешних функций подразумевает
внутреннюю сложность, и потому путь, по которому нам пред-
стоит идти, не всегда будет гладким. Никто не обвинит вас,
если несколько особо запутанных страниц вы пролистаете, не
читая. Временами вам будет хотеться стукнуть кулаком по сто-
250
Глава семнадцатая
лу и поклясться страшной клятвой никогда не прибегать к
помощи электрических и механических приспособлений для
решения математических задач. Но не сдавайтесь — устрой-
ство, которое мы соберем, может с полным правом именовать-
ся компьютером.
Последнюю модель сумматора мы разработали в главе 14.
В эту модель входила 8-битовая защелка, в которой накапли-
валась сумма чисел, вводимых с помощью набора из 8 пере-
ключателей:
8
V
8
V
Clr
Clk
8-битовая
защелка
8
Лампочки
Сложить
CI
8-битовый
сумматор
Переключатели
8
Очистка
B
A
S
DO
DI
Как вы помните, в защелке с помощью триггеров сохраняется
8-битовое значение. Чтобы задействовать сумматор, на мгно-
вение нажмите кнопку Очистка, чтобы записать в защелку 8
нулей, а затем введите с помощью переключателей первое чис-
ло и нажмите кнопку Сложить. Сумматор прибавит его к ну-
левому содержимому защелки, получив в результате все то же
введенное число. Оно будет отображено лампочками. Введите
с помощью переключателей второе число и снова нажмите
кнопку Сложить. Сумматор прибавит введенное значение к
содержимому защелки, запишет в защелку текущий резуль-
тат суммирования и отобразит его с помощью лампочек. Та-
ким образом вы можете складывать длинные ряды чисел, по-
мня, естественно, об ограничении — с помощью 8 лампочек
нельзя отобразить число, превышающее 255.
251
Автоматизация
К тому времени, когда я в главе 14 показал вам эту схему,
мы успели познакомиться только с защелками со срабатыва-
нием по уровню. В такой защелке запись входного сигнала осу-
ществляется, когда сигнал Clk обращается сначала в 1, а потом
в 0. Пока сигнал Clk равен 1 все изменения входного сигнала
отражаются на содержимом защелки. Потом в той же главе
мы узнали еще об одном типе защелок — со срабатыванием
по фронту. В таких защелках входной сигнал сохраняется в
краткий промежуток времени, когда значение сигнала Clk ме-
няется с 0 на 1. Защелками со срабатыванием по фронту легче
пользоваться, поэтому далее я буду предполагать, что нам
встречаются защелки только этого типа.
Защелка, применяемая для хранения текущего значения
суммы, называется аккумулятором (accumulator). Чуть позже
мы убедимся, что накоплением суммы роль аккумулятора не
ограничивается. В нем часто сначала хранится исходное чис-
ло, а потом результат произведенного над этим числом дей-
ствия (сложения или вычитания).
Недостаток показанного сумматора очевиден. Допустим, вам
нужно найти сумму 100 двоичных чисел. Вы подсаживаетесь к
сумматору и усердно вводите всю сотню число за числом. И вот,
когда работа закончена, вдруг оказывается, что пару чисел из
списка вы ввели неправильно. Придется начинать все сызнова.
Или не придется? В главе 16 мы узнали, как из 5 миллионов
реле собрать память RAM объемом 64 кб, и разработали пульт
для работы с этой памятью. На этом пульте есть переключатель
Перехват, позволяющий перехватывать управление памятью и
вручную изменять ее содержимое с помощью тумблеров.
Ввод данных
DI
8
Addr
Вывод
данных
Запись
W
DO
Адрес
16
8
Пульт управления
64K
×
8
RAM
252
Глава семнадцатая
Если бы вы ввели 100 ваших слагаемых в память, а не пря-
мо в сумматор, исправить ошибки было бы куда легче.
Итак, перед нами нелегкая задача: подключить память RAM
к сумматору с накоплением суммы. Совершенно ясно, что
вместо переключателей к сумматору нужно подключить вы-
ходы DO массива памяти. А вот возможность управлять ад-
ресными входами памяти с помощью двоичного счетчика (мы
познакомились с ним в главе 14) уже не так очевидна. Сигна-
лы массива DI и Запись в этой схеме не нужны:
Clk
Clr
8-битовая
защелка
8
Лампочки
Очистка
Addr
DO
16
8
16-битовый
счетчик
Clk
Clr
Вибратор
8
V
8
CI
8-битовый
сумматор
Пульт
управления
B
A
S
DI
DO
64K
×
8
RAM
Смело утверждаю, что людям случалось изобретать вычис-
лительные устройства и поудобнее. Чтобы воспользоваться
этой штукой, вы должны прежде всего замкнуть переключа-
тель Очистка, тем самым обнулив содержимое защелки и ус-
тановив выходной сигнал 16-битового счетчика в 0000h. За-
тем замкнем переключатель Перехват на пульте управления
памятью и введем первое слагаемое в память по адресу 0000h.
Если вы собираетесь сложить 100 чисел, они займут в памяти
адреса с 0000h по 0063h. По всем неиспользованным адресам
должны быть записаны нули. Разомкните переключатель Пе-
рехват на пульте управления памятью (чтобы вернуть сумма-
253
Автоматизация
тору доступ к памяти) и переключатель Очистка. А теперь рас-
слабьтесь и получайте удовольствие от созерцания мигающих
лампочек!
А чтобы вы при этом не скучали, я расскажу, что именно
происходит в сумматоре. В момент размыкания переключате-
ля Очистка текущий адрес памяти равен 0000h. На один из
входов сумматора подается сохраненная по этому адресу ве-
личина. На второй вход подается число 00h, поскольку содер-
жимое защелки также очищено.
Вибратор подает в схему синхронизирующий сигнал, т. е.
сигнал, осциллирующий между 0 и 1. Если переключатель
Очистка разомкнут, при переходе синхронизирующего сигнала
из 0 в 1 одновременно происходят две вещи. Во-первых, в за-
щелку записывается результат суммирования, во-вторых, вы-
ход счетчика увеличивается на 1, указывая теперь на следую-
щую ячейку памяти. Когда сигнал вибратора переходит из 0 в
1 в первый раз после размыкания переключателя Очистка, в
защелку записывается первое слагаемое, а выход счетчика об-
ращается в 0001h. Во второй раз в защелку записывается сум-
ма первого и второго слагаемых, а сигнал на выходе счетчика
становится 0002h. И т. д.
Конечно, для работы этой схемы требуется соблюдение
некоторых условий. Например, колебания сигнала вибратора
должны происходить достаточно медленно, чтобы схема ус-
певала на них реагировать. Ведь каждое изменение синхрони-
зирующего сигнала приводит в действие множество реле, ко-
торые переключают другие реле и т. д.
У этой схемы есть и крупный недостаток: мы не в состоя-
нии остановить ее работу! В какой-то момент лампочки пере-
станут мигать, так как, начиная с некоторой ячейки, в памяти
хранятся одни нули. Но когда счетчик достигнет значения
FFFFh, он обнулится, совсем как счетчик километров на спи-
дометре автомобиля, и сумматор начнет прибавлять те же сла-
гаемые к уже посчитанной сумме.
Этот не единственный недостаток. Наш сумматор спосо-
бен только складывать и работает только с 8-битовыми значе-
ниями. Величиной 255 ограничены как числа, записанные в
память, так и их сумма. Если вы решите реализовать не только
сложение, но и вычитание (с помощью дополнений до 2), дос-
тупный вам диапазон будет ограничен значениями от –128 до
254
Глава семнадцатая
127. Очевидный способ научить сумматор работать с больши-
ми числами (например, 16-битовыми) — удвоить ширину
массива RAM, сумматора, защелки, а также добавить на пульт
управления 8 лампочек. Но давайте считать, что к такому вло-
жению капитала вы пока не готовы.
Конечно, я не заговорил бы об этих проблемах, если бы не
собирался в конце концов решить их. Но давайте пока сформу-
лируем еще одну проблему. Что если сумма сотни слагаемых
вас не интересует, а хочется вам сложить 100 чисел попарно,
получив 50 различных сумм? Что если вам хочется машину,
которой можно было бы указывать, как именно нужно разбить
сотню чисел на суммы? Причем все результаты суммирования
должны сохраняться для последующего использования.
Автоматический сумматор, с которым мы работали до сих
пор, с помощью лампочек, подключенных к защелке, отобра-
жает только текущее значение суммы. От этих лампочек мало
проку, если вам нужно просмотреть 50 сумм, полученных в
результате попарного суммирования 100 слагаемых. Удобнее
записывать эти суммы обратно в память. С помощью пульта
управления памятью вы потом просмотрите эти числа в лю-
бое удобное для вас время. Специально для таких случаев на
пульте управления памятью предусмотрен собственный набор
лампочек.
Но это значит, что от лампочек, подключенных к защелке,
мы и вовсе можем отказаться. Подключим выходы защелки
вместо лампочек ко входам массива RAM, чтобы результаты
суммирования записывались прямо в память.
Из схемы, показанной на следующей странице, я также уда-
лил некоторые другие компоненты сумматора, а именно виб-
ратор и переключатель Очистка. Я сделал это потому, что те-
перь уже не так очевидно, откуда на счетчик и защелку посту-
пают сигналы Clk и Clr. Кроме того, мы задействовали входы
массива RAM, а значит нам понадобится вход W (Запись).
Но давайте не будем пока тревожиться о деталях схемы, со-
средоточившись вместо этого на проблеме, которую пытаемся
решить. Нам нужно изменить конфигурацию сумматора так,
чтобы его функции не ограничивались простым накоплением
суммы набора чисел. Мы хотим полной свободы в выборе ко-
личества слагаемых и количества сумм, которые мы собираем-
ся записывать в память для дальнейшего использования.
255
Автоматизация
Clk
Clr
Clk
Clr
8-битовая
защелка
8
Addr
DO
16
8
8
CI
8-битовый
сумматор
Пульт
управления
DI
8
W
B
A
S
DO
DI
16-битовый
счетчик
64K
×
8
RAM
Допустим, нам нужно найти три суммы: трех слагаемых,
двух слагаемых и еще трех слагаемых. Представим себе, что
мы ввели все слагаемые в память, начиная с адреса 0000h. Со-
держимое памяти после этого выглядит так:
27h
A2h
18h
1Fh
89h
33h
2Ah
55h
0000h:
0004h:
0007h:
Первую сумму запишем сюда
Вторую сумму запишем сюда
Третью сумму запишем сюда
Именно так я буду показывать содержимое памяти. Прямо-
угольники представляют собой отдельные ячейки памяти.
Каждый байт находится в своей ячейке. Адрес ячейки указан
256
Глава семнадцатая
слева. Все адреса указывать нужды нет, так как они идут пос-
ледовательно друг за другом, и вы всегда легко подсчитаете,
чему равен отсутствующий адрес. Справа указаны пояснения
к содержимому памяти. В данном случае я отметил, что сум-
матор должен записывать суммы в пустые ячейки. (Кстати, на
самом деле память не бывает пустой. Она всегда что-то содер-
жит, даже если это что-то — случайное сочетание битов. Важ-
но, что в данный момент эти ячейки не содержат нужной ин-
формации.)
Я знаю, вы сейчас боретесь с искушением попрактиковать-
ся в шестнадцатеричной арифметике и заполнить пустые ячей-
ки самостоятельно. Но не забывайте, что наша задача не в этом.
Мы хотим, чтобы сложением вместо нас занимался автомати-
ческий сумматор.
До сих пор он выполнял единственное действие: склады-
вал содержимое ячейки памяти с содержимым 8-битовой за-
щелки, которую я назвал аккумулятором. Но этого мало —
теперь он должен выполнять четыре различных операции. Что-
бы начать сложение, сумматор должен переписать содержи-
мое ячейки памяти в аккумулятор. Эту операцию я буду назы-
вать загрузкой. Второе действие — сложить байт из памяти с
содержимым аккумулятора. В-третьих, мы должны сохранить
в памяти сумму из аккумулятора. Наконец, надо как-то оста-
новить работу сумматора.
Если разобрать эту последовательность по косточкам, то
в данном конкретном примере сумматор должен сделать сле-
дующее:
•
загрузить значение из ячейки 0000h в аккумулятор;
•
сложить значение из ячейки 0001h с аккумулятором;
•
сложить значение из ячейки 0002h с аккумулятором;
•
сохранить значение из аккумулятора в ячейке 0003h;
•
загрузить значение из ячейки 0004h в аккумулятор;
•
сложить значение из ячейки 0005h с аккумулятором;
•
сохранить значение из аккумулятора в ячейке 0006h;
•
загрузить значение из ячейки 0000h в аккумулятор;
•
сложить значение из ячейки 0001h с аккумулятором;
•
сложить значение из ячейки 0002h с аккумулятором;
•
сохранить значение из аккумулятора в ячейке 0003h;
•
остановить работу.
257
Автоматизация
Заметьте: как и в исходном сумматоре, байты в памяти адре-
суются последовательно, начиная с адреса 0000h. Раньше ис-
пользование памяти сводилось к тому, что содержимое кон-
кретной ячейки складывалось с содержимым аккумулятора.
Потребность в этой функции сохранилась и теперь. Но в до-
полнение к ней мы хотим иногда прямо загружать в аккуму-
лятор значение из памяти или сохранять в памяти значение из
аккумулятора. Кроме того, сумматор, закончив работу, дол-
жен остановиться и дать нам возможность проверить содер-
жимое памяти.
Как этого достичь? Не ждем же мы, что сумматор сам сооб-
разит, что делать с введенными в память числами. Каждое чис-
ло в памяти нужно сопроводить кодом, который указывал бы
сумматору нужное действие: загрузить, сложить, сохранить
или остановить.
Вероятно, проще всего (хотя и не дешевле всего) завести
для решения этой задачи отдельный массив RAM, доступ к
которому будет осуществляться одновременно с первым. Толь-
ко содержать он будет не складываемые числа, а коды, симво-
лизирующие действия, которые сумматор должен выполнять
с заданными ячейками памяти. Будем называть старый мас-
сив Данные, а новый — Коды.
DO
8
Пульт
управления
Пульт
управления
Addr
DO
8
Коды
Данные
8
16
DI
Addr
16-битовый
счетчик
W
64K
×
8
RAM
64K
×
8
RAM
258
Глава семнадцатая
Мы уже разобрались, что в новом автоматическом сумматоре
нам понадобится возможность записи чисел в массив Данные.
Доступ к массиву Коды, напротив, будет осуществляться толь-
ко с пульта управления.
Для четырех действий, выполнения которых мы ожидаем
от сумматора, нам понадобятся четыре кода. Коды эти в прин-
ципе произвольны. Например, они могут быть такими:
Действие
Код
Загрузить
10h
Сохранить
11h
Сложить
20h
Остановить
FFh
Для выполнения троекратного сложения в нашем примере вы
должны с помощью пульта управления записать в массив Коды
такие значения:
10h
20h
20h
10h
20h
10h
20h
20h
0000h:
0004h:
0007h:
Сохранить
Сохранить
Сохранить
11h
11h
11h
FFh
Загрузить
Сложить
Сложить
Загрузить
Сложить
Загрузить
Сложить
Сложить
Остановить
000Bh:
Сравните содержимое этого массива с массивом Данные, ко-
торый содержит числа для сложения. Каждому коду в массиве
Коды соответствует число из массива Данные, которое нужно
загрузить в аккумулятор или сложить с его содержимым, или
пустая ячейка, в которую нужно поместить значение из акку-
259
Автоматизация
мулятора. Используемые таким образом численные коды на-
зываются кодами команд (instruction code), или кодами опера-
ций. Они «командуют» схеме выполнить определенную «опе-
рацию».
Раньше я уже упоминал, что выход 8-битовой ячейки дол-
жен быть входом массива Данные. Это необходимо для вы-
полнения команды Сохранить. Необходимо и другое измене-
ние. Поначалу входом 8-битовой защелки был выход 8-бито-
вого сумматора. Однако для выполнения команды Загрузить
вход 8-битовой защелки иногда должен соединяться с выхо-
дом массива Данные. Нам, очевидно, нужен селектор 2 линии
на 1. Исправленная схема сумматора выглядит так:
Clk
Clr
Clk
Clr
S
8-битовая
защелка
8
8
8
CI
8-битовый
сумматор
DO
8
Пульт
управления
Пульт
управления
Addr
DO
Коды
Данные
16
DI
Селектор «2 на 1»
8
Addr
16-битовый
счетчик
W
64K
×
8
RAM
64K
×
8
RAM
260
Глава семнадцатая
В этой схеме все еще много не хватает, но все 8-битовые кана-
лы между различными компонентами показаны. Адреса для
двух массивов RAM выдает 16-битовый счетчик. Выход мас-
сива Данные, как обычно, соединен со входом сумматора для
выполнения команды Сложить. На вход 8-битовой защелки
сигнал подается либо с выхода массива Данные (для выполне-
ния команды Загрузить), либо с выхода сумматора (для вы-
полнения команды Сложить). Вот здесь-то и нужен селектор
«2 на 1». Выход защелки, как обычно, возвращается на вход
сумматора, но он же является и входом массива Данные (для
выполнения команды Сохранить).
Чего на этой схеме нет, так это сущего пустяка — сигна-
лов, которые руководили бы работой всех компонентов, т. е.
управляющих сигналов (control signals). К ним относятся входы
Clk и Clr 16-битового счетчика, входы Clk и Clr защелки, вход
W массива данные и вход S селектора «2 на 1». Некоторые из
этих сигналов, очевидно, будут определяться содержимым
массива Коды. Например, на вход S селектора «2 на 1» подает-
ся 0 (выбрано поступление данных из памяти), если в теку-
щей ячейке массива Коды записана команда Загрузить. Вход
W массива Данные обращается в 1, только если в текущей ячей-
ке массива Коды содержится команда Сохранить. Эти управ-
ляющие сигналы можно генерировать с помощью различных
комбинаций логических вентилей.
Еще немного оборудования и новая команда позволят нам,
используя ту же схему, вычитать число из содержимого акку-
мулятора. Начнем с расширения таблицы кодов команд.
Команда
Код
Загрузить
10h
Сохранить
11h
Сложить
20h
Вычесть
21h
Остановить
FFh
Коды команд Сложить и Вычесть отличаются только младшим
битом — обозначим его C
0
. Если текущий код команды равен
21h, схема осуществляет те же действия, что и при выполне-
нии команды Сложить, только на этот раз данные из памяти
261
Автоматизация
перед поступлением в сумматор инвертируются, и вход сум-
матора для переноса (CI) устанавливается в 1. Обе эти задачи
можно решить с помощью сигнала C
0
при условии, что в кон-
струкцию сумматора добавлен инвертор:
Clk
Clr
Clk
Clr
S
8-битовая
защелка
8
8
8
CI 8-битовый
сумматор
DO
8
Addr
DO
Коды
Данные
16
DI
Селектор «2 на 1»
8
Инвертор
8
Addr
16-битовый
счетчик
C
0
W
Пульт
управления
Пульт
управления
64K
×
8
RAM
64K
×
8
RAM
Допустим теперь, что нам нужно сложить числа 56h и 2Ah,
а затем вычесть из суммы число 38h. Для решения этой задачи
в массивы Данные и Коды записываются такие числа:
|