Перейти к содержанию
    

Алгоритмы быстрых сдвигателей

Всем доброго времени суток!

 

Есть вот такая задача (проблема), при одновременном сложении нескольких N разрядных чисел с плавающей запятой их мантиссы сдвигаются вправо на число разрядов, которое определяет разность между самой высшей степенью, соответствующей самому большому числу из N последовательности и всех остальных степеней из этой последовательности. Естесственно не трудно посчитать, что если разрядность мантиссы равна, ну допустим 24, то необходимо поставить N линий задержки на K сдвиговых регистрах с разрядностью 24! Вобщем проблема вся в том, что это слишком объемно!!!

 

ВОПРОС: какие существуют алгоритмы быстрых сдвигателей (сразу на N разрядов)???

 

С уважением Никита!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В своих сумматорах с плавающей запятой в качестве сдвигателя использую мультиплексор(см. прикрепленный рисунок) На вход a[6..0] подается мантисса, а на вход d[3..0] – код, указывающий число разрядов, на которое осуществляется сдвиг.

post-16803-1148484430_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ВОПРОС: какие существуют алгоритмы быстрых сдвигателей (сразу на N разрядов)???

С уважением Никита!

 

ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации:

1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж.

2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига.

 

Может еще есть пара реализаций, но мне они не встречались

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации:

1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж.

2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига.

 

Barrel Shifter - это конерктная реализация циклического сдвига двоичного вектора, длина которого равна степени двойки, в виде сети из N*logN двухвходовых мультиплексоров, на каждый слой которой подается один бит из величины сдвига? Или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации:

1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж.

2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига.

 

Barrel Shifter - это конерктная реализация циклического сдвига двоичного вектора, длина которого равна степени двойки, в виде сети из N*logN двухвходовых мультиплексоров, на каждый слой которой подается один бит из величины сдвига? Или нет?

 

насколько я знаю это сдвигатель, который позволяет сдвигать слово на N бит за 1 такт, без опоры на реализацию

вот кстати тот линк про который я говорил

 

http://www.xilinx.com/bvdocs/appnotes/xapp195.pdf

 

насчет вашей реализации, я не совсем представляю что вы описали :) для 32 бит я просто ставил 32*32 битных мультиплексора все работало, вполне возможно есть более рациональные варианты, для виртекса4 я остановился на сдвигателе на умножителях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

насколько я знаю это сдвигатель, который позволяет сдвигать слово на N бит за 1 такт, без опоры на реализацию

 

Да, Вы абсолютно правы.

 

Я имел в виду следующую реализацию циклического сдвига:

 

 

 

 

entity BarrelShifter is

generic(

N : positive := 5

);

port (

Input : in bit_vector( 2 ** N - 1 downto 0 );

ShiftCount : in natural range 0 to 2 ** N - 1;

Output : out bit_vector( 2 ** N - 1 downto 0 )

);

end BarrelShifter;

 

architecture Structure of BarrelShifter is

subtype TStageIndex is integer range 0 to N;

subtype TVector is bit_vector( 2 ** N - 1 downto 0 );

type TStageResults is array( TStageIndex ) of TVector;

 

signal stageResults : TStageResults;

 

function hasBitSet( number : natural; bitIndex : natural ) return boolean is

begin

return (number / 2 ** bitIndex) mod 2 /= 0;

end function;

begin

 

stageResults( 0 ) <= Input;

 

stages: for stage in TStageIndex'Low + 1 to TStageIndex'High generate

stageResults( stage ) <= stageResults( stage - 1 ) ror 2 ** (stage - 1) when hasBitSet( ShiftCount, stage - 1 )

else stageResults( stage - 1 );

end generate;

 

Output <= StageResults( N );

 

end Structure;

 

 

 

 

В арифметический сдвиг преобразуется тривиально :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо всем за толковые советы! Действительно сдвигатель Барелла в этой ситуации спасает... Но я нашёл более оптимальный вариант, покавырявшись в стандартных библиотеках VHDL. Там есть функция SHL и SHR принимающая 2 аргумента, собственно сам сигнал, и количество разрядов, на которое его необходимо сдвинуть... Хм.. сначало подумал, что второй аргумент должен быть константой, оказалось - Unsigned. Самое интересное, а в моей ситуации просто восхитительное, это то, что сдвиг на N разрядов выполняется за один такт!!! А занимает всё это дело примерно 500 LUT (в предыдущем варианте это было 25000!!!) разница огромная! Но всё же алгоритм Барелла я взял на заметку, в жизни пригодится!

 

С уважением Никита!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 Oldring

хмм занятный код :)

 

Большое спасибо всем за толковые советы! Действительно сдвигатель Барелла в этой ситуации спасает... Но я нашёл более оптимальный вариант, покавырявшись в стандартных библиотеках VHDL. Там есть функция SHL и SHR принимающая 2 аргумента, собственно сам сигнал, и количество разрядов, на которое его необходимо сдвинуть... Хм.. сначало подумал, что второй аргумент должен быть константой, оказалось - Unsigned. Самое интересное, а в моей ситуации просто восхитительное, это то, что сдвиг на N разрядов выполняется за один такт!!! А занимает всё это дело примерно 500 LUT (в предыдущем варианте это было 25000!!!) разница огромная! Но всё же алгоритм Барелла я взял на заметку, в жизни пригодится!

 

С уважением Никита!

 

хмм интересно посмотреть именно на ваш предидущий код, уж больно разница получилась какая то калоссальная ? :)

 

ЗЫ. я часто использую на первоначальном этапе сдвига именно на shr, srl. а уж если разговор идет про фиксированные и подавно, это дает большую ясность кода, при той же реализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

2 Oldring

хмм занятный код :)

 

 

 

BTW именно такую структуру инферрит ISE для циклического сдвика с переменным аргументом. Ну и, конечно, она получится, если схлопнуть одинаковые подвыражения из 32-х 32-входовых мультиплексоров :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На http://tams-www.informatik.uni-hamburg.de/...l/shifter8.html есть джава-апплет, демонстрирующий 8-битовый barrel shifter. Красивая картинка для понимания сути, можно даже лампочками поморгать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Суть и так понятна.

 

module BarrelShifter

(

input [2**n-1:0] Input,

input [n-1:0] ShiftCount,

output [2**n-1:0] Output

);

 

parameter n = 3;

 

wire [2*2**n-1:0] a;

wire [2*2**n-1:0] b;

 

assign a = {Input, {2**n{1'b0}}};

assign b = a >> ShiftCount;

 

assign Output = b[2*2**n-1:2**n] | b[2**n-1:0];

 

endmodule

Другое дело, что по ресурсам больше выйдет. Нет у верилога циклического сдвига вправо.

Не понимаю, зачем на VHDL людей запутывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Суть и так понятна.

 

module BarrelShifter

(

input [2**n-1:0] Input,

input [n-1:0] ShiftCount,

output [2**n-1:0] Output

);

 

parameter n = 3;

 

wire [2*2**n-1:0] a;

wire [2*2**n-1:0] b;

 

assign a = {Input, {2**n{1'b0}}};

assign b = a >> ShiftCount;

 

assign Output = b[2*2**n-1:2**n] | b[2**n-1:0];

 

endmodule

Другое дело, что по ресурсам больше выйдет. Нет у верилога циклического сдвига вправо.

Не понимаю, зачем на VHDL людей запутывать.

 

Запутывать? :biggrin:

 

assign b = a >> ShiftCount; - это сдвиг на переменное число бит? И это, надеюсь, RTL? Или полагаемся на inferring? Вообще-то на VHDL inferring циклического сдвига вектора - это одна операция из 3 букв :) .

 

Сэр, только со сдвигами на константу, pls! И без всяких ИЛИ в конце! Не верю, что на Верилоге невозможно просто описать ту же структуру из мультиплексоров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Другое дело, что по ресурсам больше выйдет. Нет у верилога циклического сдвига вправо.

Не понимаю, зачем на VHDL людей запутывать.

 

Не очень понял относительно ресурсов, оба приведенных выше кода (и на vhdl и на verilog) занимают одинаковое колличество ресурсов. Что касается запутывания на vhdl, то это вопрос кому что нравиться :) О чем как известно не спорят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запутывать.-- ShiftCount : in natural range 0 to 2 ** N - 1;--

Почему нельзя типа а ror ShiftCount. Лично я без моделирования не въехал в Ваш код (снимаю шляпу).

Что касается верилога, я не знаю как без или. Но в этих двух строчках разберется даже ребенок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запутывать.-- ShiftCount : in natural range 0 to 2 ** N - 1;--

Почему нельзя типа а ror ShiftCount. Лично я без моделирования не въехал в Ваш код (снимаю шляпу).

Что касается верилога, я не знаю как без или. Но в этих двух строчках разберется даже ребенок.

 

Так ведь можно в VHDL с ror ShiftCount. Вместо всех внутренностей архитектуры:

 

Output <= Input ror ShiftCount;

 

Но это сдвиг на переменное число бит. Насколько я помню, в RTL его нет. Для подвинутых синтезаторов, которые инфёррят сдвиг на переменное число бит, вроде ISE - это подходит. Цель была - именно показать структуру барреловского сдвигателя, состоящего только из константных сдвигов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...