Rundll 0 24 мая, 2006 Опубликовано 24 мая, 2006 · Жалоба Всем доброго времени суток! Есть вот такая задача (проблема), при одновременном сложении нескольких N разрядных чисел с плавающей запятой их мантиссы сдвигаются вправо на число разрядов, которое определяет разность между самой высшей степенью, соответствующей самому большому числу из N последовательности и всех остальных степеней из этой последовательности. Естесственно не трудно посчитать, что если разрядность мантиссы равна, ну допустим 24, то необходимо поставить N линий задержки на K сдвиговых регистрах с разрядностью 24! Вобщем проблема вся в том, что это слишком объемно!!! ВОПРОС: какие существуют алгоритмы быстрых сдвигателей (сразу на N разрядов)??? С уважением Никита! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxl 0 24 мая, 2006 Опубликовано 24 мая, 2006 · Жалоба В своих сумматорах с плавающей запятой в качестве сдвигателя использую мультиплексор(см. прикрепленный рисунок) На вход a[6..0] подается мантисса, а на вход d[3..0] – код, указывающий число разрядов, на которое осуществляется сдвиг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба ВОПРОС: какие существуют алгоритмы быстрых сдвигателей (сразу на N разрядов)??? С уважением Никита! ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации: 1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж. 2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига. Может еще есть пара реализаций, но мне они не встречались Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 26 мая, 2006 Опубликовано 26 мая, 2006 · Жалоба ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации: 1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж. 2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига. Barrel Shifter - это конерктная реализация циклического сдвига двоичного вектора, длина которого равна степени двойки, в виде сети из N*logN двухвходовых мультиплексоров, на каждый слой которой подается один бит из величины сдвига? Или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 мая, 2006 Опубликовано 26 мая, 2006 · Жалоба ИМХО вам нужен бареловский сдвигатель barell shifter, в основном испольузуються 2 реализации: 1. На основе мультиплексеров, но при большом значении предельного сдвига и большой ширине данных жрет до Ж. 2. На основе умножителей, причем у хилых есть апнота на эту тему, как сделать его на 2-х умножтиелях, без декодера сдвига. Barrel Shifter - это конерктная реализация циклического сдвига двоичного вектора, длина которого равна степени двойки, в виде сети из N*logN двухвходовых мультиплексоров, на каждый слой которой подается один бит из величины сдвига? Или нет? насколько я знаю это сдвигатель, который позволяет сдвигать слово на N бит за 1 такт, без опоры на реализацию вот кстати тот линк про который я говорил http://www.xilinx.com/bvdocs/appnotes/xapp195.pdf насчет вашей реализации, я не совсем представляю что вы описали :) для 32 бит я просто ставил 32*32 битных мультиплексора все работало, вполне возможно есть более рациональные варианты, для виртекса4 я остановился на сдвигателе на умножителях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 26 мая, 2006 Опубликовано 26 мая, 2006 · Жалоба насколько я знаю это сдвигатель, который позволяет сдвигать слово на 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; В арифметический сдвиг преобразуется тривиально :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 26 мая, 2006 Опубликовано 26 мая, 2006 · Жалоба Большое спасибо всем за толковые советы! Действительно сдвигатель Барелла в этой ситуации спасает... Но я нашёл более оптимальный вариант, покавырявшись в стандартных библиотеках VHDL. Там есть функция SHL и SHR принимающая 2 аргумента, собственно сам сигнал, и количество разрядов, на которое его необходимо сдвинуть... Хм.. сначало подумал, что второй аргумент должен быть константой, оказалось - Unsigned. Самое интересное, а в моей ситуации просто восхитительное, это то, что сдвиг на N разрядов выполняется за один такт!!! А занимает всё это дело примерно 500 LUT (в предыдущем варианте это было 25000!!!) разница огромная! Но всё же алгоритм Барелла я взял на заметку, в жизни пригодится! С уважением Никита! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба 2 Oldring хмм занятный код :) Большое спасибо всем за толковые советы! Действительно сдвигатель Барелла в этой ситуации спасает... Но я нашёл более оптимальный вариант, покавырявшись в стандартных библиотеках VHDL. Там есть функция SHL и SHR принимающая 2 аргумента, собственно сам сигнал, и количество разрядов, на которое его необходимо сдвинуть... Хм.. сначало подумал, что второй аргумент должен быть константой, оказалось - Unsigned. Самое интересное, а в моей ситуации просто восхитительное, это то, что сдвиг на N разрядов выполняется за один такт!!! А занимает всё это дело примерно 500 LUT (в предыдущем варианте это было 25000!!!) разница огромная! Но всё же алгоритм Барелла я взял на заметку, в жизни пригодится! С уважением Никита! хмм интересно посмотреть именно на ваш предидущий код, уж больно разница получилась какая то калоссальная ? :) ЗЫ. я часто использую на первоначальном этапе сдвига именно на shr, srl. а уж если разговор идет про фиксированные и подавно, это дает большую ясность кода, при той же реализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба 2 Oldring хмм занятный код :) BTW именно такую структуру инферрит ISE для циклического сдвика с переменным аргументом. Ну и, конечно, она получится, если схлопнуть одинаковые подвыражения из 32-х 32-входовых мультиплексоров :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
disel 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба На http://tams-www.informatik.uni-hamburg.de/...l/shifter8.html есть джава-апплет, демонстрирующий 8-битовый barrel shifter. Красивая картинка для понимания сути, можно даже лампочками поморгать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Суть и так понятна. 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 людей запутывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Суть и так понятна. 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 людей запутывать. Запутывать? assign b = a >> ShiftCount; - это сдвиг на переменное число бит? И это, надеюсь, RTL? Или полагаемся на inferring? Вообще-то на VHDL inferring циклического сдвига вектора - это одна операция из 3 букв :) . Сэр, только со сдвигами на константу, pls! И без всяких ИЛИ в конце! Не верю, что на Верилоге невозможно просто описать ту же структуру из мультиплексоров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
disel 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Другое дело, что по ресурсам больше выйдет. Нет у верилога циклического сдвига вправо. Не понимаю, зачем на VHDL людей запутывать. Не очень понял относительно ресурсов, оба приведенных выше кода (и на vhdl и на verilog) занимают одинаковое колличество ресурсов. Что касается запутывания на vhdl, то это вопрос кому что нравиться :) О чем как известно не спорят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Запутывать.-- ShiftCount : in natural range 0 to 2 ** N - 1;-- Почему нельзя типа а ror ShiftCount. Лично я без моделирования не въехал в Ваш код (снимаю шляпу). Что касается верилога, я не знаю как без или. Но в этих двух строчках разберется даже ребенок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Запутывать.-- ShiftCount : in natural range 0 to 2 ** N - 1;-- Почему нельзя типа а ror ShiftCount. Лично я без моделирования не въехал в Ваш код (снимаю шляпу). Что касается верилога, я не знаю как без или. Но в этих двух строчках разберется даже ребенок. Так ведь можно в VHDL с ror ShiftCount. Вместо всех внутренностей архитектуры: Output <= Input ror ShiftCount; Но это сдвиг на переменное число бит. Насколько я помню, в RTL его нет. Для подвинутых синтезаторов, которые инфёррят сдвиг на переменное число бит, вроде ISE - это подходит. Цель была - именно показать структуру барреловского сдвигателя, состоящего только из константных сдвигов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться