Используя эту таблицу и обычные правила сложения в столбик, можно складывать шестнадцатеричные числа.
В главе 13 я упоминал, что для представления отрицательных чисел можно применять дополнение до двойки. Если вы имеете дело с 8-битными двоичными числами со знаком, то отрицательные числа начинаются с 1. В шестнадцатеричной системе счисления двузначные числа со знаком отрицательные, если они начинаются с цифр 8, 9, A, B, C, D, E или F, поскольку их двоичные эквиваленты начинаются с 1. Например, число 99h может соответствовать либо десятичному числу 153 (если вы знаете, что имеете дело с однобайтными числами без знака), либо десятичному числу –103 (если вы знаете, что это число со знаком).
Кроме того, байт 99h может соответствовать и десятичному числу 99. Это интересно, но, похоже, противоречит всему, о чем мы говорили до сих пор. В главе 23 объясню, как это работает, а теперь остановимся на памяти.
Глава 16
Сборка памяти
Каждое утро, когда мы просыпаемся, включается наша память. Мы вспоминаем, где находимся, что делали накануне, что планируем сделать сегодня. Память возвращается сразу или фрагментами, и в течение еще нескольких минут человек может чего-то не помнить («Забавно, я не помню, что лег спать в носках»), однако в целом мы способны восстановить непрерывность своей жизни, чтобы начать новый день.
Разумеется, человеческая память не вполне упорядочена. Попытайтесь вспомнить что-нибудь из школьного курса геометрии. Вероятно, начнете думать о сидевшем перед вами однокласснике или о том дне, когда сработала пожарная тревога как раз в тот момент, когда учитель собирался объяснить вам, что значит выражение «что и требовалось доказать».
Человеческая память не является вполне надежной. Письменность, возможно, была изобретена специально, чтобы компенсировать недостатки человеческой памяти. Может быть, прошлой ночью вы внезапно проснулись в 3:00 с отличной идеей для сценария. Схватили ручку и бумагу, которые держите у кровати специально для таких случаев, и записали идею. На следующее утро вы читаете свою блестящую мысль и начинаете работу над сценарием («Парень встречает девушку, погоня на машинах и взрывы»… и это всё?). Или не начинаете.
Мы пишем, а затем читаем. Мы сохраняем, а потом извлекаем. Мы храним информацию, а в дальнейшем получаем к ней доступ. Функция памяти заключается в том, чтобы сохранять информацию без искажений между этими двумя событиями. Каждый раз, когда мы сохраняем информацию, мы используем разные типы памяти. Бумага — хороший носитель для хранения текстовой информации, магнитная лента подходит для хранения музыки и фильмов.
Телеграфные реле, будучи объединенными в вентили, а затем в триггеры, также могут хранить информацию. Как мы видели ранее, триггер способен хранить один бит. Это не очень много, но это начало. Как только мы научимся сохранять один бит, мы легко сможем справиться с двумя, тремя и более.
В главе 14 мы познакомились с D-триггером со срабатыванием по уровню, который состоит из инвертора, двух вентилей И и двух вентилей ИЛИ-НЕ.
Когда вход Clk равен 1, выходной сигнал Q совпадает с входным сигналом «Данные». Когда значение входа Clk меняется на 0, выход Q сохраняет последнее значение входа «Данные». Дальнейшие изменения входного сигнала «Данные» не влияют на выходы до тех пор, пока значение входа Clk снова не изменится на 1. Вот таблица логики для триггера.
В главе 14 этот триггер использовался в разных схемах, а сейчас он будет применяться исключительно для хранения одного бита. По этой причине я собираюсь переименовать входы и выходы, чтобы они соответствовали цели.
Это тот же триггер, только теперь выход Q называется «Вывод данных» (Data Out, DO), а вход Clk («Запомнить этот бит») стал «Записью» (Write, W). Так же, как мы можем записать некоторую информацию на бумаге, сигнал «Запись» приводит к записи или сохранению сигнала «Ввод данных» (Data In, DI) в схеме. Обычно вход «Запись» равен 0, а сигнал «Ввод данных» не влияет на выход. Однако всякий раз, когда мы хотим сохранить значение сигнала «Ввод данных» в триггере, подаем на вход «Запись» 1, а затем снова 0. Как я упоминал в главе 14, схема такого типа также называется защелкой, поскольку она как бы «запирает» данные. Вот как мы можем представить однобитную защелку без изображения всех отдельных компонентов.
Мы можем достаточно легко объединить несколько однобитных защелок в многобитную. Все, что для этого нужно сделать, — соединить входы «Запись».
Эта 8-битная защелка содержит восемь входов и восемь выходов. Кроме того, защелка имеет один вход под названием «Запись», который обычно равен 0. Чтобы сохранить 8-битное значение в этой защелке, подайте на вход «Запись» 1, а затем 0. Эту защелку также можно изобразить следующим образом.
Или так, чтобы она больше напоминала изображение однобитной.
Другой способ соединения восьми однобитных защелок более сложен. Допустим, нам нужен только один сигнал «Ввод данных» и один сигнал «Вывод данных». Однако мы хотим сохранить значение сигнала «Ввод данных» восемь раз в течение дня или восемь раз в течение следующей минуты. Кроме того, мы хотим иметь возможность в дальнейшем просмотреть эти восемь значений, только бросив взгляд на один сигнал «Вывод данных».
Другими словами, вместо сохранения одного 8-битного значения, как в случае с 8-битной защелкой, мы хотим сохранить восемь отдельных однобитных значений.
Почему мы хотим сделать именно так? Вероятно, потому, что у нас есть только одна лампочка.
Мы знаем, что нам требуется восемь однобитных защелок. Давайте пока не будем волноваться, как именно данные в них сохраняются. Сосредоточимся на проверке сигналов «Вывод данных» этих восьми защелок, используя только одну лампочку. Конечно, мы могли бы проверять выход каждой защелки, вручную перенося лампочку от одной защелки к другой, но мы бы предпочли более автоматизированный способ. Фактически мы хотим выбирать одну из восьми однобитных защелок, используя переключатели.