Текст
                    Сара Л. Харрис
Дэвид Харрис

ЦИФРОВАЯ СХЕМОТЕХНИКА
И АРХИТЕКТУРА КОМПЬЮТЕРА:
RISC-V
Под редакцией А. Ю. Романова


Digital Design and Computer Architecture RISC-V Edition Sarah L. Harris David Harris AMSTERDAM · BOSTON · HEIDELBERG · LONDON NEW YORK · OXFORD · PARIS · SAN DIEGO SAN FRANCISCO · SINGAPORE · SYDNEY · TOKYO Morgan Kaufmann is an imprint of Elsevier
Цифровая схемотехника и архитектура компьютера: RISC-V Сара Л. Харрис Дэвид Харрис Под редакцией А. Ю. Романова Москва, 2022
УДК 004.2+744.4 ББК 32.971.3 Х21 Н а у ч н ы й р е д а к т о р: Романов А. Ю., канд. тех. наук, доцент Московского института электроники и математики им. А. Н. Тихонова Национального исследовательского университета «Высшая школа экономики» Х21 Сара Л. Харрис, Дэвид Харрис Цифровая схемотехника и архитектура компьютера: RISC-V / пер. с англ. В. С. Яценкова, А. Ю. Романова; под ред. А. Ю. Романова. – М.: ДМК Пресс, 2021. – 810 с.: ил. ISBN 978-5-97060-961-3 В книге представлен уникальный и современный подход к разработке цифровых устройств. Авторы начинают с цифровых логических элементов, переходят к разработке комбинационных и последовательностных схем, а затем используют эти базовые блоки как основу для самого сложного: разработки настоящего процессора RISC-V. По всему тексту приводятся примеры на языках SystemVerilog и VHDL, иллюстрирующие методы и способы разработки схем с помощью САПР. Изучив эту книгу, читатели смогут разработать свой собственный микропроцессор и получат полное понимание того, как он работает. В книге объединен привлекательный и юмористический стиль изложения с развитым и практичным подходом к разработке цифровых устройств. В издание вошли новые материалы о системах ввода/вывода применительно к процессорам общего назначения как для ПК, так и для микроконт­роллеров. Приведены практические примеры интерфейсов периферийных устройств с применением RS-232, SPI, управления двигателями, прерываний, беспроводной связи и аналого-цифрового преобразования. Представлено высокоуровневое описание интерфейсов, включая USB, SDRAM, Wi-Fi, PCI Express и др. Издание будет полезно студентам, инженерам, а также широкому кругу читателей, интересующихся современной схемотехникой. This Russian edition of Digital Design and Computer Architecture: RISC-V Edition (9780128200643) by Sarah Harris & David Harris is published by arrangement with Elsevier Inc. The translation has been undertaken by DMK Press at its sole responsibility. Practitioners and researchers must always rely on their own experience and knowledge in evaluating and using any information, methods, compounds or experiments described herein. Because of rapid advances in the medical sciences, in particular, independent verification of diagnoses and drug dosages should be made. To the fullest extent of the law, no responsibility is assumed by Elsevier, authors, editors or contributors in relation to the translation or for any injury and/or damage to persons or property as a matter of products liability, negligence or otherwise, or from any use or operation of any methods, products, instructions, or ideas contained in the material herein. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-0-12-820064-3 (англ.) ISBN 978-5-97060-961-3 (рус.) © 2021 Elsevier, Inc. All rights reserved © Перевод, научное редактирование, НИУ ВШЭ, 2021 © Издание, оформление, ДМК Пресс, 2021
Содержание Отзывы на книгу «Цифровая схемотехника и архитектура компьютера. RISC-V»........................................................................................ 13 Об авторах......................................................................................................... 14 Предисловие к русскому изданию..................................................................... 15 Предисловие от редактора русского перевода................................................ 22 Предисловие....................................................................................................... 24 Глава 1 От нуля до единицы 31 1.1. План игры..................................................................................................... 31 1.2. Искусство управления сложностью.............................................................. 32 1.2.1. Абстракция........................................................................................... 33 1.2.2. Конструкторская дисциплина............................................................... 35 1.2.3. Три базовых принципа.......................................................................... 36 1.3. Цифровая абстракция................................................................................... 38 1.4. Системы счисления....................................................................................... 40 1.4.1. Десятичная система счисления............................................................ 40 1.4.2. Двоичная система счисления............................................................... 41 1.4.3. Шестнадцатеричная система счисления.............................................. 43 1.4.4. Байт, полубайт и «весь этот джаз»....................................................... 45 1.4.5. Сложение двоичных чисел................................................................... 46 1.4.6. Знак двоичных чисел............................................................................ 47 1.5. Логические элементы................................................................................... 53 1.5.1. Логический элемент НЕ....................................................................... 53 1.5.2. Буфер................................................................................................... 54 1.5.3. Логический элемент И......................................................................... 54 1.5.4. Логический элемент ИЛИ.................................................................... 54 1.5.5. Другие логические элементы с двумя входными сигналами................. 55 1.5.6. Логические элементы с количеством входов больше двух................... 56 1.6. За пределами цифровой абстракции............................................................. 57 1.6.1. Напряжение питания........................................................................... 57 1.6.2. Логические уровни............................................................................... 57 1.6.3. Допускаемые уровни шумов................................................................. 58 1.6.4. Передаточная характеристика............................................................. 59 1.6.5. Статическая дисциплина...................................................................... 60 1.7. КМОП-транзисторы...................................................................................... 62 1.7.1. Полупроводники................................................................................... 63 1.7.2. Диоды................................................................................................... 64 1.7.3. Конденсаторы....................................................................................... 64 1.7.4. n-МОП- и p-МОП-транзисторы............................................................ 65 1.7.5. Логический элемент НЕ на КМОП-транзисторах................................. 69 1.7.6. Другие логические элементы на КМОП-транзисторах......................... 69 1.7.7. Передаточный логический элемент...................................................... 72 1.7.8. Псевдо-n-МОП-логика.......................................................................... 72 1.8. Потребляемая мощность............................................................................... 73 1.9. Краткий обзор главы 1 и того, что нас ждет впереди..................................... 75 Упражнения........................................................................................................ 77 Вопросы для собеседования................................................................................. 89
6  Глава 2 Разработка комбинационной логики 91 2.1. Введение....................................................................................................... 91 2.2. Логические функции..................................................................................... 95 2.2.1. Терминология....................................................................................... 95 2.2.2. Дизъюнктивная форма......................................................................... 96 2.2.3. Конъюнктивная форма......................................................................... 98 2.3. Булева алгебра.............................................................................................. 99 2.3.1. Аксиомы............................................................................................. 100 2.3.2. Теоремы одной переменной................................................................ 100 2.3.3. Теоремы с несколькими переменными............................................... 102 2.3.4. Доказательство теорем булевой алгебры........................................... 104 2.3.5. Упрощение логических уравнений..................................................... 105 2.4. От логики к логическим элементам............................................................ 106 2.5. Многоуровневая комбинационная логика................................................... 110 2.5.1. Минимизация аппаратных затрат...................................................... 111 2.5.2. Перемещение инверсии...................................................................... 112 2.6. Что такое X и Z?......................................................................................... 115 2.6.1. Недопустимое значение: Х ................................................................ 115 2.6.2. Третье состояние: Z............................................................................ 116 2.7. Карты Карно................................................................................................ 118 2.7.1. Думайте об овалах.............................................................................. 119 2.7.2. Логическая минимизация на картах Карно......................................... 120 2.7.3. Безразличные переменные................................................................. 124 2.7.4. Карты Карно: подведение итогов........................................................ 124 2.8. Базовые комбинационные блоки................................................................. 125 2.8.1. Мультиплексоры................................................................................ 125 2.8.2. Дешифраторы..................................................................................... 129 2.9. Временные характеристики........................................................................ 131 2.9.1. Задержка распространения и задержка реакции................................ 131 2.9.2. Импульсные помехи........................................................................... 136 2.10. Заключение............................................................................................... 139 Упражнения...................................................................................................... 140 Вопросы для собеседования............................................................................... 147 Глава 3 Разработка последовательностной логики 149 3.1. Введение..................................................................................................... 149 3.2. Защелки и триггеры.................................................................................... 150 3.2.1. RS-триггер.......................................................................................... 151 3.2.2. D-защелка........................................................................................... 154 3.2.3. D-триггер............................................................................................ 155 3.2.4. Регистр............................................................................................... 156 3.2.5. Триггер с функцией разрешения........................................................ 156 3.2.6. Триггер с функцией сброса................................................................. 158 3.2.7. Разработка триггеров и защелок на транзисторном уровне................ 159 3.2.8. Сравнение защелок и триггеров......................................................... 160 3.3. Разработка синхронных логических схем................................................... 161 3.3.1. Некоторые проблемные схемы........................................................... 161 3.3.2. Синхронные последовательностные схемы........................................ 163 3.3.3. Синхронные и асинхронные схемы..................................................... 166 3.4. Конечные автоматы..................................................................................... 166 3.4.1. Пример разработки конечного автомата............................................ 167 3.4.2. Кодирование состояний...................................................................... 173
 7 3.4.3. Автоматы Мура и Мили..................................................................... 176 3.4.4. Декомпозиция конечных автоматов................................................... 180 3.4.5. Восстановление конечных автоматов по электрической схеме.......... 182 3.4.6. Конечные автоматы: подведение итогов............................................. 185 3.5. Синхронизация последовательностных схем.............................................. 185 3.5.1. Динамическая дисциплина................................................................. 187 3.5.2. Временные характеристики системы................................................. 188 3.5.3. Расфазировка тактовых сигналов....................................................... 194 3.5.4. Метастабильность.............................................................................. 197 3.5.5. Синхронизаторы................................................................................. 199 3.5.6. Вычисление времени разрешения...................................................... 201 3.6. Параллелизм............................................................................................... 205 3.7. Заключение................................................................................................. 209 Упражнения...................................................................................................... 210 Вопросы для собеседования............................................................................... 218 Глава 4 Языки описания аппаратуры 221 4.1. Введение..................................................................................................... 221 4.1.1. Модули............................................................................................... 222 4.1.2. Происхождение языков SystemVerilog и VHDL................................. 222 4.1.3. Моделирование и синтез.................................................................... 224 4.2. Комбинационная логика.............................................................................. 226 4.2.1. Битовые операторы............................................................................ 227 4.2.2. Комментарии и пробелы..................................................................... 229 4.2.3. Операторы сокращения...................................................................... 230 4.2.4. Условное присваивание...................................................................... 230 4.2.5. Внутренние переменные..................................................................... 233 4.2.6. Приоритет.......................................................................................... 235 4.2.7. Числа.................................................................................................. 235 4.2.8. Z-состояние и X-состояние................................................................. 237 4.2.9. Манипуляция с битами...................................................................... 239 4.2.10. Задержки.......................................................................................... 239 4.3. Структурное моделирование....................................................................... 241 4.4. Последовательностная логика.................................................................... 245 4.4.1. Регистры............................................................................................. 245 4.4.2. Регистры со сбросом........................................................................... 245 4.4.3. Регистры с сигналом разрешения....................................................... 248 4.4.4. Группы регистров............................................................................... 249 4.4.5. Защелки............................................................................................. 250 4.5. И снова комбинационная логика................................................................. 251 4.5.1. Операторы case.................................................................................. 254 4.5.2. Условный оператор (if)....................................................................... 256 4.5.3. Таблицы истинности с незначащими битами...................................... 259 4.5.4. Блокирующие и неблокирующие присваивания................................. 260 4.6. Конечные автоматы..................................................................................... 264 4.7. Типы данных............................................................................................... 268 4.7.1. SystemVerilog..................................................................................... 268 4.7.2. VHDL................................................................................................. 269 4.8. Параметризированные модули.................................................................... 272 4.9. Тестбенч..................................................................................................... 275 4.10. Заключение............................................................................................... 280 Упражнения...................................................................................................... 281 Упражнения для SystemVerilog................................................................... 287
8  Упражнения для VHDL................................................................................ 289 Вопросы для собеседования............................................................................... 291 Глава 5 Цифровые функциональные узлы 293 5.1. Введение..................................................................................................... 293 5.2. Арифметические схемы.............................................................................. 294 5.2.1. Сложение........................................................................................... 294 5.2.2. Вычитание.......................................................................................... 302 5.2.3. Компараторы...................................................................................... 303 5.2.4. Арифметико-логическое устройство.................................................. 304 5.2.5. Схемы сдвига и циклического сдвига................................................. 309 5.2.6. Умножение......................................................................................... 310 5.2.7. Деление.............................................................................................. 312 5.2.8. Дополнительная литература.............................................................. 313 5.3. Представление чисел.................................................................................. 313 5.3.1. Числа с фиксированной запятой........................................................ 314 5.3.2. Числа с плавающей запятой............................................................... 315 5.4. Функциональные узлы последовательностной логики................................ 319 5.4.1. Счетчики............................................................................................ 319 5.4.2. Сдвиговые регистры........................................................................... 321 5.5. Матрицы памяти......................................................................................... 324 5.5.1. Обзор матриц памяти......................................................................... 324 5.5.2. Динамическое ОЗУ (DRAM).............................................................. 328 5.5.3. Статическое ОЗУ (SRAM).................................................................. 328 5.5.4. Площадь и задержки.......................................................................... 329 5.5.5. Регистровые файлы............................................................................ 330 5.5.6. Постоянное запоминающее устройство.............................................. 330 5.5.7. Реализация логических функций с использованием матриц памяти..... 332 5.5.8. Языки описания аппаратуры и память................................................ 333 5.6. Матрицы логических элементов................................................................. 336 5.6.1. Программируемые логические матрицы............................................. 336 5.6.2. Программируемые пользователем вентильные матрицы.................... 338 5.6.3. Схемотехника матриц......................................................................... 345 5.7. Заключение................................................................................................. 346 Упражнения...................................................................................................... 347 Вопросы для собеседования............................................................................... 357 Глава 6 Архитектура 359 6.1. Предисловие............................................................................................... 359 6.2. Язык ассемблера......................................................................................... 362 6.2.1. Инструкции........................................................................................ 362 6.2.2. Операнды: регистры, память и константы.......................................... 364 6.3. Программирование..................................................................................... 370 6.3.1. Порядок выполнения программы........................................................ 371 6.3.2. Арифметические/логические инструкции......................................... 371 6.3.3. Ветвление программ........................................................................... 374 6.3.4. Условные операторы.......................................................................... 377 6.3.5. Циклы................................................................................................. 378 6.3.6. Массив............................................................................................... 381 6.3.7. Вызовы функций................................................................................. 385 6.3.8. Псевдокоманды.................................................................................. 398 6.4. Машинный язык......................................................................................... 400
 9 6.4.1. Инструкции типа R............................................................................. 401 6.4.2. Инструкции типа I.............................................................................. 403 6.4.3. Инструкции типа S/B........................................................................ 404 6.4.4. Инструкции типа U/J........................................................................ 407 6.4.5. Кодирование констант........................................................................ 408 6.4.6. Режимы адресации............................................................................. 409 6.4.7. Расшифровываем машинные коды...................................................... 411 6.4.8. Могущество хранимой программы..................................................... 412 6.5. Камера, мотор! Компилируем, ассемблируем и загружаем......................... 413 6.5.1. Карта памяти...................................................................................... 414 6.5.2. Директивы ассемблера....................................................................... 416 6.5.3. Компиляция........................................................................................ 419 6.5.4. Трансляция......................................................................................... 421 6.5.5. Компоновка........................................................................................ 424 6.5.6. Загрузка............................................................................................. 426 6.6. Добавочные сведения................................................................................. 426 6.6.1. Порядок байтов.................................................................................. 426 6.6.2. Исключения........................................................................................ 427 6.6.3. Команды для чисел со знаком и без знака........................................... 431 6.6.4. Команды для работы с числами с плавающей запятой........................ 433 6.6.5. Сжатые инструкции........................................................................... 434 6.7. Эволюция архитектуры RISC-V.................................................................. 436 6.7.1. Базовые наборы команд и расширения RISC-V.................................. 436 6.7.2. Сравнение архитектур RISC-V и MIPS............................................... 437 6.7.3. Сравнение архитектур RISC-V и ARM............................................... 438 6.8. Живой пример: архитектура x86................................................................. 439 6.8.1. Регистры x86...................................................................................... 440 6.8.2. Операнды x86..................................................................................... 440 6.8.3. Флаги состояния................................................................................ 442 6.8.4. Команды x86....................................................................................... 442 6.8.5. Кодировка команд х86........................................................................ 444 6.8.6. Другие особенности x86..................................................................... 446 6.8.7. Архитектура х86: подведение итогов.................................................. 447 6.9. Заключение................................................................................................. 448 Упражнения...................................................................................................... 449 Вопросы для собеседования............................................................................... 462 Глава 7 Микроархитектура 465 7.1. Введение..................................................................................................... 465 7.1.1. Архитектурное состояние и система команд...................................... 466 7.1.2. Процесс разработки............................................................................ 466 7.1.3. Микроархитектуры RISC-V................................................................ 469 7.2. Анализ производительности....................................................................... 470 7.3. Однотактный процессор.............................................................................. 472 7.3.1. Пример программы............................................................................. 473 7.3.2. Однотактный тракт данных................................................................ 473 7.3.3. Однотактный блок управления........................................................... 482 7.3.4. Дополнительные команды.................................................................. 485 7.3.5. Анализ производительности............................................................... 488 7.4. Многотактный процессор........................................................................... 490 7.4.1. Многотактный тракт данных.............................................................. 491 7.4.2. Многотактное устройство управления............................................... 497 7.4.3. Дополнительные команды.................................................................. 509
10  7.4.4. Анализ производительности............................................................... 512 7.5. Конвейерный процессор.............................................................................. 515 7.5.1. Конвейерный тракт данных................................................................ 518 7.5.2. Конвейерное устройство управления................................................. 520 7.5.3. Конфликты......................................................................................... 520 7.5.4. Анализ производительности............................................................... 531 7.6. Разрабатываем процессор на HDL.............................................................. 533 7.6.1. Однотактный процессор .................................................................... 535 7.6.2. Универсальные строительные блоки.................................................. 539 7.6.3. Тестбенч............................................................................................. 542 7.7. Улучшенные микроархитектуры................................................................. 547 7.7.1. Длинные конвейеры........................................................................... 548 7.7.2. Микрокоманды................................................................................... 549 7.7.3. Предсказание условных переходов..................................................... 550 7.7.4. Суперскалярный процессор................................................................ 552 7.7.5. Процессор с внеочередным выполнением команд.............................. 555 7.7.6. Переименование регистров................................................................ 558 7.7.7. Многопоточность............................................................................... 560 7.7.8. Мультипроцессоры............................................................................. 561 7.8. Живой пример: эволюция микроархитектуры RISC-V................................ 565 7.9. Заключение................................................................................................. 569 Упражнения...................................................................................................... 571 Вопросы для собеседования............................................................................... 579 Глава 8 Системы памяти 581 8.1. Введение..................................................................................................... 581 8.2. Анализ производительности систем памяти............................................... 586 8.3. Кеш-память................................................................................................. 588 8.3.1. Какие данные хранятся в кеш-памяти?............................................... 589 8.3.2. Как найти данные в кеш-памяти?....................................................... 590 8.3.3. Какие данные заместить в кеш-памяти?............................................. 599 8.3.4. Улучшенная кеш-память.................................................................... 600 8.4. Виртуальная память.................................................................................... 604 8.4.1. Трансляция адресов............................................................................ 607 8.4.2. Таблица страниц................................................................................. 609 8.4.4. Защита памяти................................................................................... 612 8.4.5. Стратегии замещения страниц........................................................... 612 8.4.6. Многоуровневые таблицы страниц..................................................... 613 8.5. Заключение................................................................................................. 616 Эпилог............................................................................................................... 616 Упражнения...................................................................................................... 617 Вопросы для собеседования............................................................................... 624 Глава 9 Ввод/вывод во встраиваемых системах 626 9.1. Введение..................................................................................................... 626 9.2. Отображение ввода/вывода в пространство памяти.................................. 627 9.3. Ввод/вывод во встраиваемых системах..................................................... 629 9.3.1. Плата RED-V...................................................................................... 629 9.3.2. Система на кристалле FE310-G002.................................................... 631 9.3.3. Цифровой ввод/вывод общего назначения........................................ 634 9.3.4. Драйверы устройств ввода/вывода.................................................... 638 9.3.5. Последовательный ввод/вывод......................................................... 642
 11 9.3.6. Таймеры............................................................................................. 659 9.3.7. Аналоговый ввод/вывод.................................................................... 661 9.3.8. Прерывания........................................................................................ 669 9.4. Другие внешние устройства микроконтроллера......................................... 674 9.4.1. Символьные ЖК-дисплеи................................................................... 674 9.4.2. VGA-монитор..................................................................................... 678 9.4.3. Беспроводная связь Bluetooth............................................................ 684 9.4.4. Управление двигателями.................................................................... 686 9.5. Заключение................................................................................................. 698 Приложение А. Реализация цифровых систем 699 А.1. Введение.................................................................................................... 699 А.2. Логические микросхемы серии 74xx.......................................................... 700 А.2.1. Логические элементы........................................................................ 700 А.2.2. Другие логические функции.............................................................. 701 А.3. Программируемая логика........................................................................... 703 А.3.1. PROM...................................................................................................... 704 А.3.2. Блоки PLA......................................................................................... 705 А.3.3. FPGA................................................................................................. 705 А.4. Заказные специализированные интегральные схемы................................. 708 А.5. Работа с документацией............................................................................. 709 А.6. Семейства логических микросхем.............................................................. 714 А.7. Корпуса и монтаж интегральных схем....................................................... 717 А.8. Линии передачи.......................................................................................... 721 A.8.1. Согласованная нагрузка.................................................................... 723 A.8.2. Нагрузка холостого хода.................................................................... 725 A.8.3. Нагрузка короткого замыкания.......................................................... 726 A.8.4. Рассогласованная нагрузка................................................................ 726 A.8.5. Когда нужно применять модели линии передачи............................... 729 A.8.6. Правильное подключение нагрузки к линии передачи........................ 730 A.8.7. Вывод формулы для Z0...............................................................................................................................731 A.8.8. Вывод формулы для коэффициента отражения.................................. 733 A.8.9. Линии передачи: подведение итогов.................................................. 733 A.9. Экономика.................................................................................................. 735 Приложение B. Система команд RISC-V Приложение C. Программирование на языке С 738 747 C.1. Введение..................................................................................................... 747 Краткий итог...................................................................................................... 749 C.2. Добро пожаловать в язык С........................................................................ 750 C.2.1. Структура программы на языке С...................................................... 750 C.2.2. Запуск С-программы.......................................................................... 751 Краткий итог...................................................................................................... 752 C.3. Компиляция................................................................................................ 752 C.3.1. Комментарии..................................................................................... 753 C.3.2. #define.............................................................................................. 753 C.3.3. #include.......................................................................................... 754 Краткий итог...................................................................................................... 755 C.4. Переменные................................................................................................ 756 C.4.1. Базовые типы данных......................................................................... 756 C.4.2. Глобальные и локальные переменные................................................ 758
12  C.4.3. Инициализация переменных.............................................................. 759 Краткий итог...................................................................................................... 759 C.5. Операции.................................................................................................... 760 C.6. Вызовы функций......................................................................................... 763 C.7. Управление последовательностью выполнения действий.......................... 765 C.7.1. Условные операторы.......................................................................... 765 C.7.2. Циклы................................................................................................ 767 Краткий итог...................................................................................................... 769 C.8. Другие типы данных................................................................................... 770 C.8.1. Указатели.......................................................................................... 770 C.8.2. Массивы............................................................................................ 772 C.8.3. Символы............................................................................................ 777 C.8.4. Строки символов................................................................................ 778 C.8.5. Структуры.......................................................................................... 780 C.8.6. Оператор typedef............................................................................ 781 C.8.7. Динамическое распределение памяти................................................ 783 C.8.8. Связные списки................................................................................. 784 Краткий итог...................................................................................................... 786 C.9. Стандартная библиотека языка C............................................................... 786 C.9.1. stdio................................................................................................ 787 C.9.2. stdlib.............................................................................................. 791 C.9.3. math.................................................................................................. 794 C.9.4. string.............................................................................................. 794 C.10. Компилятор и опции командной строки.................................................... 795 C.10.1. Компиляция нескольких исходных c-файлов.................................... 795 C.10.2. Опции компилятора......................................................................... 795 C.10.3. Аргументы командной строки.......................................................... 796 C.11. Типичные ошибки..................................................................................... 797 Дополнительная литература 801 Предметный указатель 803
Отзывы на книгу «Цифровая схемотехника и архитектура компьютера. RISC-V» Харрис и Харрис детально описали устройство процессора RISC-V от элект­ ронных компонентов до микроархитектуры. Их ясные объяснения в сочетании с широким охватом темы дают полное представление как о цифровой схемотехнике, так и об архитектуре RISC-V. Это очень информативный и познавательный подход, поскольку у студентов есть отличная возможность запус­ кать большие цифровые проекты на современных FPGA. Дэвид А. Паттерсон, Калифорнийский университет в Беркли Потрясающе, какие разнообразные знания авторы объединили в одной книге! По мере развития производства полупроводников значимость правильной разработки цифровых схем и компьютерной архитектуры будет только возрастать. Читатели найдут доступное и всестороннее рассмотрение обеих тем и после прочтения книги получат четкое понимание архитектуры набора команд RISC-V. Эндрю Уотерман, SiFive Мне доводилось видеть отличные учебники по цифровой схемотехнике и отличные учебники по компьютерным архитектурам – но этот учебник представляет собой и то, и другое! Он также уникален своей способностью формировать общую картину. Авторы начинают с азов, и это делает архитектуру RISC-V понятной. Упражнения к главам этой книги послужат отличным методическим ресурсом для университетских преподавателей. Рой Кравиц, Государственный университет Портленда Когда я впервые прочитал учебник по MIPS в 2008 году, то подумал, что это один из лучших учебников по компьютерной архитектуре. Я сразу начал использовать его в своих лекциях. Тринадцать лет спустя мне посчастливилось прочитать новое издание про RISC-V, и мое мнение осталось прежним: это отличная книга, очень понятная, исчерпывающая, с высоким образовательным потенциалом. Она полностью соответствует учебной программе, которую проходят студенты в области цифровой схемотехники и компьютерной архитектуры. Я с нетерпением жду возможности использовать этот учебник по архитектуре RISC-V в своих лекциях. Даниэль Чавер Мартинес, Мадридский университет Комплутенсе
Об авторах Дэвид Мани Харрис (David Money Harris) – доцент в колледже им. Харви Мадда (Harvey Mudd College). Получил ученую степень кандидата наук по электронике в Стэнфордском университете и степень магистра по электронике и информатике в Массачусетском технологическом институте (MIT). Перед Стэнфордом работал в компании Intel в качестве схемотехника и разработчика логики для процессоров Itanium и Pentium II. Впоследствии работал консультантом в Sun Microsystems, Hewlett-Packard, Evans & Sutherland и других компаниях. Увлечения Дэвида включают в себя преподавание, разработку чипов и активный отдых на природе. В свободное от работы время занимается пешим туризмом, скалолазанием и альпинизмом. Особенно любит длинные прогулки с сыном Абрахамом, который родился, когда Дэвид начал работать над этой книгой. Дэвид имеет более десяти патентов и является автором трех других учебников по разработке чипов, а также двух путеводителей по горам Южной Калифорнии. Сара Л. Харрис (Sarah L. Harris) – доцент в колледже им. Харви Мадда (Harvey Mudd College). Получила степени магистра и кандидата наук по электронике в Стэнфордском университете и степень бакалавра по электронике и вычислительной технике в университете Брайама Янга (BrighamYoung University). Сара также работала в компаниях Hewlett-Packard, San Diego Supercomputer Center, Nvidia и исследовательском отделе компании Microsoft Research в Пекине. Интересы Сары не ограничиваются преподаванием, изучением и разработкой новых технологий, она также любит путешествовать, увлекается виндсерфингом, скалолазанием и игрой на гитаре. Среди ее недавних начинаний можно отметить исследования в области интерфейсов, позволяющих разрабатывать цифровые элект­ рические схемы простыми рисунками от руки, работу в качестве научного коррес­ пондента для филиала Национального общественного радио (National Public Radio) и обучение кайтсерфингу. Сара говорит на четырех языках и собирается изучить еще несколько в ближайшем будущем. Романов Александр Юрьевич – научный редактор русского перевода данной книги, доцент Московского института электроники и математики им. А. Н. Тихонова Национального исследовательского университета «Высшая школа экономики» (МИЭМ НИУ ВШЭ). В 2009 г. закончил магистратуру в Харьковском политехническом институте, работал в Киевском политехническом институте им. Сикорского. С 2014 г. работает в МИЭМ НИУ ВШЭ, где возглавляет лабораторию САПР (https://miem.hse.ru/edu/ce/cadsystem), специализирующуюся на проектной деятельности, а также разработке цифровых систем на ПЛИС/микроконтроллерах, робототехнических комплексов, аппаратных реализаций систем искусственного интеллекта, многопроцессорных систем, систем удаленного доступа к лабораторному оборудованию и т. д. В 2015 г. защитил диссертацию в Институте проблем проектирования в микроэлектронике РАН (г. Зеленоград), является автором более 150 научных статей, патентов и книг. Более подробно об учебном процессе в лаборатории можно узнать из интервью: https://miem.hse.ru/news/364316102.html.
Предисловие к русскому изданию Вы держите в руках книгу, которая занимает на российском книжном рынке особое место. Если вы студент и хотите пройти собеседование в крупную электронную компанию на прозицию проектировщика процессоров, нейроускорителей или сетевых микросхем, то самое лучшее, что вы можете сделать сейчас, – это прочитать данную книгу от корки до корки, одновременно выполняя упражнения на симуляторах и платах ПЛИС. Когда мы говорим о собеседованиях, мы говорим о таких компаниях, как Apple, Intel, NVidia, а также о передовых российских проектировщиках процессоров Synta­ core, «Элвис-НеоТек» и «Байкал Электроникс». В каждой из них вам дадут задания ти­па «напишите на доске дизайн простого арбитра на языке описания аппаратуры Verilog» или «объясните, как помогают производительности микропроцессора байпасы в его конвейере». Конечно, мы не утверждаем, что изучение этого учебника гарантирует вам успех, но эта книга закладывает современную базу во всех областях, о которых вас будут спрашивать: цифровая логика и ее тайминг, арифметические блоки и конечные автоматы, архитектура (система команд) и микроархитектура (строение конвейера) процессора. С использованием того же самого языка SystemVerilog, который используют современные разработчики цифровых систем на рабочем месте (вам также могут встретиться блоки на языке VHDL, и он тоже есть в книге). После этой книги вам, конечно, нужно будет сделать несколько учебных проектов и изучить по статьям в сети Интернет некоторые типы дизайнов, которых в книге нет (очереди FIFO, пересечение доменов тактовой частоты и т. д.). Совместно с этой книгой также рекомендуется читать еще одну – «Цифровой синтез: практический курс»1. Она создана специально как дополнение к предыдущей версии книги Харрисов; в ближайшее время планируется ее переиздание, адаптированное под RISC-V. После этого вы будете готовы к бою. Никакая другая книга или комбинация книг на русском языке не поможет вам пройти эту начальную часть траектории эффективнее, чем «Цифровая схемотехника и архитектура компьютера: RISC-V» Дэвида Харриса и Сары Харрис. Как возникла современная база проектирования В 1980-е годы произошли две революции в проектировании цифровых микросхем. Первая революция была в маршруте проектирования. До конца 1980-х схемы рисо1 Цифровой синтез: практический курс / под общ. ред. А. Ю. Романова, Ю. В. Панчула. М.: ДМК Пресс, 2020. https://dmkpress.com/catalog/electronics/circuit_design/978-5-97060-850-0/.
16 Предисловие к русскому изданию вали мышкой на экране, а с начала 1990-х их стали синтезировать из кода на языках описания аппаратуры Verilog и VHDL. Основные события: ►► 1984 – Gateway Design Automation / Cadence изобретают язык описания аппаратуры Verilog; ►► 1984 – Xilinx изобретает реконфигурируемые микросхемы ПЛИС/FPGA; ►► 1986 – Optimal Solutions / Synopsys изобретают цифровой синтез; ►► 1988–1992 – цифровой синтез внедряют в проектирование Apple, Sun, Nokia и др.; ►► 1997–1999 – Lexra, MIPS, ARM начинают лицензировать процессорные ядра в виде IP-блоков (Intellectual Property – интеллектуальная собственность). Вторая революция произошла в архитектуре и микроархитектуре процессоров. В 1970-х были популярны процессоры с двухуровневой организацией на основе так называемой технологии микропрограммирования. Команды процессора, видимые программисту, реализовывались на аппаратном уровне с помощью цепочек из слов (последовательностей битов в памяти) с сигналами контроля, так называемого мик­ рокода. Такая организация позволяла создавать очень сложные системы команд, но ограничивала возможности по их параллельному выполнению. В 1978 году группа исследователей в Стенфорде под руководством Джона Хеннесси задала себе вопрос: действительно ли нужны эти сложные команды, или их необходимость – просто маркетинговая иллюзия? Стенфордцы провели анализ большого количества пользовательских программ и пришли к выводу, что большинство используемых в программах команд – простые. И если тратить усилия не на усложнение цепочек микрокода, а на построение так называемого конвейера – структуры, в которой простые команды выполняются с перекрытием во времени, – то можно выполнять программы быстрее. Так появилась архитектура MIPS. К похожим идеям пришла группа в Беркли под руководством Дэвида Паттерсона, которая в начале 1980-х создала архитектуры RISC I и RISC II, из которых выросла архитектура SPARC. В середине 1980-х появилась компания ARM, и за последующие десятилетия процессоры с новой организацией сначала завоевали рынок рабочих станций, а потом и бытовой электроники, сотовых телефонов и мик­ роконтроллеров. В конце 1980-х даже Intel, которая изначально делала процессоры на основе микрокода, стала вводить в Intel 486 конвейер, а к 1996 году построила процессор PentiumPro, в котором большинство команд на лету преобразовывались в простые команды, отправлявшиеся на конвейер в стиле RISC-процессоров. Хранимый в памяти микрокод остался только для сложных инструкций. В начале 1990-х основатели концепции RISC-процессоров Джон Хеннесси и Дэвид Паттерсон опуб­ликовали два учебника, которые стали бестеллерами: ►► учебник начального уровня «Архитектура компьютера и проектирование компью­терных систем» ►► и более сложный учебник «Компьютерная архитектура: количественный подход».
Предисловие к русскому изданию 17 Эти учебники описывали архитектуру и микроархитектуру сначала на основе MIPS-образной архитектуры DLX, а потом стали использовать MIPS. К тому времени процессоры архитектуры MIPS уже использовались в компьютерах для голливудских спецэффектов, а потом и в домашней электронике. В течение 1990-х американские университеты внедрили в учебный процесс книги Хеннесси и Паттерсона, курсы по языкам описания аппаратуры Verilog и VHDL, а также лабораторные работы на платах с микросхемами реконфигурируемой логики ПЛИС/FPGA, которые позволили строить студенческие процессоры без сложной процедуры заказа их на фабрике. Так выросло поколение студентов, которые разработали Apple iPhone, графические процессоры от NVidia, микросхемы для маршрутизаторов Cisco и Juniper и другие популярные устройства. Что происходило в это время в России Революции в цифровом синтезе и микроархитектуре процессоров по времени выпали на сложный период российской истории. Открытие советского рынка для иностранных компьютеров, коллапс СССР и недофинансирование вузов привели к тому, что в российcком обществе перестали верить, что в России возможно проектирование конкурентоспособных чипов. Долгое время группы разработчиков сохранялись только в компаниях, связанных с обороной и космосом, для проектирования чипов для космоса в таких организациях, как НИИСИ и НПЦ «Элвис». Российская команда, разработавшая процессор «Эльбрус», прототип которого при симуляции на Verilog показывал многообещающие результаты на вычислениях с плавающей запятой, попыталась в 2000 году получить финансирование у венчурных капиталистов Кремниевой долины, но вернулась в Россию. В результате обучение компьютерной архитектуре во многих российских вузах стало описательным. Например, вузовские преподаватели стали использовать учебник Эндрю Таненбаума «Архитектура компьютеров», который был больше ориентирован на программистов, чем разработчиков процессоров. Что и понятно – Таненбаум получил известность как создатель операционной системы Minix, предшественницы Linux, а не разработчик процессора. Для микроархитектуры учебник использовал предыдущую технологическую базу (микрокод) и никак не был привязан к синтезу процессоров на языках описания аппаратуры. То есть студенты изучали системы команд и виды кеша для программистов, но не могли сделать процессор руками. Учебники Паттерсона и Хеннесси были переведены на русский язык с большим опозданием, и в них не вошли приложения с описанием языков проектирования аппаратуры. Профессор Аркадий Поляков после работы в Кремниевой долине вернулся в Россию и издал в 2003 году учебник по Verilog, но в нем не было привязки к компью­ терной архитектуре. Даже когда российские вузы делали лабораторные работы с ПЛИС, преподаватели часто выбирали разработку схемы с помощью рисования мышкой на экране, хотя в американских компаниях это перестали делать еще в начале 1990-х. В типичной вузовской методичке по цифровой электронике 2000-х годов шло качественное описание схем мультиплексоров и триггеров, а потом, пропустив
18 Предисловие к русскому изданию два уровня абстракции, студенты сразу изучали программирование микроконтроллеров. Не было учебника, который бы увязывал все эти элементы в одно целое. История появления учебника «Цифровая схемотехника и архитектура компьютера» Дэвид Харрис учился в MIT как раз тогда, когда произошла революция в маршруте проектирования конца 1980 – начала 1990-х годов. Вооруженный новыми методологиями, Дэвид пошел работать в Intel над процессором Pentium II. После этого защитил диссертацию в Стенфорде и стал преподавателем в Колледже Харви-Мадд в южной Калифорнии. ►► http://pages.hmc.edu/harris/about/General_Resume.pdf. Колледж Харви-Мадд не особо известен широкой публике, но находится среди топ-университетов по заработным платам выпускников, а также количеству выпускников, защищающих впоследствии диссертации. Еще Харви-Мадд известен проектами в области робототехники, которые они делают вместе с NASA. Иными словами, это практик высшего калибра. ►► https://www.monster.com/career-advice/article/colleges-that-get-mostpay-for-graduates. ►► https://www.hmc.edu/about-hmc/2020/09/14/harvey-mudd-ranks-highin-u-s-news-and-world-report-2021/. ►► https://ti.arc.nasa.gov/news/ASR-hosts-Clinic-project/. Дэвид Харрис и его коллега Сара Харрис (они не родственники, а просто однофамильцы) в 2008 году написали первый вариант учебника, в котором в лаконичной и технически корректной форме изложили материал, который обычно входил в несколько учебников: цифровая логика, языки описания аппаратуры Verilog и VHDL, архитектура и микроархитектура компьютера, а также использование готовых чипов. Студенты получили возможность, используя только один учебник, начать с нуля, дойти до конструирования собственного небольшого процессора, реализующего подмножество архитектуры MIPS, а потом сравнить его работу с реальным микроконтроллером Microchip PIC32 на архитектуре MIPS. Книга Харрисов появилась в России В начале 2010-х годов в российской электронной индустрии наступило оживление. Зеленоградские компании «Элвис» и «Миландр» налаживали контакты с ARM и MIPS для лицензирования процессорных ядер, НИИСИ строил суперскалярное 64-битное MIPS-ядро, КМ211 разрабатывали процессоры для смарт-карт и налаживали контакты с тайваньской фабрикой TSMC. РОСНАНО финансировало проект компании «Элвис» в области умных камер и новую компанию «Байкал Электроникс».
Предисловие к русскому изданию 19 Когда проблемы недостатка финансирования и изоляции российских компаний от международного рынка стали решаться, на первый план вышла проблема нехватки кад­ров. Хотя вузовские программы в МИЭТ и ИТМО старались поддерживать свои программы на уровне, компаниям приходилось обучать не только разработчиков схем на Verilog (на уровне RTL – Register Transfer Level), но и инженеров-верификаторов, которым нужно было создавать тесты и модели со знанием, что проиcходит в схеме, спроектированной на Verilog. Поэтому когда в 2014 году появилась идея перевести на русский язык книгу Харрисов, ее поддержали сразу несколько человек и компаний. Преподаватели и аспиранты российских университетов МИФИ, ИТМО, ИТМиВТ, СПб ГУАП, украинских КНУ, КПИ, ХНУРЭ и ЧНТУ; сотрудники российских компаний МЦСТ, НИИСИ РАН, «Модуль», RusBITech, amperka.ru, Runtime Design Automation, «БиДжи»; русские инженеры американских и европейских компаний Imagination Technologies / MIPS Processors, AMD, Synopsys, Apple, eASIC, Cadence, NVidia, Marvell Semiconductor, университета Принстон – более 40 человек приняли участие в переводе, ревью, редактировании и корректировании как учебника, так и лекционных слайдов для него. Перевод поддержала британская компания Imagination Technologies, которая в это время заключала сделки по лицензированию процессорных ядер MIPS и графических ядер PowerVR с российскими компаниями и была заинтересована в улучшении технического образования в России для налаживания долговременных бизнес-отношений с российскими партнерами. В издании книги также помогло eNano, образовательное отделение РОСНАНО, российского фонда, который вкладывал в микроэлектронные проекты. После выхода первого онлайн-издания за дело взялось российское издательство «ДМК Пресс», которое выпустило второе издание Харрисов (использую­щее архитектуру MIPS) в бумажном виде, затем дополнение, которое применяет архитектуру ARM. Книга «Цифровая схемотехника и архитектура компьютера» стала настолько популярна, что ее начали использовать в ведущих российских вузах. Единственного, чего ей не хватало, это полноценного практического курса, который бы мог дополнить основной материал лабораторными работами. В 2019 г. такой курс был создан. Под эгидой МИЭМ НИУ ВШЭ была собрана большая команда преподавателей и разработчиков из СНГ и США, написавшие книгу «Цифровой синтез: практический курс» под редакцией А. Ю. Романова и Ю. В. Панчула. Книга хороша тем, что она раскрывает и дополняет материал книги Харрисов, а также поддержана репозитарием с исходными кодами всех примеров, приведенных в ней, и адаптирована под выполнение лабораторных работ на дешевых отладочных платах с ПЛИС. И вот, наконец, ввиду все большего распространения архитектуры RISC-V, по­ яви­лось новое издание книги «Цифровая схемотехника и архитектура компьютера». Почему RISC-V? Лицензируемые ядра RISC-процессоров совершили еще одну революцию в конце 1990 – начале 2000-х годов, когда ARM стал сердцем сотовых телефонов от Nokia и Ericsson, а MIPS стали использовать в телевизорах Sony, игровых приставках
20 Предисловие к русскому изданию и даже роботах. К компаниям ARM и MIPS присоединились несколько конкурентов, в частности ARC и Tensilica, которые образовали так называемую индустрию полупроводниковой интеллектуальной собственности, semiconductor IP, общим размеров в несколько миллиардов долларов. Помимо разработчиков центральных процессоров в эту индустрию вошли Imagination Technologies – компания, которая спроектировала графический процессор PowerVR для ранних Apple iPhone, затем разработчик процессора для обработки сигналов CEVA и уже в наше время компании, которые выпускают ускорители нейросетевых вычислений. ARM и MIPS получали доход двумя способами: 1) продажей лицензий на процессорные ядра – фактически на использование сотни тысяч строк на Verilog, написанных инженерами ARM и MIPS, внутри систем на кристалле заказчика. Примерами таких компаний стали Microchip, которая лицензировала ядро MIPS M4K для микроконтроллеров PIC32, и ST Microelectronics, которая лицензировала ядра ARM Cortex M для линейки мик­роконтроллеров STM32; 2) продажей так называемой архитектурной лицензии – права на создание процессора собственной микроархитектуры. Инженеры компании-покупателя архитектурной лицензии создавали собственную микроархитектуру и могли разрабатывать код на Verilog сами, но их ядро делалось совместимым по архитектуре (системе команд) с ARM или MIPS. Последним примером такого лицензиата является компания Apple, которая создала свое ARM-совместимое ядро для системы на кристалле Apple M1. Хотя разделение компаний на разработчиков IP-блоков и разработчиков систем на кристалле помогло развить индустрию в 1990–2000-е годы, не все в этой схеме было идеальным. ►► Во-первых, многие компании были недовольны условиями и политикой лицензирования как ядер, так и архитектуры. Особенно сильное негативное впечатление на индустрию произвел судебный процесс MIPS против Lexra в 1999 году, в результате которого пионер IP-лицензирования компания Lexra обанкротилась из-за довольно мелкого нарушения патента на редко используемые инструкции невыравненного обмена с памятью (https://www.eetimes. com/lexra-quits-ip-cores-business-in-deal-with-mips/). ►► Во-вторых, контроль архитектуры со стороны коммерческих компаний не нравился университетским исследователям. Хотя MIPS активно использовался в учебниках, а ARM давал гранты университетам, но ученые были недовольны перспективой получения писем от корпоративных юристов из-за какого-нибудь созданного ими экспериментального процессора. ►► Наконец, во всех RISC-архитектурах скопились разные черты, которые ког­да-­то казались хорошими идеями, но стали тормозом прогресса при услож­нении процессоров, повышении частоты, введении микроархитектуры с вне­очередным выполнением команд, переменной длины инструкций и предсказателями перехода. У SPARС такой чертой были регистровые окна, у MIPS – слоты отло-
Предисловие к русскому изданию 21 женного ветвления, у ARM – условное выполнение инструкций. Нужна была ревизия мира RISC-процессоров. И этой ревизией стала RISC-V – архитектура, созданная в 2010 году группой того же Дэвида Паттерсона из Университета Калифорнии в Беркли, который написал два учебника и стоял у истоков архитектуры SPARC. Группа RISC-V не только объединила опыт процессорных компаний за предыдущие 30 лет, но и вступила в партнерство с Linux Foundation и многими крупными компаниями – Google, AMD, Western Digital. Когда вы используете архитектуру RISC-V для проектирования своего процессора, вам не нужно платить за архитектурную лицензию. При этом сами вы можете получать за свой процессор деньги: продавать его как IP-блок, систему на кристалле или производить на его основе чипы. Вы также можете решить сделать бесплатный процессор с открытым кодом на Verilog для исследователей – это тоже поощряется сообществом вокруг архитектуры RISC-V. Сейчас RISC-V может сыграть большую роль в становлении российской элект­ роники. Российские компании CloudBEAR и Syntacore (приобретенная компанией «Ядро») работают над процессорами собственной микроархитектуры, совместимыми по системе команд с архитектурой RISC-V. Это идеальная комбинация, которая позволяет разрабатывать свои процессоры и конкурировать по производительности, энергопотреблению и набору расширений с производителями на мировом рынке, одновременно сохраняя программную совместимость со всеми программами, которые создаются для экосистемы RISC-V во всем мире. К таким программам относятся компиляторы, операционные системы и прикладные программы – от программ для миниатюрных чипов для интернета вещей до мобильных устройств, автомобильной электроники, десктопов и суперкомпьютеров. Подводя итог Предыдущие издания учебника Харрисов уже помогли исправить серьезный дис­ баланс в преподавании цифровой электроники в России, который возник еще в 1990-е го­ды. Книга также стала отправной точкой для создания курса лабораторных работ на ПЛИС под эгидой МИЭМ НИУ ВШЭ, онлайн-курсов от РОСНАНО и семинаров на ChipEXPO в Сколково. Новое же издание учебника Харрисов выходит как раз тогда, когда в России разворачиваются амбициозные проекты по созданию высокопроизводительных процессорных ядер, которые совместимы с открытой международной архитектурой RISC-V и при этом спроектированы в России. Мы ожидаем, что читатели этой книги станут топ-разработчиками и бизнес-лидерами российcкой электронной промышленности и помогут ей занять место в мире, которое соответствует российским традициям достижений в математике, физике, атомных и космических технологиях. Юрий Панчул, инженер-проектировщик CPU, GPU и сетевых микросхем, с опытом работы в MIPS Technologies, Imagination Technologies, Juniper Networks и Samsung Advanced Computing Lab
Предисловие от редактора русского перевода Дорогие читатели, перед вами – уникальное издание. После распада СССР в русскоязычной образовательной среде возник вакуум, интеллектуальный рынок быстро захватили иностранные САПРы, а на первых ролях оказалась западная электроника. В сфере образования курсы по цифровой электронике нередко сводились к локальным курсам под конкретные платы, наличествовавшие в том или ином университете, а во многих случаях (в том числе из-за отсутствия надлежащего оборудования) учебный процесс превращался в сугубо теоретическое изучение дисциплины. Об этом явлении совершенно справедливо написал Юрий Панчул: https://habr.com/ru/post/589091/ («Почему книга Энд­рю Таненбаума “Архитектура компьютера” вредна для образования»), чью точку зрения я полностью поддерживаю, поскольку сам учился по книге Таненбаума. К счастью, в последующие годы картина начала меняться. Университеты стали богаче, появилась возможность приобретения необходимого оборудования, оно стало доступно и для личного пользования; началось оживление в российских компаниях, и обозначилась все большая потребность в специалистах по цифровой электронике. Все эти обстоятельства сформировали запрос на появление массовых учебных материалов на русском языке. Звезды сошлись в 2016 году: для написания книги, по инициативе Юрия Панчула, удалось собрать вместе специалистов из ряда университетов и международных компаний, получить финансирование от Imagination technologies и найти понимание ведущего издательства в этой сфере – «ДМК Пресс». Основой для написания материала будущего издания стала великолепная книга D. M. Harris, S. L. Harris «Digital Design and Computer Architecture», де-факто являющаяся стандартом при изучении компьютерной архитектуры и цифрового синтеза во многих зарубежных университетах. Так появилось первое издание книги «Цифровая схемотехника и архитектура компью­тера». Несмотря на то что перевод был в некоторой степени аматорским и в первом издании обнаружились некоторые ошибки и неточности, книга стала бест­ селлером и разошлась тиражом в не одну тысячу экземпляров. Поскольку перевод первого издания книги осуществлялся без моего участия, мною в учебном процессе использовалась ее английская версия. Но как только появился русский перевод, он был сразу внедрен в учебные курсы, и на нем выросло несколько поколений студентов. Дальше – больше. «Цифровой синтез» издали в цветном варианте, потом вышло дополнение по архитектуре ARM, а также была выпущена отдельная книга, допол-
Предисловие от редактора русского перевода 23 няющая основную: «Цифровой синтез: практический курс», которая представляет собой компьютерный практикум, построенный на дешевых и доступных платах ПЛИС, при этом был сделан акцент на изучении языка Verilog. Следует отметить, что время не стоит на месте: архитектура MIPS, которой посвящена исходная книга, все больше теряет свои позиции и вытесняется RISC-V, объединяющей в себе новые подходы к проектированию RISC-процессоров и принципы открытой разработки. Таким образом, появилась насущная необходимость в переводе нового издания книги D. M. Harris, S. L. Harris «Digital Design and Computer Architecture. RISC-V Edition». Хотя новое издание в целом ряде глав пересекается с исходной книгой, другие главы, посвященные архитектуре RISC-V, – полностью новые. Можно было пойти при этом по одному из путей: либо выпустить дополнение к основной книге (как это было сделано для архитектуры ARM), либо перевы­ пустить книгу полностью. Чтобы не нарушать целостность произведения, было принято решение пойти по второму пути, попутно исправив допущенные ранее ошибки и тщательно переработав старые главы. Результат этого труда – перед вами. Данная книга будет полезна всем студентам (таких вузов, как, например, МИЭТ или ИТМО), изучающим архитектуру компьютера и языки описания аппаратуры, а также всем разработчикам, которым необходимо понимать, как устроен микропроцессор/микроконтроллер или другая цифровая схема изнутри. Александр Юрьевич Романов, научный редактор книги, к. т. н., доцент МИЭМ НИУ ВШЭ, преподаватель курсов «Проектирование систем на кристалле» и «Системное проектирование цифровых устройств», г. Москва, Россия
Предисловие Эта книга уникальна тем, что описывает цифровую схемотехнику с точки зрения компьютерной архитектуры, начиная с двоичной логики и заканчивая проектированием микропроцессора. Мы считаем, что проектирование микропроцессора является своеобразным обрядом посвящения для студентов инженерных и компьютерных специальностей. Внутренняя работа микропроцессора кажется почти магической для непосвященных, но при подробном объяснении оказывается простой и доступной для понимания. Проектирование цифровых схем само по себе является захватывающим предметом. Программирование на языке ассемблера позволяет понять внутренний язык, на котором говорит микропроцессор. Микроархитектура, в свою очередь, является тем связующим звеном, которое объединяет эти предметы воедино. Первые две версии этого набирающего популярность учебника описывают архитектуры MIPS и ARM. MIPS – одна из исходных вычислительных архитектур с сокращенным набором команд (Reduced Instruction Set Computing, RISC), простая в изучении и применении. Значимость архитектуры MIPS сложно переоценить, поскольку она вдохновила разработчиков на создание последующих архитектур, включая RISC-V. Архитектура ARM стала очень популярной за последние несколько десятилетий благодаря своей эффективности и богатой экосистеме. Было продано более 50 млрд процессоров ARM, и более 75 % людей на планете используют продукты с этими процессорами. В течение последнего десятилетия архитектура RISC-V становится все более значимой как с образовательной, так и с коммерческой точки зрения. Будучи широко распространенной компьютерной архитектурой с открытым исходным кодом, RISC-V сочетает простоту MIPS с гибкостью и функциональностью современных процессоров. С познавательной точки зрения использование трех версий учебника – MIPS, ARM и RISC-V – полностью идентично. Архитектура RISC-V имеет ряд особенностей, включающих расширяемость и компактный формат представления инструкций, которые повышают ее эффективность, но немного увеличивают сложность. Три микроархитектуры также похожи, а архитектуры MIPS и RISC-V имеют много общего. Мы планируем переиздавать версии учебника про MIPS, ARM и RISC-V до тех пор, пока эти архитектуры востребованы рынком. Особенности книги Эта книга содержит ряд особенностей. Одновременное использование языков SystemVerilog и VHDL Языки описания аппаратуры (hardware description languages, HDL) находятся в основе современных методов проектирования сложных цифровых систем. К сожалению, разработчики делятся на две примерно равные группы, использующие два
Предисловие 25 разных языка, – SystemVerilog и VHDL. Языки описания аппаратуры рассматриваются в главе 4, сразу после глав, посвященных проектированию комбинационных и последовательностных логических схем. Затем языки HDL используются в главах 5 и 7 для разработки цифровых блоков большего размера и процессора целиком. Тем не менее главу 4 можно безболезненно пропустить, если изучение языков HDL не входит в программу. Эта книга уникальна тем, что использует одновременно и SystemVerilog, и VHDL, что позволяет читателю освоить проектирование цифровых систем сразу на двух языках. В главе 4 сначала описываются общие принципы, применимые к обоим языкам, а затем вводится синтаксис и приводятся примеры использования этих языков. Этот двуязычный подход облегчает преподавателю выбор языка HDL, а читателю позволит перейти с одного языка на другой как во время учебы, так и в профессиональной деятельности. Архитектура и микроархитектура процессора RISC-V Главы 6 и 7 посвящены изучению архитектуры и микроархитектуры RISC-V. Архитектура RISC-V является идеальным учебным пособием в том смысле, что это реальная архитектура, на которой основаны миллионы выпускаемых ежегодно мик­ росхем, и в то же время она проста для изучения. Кроме того, сотни университетов по всему миру разрабатывают учебные курсы, лабораторные работы и различные инструменты именно для этой архитектуры. Живые примеры В дополнение к обсуждению основной темы этого учебника – архитектуры RISC-V – в разделе 6.8 для расширения кругозора студентов рассматривается архитектура процессоров Intel x86. В главе 9 (доступной в виде онлайн-приложения) также описываются периферийные устройства на примере популярной платы для разработки RED-V RedBoard от SparkFun, в основе которой лежит процессор SiFive Freedom E310 RISC-V. Эти живые примеры показывают, как описанные в данных главах концепции применяются в реальных микросхемах, которые широко используются в персональных компьютерах и бытовой электронике. Доступное описание высокопроизводительных архитектур Глава 7 содержит краткий обзор особенностей современных высокопроизводительных микроархитектур, включая такие, как внеочередное выполнение команд, суперскалярность, многопоточность и многоядерность. Материал изложен в доступной для первокурсников форме и показывает, как можно расширить микроархитектуры, описанные в книге, чтобы получить современный процессор. Упражнения в конце глав и вопросы для собеседования Лучшим способом изучения цифровой схемотехники является разработка устройств. В конце каждой главы приведены многочисленные упражнения. За
26 Предисловие упражнениями следует набор вопросов для собеседования, которые наши коллеги обычно задают студентам, претендующим на работу в отрасли. Эти вопросы предлагают читателю взглянуть на задачи, с которыми соискателям придется столкнуться в ходе собеседования при трудоустройстве. Решения упражнений доступны через веб-сайт книги и специальный веб-сайт для преподавателей. Более подробная информация приведена в следующем разделе. Материалы в сети Интернет Дополнительные англоязычные материалы для этой книги доступны на веб-сайте по адресу http://www.ddcabook.com или на сайте издателя: https://www.elsevier. com/books-and-journals/book-companion/9780128200643. Эти веб-сайты доступны для всех читателей и содержат следующие материалы: ►► ссылки на видеокурсы; ►► решения упражнений с нечетными номерами; ►► иллюстрации из книги в форматах PDF и PPTX; ►► ссылки на профессиональные инструменты автоматизированного проектирования (САПР) от Intel®; ►► инструкции по использованию PlatformIO (расширение Visual Studio Code) для компиляции, сборки и моделирования кода на языках С и ассемблера для процессоров RISC-V; ►► HDL-код для процессора RISC-V; ►► полезные советы по использованию Intel Quartus; ►► слайды лекций в формате PowerPoint (PPTX); ►► образцы учебных и лабораторных материалов для курса; ►► список опечаток и исправлений. Также существует специальный веб-сайт для преподавателей, зарегистрировавшихся на https://inspectioncopy.elsevier.com, который содержит: ►► решения всех упражнений; ►► решения заданий к лабораторным работам. Открытые курсы на EdX К этой книге прилагаются открытые курсы на сайте EdX (https://www.edx. org/). Курсы содержат видеолекции, интерактивные упражнения, а также интерактивные наборы задач и лабораторные работы. Набор курсов состоит из двух частей – «Цифровая схемотехника» (ENGR 85A) и «Компьютерная архитектура» (ENGR 85B), – разработанных в Harvey Mudd College (HarveyMuddX; на EdX выполните поиск по фразам «Digital Design HarveyMuddX» и «Computer Architecture HarveyMuddX»). Вам не придется платить за просмотр видео, но EdX взимает плату за интерактивные упражнения и сертификат. Для студентов предусмотрены скидки.
Предисловие 27 Как использовать программный инструментарий в учебном курсе Программное обеспечение Intel Quartus Программное обеспечение Quartus Web Edition и Lite Edition представляет собой бесплатные версии профессиональной САПР Intel Quartus™, предназначенной для разработки устройств на FPGA. Это позволяет студентам проектировать цифровые устройства в виде принципиальных схем или на языках SystemVerilog и VHDL. Пос­ ле создания схемы или кода устройства студенты могут моделировать их поведение с использованием САПР ModelSim™-Intel FPGA Edition или Starter Edition, которые входят в состав САПР Intel Quartus. Quartus также содержит встроенный инструмент логического синтеза, который поддерживает языки описаний SystemVerilog и VHDL. Разница между Web Edition, Lite Edition и Pro Edition заключается в том, что Web- и Lite Edition поддерживают только подмножество наиболее распространенных FPGA производимых Intel FPGA (Altera). Бесплатные версии ModelSim искусственно снижают производительность моделирования для проектов, содержащих больше 10 тысяч строк HDL-кода, тогда как профессиональная версия ModelSim этого не делает. PlatformIO Расширение PlatformIO для редактора Visual Studio Code представляет собой набор средств разработки программного обеспечения (software development kit, SDK) для RISC-V. Поскольку появление каждой новой платформы влекло за собой появление нового SDK, расширение PlatformIO сделало процесс программирования и использования различных процессоров заметно проще благодаря наличию унифицированного интерфейса для большого количества платформ и устройств. SDK PlatformIO можно скачать бесплатно и использовать с RED-V RedBoard SparkFun, как описано в лабораторных работах на веб-сайте1. PlatformIO предоставляет доступ к коммерческому компилятору RISC-V и позволяет студентам разрабатывать программы на языках С и ассемблера, компилировать их, а затем запускать и выполнять их отладку на RedBoard SparkFun RED-V (глава 9 и соответствующие лабораторные работы). Симулятор ассемблера Venus Симулятор Venus, доступный по адресу https://www.kvakil.me/venus/, – это веб-симулятор ассемблера RISC-V. Программы разрабатываются (или копируются/вставляются) на вкладке Редактор, а затем моделируются и запускаются на вкладке Симулятор. Во время работы программы можно просматривать содержимое регистров и памяти. 1 https://docs.platformio.org/en/latest/boards/sifive/sparkfun_redboard_v.html.
28 Предисловие Лабораторные работы Веб-сайт книги содержит ссылки на ряд лабораторных работ, которые охватывают все темы, начиная от проектирования цифровых систем и заканчивая архитектурой компьютера. Из лабораторных работ студенты узнают, как использовать САПР Quartus для описания своих проектов, их моделирования, синтеза и реализации. Лабораторные работы также включают темы по программированию на языке C и языке ассемблера с использованием PlatformIO и RedBoard RED-V от SparkFun. После синтеза схемы студенты могут реализовать свои проекты, используя платы Altera DE2, DE2-115, DE0 или другую плату FPGA. Лабораторные работы подготовлены для плат DE2 или DE-115. Эти мощные и относительно недорогие платы доступны для заказа на сайте www.de2-115.terasic.com. На платах размещаются мик­росхемы FPGA, которые можно сконфигурировать для реализации студенческих проектов. Мы предоставляем лабораторные работы, которые описывают, как реализовать различные блоки на плате DE2-115 с помощью программного обеспечения Quartus. Для проведения лабораторных работ учащимся необходимо загрузить и установить Intel Quartus Web или Lite Edition и Visual Studio Code с расширением PlatformIO. Преподаватели также могут установить эти САПР в учебных лабораториях. Лабораторные работы включают инструкции по разработке проектов на плате DE2/DE2-115. Этап практической реализации проекта на плате можно пропус­ тить, но мы считаем, что он имеет большое значение для получения практических на­выков. Мы протестировали лабораторные работы на ОС Windows, но такие же инструменты доступны и для ОС Linux. Курсы RVfpga После изучения материала данной книги мы рекомендуем пройти бесплатный цикл из двух курсов RISC-V FPGA (RVfpga). Первый курс рассказывает о том, как сконфигурировать коммерческое ядро RISC-V для реализации на FPGA, запрограммировать его с помощью языка ассемблера RISC-V или С, добавить к нему периферийные устройства, а также проанализировать и изменить ядро и систему памяти, включая добавление инструкций в ядро. В этом курсе используется система на кристалле (SoC) SweRVolf с открытым исходным кодом (https://github.com/chipsalliance/ Cores-SweRVolf), основанная на коммерческом ядре SweRV EH1 от Western Digital (https://www.westerndigital.com/solutions/business/risc-v). В курсе также показано, как использовать симулятор HDL с открытым исходным кодом Verilator и симулятор набора команд RISC-V с открытым исходным кодом Whisper от Western Digital. Второй курс, RVfpga-SoC, показывает, как построить SoC на основе SweRVolf, используя такие функциональные элементы, как ядро SweRV EH1, межмодульные соединения и память. Затем курс рассказывает пользователю о загрузке и запуске операционной системы Zephyr на SoC RISC-V. Все необходимое программное обес­ печение и исходный код системы (файлы Verilog/SystemVerilog) бесплатны, а кур-
Предисловие 29 сы можно проходить с использованием симулятора, поэтому вам не придется покупать оборудование. Материалы RVfpga свободно доступны после регистрации на сайте программы Imagination Technologies University по адресу https://university. imgtec.com/rvfpga/. Опечатки Все опытные программисты знают, что любая сложная программа непременно содержит ошибки. Так же происходит и с книгами. Мы старались выявить и исправить все ошибки и опечатки в этой книге. Тем не менее некоторые ошибки могли остаться. Список найденных ошибок будет опубликован на веб-сайте книги. Пожалуйста, присылайте найденные ошибки по адресу ddcabugs@gmail.com (для английской версии книги; для русской версии – присылайте научному редактору русского перевода А. Ю. Романову на электронную почту a.romanov@hse.ru). Первый человек, который сообщит об ошибке в английском издании и предоставит исправление, которое мы используем в будущем переиздании книги, будет вознагражден премией в 1 доллар! Признательность за поддержку Мы высоко ценим огромный вклад Стива Меркена (Steve Merken), Нейта Макфаддена (Nate McFadden), Руби Гаммелл (Ruby Gammell), Андрэ Аке (Andrae Akeh), Маникандана Чандрасекарана (Manikandan Chandrasekaran) и остальных членов издательской команды Morgan Kaufmann, которые сделали эту книгу реальностью. Мы любим творчество Дуэйна Бибби (Duane Bibby), чьи забавные рисунки украшают страницы книги. Мы хотели бы поблагодарить Мэтью Уоткинса (Matthew Watkins), который помог написать раздел о гетерогенных многопроцессорных системах в главе 7, и Джоша Брейка (Josh Brake), принявшего участие в написании главы 9 о встроенных системах ввода-вывода. Мы высоко ценим работу Матео Марковича (Mateo Markovic) и Джорди Райдера (Geordie Ryder), которые рецензировали книгу и внесли свой вклад в решения упражнений. Огромный вклад в улучшение качества книги внесли многочисленные рецензенты: Дэниел Чавер Мартинес (Daniel Chaver Martinez), Рой Кравиц (Roy Kravitz), Звонимир Бандич (Zvonimir Bandic), Джузеппе Ди Луна (Giuseppe Di Luna), Штеффен Пол (Steffen Paul), Рави Миттал (Ravi Mittal), Дженнифер Виникус (Jennifer Winikus), Хешам Омран (Hesham Omran), Анхель Солис (Angel Solis), Райнер Дизон (Reiner Dizon) и Олоф Киндгрен (Olof Kindgren). Мы также очень признательны нашим студентам в колледже Harvey Mudd и Университете Невады в Лас-Вегасе, которые дали нам полезные отзывы на черновики этого учебника. И конечно же, мы оба благодарим наши семьи за их любовь и поддержку.
Ве рх Запретная ЗОНА Ни з
Глава 1 От нуля до единицы 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8. 1.9. План игры Искусство управления сложностью Цифровая абстракция Системы счисления Логические элементы За пределами цифровой абстракции КМОП-транзисторы Потребляемая мощность Краткий обзор главы 1 и того, что нас ждет впереди Упражнения Вопросы для собеседования 1.1. План игры За последние тридцать лет микропроцессоры буквально изменили наш мир до неузнаваемости. Ноутбук сейчас обладает большей вычислительной мощностью, чем большой компьютер из недавнего прошлого, занимавший целую комнату. Внутри современного автомобиля представительского класса можно обнаружить около пятидесяти микропроцессоров. Именно прогресс в области микропроцессорной техники сделал возможным появление сотовых телефонов и сети Интернет, значительно продвинул вперед медицину и радикально изменил тактику и стратегию современных войн. Объем продаж мировой полупроводниковой промышленности вырос с 21 млрд долларов в 1985 году до 300 млрд долларов в 2011 году, причем микропроцессоры составили львиную долю этих продаж. Мы убеждены, что микропроцессоры важны не только с технической, экономической и социальной точек зрения, но и стали одним из самых увлекательных изобретений в истории человечества. Когда вы за-
32 Глава 1. От нуля до единицы кончите чтение этой книги, вы будете знать, как разработать и построить ваш собственный микропроцессор, а навыки, полученные на этом пути, пригодятся вам для разработки многих других цифровых систем. Мы предполагаем, что у вас уже есть базовые знания по теории элект­ ричества, некоторый опыт программирования и искреннее желание понять, что происходит внутри компьютера. В этой книге основное внимание уделяется разработке цифровых систем, то есть систем, которые используют для своей работы два уровня напряжения, представляющих единицу и ноль. Мы начнем с простейших цифровых логических элементов (digital logic gates), которые принимают определенную комбинацию единиц и нулей на входах и трансформируют ее в другую комби­нацию единиц и нулей на выходах. После этого мы с вами научимся объединять эти простейшие логические элементы в более сложныe модули, такие как сумматоры и блоки памяти. Затем перейдем к программированию на языке ассемблера – родном языке микропроцессора. И в завершение из кирпичиков логических элементов мы соберем полноценный микропроцессор, способный выполнять программы, разработанные на языке ассемблера. Огромным преимуществом цифровых систем над аналоговыми является то, что необходимые для их построения блоки чрезвычайно прос­ты, поскольку оперируют не непрерывными сигналами, а единицами и нулями. Построение цифровой системы не требует запутанных математических расчетов или глубоких знаний в области физики. Вместо этого задача, стоящая перед разработчиком цифровых устройств, заключается в том, чтобы собрать сложную работающую систему из этих простых блоков. Возможно, микропроцессор станет первой разработанной вами системой, настолько сложной, что ее невозможно целиком удержать в голове. Именно поэтому одной из тем, проходящих красной нитью через эту книгу, является искусство управления сложностью системы. 1.2. Искусство управления сложностью Одной из характеристик, отличающих профессионального инженера-­ элект­ронщика или программиста от дилетанта, является систематический подход к управлению сложностью многоуровневой системы. Современные цифровые системы построены из миллионов и миллиардов транзисторов. Человеческий мозг не в состоянии предсказать поведение подобных систем путем составления уравнений, описывающих движение каждого электрона в каждом транзисторе системы, и последующего решения этой системы уравнений. Для того чтобы разработать удачный
1.2. Искусство управления сложностью 33 микропроцессор и не утонуть при этом в море избыточной информации, необходимо научиться управлять сложностью разрабатываемой системы. 1.2.1. Абстракция Критически важный принцип управления сложностью системы – абстракция, подразумевающая исключение из рассмотрения тех элементов, которые в данном конкретном случае несущественны для понимания работы этой системы. Любую систему можно рассматривать с различных уровней абстракции. Политику, участвующему в выборах, например, нет нужды учитывать все детали окружающего его мира, ему достаточно абстрактной иерархической модели страны, состоящей из населенных пунктов, областей и федеральных округов. В области может быть несколько населенных пунктов, а федеральный округ включает в себя разные области. Если политик борется за пост президента, то его, скорее всего, интересует то, как проголосует федеральный округ в целом, при этом ему не обязательно знать, какое количество голосов он наберет в каждом конкретном населенном пункте этого округа. Для политика федеральный округ – это его уровень абстракции. С другой стороны, бюро переписи населения обязано знать количество жителей в каждом городе или поселке страны и потому должно оперировать на самом низком уровне абстракции данной системы – на уровне населенных пунктов. На рис. 1.1 показаны уровни абстракции, типичные Прикладное Прикладные для любой электронной компьютерной системы вместе ПО программы (ПО) со строительными блоками, характерными для каждоДрайверы Операционные го уровня абстракции этой системы. На самом низком устройств системы уровне абстракции находится физика, изучающая двиРегистры Архитектура команд жение электронов. Поведение электронов описывает(инструкций) ся квантовой механикой и системой уравнений МакМикроУправление свелла. архитектура потоками Рассматриваемая нами современная электронная Сумматоры система состоит из полупроводниковых устройств Логика Память (devices), таких как транзисторы (а когда-то это были Элементы И Цифровые электронные лампы). Каждое такое устройство имеет схемы Элементы НЕ четко определенные точки соединения с другими поАналоговые Усилители добными устройствами. Эти точки мы будем называть схемы Фильтры контактами (в англоязычной литературе используТранзисторы Полупроводниется термин terminal). Любое электронное устройство Диоды ковые приборы может быть представлено абстрактной математической моделью, описывающей изменяющуюся во вреЭлектроны Физика мени взаимозависимость тока и напряжения. Такие же изменения тока и напряжения можно наблюдать Рис. 1.1 Уровни абстракции на экране осциллографа, если подключить осцилло- электронной вычислительной граф к контактам реального устройства. Данный под- системы
34 Глава 1. От нуля до единицы ход означает, что если рассматривать систему на уровне устройств, функции которых однозначно определены, то можно не учитывать поведение электронов внутри отдельных устройств этой системы. Следующий уровень абстракции – это аналоговые схемы (analog circuits), в которых полупроводниковые устройства соединены таким образом, чтобы они образовывали функциональные компоненты, например усилители. Напряжение на входе и на выходе аналоговой цепи изменяется в непрерывном диапазоне. В отличие от аналоговых цепей, цифровые схемы (digital circuits), такие как логические элементы, используют два строго ограниченных дискретных уровня напряжения. Один из этих дискретных уровней – это логический ноль, другой – логическая единица. В разделах этой книги, посвященных разработке цифровых схем и устройств, мы будем использовать простейшие цифровые схемы для построения сложных цифровых модулей, таких как сумматоры и блоки памяти. Микроархитектурный уровень абстракции, или просто микроархитектура (microarchitecture), связывает логический и архитектурный уровни абстракции. Архитектурный уровень абстракции, или архитектура (architecture), описывает компьютер с точки зрения программиста. Например, архитектура Intel x86, используемая микропроцессорами большинства персональных компьютеров (ПК), определяется набором инструкций и регистров (памяти для временного хранения переменных), доступным для использования программистом. Микроархитектура – это соединение простейших цифровых элементов в логические блоки, предназначенные для выполнения команд, определенных какой-то конкретной архитектурой. Отдельно взятая архитектура может быть реализована с использованием различных вариантов микроархитектур с разным соотношением цены, производительности и потребляемой энергии, и такое соотношение зачастую выбирается как баланс между этими тремя факторами. Процессоры Intel Core i7, Intel 80486 и AMD Athlon, например, используют одну и ту же архитектуру x86, но реализованную с применением трех разных микроархитектурных решений. Рассмотрим область программного обеспечения. Операционная система (operating system) управляет операциями нижнего уровня, такими как доступ к жесткому диску или управление памятью. И наконец, программное обеспечение использует ресурсы операционной системы для решения конкретных задач пользователя. Именно принцип абстрагирования от маловажных деталей позволяет вашей бабушке общаться с внуками в интернете, не задумываясь о квантовых колебаниях электронов или организации памяти компьютера. Каждая глава этой книги начинается с иконок (рис. 1.1), символически изображающих уровни абстракции электронной системы, которые мы перечислили выше. Иконка темно-синего цвета указывает на тот уровень абстракции, которому уделяется главное внимание в этой конкретной главе. Иконки более светлого оттенка синего указывают на другие уровни абстракции, также затронутые в главе.
1.2. Искусство управления сложностью Предмет этой книги – уровни абстракции от цифровых схем до компьютерной архитектуры. Работая на каком-либо из этих уровней абстракции, полезно знать кое-что и об уровнях абстракции, непосредственно сопряженных с тем уровнем, где вы находитесь. Программист, например, не сможет полностью оптимизировать код без понимания архитектуры процессора, который будет выполнять эту программу. Инженер-электронщик, разрабатывающий какой-либо блок микросхемы, не сможет найти компромисс между быстродействием и уровнем потребления энергии транзисторами, ничего не зная о той цифровой схеме, где этот блок будет использоваться. Мы надеемся, что к тому времени, когда вы закончите чтение этой книги, вы сможете выбрать уровень абстракции, необходимый для успешного выполнения любой стоящей перед вами задачи, и оценить влияние ваших инженерных решений на другие уровни абстракции в разрабатываемой вами системе. 1.2.2. Конструкторская дисциплина Конструкторская дисциплина – это преднамеренное ограничение самим конструктором выбора возможных вариантов разработки, что позволяет работать продуктивнее на более высоком уровне абстракции. Использование взаимозаменяемых частей – это, вероятно, самый хорошо знакомый всем нам пример практического применения конструкторской дисциплины. Одним из первых примеров использования взаимозаменяемых деталей и узлов стала унификация при производстве кремневых ружей. До начала XIX века такие ружья производились вручную и в штучном порядке. Высококвалифицированный оружейный мастер тщательно подтачивал и подгонял комплектующие, произведенные несколькими не связанными друг с другом ремесленниками. Конструкторская дисцип­ лина для обеспечения взаимозаменяемости деталей и узлов произвела революцию в оружейной промышленности. Ограничение ассортимента комплектующих деталей до стандартного набора с жестко установленными допусками для каждой детали позволило собирать и ремонтировать ружья гораздо быстрее и использовать при этом менее квалифицированный персонал. Оружейный мастер перестал тратить свое время на разрешение проблем, связанных с нижними уровнями абстракции, такими как доводка какого-то конкретного ствола или исправление формы отдельного взятого приклада. В контексте данной книги соблюдение конструкторской дисциплины в виде максимального использования цифровых схем играет очень важную роль. В цифровых схемах используются дискретные значения напряжения, в то время как в аналоговых схемах напряжение изменяется непрерывно. Таким образом, цифровые схемы, которые можно рассматривать как подмножество аналоговых цепей, в некотором смысле уступают по своим характеристикам более широкому классу аналого- 35
36 Глава 1. От нуля до единицы вых цепей. Но цифровые цепи гораздо проще разработать. Ограничивая использование аналоговых схем и по возможности заменяя их цифровыми, мы можем легко объединять отдельные компоненты в сложные системы, которые в конечном итоге для большинства приложений превзойдут по своим параметрам системы, построенные на аналоговых цепях. Примером тому могут служить цифровые телевизоры, компакт-дис­ ки (CD) и мобильные телефоны, которые уже практичеКапитан Мериуэзер Льюски полностью вытеснили своих аналоговых предшест­ ис – один из руководителей венников. знаменитой экспедиции Льюиса и Кларка на северо-запад США, был, пожалуй, одним из самых ранних сторонников взаимозаменяемости. В 1806 го­ду в своем дневнике, описывая особенности кремниевых унификации деталей кремневых ружей того времени, он написал следующее: «Ружья Дрюера и сержанта Прайора одновременно вышли из строя. На ружье Дрюера сломался ударно-спусковой механизм, и мы заменили его на новый. У ружья сержанта Прайора был сломан курковый винт, вместо которого мы поставили запасной, заранее изготовленный специально для ударно-спускового механизма этого ружья на мануфактуре Харперс Фейри, где это оружие и бы­ло произведено. Если бы не предусмотрительность, зак­лючавшаяся в том, что мы заранее позаботились о запасных частях для ружей, и не мастерство Джона Шилдса, выполнившего всю работу, то большинство ружей нашей экспедиции к этому времени было бы полностью непригодно для какого-либо использования. И я имею полное право записать в своем дневнике, что, к счастью для нас, все наше оружие находится в прекрасном состоянии». См.: История экспедиции Льюиса и Кларка: в 4 т. / под ред. Элиота Куэса. 1-е изд.: Харпер, НьюЙорк, 1893; Переизд.: Довер, Нью-Йорк (3 тома), 3:817. 1.2.3. Три базовых принципа В дополнение к абстрагированию от несущественных деталей и конструкторской дисциплине разработчики элект­ ронных систем используют еще три базовых принципа для управления сложностью системы: иерархичность, модульность конструкции и регулярность. Эти принципы применимы как к программному обеспечению, так и к аппаратной части компьютерных систем. ►► Иерархичность – принцип иерархичности предполагает разделение системы на отдельные модули, а затем последующее разделение каждого такого модуля на фрагменты до уровня, позволяющего легко понять поведение каждого конкретного фрагмента. ►► Модульность – принцип модульности требует, чтобы каждый модуль в системе имел четко определенную функциональность и набор интерфейсов и мог быть легко и без непредвиденных побочных эффектов соединен с другими модулями системы. ►► Регулярность – принцип регулярности требует соблюдения единообразия при разработке отдельных модулей системы. Стандартные модули общего назначения, например такие как блоки питания, могут использоваться многократно, во много раз снижая количество модулей, необходимых для разработки новой системы. Для иллюстрации трех базовых принципов вновь воспользуемся аналогией из оружейного производства. Нарезное кремневое ружье было одним из самых сложных устройств массового применения в начале XIX века. Используя принцип иерархичности, мы можем разделить его на три главных модуля, как показано на рис. 1.2: ствол, ударно-спусковой механизм и приклад с цевьем.
1.2. Искусство управления сложностью 37 Рис. 1.2 Кремневый ружейный замок (рисунок из Euroarms Italia www.euroarms.net © 2006 г.) Ствол – это длинная металлическая труба, через которую при выстреле выбрасывается пуля. Ударно-спусковой механизм производит выстрел. Деревянные приклад и цевье соединяют воедино остальные части ружья и обеспечивают стрелку надежное удержание оружия при выстреле. В свою очередь, ударно-спусковой механизм включает в себя спусковой крючок, курок, кремень, огниво и пороховую полку. Каждый из этих компонентов также может рассматриваться как следующий иерархический уровень и может быть разделен на более мелкие детали. Принцип модульности требует, чтобы каждый компонент выполнял четко определенную функцию и имел интерфейс. Функция приклада и цевья – служить базой для установки ствола и ударно-спускового механизма. Интерфейс для приклада и цевья – это их длина и расположение крепежных элементов, таких как винты или шурупы. Ствол ружья, изготовленного с соблюдением принципа модульности конструкции, может быть установлен на приклады и цевья от разных производителей, если все соединяемые части имеют правильную длину и подходя-
38 Глава 1. От нуля до единицы щие крепежные элементы. Функция ствола – разогнать пулю до необходимой скорости и придать ей вращение, чтобы увеличить точность стрельбы. Принцип модульности требует также, чтобы при соединении модулей не возникало никаких побочных эффектов: конструкция приклада и цевья не должна препятствовать функционированию ствола. Принцип регулярности учит тому, что взаимозаменяемые детали – это хорошая идея. При соблюдении принципа регулярности поврежденный ствол может быть с легкостью заменен на аналогичный. Стволы могут изготовляться на поточной линии с гораздо большей экономической эффективностью, чем в случае штучного производства. В данной книге мы будем постоянно возвращаться к этим трем базовым принципам: иерархичности, модульности и регулярности. 1.3. Цифровая абстракция Большинство физических величин изменяются непрерывно. Например, напряжение в электрическом проводе, частота колебаний или распределение массы – все это параметры, изменяющиеся непрерывно. Цифровые системы, с другой стороны, представляют информацию в виде дискретно меняющихся переменных с конечным числом строго определенных значений. Одной из наиболее ранних цифровых систем стала аналитическая машина Чарльза Бэббиджа, которая использовала переменные с десятью дискретными значениями. Чарльз Бэббидж Начиная с 1834 года и до 1871 года1 Бэббидж разрабаты1791–1871 вал и пытался построить этот механический компьютер. Чарльз Бэббидж родился Шестеренки аналитической машины могли находиться в 1791 году. Закончил Кембриджский университет и жев одном из десяти фиксированных положений, а каждое нился на Джорджиане Витмур. такое положение было промаркировано от 0 до 9, подобОн изобрел аналитическую но механическому счетчику пробега автомобиля. Рисумашину – первый в мире механический компьютер. Чарльз нок 1.3 показывает, как выглядел прототип аналитической Бэббидж также изобрел премашины. Каждый ряд шестеренок такой машины обрабадохранительную решетку для тывал одну цифру. В своем механическом компьютере Бэблокомотивов, спидометр и универсальный почтовый тариф. бидж использовал 25 рядов шестеренок таким образом, Ученый также очень интересочтобы машина обеспечивала вычисления с точностью до вался отмычками для замков 25-го знака. и почему-то ненавидел уличных музыкантов. (Портрет любезно В отличие от машины Бэббиджа большинство электпредоставлен Fourmilab Швейронных компьютеров использует двоичный (бинарный) цария, www.fourmilab.ch.) код. В случае двоичного кода высокое напряжение – это единица, а низкое напряжение – ноль, поскольку гораздо легче оперировать двумя уровнями напряжения, чем десятью. 1 А большинству из нас кажется, что обучение в университете – это так долго!
1.3. Цифровая абстракция 39 Рис. 1.3 Аналитическая машина Бэббиджа в год его смерти (1871) (изображение любезно предоставлено Музеем науки и общества) Объем информации D, передаваемый одной дискретной переменной, которая может находиться в N различных состояниях, измеряется в единицах, называемых битами, и вычисляется по следующей формуле: D = log2N бит. (1.1) Двоичная переменная передает log22 = 1 – один бит информации. Теперь вам, вероятно, понятно, почему единица информации называется битом. Бит (bit) – это сокращение от английского binary digit, что дословно переводится как двоичный разряд. Каждая шестеренка в машине Бэббиджа содержит log210 = 3,322 бита информации, поскольку она может находиться в одном из 23,322 = 10 уникальных положений. Теоретически непрерывный сигнал может передавать бесконечное количество информации, поскольку может принимать неограниченное число значений. На практике шум и ошибки измерения ограничивают информацию, передаваемую большинством непрерывных сигналов, диапазоном от 10 бит до 16 бит. Если же измерение уровня сигнала должно быть произведено очень быстро, то объем передаваемой информации будет еще ниже (в случае 10 бит, например, это будет только 8 бит). Предмет этой книги – цифровые схемы, использующие двоичные переменные ноль и единицу. Джордж Буль разработал систему логики, использующую двоичные переменные, и эту систему сегодня называют его именем – булева логика. Логические переменные могут принимать значения ИСТИНА (TRUE) или ЛОЖЬ (FALSE). В электронных компьютерах положительное напряжение обычно представляет единицу, а нулевое напряжение представляет ноль. В этой книге мы будем использовать понятия единица (1), ИСТИНА (TRUE) и ВЫСОКИЙ УРОВЕНЬ СИГНАЛА (HIGH) как синонимы. Аналогичным образом мы будем использовать ноль (0), ЛОЖЬ (FALSE) и НИЗКИЙ УРОВЕНЬ СИГНАЛА (LOW) как взаимозаменяемые термины.
40 Глава 1. От нуля до единицы Джордж Буль 1815–1864 Джордж Буль родился в семье небогатого ремесленника. Родители Джорджа не могли оплатить его формального образования, поэтому он осваивал математику самоучкой. Несмотря на это, Булю удалось стать преподавателем Королевского колледжа в Ирландии. В 1854 году Джордж Буль написал свою работу «Исследование законов мышления», которая впервые ввела в научный оборот двоичные переменные, а также три основных логических оператора И, ИЛИ, НЕ (AND, OR, NOT). (Портрет любезно предоставлен Американским физическим институтом.) Преимущества цифровой абстракции заключаются в том, что разработчик цифровой системы может сосредоточиться исключительно на единицах и нулях, полностью игнорируя, каким образом логические переменные представлены на физическом уровне. Разработчика не волнует, представлены ли нули и единицы определенными значениями напряжения, вращающимися шестернями или уровнем гидравлической жидкости. Программист может продуктивно работать, не располагая детальной информацией об аппаратном обеспечении компьютера. Но понимание того, как работает это аппаратное обеспечение, позволяет программисту гораздо лучше оптимизировать программу для конкретного компьютера. Как вы могли видеть выше, один-единственный бит не может передать большого количества информации. Поэтому в следующем разделе мы рассмотрим вопрос о том, каким образом набор битов можно использовать для представления десятичных чисел. В последующих главах мы также покажем, как группы битов могут представлять буквы и даже целую программу. 1.4. Системы счисления Все мы привыкли работать с десятичными числами. Но в цифровых системах, построенных на единицах и нулях, использование двоичных или шестнадцатеричных чисел зачастую более удобно. В данном разделе мы рассмотрим системы счисления, использованные в этой книге. 1.4.1. Десятичная система счисления Еще в начальной школе всех нас научили считать и выполнять различные арифметические операции в десятичной (decimal) системе счисления. Такая система использует десять арабских цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – столько же, сколько у нас пальцев на руках. Числа больше 9 записываются в виде строки цифр. Причем цифра, находящаяся в каждой последующей позиции такой строки, начиная с крайней правой цифры, имеет «вес», в десять раз превышающий «вес» цифры, находящейся в предыдущей позиции. Именно поэтому десятичную систему счисления называют системой по основанию (base) 10. Справа налево «вес» каждой позиции увеличивается следующим образом: 1, 10, 100, 1000 и т. д. Позицию, которую цифра занимает в строке десятичного числа, называют разрядом, или декадой.
1.4. Системы счисления Чтобы избежать недоразумений при одновременной работе с более чем одной системой счисления, основание системы обычно указывается путем добавления цифры позади и чуть ниже основного числа: 974210. Рисунок 1.4 показывает, для примера, как десятичное число 974210 может быть записано в виде суммы цифр, составляющих это число, умноженных на «вес» разряда, соответствующего каждой конк­ретной цифре. Колонка единиц Колонка десятков Колонка сотен Колонка тысяч 9742 10 = 9 × 103 + 7 × 102 + 4 × 101 + 2 × 100 Девять тысяч Семь сотен Четыре десятки Две единицы Рис. 1.4 Представление десятичного числа N-разрядное десятичное число может представлять одну из 10N цифровых комбинаций: 0, 1, 2, 3, … 10N – 1. Это называется диапазоном N-разрядного числа. Десятичное число, состоящее из трех цифр (разрядов), например, представляет одну из 1000 возможных цифровых комбинаций в диапазоне от 0 до 999. 1.4.2. Двоичная система счисления Одиночный бит может принимать одно из двух значений, 0 или 1. Несколько битов, соединенных в одной строке, образуют двоичное (binary) число. Каждая последующая позиция в двоичной строке имеет вдвое больший «вес», чем предыдущая позиция, так что двоичная система счисления – это система по основанию 2. В двоичном числе «вес» каж­ дой позиции увеличивается (так же, как и в десятичном – справа налево) следующим образом: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16 384, 32 768, 65 536 и т. д. Работая с двоичными числами, очень полезно для экономии времени запомнить значения степеней двойки до 216. Произвольное N-разрядное двоичное число может представлять одну из 2N цифровых комбинаций: 0, 1, 2, 3, … 2N – 1. В табл. 1.1 собраны 1‑битные, 2-битные, 3-битные и 4-битные двоичные числа и их десятичные эквиваленты. Пример 1.1 ПРЕОБРАЗОВАНИЕ ЧИСЕЛ ИЗ ДВОИЧНОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ДЕСЯТИЧНУЮ Преобразовать двоичное число 101102 в десятичное. Решение Необходимые преобразования представлены на рис. 1.5. 41
42 Глава 1. От нуля до единицы Колонка единиц Колонка двоек Колонка четверок Колонка восьмерок Колонка шестнадцати Рис. 1.5 Преобразование двоичного числа в десятичное число Таблица 1.1 10110 2 = 1 × 24 + 0 × 23 + 1 × 22 + 1 × 21+ 0 × 20 = 2210 Одна шестнадцать Нет восемь Одна четыре Одна двойка Нет единиц Таблица двоичных чисел и их десятичный эквивалент 1-битные двоичные числа 2-битные двоичные числа 3-битные двоичные числа 4-битные двоичные числа Десятичные эквиваленты 0 1 00 01 10 11 000 001 010 011 100 101 110 111 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Пример 1.2 ПРЕОБРАЗОВАНИЕ ЧИСЕЛ ИЗ ДЕСЯТИЧНОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ДВОИЧНУЮ Преобразовать десятичное число 8410 в двоичное. Решение Определите, что должно стоять в каждой позиции двоичного результата: 1 или 0. Вы можете делать это, начиная с левой или правой позиции. Если начать слева, найдите наибольшую степень 2, меньшую или равную заданному числу (в примере такая степень – это 64). 84 > 64, поэтому ставим 1 в позиции, соответствующей 64. Остается 84 – 64 = 20, 20 < 32, так что в позиции 32 надо поставить 0, 20 > 16, поэтому в позиции 16 ставим 1. Остается 20 – 16 = 4. 4 < 8, поэтому 0 в позиции 8. 4 ≥ 4 – ставим 1 в позицию 4. 4 – 4 = 0, поэтому будут 0 в позициях 2 и 1. Собрав все вместе, получаем 8410 = 10101002. Если начать справа, будем последовательно делить исходное число на 2. Остаток идет в очередную позицию. 84/2 = 42, поэтому 0 в самой правой позиции. 42/2 = 21, 0 во вторую позицию. 21/2 = 10, остаток 1 идет в позицию, соот-
1.4. Системы счисления 43 ветствующую 4. 10/2 = 5, поэтому 0 в позицию, соответствующую 8. 5/2 = 2, остаток 1 в позицию 16. 2/2 = 1, 0 в 32 позицию. Наконец, 1/2 = 0 с остатком 1, который идет в позицию 64. Снова 8410 = 10101002. 1.4.3. Шестнадцатеричная система счисления Использование длинных двоичных чисел для записи и выполнения математических расчетов на бумаге утомительно и чревато ошибками. При этом длинное двоичное число можно разбить на группы по четыре бита, каждая из которых представляет одну из 24 = 16 цифровых комбинаций. Именно поэтому зачастую бывает удобнее использовать для работы систему счисления по основанию 16, называемую шестнадцатеричной (hexadecimal). Для записи шестнадцатеричных чисел используются цифры от 0 до 9 и буквы от A до F, как показано в табл. 1.2. В шестнадцатеричном числе «вес» каждой позиции меняется следующим образом: 1, 16, 162 (или 256), 163 (или 4096) и т. д. Таблица 1.2 Интересно, что термин hexadecimal (шестнадцатеричный) введен в научный обиход корпорацией IBM в 1963 году и является комбинацией греческого слова hexi (шесть) и латинского decem (десять). Правильнее было бы использовать латинское же слово sexa (шесть), но термин sexadecimal воспринимался бы несколько неоднозначно. Шестнадцатеричная система счисления Шестнадцатеричная цифра Десятичный эквивалент Двоичный эквивалент 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Пример 1.3 ПРЕОБРАЗОВАНИЕ ШЕСТНАДЦАТЕРИЧНОГО ЧИСЛА В ДВОИЧНОЕ И ДЕСЯТИЧНОЕ Преобразовать шестнадцатеричное число 2ЕD16 в двоичное и десятичное. Решение Преобразование шестнадцатеричного числа в двоичное и обратно – очень простое, так как каждая шестнадцатеричная цифра прямо соответствует
44 Глава 1. От нуля до единицы 4-разрядному двоичному числу. 216 = 00102, Е16 = 11102 и D16 = 11012, так что 2ED16 = 0010111011012. Преобразование в десятичную систему счисления требует выполнения арифметических операций, показанных, показанной на рис. 1.6. Колонка единицы Колонка шестнадцати Колонка двухсот пятидесяти шести 2ED 16 = 2 × 162 + E × 161 + D × 160 = 74910 Две Четырнадцать двести шестнадцать пятьдесят шесть Рис. 1.6 Пример 1.4 Тринадцать единиц Преобразование шестнадцатеричного числа в десятичное число ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ЧИСЛА В ШЕСТНАДЦАТЕРИЧНОЕ Преобразовать двоичное число 11110102 в шестнадцатеричное. Решение Повторим еще раз, это просто. Начинаем справа. 4 наименее значимых бита 10102 = А16. Следующие биты 1112 = 716. Отсюда 11110102 = 7А16. Пример 1.5 ПРЕОБРАЗОВАНИЕ ДЕСЯТИЧНОГО ЧИСЛА В ШЕСТАНДЦАТЕРИЧНОЕ И ДВОИЧНОЕ Преобразовать десятичное число 33310 в шестнадцатеричное и двоичное. Решение Как и в случае преобразования десятичного числа в двоичное, можно начать как слева, так и справа. Если начать слева, найдите наибольшую степень шестнадцати, меньшую или равную заданному числу (в нашем случае это 162 = 256). Число 256 содержится в числе 333 только один раз, поэтому в позицию с «весом» 256 мы записываем единицу. Остается число 333 – 256 = 77. Число 16 содержится в числе 77 четыре раза, поэтому в позицию с «весом» 16 записываем четверку. Остается 77 – 16 × 4 = 13. 1310 = D16, поэтому в позицию с «весом» 1 записываем цифру D. Итак, 33310 = 14D16, это число легко преобразовать в двоичное, как мы показали в примере 1.3: 14D16 = 1010011012. Если начинать справа, будем повторять деление на 16. Каждый раз остаток идет в очередную колонку. 333/16 = 20 с остатком 1310 = D16, который идет в самую правую позицию. 20/16 = 1 с остатком 4, который идет в позицию с «весом» 16. 1/16 = 0 с остатком 1, который идет в позицию с «весом» 256. В результате опять получаем 14D16.
1.4. Системы счисления 45 1.4.4. Байт, полубайт и «весь этот джаз» Группа из восьми бит называется байт (byte). Байт предЕсли подходить абсолютно ставляет 28 = 256 цифровых комбинаций. Размер модулей, строго к терминологии, то мик­ сохраненных в памяти компьютера, обычно измеряется ропроцессором называется такой процессор, все элементы именно в байтах, а не битах. которого размещаются на одГруппа из четырех бит (половина байта) называется ной микросхеме. До 70-х годов 4 полубайт (nibble). Полубайт представляет 2 = 16 цифроХХ века полупроводниковая технология не позволяла развых комбинаций. Одна шестнадцатеричная цифра занимаместить процессор целиком ет один полубайт, а две шестнадцатеричные цифры – один на одной микросхеме, поэтому байт. В настоящее время полубайты уже не находят шипроцессоры мощных компью­ теров представляли собой рокого применения, но этот термин все же стоит знать, да набор плат с довольно больи звучит он забавно (в англ. языке nibble означает откусышим количеством различных вать что-либо маленькими кусочками). микросхем на них. Компания Intel в 1971 году представила Микропроцессор обрабатывает данные не целиком, первый 4-битный микропроа небольшими блоками, называемыми словами. Размер цессор, получивший в качестве слова (word) не является величиной, установленной раз названия номер 4004. В наши дни даже самые передовые суи навсегда, а определяется архитектурой каждого конперкомпьютеры построены на кретного микропроцессора. На момент написания этой микропроцессорах, поэтому главы (в 2012 го­ду) абсолютное большинство компьютев этой книге мы будем считать «микропроцессор» и «процесров использовало 64‑битные процессоры. Такие процессосор» тождественными понятиры обрабатывают информацию блоками (словами) длиной ями и использовать оба этих 64 би­та. А еще не так давно верхом совершенства считатермина как синонимы. лись компьютеры, обрабатывающие информацию словами длиной 32 бита. Интересно, что и сегодня наиболее простые микропроцессоры и особенно те, что управляют работой таких бытовых устройств, как, например, тостеры или микроволновые печи, используют слова длиной 16 бит или даже 8 бит. В рамках одной группы битов конечный бит, находящийся на одном конце этой группы (обычно правом), называется наименее значимым битом (least significant bit, LSB), или просто младшим битом, а бит на другом конце группы называется наиболее значимым битом (most significant bit, MSB), или старшим битом. Рисунок 1.7 (a) демонстрирует наименее и наиболее значимые биты в случае 6-битного двоичного числа. Аналогичным образом внутри одного слова можно выделить наименее значимый байт (least significant byte, LSB), или младший байт, и наиболее значимый байт (most significant byte, MSB), или старший байт. Рисунок 1.7 (b) показывает, как это делается в случае 4-байтного числа, записанного восемью шестнадцатеричными цифрами. 101100  Младший  Старший значащий бит (a) значащий бит DEAFDAD8   Младший Старший значащий байт (b) значащий байт Рис. 1.7 Наименее и наиболее значимые биты и байты
46 Глава 1. От нуля до единицы В силу удачного совпадения 210 = 1024 ≈ 103. Этот факт позволяет нам использовать приставку кило (греческое название тысячи) для сокращенного обозначения 210. Например, 210 байт – это один килобайт (1 КБ). Подобным же образом мега (греческое название миллиона) обозначает 220 ≈ 106, а гига (греческое название миллиарда) указывает на 230 ≈ 109. Зная, что 210 ≈ 1 тысяча, 220 ≈ 1 миллион, 230 ≈ 1 миллиард и помня значения степеней двойки до 29 включительно, будет легко приблизительно рассчитать в уме любую другую степень двух. Пример 1.6 ОЦЕНКА СТЕПЕНЕЙ ДВОЙКИ Найдите приблизительное значение 224 без использования калькулятора. Решение Представьте экспоненту как число, кратное десяти, и остаток. 224 = 220 × 24, 220 ≈ 1 миллион. 24 = 16. Итак, 224 ≈ 16 миллионов. На самом деле 224 = 16 777 216, но 16 миллионов – достаточно хорошее приближение для маркетинговых целей. Так же как 1024 байта называют килобайтом (КБ), 1024 бита называют килобитом (Кб или кбит). Аналогичным образом МБ, Мб, ГБ и Гб используются для сокращенного обозначения миллиона и миллиарда байт и бит. Размеры элементов памяти обычно измеряются в байтах. А вот скорость передачи данных измеряется в битах в секунду. Максимальная скорость передачи данных телефонным модемом, например, составляет 56 килобит в секунду. 1.4.5. Сложение двоичных чисел Сложение двоичных чисел производится так же, как и сложение десятичных, с той лишь разницей, что двоичное сложение выполнить гораздо проще (рис. 1.8). Как и при сложении десятичных чисел, если сумма двух чисел превышает значение, помещающееся в один разряд, мы переносим 1 в следующий разряд. На рис. 1.8 для сравнения показано сложение десятичных и двоичных чисел. В крайней правой колонке на рис. 1.8 (a) складываются числа 7 и 9. Сумма 7 + 9 = 16, что превышает 9, а значит, больше того, что может вместить один десятичный разряд. Поэтому мы записываем в первый разряд 6 (первая колонка) и переносим 10 в следующий разряд (вторая колонка) как 1. Аналогичным же образом при сложении двоичных чисел, если сумма двух чисел превышает 1, мы переносим 2 в следующий разряд как 1. В правой колонке на рис. 1.8 (b), например, сумма 1 + 1 = 210 = 102, что не может уместиться в одном двоичном разряде. Поэтому мы записываем 0 в первом разряде (первая колонка) и 1 в следующем разряде (вторая колонка). Во второй колонке опять складываются 1 и 1 и еще добавляется 1, перенесенная сюда после сложения чисел в первой колонке. Сумма 1 + 1 + 1 = 310 = 112.
47 1.4. Системы счисления Мы записываем 1 в первый разряд (вторая колонка) и снова добавляем 1 в следующий разряд (третья колонка). По очевидной причине бит, добавленный в соседний разряд (колонку), называется битом переноса (carry bit). 11 4277 + 5499 9776 (a) Пример 1.7 11 1011 + 0011 1110 (b)  переносы  Рис. 1.8 Примеры сложения с переносом: (a) десятичное, (b) двоичное ДВОИЧНОЕ СЛОЖЕНИЕ Вычислить 01112 + 01012. Решение На рис. 1.9 показано, что сумма равна 11002. Переносы выделены синим цветом. Мы можем проверить нашу работу, повторив вычисления в десятичной системе счисления. 01112 = 710, 01012 = 510. Сумма равна 1210 = 11002. Рис. 1.9 Пример двоичного сложения Цифровые системы обычно оперируют числами с заранее определенным и фиксированным количеством разрядов. Ситуацию, когда результат сложения превышает выделенное для него количество разрядов, называют переполнением (overflow). Четырехбитная ячейка памяти, например, может сохранять значения в диапазоне [0, 15]. Такая ячейка переполняется, если результат сложения превышает число 15. В этом случае дополнительный пятый бит отбрасывается, а результат, оставшийся в четырех битах, будет ошибочным. Переполнение можно обнаружить, если следить за переносом бита из наиболее значимого разряда двоичного числа (рис. 1.8), из наиболее левой колонки. Пример 1.8 СЛОЖЕНИЕ С ПЕРЕПОЛНЕНИЕМ Вычислить 11012 + 01012. Будет ли переполнение? Решение На рис. 1.10 показано, что сумма равна 100102. Результат выходит за границы четырехбитового двоичного числа. Если его нужно запомнить в 4 битах, наиболее значимый бит пропадет, оставив некорректный результат 00102. Если вычисления производятся с числами с пятью или более битами, результат 100102 будет корректным. Рис. 1.10 Пример двоичного сложения с переполнением 1.4.6. Знак двоичных чисел До сих пор мы рассматривали двоичные числа без знака (unsigned) – то есть только положительные числа. Часто для вычислений требуются как положительные, так и отрицательные числа, а это значит, что для знака двоичного числа нам потребуется дополнительный разряд. Существует
48 Глава 1. От нуля до единицы несколько способов представления двоичных чисел со знаком (signed). Наиболее широко применяются два: прямой код (Sign/Magnitude) и дополнительный код (Two’s Complement). Прямой код Представление отрицательных двоичных с использованием прямого кода интуитивно покажется вам наиболее привлекательным, поскольку совпадает с привычным способом записи отрицательных чисел, когда сначала идет знак минус, а затем абсолютное значение числа. Двоичное число, состоящее из N бит и записанное в прямом коде, использует наиболее значимый бит для знака, а остальные N – 1 бит для записи абсолютного значения этого числа. Если наиболее значимый бит 0, то число положительное. Если наиболее значимый бит 1, то число отрицательное. Пример 1.9 ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В ПРЯМОМ КОДЕ Запишите числа 5 и –5 как четырехбитовые числа в прямом коде. Решение Оба числа имеют абсолютную величину 510 = 1012. Таким образом, 510 = 01012 и –510 = 11012. К сожалению, стандартный способ сложения не работает в случае двоичных чисел со знаком, записанных в прямом коде. Например, складывая –510 + 510 привычным способом, получаем 11012 + 01012 = 100102. Что, естественно, является полным абсурдом. Двоичная переменная длиной N бит в прямом коде может представлять число в диапазоне [–2N–1 + 1, 2N–1 – 1]. Другой несколько странной особенностью прямого кода является наличие +0 и –0, причем оба этих числа соответствуют одному нулю. Нетрудно предположить, что представление одной и той же величины двумя различными способами чревато ошибками. Дополнительный код Двоичные числа, записанные с использованием дополнительного кода, и двоичные числа без знака идентичны, за исключением того, что в случае дополнительного кода вес наиболее значимого бита –2N–1 вмес­ то 2N–1, как в случае двоичного числа без знака. Дополнительный код гарантирует однозначное представление нуля, допускает сложение чисел по привычной схеме, а значит, избавлен от недостатков прямого кода. В случае дополнительного кода нулевое значение представлено нулями во всех разрядах двоичного числа: 00…0002. Максимальное положительное значение представлено нулем в наиболее значимом разряде и единицами во всех других разрядах двоичного числа: 01…1112 = 2N–1 – 1. Максимальное отрицательное значение содержит единицу в наиболее
1.4. Системы счисления 49 значимом разряде и нули во всех остальных разрядах: 10…0002 = –2N–1. Отри­цательная единица представлена единицами во всех разрядах двоичного числа: 11…1112. Обратите внимание на то, что наиболее значимый разряд у всех положительных чисел – это «0», в то время как у отрицательных чисел – это «1», то есть наиболее значимый бит дополнительного кода можно рассматривать как аналог знакового бита прямого кода. Но на этом сходство кончается, поскольку остальные биты дополнительного кода интерпретируются не так, как биты прямого кода. В случае дополнительного кода знак отрицательного двоичного числа изменяется на противоположный путем выполнения специальной операции, называемой в дополнительном коде (taking the two’s complement). Суть этой операции заключается в том, что инвертируются все биты этого числа, а затем к значению наименее значимого бита прибавляется 1. Подобная операция позволяет найти двоичное представление отрицательного числа или определить его абсолютное значение. Пример 1.10 ПРЕДСТАВЛЕНИЕ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ В ДОПОЛНИТЕЛЬНОМ КОДЕ Найти представление –210 как 4-битового числа в дополнительном коде. Решение Начните с +210 = 00102. Для получения –210 инвертируйте биты и добавьте единицу. Инвертируя 00102, получим 11012. 11012 + 1 = 11102. Итак, –210 равно 11102. Пример 1.11 ЗНАЧЕНИЕ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ В ДОПОЛНИТЕЛЬНОМ КОДЕ Найти десятичное значение числа 10012 в дополнительном коде. Решение Число 10012 имеет старшую 1, поэтому оно должно быть отрицательным. Чтобы найти его модуль, инвертируем все биты и добавляем 1. Инвертируя 10012, получим 01102. 01102 + 1 = 01112 = 710. Отсюда 10012 = –710. Неоспоримым преимуществом дополнительного кода является то, что привычный способ сложения работает как в случае положительных, так и отрицательных чисел. Напомним, что при сложении N-битных чисел N-й бит (т. е. N + 1 бит результата) не переносится. (Фото: ESA/CNES/ ARIANESPACE-Service Optique CS6) Ракета Ариан-5 ценой 7 млрд долларов, запущенная 4 июня 1996 года, отклонилась от курса и разрушилась через 40 секунд после запуска. Отказ был вызван тем, что в бортовом компьютере произошло переполнение 16-разрядных ре­ гист­ров, после чего компьютер вышел из строя. Программное обеспечение Ариан-5 было тщательно протестировано, но на ракете Ариан-4. Но новая ракета имела двигатели с более высо­кими скоростными параметрами, которые, будучи переданными бортовому компью­теру, и вызвали переполнение ре­гист­ров.
50 Глава 1. От нуля до единицы Пример 1.12 СЛОЖЕНИЕ ЧИСЕЛ, ПРЕДСТАВЛЕННЫХ В ДОПОЛНИТЕЛЬНОМ КОДЕ Вычислить (a) –210 + 110 и (b) –710 + 710 с помощью чисел в дополнительном коде. Решение (a) –210 + 110 = 11102 + 00012 = 11112 = –110. (b) –710 + 710 = 10012 + 01112 = 100002. Пятый бит отбрасывается, оставляя правильный 4-битовый результат 00002. Вычитание одного двоичного числа из другого осуществляется путем преобразования вычитаемого в дополнительный код и последующего его сложения с уменьшаемым. Пример 1.13 ВЫЧИТАНИЕ ЧИСЕЛ В ДОПОЛНИТЕЛЬНОМ КОДЕ Вычислить (a) 510 – 310 и (b) 310 – 510, используя 4-разрядные числа в дополнительном коде. Решение (a) 310 = 00112. Вычисляя его дополнительный код, получим –310 = 11012. Теперь сложим 510 + (–310) = 01012 + 11012 = 00102 = 210. Отметим, что перенос из наиболее значимой позиции сбрасывается, поскольку результат записывается в четырех битах. (b) Вычисляя дополнительный код от 510, получим –510 = 10112. Теперь сложим 310 + (–510) = 00112 + 10112 = 11102 = –210. Представление нуля в дополнительном коде также производится путем инвертирования всех битов (это дает 11…1112) и последующим прибавлением 1, что делает значения всех битов равными 0. При этом перенос наиболее значимого бита игнорируется. В результате нулевое значение всегда представлено набором только нулевых битов. В отличие от прямого кода дополнительный код не имеет отрицательного нуля. Ноль всегда считается положительным числом, так как его знаковый бит всегда 0. Так же, как и двоичное число без знака, произвольное N-битное число, записанное в дополнительном коде, может принимать одно из 2N возможных значений. Но весь этот диапазон разделен между положительным и отрицательным числами. Например, 4-битное двоичное число без знака может принимать 16 значений от 0 до 15. В случае дополнительного кода 4-битное число также принимает 16 значений, но уже от –8 до 7. В общем случае диапазон N-битного числа, записанного в дополнительном коде, охватывает [–2N–1, 2N–1 – 1]. Легко понять, почему в отрицательном диапазоне оказалось на одно значение больше, чем в положительном, – в дополнительном коде отсутствует отрицательный ноль.