В вычислительной технике арифметико-логическое устройство ( АЛУ ) представляет собой комбинационную цифровую схему , которая выполняет арифметические и побитовые операции над целыми двоичными числами . [1] [2] [3] В отличие от блока с плавающей запятой (FPU), который работает с числами с плавающей запятой . Это фундаментальный строительный блок многих типов вычислительных схем, включая центральный процессор (ЦП) компьютеров, FPU и графические процессоры (GPU). [4]
Входными данными для АЛУ являются данные, с которыми нужно работать, называемые операндами , и код, указывающий операцию, которую необходимо выполнить; Выход АЛУ является результатом выполненной операции. Во многих конструкциях АЛУ также имеет входы или выходы состояния, или и то, и другое, которые передают информацию о предыдущей операции или текущей операции соответственно между АЛУ и внешними регистрами состояния .
АЛУ имеет множество входных и выходных цепей , которые представляют собой электрические проводники , используемые для передачи цифровых сигналов между АЛУ и внешней схемой. Когда АЛУ работает, внешние схемы подают сигналы на входы АЛУ, и в ответ АЛУ генерирует и передает сигналы во внешние схемы через свои выходы.
Базовый АЛУ имеет три параллельные шины данных , состоящие из двух входных операндов ( A и B ) и выходного результата ( Y ). Каждая шина данных представляет собой группу сигналов, передающих одно целое двоичное число. Обычно ширины шин A, B и Y (количество сигналов, составляющих каждую шину) идентичны и соответствуют собственному размеру слова внешней схемы (например, инкапсулирующего ЦП или другого процессора).
Входной код операции представляет собой параллельную шину, которая передает в АЛУ код выбора операции, который представляет собой перечисляемое значение , определяющее желаемую арифметическую или логическую операцию, которую должно выполнить АЛУ. Размер кода операции (ширина шины) определяет максимальное количество отдельных операций, которые может выполнить АЛУ; например, четырехбитный код операции может определять до шестнадцати различных операций ALU. Как правило, код операции ALU — это не то же самое, что код операции машинного языка , хотя в некоторых случаях он может быть напрямую закодирован как битовое поле внутри кода операции машинного языка.
Выходы состояния представляют собой различные отдельные сигналы, которые передают дополнительную информацию о результате текущей операции АЛУ. АЛУ общего назначения обычно имеют сигналы состояния, такие как:
По завершении каждой операции АЛУ выходные сигналы состояния обычно сохраняются во внешних регистрах, чтобы сделать их доступными для будущих операций АЛУ (например, для реализации арифметики с множественной точностью ) или для управления условным ветвлением . Набор битовых регистров, в которых хранятся выходные данные состояния, часто рассматривается как один многоразрядный регистр, который называется «регистром состояния» или «регистром кода состояния».
Входы состояния позволяют предоставлять дополнительную информацию АЛУ при выполнении операции. Обычно это одиночный бит переноса, который является сохраненным переносом из предыдущей операции АЛУ.
АЛУ представляет собой комбинационную логическую схему, что означает, что его выходные данные будут изменяться асинхронно в ответ на изменения входных данных. При нормальной работе стабильные сигналы подаются на все входы АЛУ, и когда проходит достаточно времени (известное как « задержка распространения ») для распространения сигналов через схему АЛУ, результат работы АЛУ появляется на АЛУ. выходы. Внешняя схема, подключенная к АЛУ, отвечает за обеспечение стабильности входных сигналов АЛУ на протяжении всей операции и за предоставление достаточного времени для распространения сигналов через АЛУ перед выборкой результата АЛУ.
В общем, внешняя схема управляет АЛУ, подавая сигналы на его входы. Обычно внешняя схема использует последовательную логику для управления работой АЛУ, которая регулируется тактовым сигналом достаточно низкой частоты, чтобы обеспечить достаточно времени для выхода АЛУ для стабилизации в наихудших условиях.
Например, ЦП начинает операцию сложения АЛУ, направляя операнды из их источников (которые обычно являются регистрами ) на входы операндов АЛУ, в то время как блок управления одновременно применяет значение к входу кода операции АЛУ, настраивая его для выполнения сложения. В то же время ЦП также направляет выходные данные результата АЛУ в регистр назначения, который получит сумму. Входным сигналам АЛУ, которые остаются стабильными до следующего тактового сигнала, разрешается распространяться через АЛУ и в регистр назначения, пока ЦП ожидает следующего тактового сигнала. Когда поступает следующий тактовый сигнал, регистр назначения сохраняет результат ALU, и, поскольку операция ALU завершена, входы ALU могут быть настроены для следующей операции ALU.
АЛУ обычно поддерживают ряд основных арифметических и побитовых логических функций. Базовые АЛУ общего назначения обычно включают в свой репертуар следующие операции: [1] [2] [3] [5]
Операции сдвига ALU приводят к сдвигу операнда A (или B) влево или вправо (в зависимости от кода операции), и сдвинутый операнд появляется в позиции Y. Простые ALU обычно могут смещать операнд только на одну битовую позицию, тогда как более сложные ALU используют бочкообразные переключатели , которые позволяют им сдвигать операнд на произвольное количество бит за одну операцию. Во всех операциях однобитового сдвига бит, сдвинутый из операнда, появляется при выполнении; значение бита, сдвинутого в операнд, зависит от типа сдвига.
В вычислениях целочисленной арифметики арифметика с множественной точностью — это алгоритм, который работает с целыми числами, превышающими размер слова ALU. Для этого алгоритм рассматривает каждый операнд как упорядоченный набор фрагментов размера ALU, упорядоченных от наиболее значимого (MS) к наименее значимому (LS) или наоборот. Например, в случае 8-битного АЛУ 24-битное целое число 0x123456
будет рассматриваться как набор трех 8-битных фрагментов: 0x12
(MS), 0x34
и 0x56
(LS). Поскольку размер фрагмента точно соответствует размеру слова ALU, ALU может напрямую работать с этим «куском» операнда.
Алгоритм использует ALU для непосредственной работы с конкретными фрагментами операндов и, таким образом, генерирует соответствующий фрагмент («частичный») результата с множественной точностью. Каждый партиал при генерации записывается в связанную область хранения, предназначенную для результата с множественной точностью. Этот процесс повторяется для всех фрагментов операндов, чтобы создать полную коллекцию частичных значений, что является результатом операции множественной точности.
В арифметических операциях (например, сложении, вычитании) алгоритм начинается с вызова операции ALU над LS-фрагментами операндов, тем самым создавая как частичный LS, так и бит выполнения. Алгоритм записывает часть в назначенное хранилище, тогда как конечный автомат процессора обычно сохраняет бит выполнения в регистр состояния ALU. Затем алгоритм переходит к следующему фрагменту коллекции каждого операнда и вызывает операцию ALU над этими фрагментами вместе с сохраненным битом переноса из предыдущей операции ALU, создавая таким образом еще одну (более значимую) часть и бит выполнения. Как и раньше, бит переноса сохраняется в регистре состояния, а частичный код записывается в назначенное хранилище. Этот процесс повторяется до тех пор, пока не будут обработаны все фрагменты операндов, в результате чего в хранилище сохраняется полный набор частичных значений, которые составляют арифметический результат с различной точностью.
В операциях сдвига с множественной точностью порядок обработки фрагмента операнда зависит от направления сдвига. При операциях сдвига влево фрагменты сначала обрабатываются LS, поскольку бит LS каждого фрагмента, который передается через сохраненный бит переноса, должен быть получен из бита MS ранее сдвинутого влево менее значимого операнда. И наоборот, операнды сначала обрабатываются MS при операциях сдвига вправо, поскольку бит MS каждого фрагмента должен быть получен из бита LS ранее сдвинутого вправо, более значимого операнда.
В поразрядных логических операциях (например, логическом И, логическом ИЛИ) фрагменты операнда могут обрабатываться в любом произвольном порядке, поскольку каждая часть зависит только от соответствующих фрагментов операнда (сохраненный бит переноса из предыдущей операции ALU игнорируется).
Хотя АЛУ может быть спроектировано для выполнения сложных функций, в результате более высокая сложность схемы, стоимость, энергопотребление и больший размер во многих случаях делают это непрактичным. Следовательно, ALU часто ограничиваются простыми функциями, которые могут выполняться на очень высоких скоростях (т. е. с очень короткими задержками распространения), а схема внешнего процессора отвечает за выполнение сложных функций путем организации последовательности более простых операций ALU.
Например, вычисление квадратного корня числа может быть реализовано различными способами, в зависимости от сложности ALU:
Приведенные выше реализации переходят от самых быстрых и дорогих к самым медленным и наименее затратным. Квадратный корень вычисляется во всех случаях, но процессорам с простыми ALU для выполнения вычислений потребуется больше времени, поскольку необходимо выполнить несколько операций ALU.
АЛУ обычно реализуется либо как отдельная интегральная схема (ИС), например 74181 , либо как часть более сложной ИС. В последнем случае экземпляр ALU обычно создается путем его синтеза из описания, написанного на VHDL , Verilog или каком-либо другом языке описания оборудования . Например, следующий код VHDL описывает очень простой 8-битный ALU:
объект alu - это порт ( -- соединения alu с внешней схемой: A : вход со знаком ( от 7 до 0 ); -- операнд A B : вход со знаком ( от 7 до 0 ); -- операнд B OP : беззнаковый ( от 2 до 0 ) ); -- код операции Y : выход со знаком ( от 7 до 0 )); -- результат операции end alu ; поведение архитектуры alu is Begin Case OP is -- декодировать код операции и выполнить операцию: When "000" = > Y <= A + B ; -- добавить , когда "001" => Y <= A - B ; -- вычитаем , когда "010" => Y <= A - 1 ; -- уменьшить , когда "011" => Y <= A + 1 ; -- увеличивать , когда "100" => Y <= not A ; -- дополнение до 1 , когда "101" => Y <= A и B ; -- побитовое И, когда "110" => Y <= A или B ; -- побитовое ИЛИ, когда "111" => Y <= A xor B ; -- побитовое исключающее ИЛИ, когда другие => Y <= ( другие => 'X' ); конец дела ; конец поведенческий ;
Математик Джон фон Нейман предложил концепцию ALU в 1945 году в отчете об основах нового компьютера под названием EDVAC . [6]
Стоимость, размер и энергопотребление электронных схем были относительно высокими на заре информационной эпохи . Следовательно, все последовательные компьютеры и многие ранние компьютеры, такие как PDP-8 , имели простое АЛУ, которое работало с одним битом данных за раз, хотя они часто предоставляли программистам более широкий размер слова. Одним из первых компьютеров, имевших несколько дискретных однобитовых схем ALU, был Whirlwind I 1948 года , в котором использовалось шестнадцать таких «математических блоков», что позволяло ему работать с 16-битными словами.
В 1967 году Fairchild представила первое АЛУ, реализованное в виде интегральной схемы, Fairchild 3800, состоящее из восьмибитного АЛУ с аккумулятором. [7] Вскоре появились и другие интегральные ALU, в том числе четырехбитные ALU, такие как Am2901 и 74181 . Эти устройства обычно были способны к « битовой срезке », то есть имели сигналы «переноса вперед», что облегчало использование нескольких взаимосвязанных микросхем ALU для создания ALU с более широким размером слова. Эти устройства быстро стали популярными и широко использовались в побитовых мини-компьютерах.
Микропроцессоры начали появляться в начале 1970-х годов. Несмотря на то, что транзисторы стали меньше, на кристалле часто не хватало места для АЛУ полной ширины слова, и в результате в некоторых ранних микропроцессорах использовалось узкое АЛУ, которое требовало нескольких циклов на одну инструкцию машинного языка. Примером этого может служить популярный Zilog Z80 , который выполнял восьмибитное сложение с помощью четырехбитного АЛУ. [8] Со временем геометрия транзисторов еще больше уменьшилась, следуя закону Мура , и стало возможным создавать более широкие АЛУ на микропроцессорах.
Транзисторы современных интегральных схем (ИС) на несколько порядков меньше, чем у ранних микропроцессоров, что позволяет устанавливать на ИС весьма сложные АЛУ. Сегодня многие современные ALU имеют большую ширину слова и архитектурные усовершенствования, такие как бочкообразные переключатели и двоичные умножители , которые позволяют им выполнять за один такт операции, которые требовали бы нескольких операций на более ранних ALU.
АЛУ могут быть реализованы в виде механических , электромеханических или электронных схем [9] [ проверка не удалась ] , и в последние годы проводились исследования биологических АЛУ [10] [11] (например, на основе актина ). [12]