Поиск
Логин:
Doublebrick - Российское сообщество энтузиастов конструкторов LEGO!

Механические вычислительные машины из LEGO

Избранная статья! Статья | 05.02.2011 | 04:24 | Автор: Delian  |  |  |  | 

Механические вычислительные машины из LEGO

Однажды в википедии я наткнулся на ссылки на модели машин Беббиджа, собранных из ЛЕГО и Meccano, и решил, что было бы неплохо попробовать тоже собрать нечто подобное. Разобраться в этих моделях настолько, чтобы сделать точно так же, очень сложно, поэтому я решил рассмотреть существующие реализации компонентов механических вычислительных машин, и здесь описать основные идеи.

Представление чисел

Для представления одного разряда используется колесо с цифрами от 0 до n-1, где n – основание системы счисления. С этим колесом связана шестеренка с числом зубцов, кратным n. К - число зубцов, такое, что при повороте на k зубцов, значение разряда увеличивается на 1. Такм образом, у этой шестеренки k*n зубцов. Благодаря замечательной 40-зубой шестеренке Лего предоставляет возможность собрать машину с десятичным представлением чисел, но, ввиду отсутствия у меня такого количества 40-зубых шестерней, и для простоты, я буду использовать четверичную систему, так как все лего-шестерни имеют число зубцов, кратное 4.

На этой картинке 40-зубая шестеренка
На этой картинке 40-зубая шестеренка, n=10 (десятичная система), k = 4.

Калькулятор Паскаля

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

Механизм очень похож на циферблат старых телефонов. Есть подвижное колесо с отверстиями, напротив каждого отверстия на неподвижной части (на корпусе) отмечены цифры, на месте нуля – упор. Пользователь втыкает палочку в цифру, которую ему нужно прибавить, и крутит колесо до упора. Колесо соединено с другим точно таким же колесом, на котором накапливается результат. На этом, втором колесе, обозначены цифры, и результат отображается в окошке.

Перенос разряда

А вот с переносом разряда дело обстоит посложнее, но все реализации почти одинаковые. Во всех механизмах для переноса разряда шестеренка имеет пупырышек напротив перехода на 0, и когда этот переход происходит, этот пупырышек поднимает рычаг, который потом под своим весом падает и перещелкивает следующую шестеренку на одно значение. В моей разностной машине это происходит так:

В другой машине, которая будет также представлена ниже, все происходит, в теории, еще проще, хоть и выглядит громоздко:

Когда шестерня, связанная с разрядом, делает полный оборот, стрелка с маленькой шестеренкой (1) также делает полный оборот, и при переходе на 0 она проходит возле шестеренки (2), вращая ее. Она в свою очередь вращает еще одну стрелку с шестеренкой (3), которая , проходя мимо шестеренки со следующим разрядом, увеличивает его на 1. Кроме этих взаимодействий, эти шестеренки больше ни с чем не соединены, и не мешают суммированию.

Разностная машина

В начале 19 века Чарльз Беббидж решил построить машину, которая будет вычислять значения многочлена в любой точке по некоторому набору начальных значений. Эта машина выполняет значительно более сложную задачу, чем калькулятор Паскаля, но в ее основе также лежит сумматор, так как эта машина для своих вычислений использует только операции сложения. Мы будем строить машину, вычисляющую значения многочленов 2 степени.

Легче всего объяснить, как работает разностная машина, на примере:

Допустим, мы хотим вычислить значения функции y = x^2. Мы знаем, что y(0) = 0, y(1) = 1 и у(2) = 4.

Теперь заметим, что у(1) – у(0) = 1 , у(2) – у(1) = 3. Это так называемые «первые разности». Есть еще «вторые разности» – это разности между двумя соседними первыми разностями. Для квадратного многочлена все вторые разности равны, значит, на каждом шаге первая разность нашей функции на 2 больше предыдущей.

Зная разности, теперь начнем вычислять значения функции. Вначале у = 0, первая разность = 1, а вторая разность = 2. Прибавляем к у первую разность, получаем значение у в следующей точке. Теперь у = 1. Первая разность теперь увеличивается на 2, становится 3. Опять прибавляем к у значение первой разности, получаем 4. Снова увеличиваем разность на 2, она становится 5. Следующее значение у = 4+5 = 9, и так далее.

Переходим от теории к самой машине. Понятно, что она должна хранить 3 числа – само значение функции, первую разность и вторую разность. В машине должно быть 2 сумматора – чтобы прибавлять вторую разность к первой, и чтобы прибавлять первую разность к значению функции. Эти 2 сумматора будут по очереди работать, каждый раз получая новые значения функции.

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

Сохранение значения при суммировании

Вспомним калькулятор Паскаля. В нем было 2 колеса, представляющих собой 2 слагаемых. Когда мы втыкали палочку напротив цифры n, мы ставили первое слагаемое равным n, потом когда мы крутили колесо, первое слагаемое мы уменьшали до 0, при этом второе слагаемое увеличивалось на n. Значение первого слагаемого мы потеряли. В разностной машине это недопустимо, потому что значение разности нам будет нужно на каждом шаге. Поэтому нужно либо придумать такой сумматор, который бы вообще не портил первое слагаемое, либо придумать механизм восстановления значения после суммации. Сам Беббидж пошел по второму пути, но возможен и первый.

У Бэббиджа сумматор предполагался примерно таким образом: По принципу паскалевского калькулятора прибавить первое слагаемое ко второму, и одновременно сохранить его где-нибудь еще, а потом оттуда восстановить первое слагаемое опять по принципу паскаля.

Шестеренки располагаются буквой М в 2 ряда.

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

  1. Она соединена и с правой, и с левой шестеренками
  2. Соединена только с правой
  3. Вообще ни с чем не соединена

Работа машины состоит из 4 фаз:

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

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

  2. Теперь правая нижняя шестеренка 2 ряда поднялась вверх, в состояние 2. Вращается шестеренка над ней, делает полный оборот. Как и в предыдущем случае, значение на нижней шестеренке уменьшилось до нуля, а значение правой шестеренки восстановилось и стало равным n.

  3. Правая нижняя шестеренка 2 ряда перешла в состояние 3, А левая – опустилась в состояние 1. Теперь работает второй сумматор совершенно аналогично пункту 1.
  4. Левая шестеренка в состояние 2. Далее аналогично пункту 2.

Очень крутая реализация разностной машины показана вот здесь.

На это видео можно смотреть бесконечно, как на огонь и воду. При этом, понять, что тут происходит, не так то просто. Этот механизм устроен иначе – он вообще не портит первое слагаемое. Сумматор устроен следующим образом:

Внизу у нас есть первое слагаемое. Прямо над ним крутится хитроумная конструкция, на самом деле там переключатель (A), который задает положение маленькой неподвижной шестереночки (D). Она блокирует передачу в центре этого механизма, соединяющую и разъединяющую ее ось с осью шестеренки выше(E). Спуск (B) зацепляется за этот переключатель, и конструкция соединяется со вторым слагаемым. Начинается суммирование. Первое слагаемое задает позицию штырька (С), об который переключатель нажимается обратно и разъединяет оси. За такт конструкция делает один полный оборот, соответственно, в зависимости от положения штырька увеличится второе слагаемое. Колесо с пупырышками (F) нужно для дискретности вращения. Первое слагаемое не портится. Ура.

К сожалению, я не обладаю такими запасами шестеренок, поэтому я постарался сделать механизм проще. Вот мой вариант сумматора:

Белая стрелка делает 1 полный оборот. Стрелка может двигаться вперед-назад вдоль своей оси. Она начинает свое движение из самой верхней точки и крутится по часовой стрелке. В верхней точке находится скос, который прижимает стрелку к правой стороне. По ходу движения стрелка натыкается на еще один скос, закрепленный на правой стороне, и съезжает влево. При этом вот эта хитрая шестеренка, жестко соединенная со стрелкой

также съезжает влево и входит в контакт с передачей на левой стороне. В зависимости от того, где находился второй скос, хитрая шестеренка будет в контакте с передачей 1, 2 или 3 четверти оборота, затем снова отодвинется назад, когда стрелка наедет на первый скос, который в верхней точке. Итого, подвижный скос соответствует первому слагаемому, второе слагаемое увеличивается соответственно установленной позиции скоса, и при этом сам скос останется на том же месте. Суммирование произведено, слагаемое сохранилось.

Синхронизация

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

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

Аналитическая машина - теория

Последняя часть моего обзора - чисто теоретическая, и предназначается для тех, кто представляет себе архитектуру ЭВМ. Она будет посвящена аналитической машине, которую Бэббидж мечтал построить. Аналитическая машина должна была быть полным аналогом современного компьютера – с арифметико-логическим устройством, устройством управления, памятью. Возможно, имей Бэббидж неограниченные запасы Лего техника, он бы это сумел реализовать, поскольку, чисто теоретически это можно себе представить.

Допустим, у нас будет машина с двухадресной системой команд, командами сложения, вычитания, присваивания и условного перехода. Представление чисел – десятичное. Программа хранится вместе с данными в памяти. Память на 100 ячеек, чтобы хватило на нетривиальные задачи. Следовательно, 2 разряда на адрес в памяти, значит, будем использовать пятизначные числа. Память можно организовать в виде квадрата 10 на 10 столбцов, при считывании данных к нужному столбцу подъезжает еще один столбец, в котором записан 0, и происходит суммирование по принципу разностной машины (эти механизмы нам уже известны). Для записи в память нужно сначала обнулить ячейку (произвести ее суммирование с пустым местом без сохранения), а потом прибавить к ней новое значение. Для подведения этого «считывающее-записывающего» столбца в нужное место у нас есть 2 числа – адрес ячейки. При обращении к ячейке сначала сгоняем первую координату до нуля, двигая столбец по вертикали, затем сгоняем до нуля вторую координату, двигая его по горизонтали. Сам адрес мы потеряем, да он и не очень нужен. Таким образом, память можно организовать только одними сумматорами и перемещением столбца.

Теперь процессор (Бэббидж называл это устройство «мельница»). Процессор будет состоять из счетчика адреса (двухразрядный счетчик, каждым тактом увеличивающийся на 1), его дубликат для восстановления, регистр команды (пятиразрядный столбец), сумматор и вычитатель (по сути работающий как сумматор), устройство для присваивания – тоже по сути сумматор, у него просто первый операнд не может быть получен из памяти, а только в результате сложения или обнуления; устройство для условного перехода – просто рычажок, который другое устройство может переключить, если в результате его работы получен результат 0 (не думал, как это реализовать, но если вы сделали все остальное, то вряд ли это для вас проблема). Полный такт работы процессора будет состоять из следующих действий (разделяемых кучей синхронизаторов наподобие коробки передач):

  1. Увеличить счетчик адреса на 1
  2. Получить из памяти команду по счетчику адреса
  3. Восстановить счетчик адреса
  4. Первый разряд в регистре команды обнуляется, при этом выбирается одно из четырех устройств, которое будет работать дальше (как в линейной коробке передач)
  5. Получить из памяти операнды и направить их в сумматор, вычитатель и присвоитель.
  6. Получить из памяти команду по счетчику адреса еще раз (мы ее в тот раз испортили)
  7. Восстановить счетчик адреса
  8. Выполнить действие выбранным устройством, результат направить в стобец для записи в память.
  9. Записать в память по адресу первого операнда результат

Осталось только разобраться с командой условного перехода. У нее первый операнд – заведомо неиспользуемая ячейка памяти, чтобы шаг 9 нормально выполнился. А в 4 и 5 разрядах – новые значения счетчика адреса. Если рычажок условного перехода был переключен прошлой командой, в течение шага 8 в счетчик адреса записываются новое значение.

А еще можно придумать команды ввода и вывода, и еще много чего…

Вот такими представляли вычислительные машины будущего в 19 веке. Эти механизмы были необходимы в то время для решения различных инженерных задач, и в их разработку вкладывались огромные силы. Бэббидж потратил более 17 тысяч фунтов (по современным меркам – порядка двух миллионов фунтов) на разработку этих машин, первые их прототипы весили 15 тонн.

Не секрет, что успешные изобретения, такие как лампочка или микропроцессор, быстро находят себе применение во всех сферах человеческой жизни. Возможно, имей Бэббидж достаточные активы Лего Техника, уже к концу 19 века просторы мирового океана, как в рассказе Гарри Гаррисона «Трансатлантический туннель», бороздили бы подводные лодки с машинными залами, где огромные механические разностные машины рассчитывали бы курс, и тогда кто знает, в каком мире жили бы мы сейчас….


Поделиться |

Голосование
?
Ваша оценка
(2)
0.0
Голосовать могут только зарегистрированные пользователи.