Последний рассмотренный нами сумматор был описан в главе 14. Эта версия включала 8-битную защелку, где накапливалась общая сумма чисел, введенных с помощью набора из восьми переключателей.
Как вы помните, 8-битная защелка использует триггеры для хранения 8-битного значения. Чтобы использовать это устройство, на мгновение нажмите кнопку «Очистка» для обнуления содержимого защелки. Затем с помощью переключателей введите первое число. Сумматор просто прибавит его к нулевому значению на выходе защелки, поэтому результатом будет введенное число. При нажатии кнопки «Сложить» это число сохранится в защелке и отобразится лампочками. Теперь с помощью переключателей введите второе число. Сумматор прибавит его к уже сохраненному в защелке.
Нажатие кнопки «Сложить» снова приводит к сохранению общей суммы в защелке и ее отображению с помощью лампочек. Так вы можете сложить множество чисел, отображая общую сумму, которая, правда, ограничена числом 255 при использовании восьми лампочек.
Когда я продемонстрировал эту схему в главе 14, вам было известно только о защелках со срабатыванием по уровню. Для сохранения данных в такой защелке нужно, чтобы значение входного сигнала Clk стало равным 1, а затем 0. Пока вход Clk — 1, сигналы на входах защелки для данных могут меняться, и эти изменения будут влиять на ее содержимое. Чуть позже я познакомил вас с защелками со срабатыванием по фронту, которые сохраняют данные в краткий промежуток времени, пока входной сигнал Clk изменяется с 0 на 1. Защелки со срабатыванием по фронту немного проще, поэтому в этой главе при описании защелок буду предполагать, что речь идет о защелках именно этого типа.
Защелка, применяемая для хранения текущего значения суммы, называется аккумулятором или накопителем. Однако далее мы увидим, что аккумулятору нет необходимости просто накапливать сумму. Часто это защелка, где сначала сохраняется одно число, а затем результат сложения или вычитания из него другого числа.
У показанной выше счетной машины существует серьезный недостаток, который сразу бросается в глаза. Допустим, существует список из 100 двоичных чисел, которые вы хотите сложить. Вы садитесь перед сумматором, старательно вводите каждое число и накапливаете сумму. По окончании процедуры обнаруживаете, что несколько чисел в списке были неправильными. В этом случае вам придется начинать все сначала.
А может, и нет. В предыдущей главе мы использовали около пяти миллионов реле для создания массива RAM емкостью 64 килобайта. Кроме того, мы собрали пульт управления, который позволяет замкнуть переключатель «Перехват» и фактически перехватить управление массивом RAM, чтобы производить запись и чтение данных с помощью переключателей.
Если бы вы ввели все 100 двоичных чисел в этот массив RAM, а не напрямую в сумматор, то сделать несколько исправлений было бы проще.
Итак, теперь перед нами стоит задача подключить массив RAM к сумматору, аккумулирующему итоговое значение. Очевидно, что вместо сигналов от переключателей на вход сумматора можно подать выходные сигналы массива RAM (DO), однако легко упустить тот факт, что 16-битный счетчик (вроде собранного в главе 14) способен управлять адресными сигналами. Сигналы массива RAM «Ввод данных» (DI) и «Запись» в этой схеме отсутствуют за ненадобностью.
Разумеется, это не самое простое счетное устройство. Перед его использованием нужно замкнуть переключатель «Очистка». При этом содержимое защелки обнуляется, а для выходного сигнала 16-битного счетчика задается значение 0000h. Затем вы замыкаете переключатель «Перехват» на пульте управления массивом RAM, после чего можете записать в память набор подлежащих сложению 8-битных чисел, начиная с адреса 0000h. Если собираетесь суммировать 100 чисел, сохраните их в ячейках памяти с адресами 0000h–0063h. Кроме того, вы должны записать значение 00h во все неиспользуемые ячейки памяти. Затем можете разомкнуть переключатель «Перехват» на пульте управления массивом RAM, чтобы снова передать сумматору управление памятью, а также разомкнуть переключатель «Очистка». Теперь можно расслабиться и любоваться мигающими лампочками.
Вот что происходит при совершении вышеописанных действий: при первом размыкании переключателя «Очистка» текущим адресом массива RAM является 0000h. Восьмибитное значение, сохраненное в ячейке по этому адресу, подается на один из входов сумматора. На другой вход подается значение 00h, поскольку содержимое защелки также обнулено.
Осциллятор генерирует тактовый сигнал, или синхросигнал, который быстро колеблется между значениями 0 и 1. После размыкания переключателя «Очистка» при каждом изменении синхросигнала с 0 на 1 одновременно происходят две вещи: в защелке сохраняется сумма из сумматора, а значение 16-битного счетчика увеличивается на единицу, то есть происходит обращение к следующему адресу в массиве RAM. При первом изменении значения синхросигнала с 0 на 1 после размыкания переключателя «Очистка» в защелке сохраняется первое число, а значение счетчика изменяется на 0001h. Во второй раз в защелке сохраняется сумма первого и второго чисел, а значение счетчика изменяется на 0002h. И так далее.
Разумеется, здесь я делаю некоторые допущения. Прежде всего предполагается, что частота колебаний осциллятора достаточно низкая, чтобы остальные компоненты схемы успевали сработать. При каждом изменении значения синхросигнала одни многочисленные реле должны активировать другие, чтобы на выходе сумматора появилось значение суммы.
Одна из проблем этой схемы в том, что мы не можем остановить ее работу. В какой-то момент лампочки перестанут мигать потому, что в оставшихся ячейках памяти хранится значение 00h. Тогда вы сможете считать двоичную сумму. Когда счетчик достигнет значения FFFFh, он обнулится (подобно одометру автомобиля), и автоматический сумматор снова начнет прибавлять числа к полученной ранее сумме.
У этого сумматора есть и другие недостатки. Он способен производить только сложение 8-битных чисел. Мало того, что в массиве RAM нельзя сохранить число больше 255, — сама сумма также ограничена значением 255. Кроме того, наш сумматор не способен производить вычитание, хотя вы можете выразить отрицательные числа с помощью дополнения до двух, в случае чего сумматор будет обрабатывать числа только в диапазоне от –128 до 127. Очевидно, что для суммирования больших значений (например, 16-битных) требуется удвоить ширину массива RAM, сумматора и защелки, а также добавить еще восемь лампочек. Однако к таким инвестициям вы можете оказаться не готовы.
Конечно, я бы даже не упомянул об этих проблемах, если бы не был уверен, что они решаемы. Осложнение, на котором я хотел бы сосредоточить ваше внимание в первую очередь, заключается в другом. Что, если вас не интересует одна сумма 100 чисел и вы хотите использовать сумматор для сложения 50 пар чисел и получения 50 разных сумм? Что, если вам нужна машина, способная складывать числа группами по два, десять и т. д., а также предоставлять удобный доступ к результатам своей работы?