
Как и обещали в прошлый раз, мы начинаем детальный разбор Арифметико-Логического Устройства (Arithmetic and Logic Unit, ALU).
Общее содержание цикла «UDB. Что же это такое?»
Часть 1. Введение. PLD.
Часть 2. Datapath.
Часть 3. Datapath FIFO.
Часть 4. Datapath ALU. (Текущая статья)
Часть 5. Datapath. Полезные мелочи.
Часть 6. Модуль управления и статуса.
Часть 7. Модуль управления тактированием и сбросом
Часть 8. Адресация UDB
21.3.2.4 Datapath ALU
Ядро ALU состоит из трех независимых 8-битных программируемых функций: арифметического/логического блока, блока регистров сдвига и блока наложения маски.
Арифметические и логические операции
Функции АЛУ, выбираемые динамически при помощи конфигурационного ОЗУ, приведены в таблице ниже.
Таблица 21-8. Функции ALU.
Func[2:0] | Функция | Операция |
---|---|---|
000 | PASS | srca |
001 | INC | ++srca |
010 | DEC | --srca |
011 | ADD | srca + srcb |
100 | SUB | srca – srcb |
101 | XOR | srca ^ srcb |
110 | AND | srca & srcb |
111 | OR | srca | srcb |
Вход переноса (Carry in)
Carry in используется в арифметических операциях. Как показано в таблице 21-9, для определенных функций существуют значения carry in по умолчанию.
Таблица 21-9. Функции Carry In.
Функции | Операция | Реализация Carry In по умолчанию |
---|---|---|
INC | ++srca | srca + 00h + ci, где ci равно 1 |
DEC | --srca | srca + ffh + ci, где ci равно 0 |
ADD | srca + srcb | srca + srcb + ci, где ci равно 0 |
SUB | srca — srcb | srca + ~srcb + ci, где ci равно 1 |
В дополнение к этим штатным арифметическим применениям, имеется ещё три варианта для использования переноса. Биты CI SELA и CI SELB задают правила использования входа carry in для каждого такта. ОЗУ динамической конфигурации выбирает конфигурацию A или B в каждом такте. Параметры приведены в таблице 21-10.
Таблица 21-10. Дополнительные функции Carry In.
CI SEL A CI SEL B |
Режим переноса |
Описание |
---|---|---|
00 | По умолчанию (Default) |
Арифметический режим по умолчанию, описанный в таблице 21-9. |
01 | Защелкивание (Registered) |
Флаг переноса, который является результатом переноса с предыдущего цикла. Этот режим используется для реализации операций сложения с переносом и вычитания с заниманием. |
10 | Проброс (Routed) |
Перенос генерируется в другом месте и пробрасывается на этот вход. Этот режим можно использовать для реализации управляемых счетчиков. |
11 | Связывание в цепочки (Chained) |
Перенос помещается в цепочку после предыдущего Datapath. Этот режим можно использовать для реализации одноцикловых операций более высокой разрядности, в которых используются два или более Datapath. |
Если используется проброс переноса, в ряде функций он используется, как показано в таблице 21-11. Обратите внимание, что для функций декремента и вычитания единицы активный уровень переноса — низкий (инверсный).
Таблица 21-11. Функции трассированного Carry In.
Функция | Полярность Carry In | Carry In активен | Carry In неактивен |
---|---|---|---|
INC | Прямая | ++srca | srca |
DEC | Инверсная | --srca | srca |
ADD | Прямая | (srca + srcb) +1 | srca + srcb |
SUB | Инверсная | (srca – srcb) -1 | (srca — srcb) |
Выход переноса (Carry Out)
Carry out – опциональный выход Datapath, формируемый на основе статически заданного старшего бита. Значение может быть передано по цепочке на вход переноса в более старший блок. Обратите внимание, что в случае функций декрементирования и вычитания carry out инвертирован.
Таблица 21-12. Функции Carry Out.
Функция | Полярность Carry Out | Carry Out активен | Carry Out неактивен |
---|---|---|---|
INC | Прямая | ++srca == 0 | srca |
DEC | Инверсная | --srca == -1 | srca |
ADD | Прямая | srca + srcb > 255 | srca + srcb |
SUB | Инверсная | srca – srcb < 0 | (srca – srcb) |
Структура переноса
Параметры carry in и для выбора старшего бита, для выработки carry out показаны на рисунке 21-15. Защелкнутые значения carry out могут быть использованы в качестве carry in для последующих арифметических операций. Эта особенность может быть использована для реализации функций большей разрядности с использованием циклов.

Рисунок 21-15. Операция переноса.
Операция сдвига
Операция сдвига происходит независимо от работы ALU, согласно таблице 21-13.
Таблица 21-13. Функции операции сдвига.
Shift [1:0] | Функция |
---|---|
00 | Пропуск (Pass) |
01 | Сдвиг влево (Shift Left) |
10 | Сдвиг вправо (Shift Right) |
11 | Перестановка нибблов (Nibble Swap) |
Выходное значение операции сдвига выдаётся с Datapath. Настройка выходов для сдвига вправо (sor) и влево (sol_msb) выполняется одними и теми же битами. Статический бит конфигурации (SHIFT SEL в регистре CFG15) определяет, какой выход сдвига используется в качестве выхода Datapath. При отсутствии сдвига сигналы sor и sol_msb определяются как LSB и MSB функции ALU, соответственно.
Биты конфигурации SI SELA и SI SELB определяют сдвиг данных для указанной операции. ОЗУ динамической конфигурации выбирает конфигурацию A или B для каждого такта. Вдвигаемые данные используются только при сдвиге влево и вправо, данный вход не используется при пропуске и перестановке нибблов. Выбранные значения и варианты использования относятся как к сдвигу вправо, так и к сдвигу влево и показаны в таблице 21-14.
Таблица 21-14. Функции Shift in
SI SEL A SI SEL B |
Источник вдвигаемых данных |
Описание |
---|---|---|
00 | По умолчанию/Арифметический (Default/Arithmetic) |
По умолчанию, значение бита DEFSI (константа 1 или 0). Однако, если MSB SI взведён, то источником является значение выбранного старшего бита АЛУ (только для сдвигов вправо). |
01 | Защёлкивание (Registered) |
Входное значение для сдвига задается текущим защелкнутым выходным значением сдвига (из предыдущего цикла). Операция сдвига влево использует последнее значение сдвига влево. Операция сдвига вправо использует последнее выходное значение сдвига вправо. |
10 | Проброс (Routed) |
Входные данные для сдвига поступают извне, через трассировочные ресурсы (вход SI). |
11 | Связывание в цепочки (Chained) |
Для входного сдвига влево пробрасывается с выхода правого блока Datapath в цепочке, для входного сдвига вправо — с левого. |
Выходные данные при сдвиге влево берутся из бита, заданного как старший. При сдвиге вправо входные данные вталкиваются, начиная с выбранной старшей (MSB) позиции. Выходные данные хоть при сдвиге влево, хоть при сдвиге вправо, защёлкиваются и могут быть использованы на следующем такте. Эту особенность можно использовать для реализации сдвига большей разрядности в множественных циклах.

Рисунок 21-16. Операция сдвига.
Стоит заметить, что изолированные выбором MSB биты все еще сдвинуты. В показанном примере бит 7 все еще сдвинут в значении sil при сдвиге вправо, а бит 5 сдвинут в бит 4 при сдвиге влево. Выходной (правый или левый) бит изолированной группы будет утерян.
Операция наложения маски ALU
8-битный маскирующий регистр в статическом пространстве конфигурационных регистров UDB определяет операцию наложения маски. В этой операции на выход ALU накладывается маска (операция AND) со значением данного регистра. Типичным использованием операции наложения маски ALU является реализация автономных таймеров и счетчиков с разрешением, кратным степени двойки.
21.3.2.5. Входы Datapath и мультиплексирование (Datapath Inputs and Multiplexing)
Как показано в таблице 21-15, каждый Datapath имеет 9 входов, включая 6 входов от трассирования каналов. К ним относятся адреса конфигурации ОЗУ, FIFO, сигналов управления загрузкой регистров данных, а также сдвига и переноса входов данных.
Таблица 24-15. Входы Datapath.
Вход | Описание |
---|---|
RAD2 RAD1 RAD0 |
Асинхронный адрес в ОЗУ динамической конфигурации. Адресует восемь программируемых пользователем 16-битных слов. Каждое слово содержит управляющие биты Datapath для текущего цикла. Последовательность инструкций может определяться этими адресными входами. |
F0LD F1LD |
Если взведён в данном цикле, в выбранный FIFO загружаются данные из аккумулятора A0 или A1, либо выходные данные из АЛУ. Источник выбирается при помощи битов конфигурации Fx INSEL[1:0]. Этот вход чувствителен к перепадам. Он дискретизируется с тактовой частотой Datapath; при обнаружении перехода от «0» к «1», загрузка происходит по следующему фронту тактового сигнала. |
D0LD D1LD |
Если взведён в данном цикле, регистр Dx загружается из связанного с ним FIFO Fx. Этот вход чувствителен к перепадам. Он дискретизируется с тактовой частотой Datapath; при обнаружении перехода от «0» к «1», загрузка происходит по следующему фронту тактового сигнала. |
SI | Это значение входа данных, которое можно использовать для сдвига вправо или влево. |
CI | Это значение переноса используется, если управляющий сигнал переноса равен «routed carry». |
Как показано на рисунке 21-17, каждый вход имеет мультиплексор 6-в-1, следовательно, все входы взаимозаменяемы. Входы обрабатываются двумя способами: либо по уровню, либо по перепаду. Адрес в ОЗУ динамической конфигурации, а также значения сдвига и данных чувствительны к уровню. FIFO и сигналы загрузки регистров данных чувствительны к перепадам.

Рисунок 21-17. Сигналы входов Datapath.
В следующей статье мы перейдем к обзору полезных мелочей.