Я недавно начал читать книгу Чарльза Петцольда под названием «Код», которая до сих пор охватывает именно те вещи, которые, я полагаю, вам интересны. Но я не прошел весь путь, поэтому сначала пролистайте книгу перед покупкой / заимствованием.
Это мой относительно короткий ответ, а не Петцольдс ... и, надеюсь, в соответствии с тем, о чем вы любили.
Вы слышали о транзисторе, который я предполагаю. Оригинальный способ использовать транзистор был для таких вещей, как транзисторный радиоприемник. это в основном усилитель, возьмите крошечный маленький радиосигнал, плавающий в воздухе, и подайте его на вход транзистора, который открывает или закрывает поток тока в цепи рядом с ним. И вы подключаете эту цепь с более высокой мощностью, так что вы можете взять очень слабый сигнал, усилить его и, например, подать в динамик и прослушать радиостанцию (это еще не все, изолируя частоту и поддерживая баланс транзистора, но Вы поняли, я надеюсь).
Теперь, когда существует транзистор, это послужило способом использовать транзистор в качестве переключателя, например, выключателя света. Радиоприемник похож на диммерный выключатель света, вы можете включить его в любом месте от полного до полного выключения. Выключатель света без диммера либо включен, либо выключен, в середине переключателя есть какое-то волшебное место, где он переключается. Точно так же мы используем транзисторы в цифровой электронике. Возьмите выход одного транзистора и подайте его на вход другого транзистора. Выход первого, конечно, не такой слабый сигнал, как радиоволна, он заставляет второй транзистор полностью включаться или выключаться. это приводит к концепции TTL или транзисторно-транзисторной логики. По сути, у вас есть один транзистор, который управляет высоким напряжением или позволяет назвать его 1, а на этом нулевом напряжении, давайте назовем это 0. И вы расположите входы с другой электроникой, чтобы вы могли создавать И-вентили (если оба входа Если 1, то выход равен 1), ИЛИ вентили (если один или другой вход равен 1, то выход равен 1). Инверторы, NAND, вентили, вентили NOR (или с инвертором) и т. Д. Раньше был справочник по TTL, и вы могли купить 8 или около того чипов с одним или двумя или четырьмя воротами (NAND, NOR, И, и т. Д.) Функции внутри, два входа и выхода для каждого. Теперь нам не нужны те, которые дешевле создавать программируемую логику или выделенные микросхемы с миллионами транзисторов. Но мы все еще думаем с точки зрения И, ИЛИ, а НЕ ворот для проектирования аппаратного обеспечения. (обычно больше похоже на nand и nor).
Я не знаю, чему они учат сейчас, но концепция та же самая, поскольку для памяти триггер можно рассматривать как две из этих пар TTL (NANDS), связанные вместе с выходом одной, поступающей на вход другой.Оставим это на этом.Это в основном один бит в том, что мы называем SRAM, или статический ramСрам занимает в основном 4 транзистора.Драм или динамический таран памяти, которые вы вставляете в свой компьютер, самостоятельно берут один транзистор на бит, поэтому для начала вы можете понять, почему драм - это то, что вы покупаете за гигабайты.Биты Sram помнят, что вы их установили, пока не отключится питание.Драм начинает забывать то, что вы сказали ему, как только вы говорите, в основном, драм использует транзистор еще одним третьим способом, есть некоторая емкость (как в конденсаторе, не будем вдаваться в это здесь), которая похожа на крошечную перезаряжаемую батарею,как только вы зарядите его и отсоедините зарядное устройство, оно начнет разряжаться.Представьте себе ряд стаканов на полке с небольшими отверстиями в каждом стакане, это ваши биты драм, вы хотите, чтобы некоторые из них были такими, чтобы у вас был помощник, чтобы заполнить стаканы, которые вы хотите, чтобы они были.Этот помощник должен постоянно заполнять кувшин и идти вниз по ряду, держать «однобитовые» стаканы достаточно заполненными водой, а «нулевые» стаканы должны оставаться пустыми.Таким образом, в любой момент, когда вы захотите увидеть, какие у вас есть данные, вы можете просмотреть и прочитать их и нули, ища уровни воды, которые определенно выше среднего уровня, равного единице, и уровней, определенно ниже середины, равных нулю.при включенном питании, если помощник не может держать очки достаточно полными, чтобы отличить один от нуля, они в конечном итоге будут выглядеть как нули и истощатся.Это обмен на большее количество бит на чип.Короткая история здесь заключается в том, что за пределами процессора мы используем драм для нашей объемной памяти, и есть вспомогательная логика, которая заботится о том, чтобы сохранять единицы в единицу и нули в ноль.Но внутри чипа регистр AX и регистры DS, например, хранят ваши данные с помощью триггеров или sram.И для каждого бита, о котором вы знаете, например, биты в регистре AX, вероятно, есть сотни или тысячи или больше, которые используются для ввода и выгрузки битов из этого регистра AX.
Вы знаете, что процессоры работают нанекоторые тактовые частоты, в наши дни около 2 гигагерц или два миллиарда часов в секунду.Подумайте о часах, которые генерируются кристаллом, это еще одна тема, но логика рассматривает эти часы как напряжение, которое становится высоким, равно нулю, высокому и равному нулю при этой тактовой частоте 2 ГГц или что-то еще (достижения геймбоя составляют 17 МГц, старые ставки около 75 МГц,оригинальный IBM PC 4,77 МГц).
Таким образом, транзисторы, используемые в качестве переключателей, позволяют нам измерять напряжение и превращать его в те единицы и нули, с которыми мы знакомы как как инженеры аппаратного обеспечения, так и инженеры программного обеспечения, и идти так далеко, что дают нам И, ИЛИ, и НЕлогические функции.И у нас есть эти магические кристаллы, которые позволяют нам получать точные колебания напряжения.
Так что теперь мы можем делать такие вещи, как, скажем, если часы равны единице, а моя переменная состояния говорит, что я в инструкции извлечениязатем нужно переключить несколько вентилей, чтобы адрес нужной инструкции, находящийся в счетчике программ, вышел на шину памяти, чтобы логика памяти могла дать мне инструкцию для MOV AL, 61h.Вы можете посмотреть это в руководстве по x86 и обнаружить, что некоторые из этих битов кода операции говорят, что это операция mov, а целью являются младшие 8 бит регистра EAX, а источником mov является непосредственное значение, что означает егонаходится в ячейке памяти после этой инструкции.Таким образом, мы должны сохранить эту инструкцию / код операции где-нибудь и извлечь следующую ячейку памяти в следующем тактовом цикле.так что теперь мы сохранили mov al, немедленный и у нас есть значение 61h, считанное из памяти, и мы можем переключить некоторую транзисторную логику так, чтобы бит 0 этого 61h сохранялся в триггере 0 бита al и бит 1 в бит 1 и т. д..
Как все это происходит, спросите вы?Подумайте о функции python, выполняющей некоторую математическую формулу.вы начинаете в верхней части программы с некоторыми входными данными в формулу, которые входят в переменные, у вас есть отдельные шаги в программе, которые могут добавить сюда константу или вызвать функцию квадратного корня из библиотеки и т. д.верните ответ.Аппаратная логика выполняется аналогичным образом, и сегодня используются языки программирования, один из которых очень похож на C. Основное отличие состоит в том, что ваши аппаратные функции могут иметь сотни или тысячи входов, а выход - один бит.На каждом тактовом цикле бит 0 регистра AL вычисляется с помощью огромного алгоритма, в зависимости от того, как далеко вы хотите посмотреть.Подумайте о той функции квадратного корня, которую вы вызвали для своей математической операции. Эта функция сама по себе является одним из этих некоторых входных данных, создающих вывод, и она может вызывать другие функции, например, умножение или деление.Таким образом, у вас, вероятно, есть где-то бит, который вы можете считать последним шагом перед битом 0 регистра AL, и его функция: если такт равен единице, то AL [0] = AL_next [0];иначе AL [0] = AL [0];Но есть более высокая функция, которая содержит следующий бит, вычисленный из других входных данных, и более высокая функция и более высокая функция, и многие из них создаются компилятором так же, как три строки Python могут превратиться в сотни или тысячилиний ассемблера.Несколько линий HDL могут стать сотнями или тысячами или более транзисторами.Аппаратные люди обычно не смотрят формулу самого низкого уровня для определенного бита, чтобы найти все возможные входные данные и все возможные AND, OR и NOT, которые требуются для вычисления, больше, чем вы, вероятно, проверяете ассемблер, сгенерированный вашими программами.но ты мог бы, если бы захотел.
Примечание о микрокодировании, большинство процессоров не используют микрокодирование. Вы попадаете в него, например, с x86, потому что это был прекрасный набор инструкций для своего времени, но на первый взгляд, он пытается идти в ногу со временем. другие наборы команд не нуждаются в микрокодировании и используют логику непосредственно, как я описал выше. Вы можете думать о микрокодировании как о другом процессоре, использующем другой набор команд / язык ассемблера, который эмулирует набор команд, который вы видите на поверхности. Не так сложно, как при попытке эмулировать Windows на Mac или Linux на Windows, и т. Д. Слой микрокодирования разработан специально для работы, вы можете подумать, что есть только четыре регистра AX, BX, CX, DX, но есть еще много внутри. И естественно, что одна сборочная программа каким-то образом может выполняться по нескольким путям выполнения в одном или нескольких ядрах. Так же, как процессор в вашем будильнике или стиральной машине, программа микрокода проста и мала, отлажена и записана на аппаратном обеспечении, мы надеемся, никогда не нуждаемся в обновлении прошивки. По крайней мере, в идеале. но, как, например, ваш ipod или телефон, вы иногда хотите исправить ошибку или что-то еще, и есть способ обновить ваш процессор (BIOS или другое программное обеспечение загружает патч при загрузке). Скажем, вы открываете батарейный отсек для пульта ДУ телевизора или калькулятора, вы можете увидеть дыру, где вы можете увидеть несколько металлических контактов подряд, может быть, три или 5 или много. Для некоторых пультов и калькуляторов, если вы действительно хотите их перепрограммировать, обновите прошивку. Обычно нет, хотя, в идеале, этот пульт идеален или достаточно совершенен, чтобы пережить телевизор. Микрокодирование дает возможность выводить на рынок очень сложный продукт (миллионы, сотни миллионов транзисторов) и исправлять большие и исправляемые ошибки в полевых условиях. Представьте себе программу на 200 миллионов строк Python, которую ваша команда написала, скажем, за 18 месяцев, и вам придется ее доставить, иначе компания не получит продукт для соревнований. То же самое, за исключением небольшой части кода, которую вы можете обновить в поле, остальное должно быть высечено в камне. для будильника или тостера, если есть ошибка или вещь нуждается в помощи, просто выбросьте ее и получите другую.
Если вы копаетесь в википедии или просто гуглите, то можете посмотреть наборы инструкций и машинный язык для таких вещей, как 6502, z80, 8080 и другие процессоры. Может быть 8 регистров и 250 команд, и из числа транзисторов вы можете почувствовать, что эти 250 инструкций по сборке все еще являются языком очень высокого уровня по сравнению с последовательностью логических элементов, необходимых для вычисления каждого бита в триггере за такт цикл. Вы правы в этом предположении. За исключением микрокодированных процессоров, эта логика низкого уровня никоим образом не программируется, вы должны исправлять аппаратные ошибки с помощью программного обеспечения (для аппаратного обеспечения, которое будет или будет доставлено, а не утилизировано).
Посмотрите на эту книгу Петцольда, он отлично объясняет вещи, намного превосходящие все, что я когда-либо мог написать.