Как и обещали в прошлый раз, мы начинаем детальный разбор Арифметико-Логического Устройства (Arithmetic and Logic Unit, ALU), ядро которого состоит из трех независимых 8-битных программируемых функций: арифметического/логического блока, блока регистров сдвига и блока наложения маски.
Ядро ALU состоит из трех независимых 8-битных программируемых функций: арифметического/логического блока, блока регистров сдвига и блока наложения маски.
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 используется в арифметических операциях. Как показано в таблице 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.
CI SEL A CI SEL B |
Режим переноса | Описание |
00 | По умолчанию (Default) | Арифметический режим по умолчанию, описанный в таблице 21-9. |
01 | Защелкивание (Registered) |
Флаг переноса, который является результатом переноса с предыдущего цикла. Этот режим используется для реализации операций сложения с переносом и вычитания с заниманием. |
10 | Проброс (Routed) |
Перенос генерируется в другом месте и пробрасывается на этот вход. Этот режим можно использовать для реализации управляемых счетчиков. |
11 | Связывание в цепочки (Chained) |
Перенос помещается в цепочку после предыдущего Datapath. Этот режим можно использовать для реализации одноцикловых операций более высокой разрядности, в которых используются два или более Datapath. |
Если используется проброс переноса, в ряде функций он используется, как показано в таблице 21-11. Обратите внимание, что для функций декремента и вычитания единицы активный уровень переноса — низкий (инверсный).
Функция | Полярность 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 активен | 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. Операция переноса.
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.
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 при сдвиге влево. Выходной (правый или левый) бит изолированной группы будет утерян.
8-битный маскирующий регистр в статическом пространстве конфигурационных регистров UDB определяет операцию наложения маски. В этой операции на выход ALU накладывается маска (операция AND) со значением данного регистра. Типичным использованием операции наложения маски ALU является реализация автономных таймеров и счетчиков с разрешением, кратным степени двойки.
Вход | Описание |
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.