реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> shift, !
Egel
сообщение Aug 31 2009, 12:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 28-07-08
Из: Химки
Пользователь №: 39 244



У кого-нибудь есть мысли - как реализовать логический, циклический и арифметический сдвиг на одном 64-разрядном сдвигателе? Все это дело за такт - без конвейеров. Операнд - 64-разрядное число.

Если писать


assign vix = {vxod[63:0], x1, x2, x3, ...} >> sh[5:0];

Где х1, х2 .... - сигналы с мультиплексоров - соответственно ноль, бит операнда или знак операнда.

То синтезируется - 128-разрядный сдвигатель.

Было бы не плохо сделать сдвиг вправо/влево также на одном. По этому поводу была задумка сделать операцию mirror (т.е. полную инверсию операнда) на входе и выходе.

Если кто что подскажет - буду признателен.
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 1 2009, 03:34
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Egel @ Aug 31 2009, 07:27) *
У кого-нибудь есть мысли - как реализовать логический, циклический и арифметический сдвиг на одном 64-разрядном сдвигателе? Все это дело за такт - без конвейеров. Операнд - 64-разрядное число.


а что сложного то ?

Код
//логический
unsigned pipa, popa;
pipa = n_rigth_left ? pipa << shift : pipa >> shift;

//арифметический
signed pipa, popa;
pipa = n_rigth_left ? pipa <<< shift : pipa >>> shift;

//циклический
typedef unsigned this_t;
typedef unsigned shift_t;
pipa = round_shift(popa, shift, n_rigth_left);

function automatic data_t round_shift (input data_t data, shift_t shift, bit n_rigth_left );
  for (int i = 0; i < shift; i++) begin
    if (n_rigth_left)
      data = {data[$high(data)-1 : 0], data[$high(data)]};
    else
      data = {data[0], data[$high(data) : 1]};
  end
  return data;
endfunction


а дальше пусть синтезатор разбирается. Но тормоза будут еще те %)


--------------------
Go to the top of the page
 
+Quote Post
yes
сообщение Sep 8 2009, 11:15
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



Цитата(des00 @ Sep 1 2009, 07:34) *
а дальше пусть синтезатор разбирается. Но тормоза будут еще те %)


там должно синтезироватся n-мультиплексоров, где n - разрядность shift
даже в примитивной FPGA, это всего n (для 64х битного слова - 6(?) уровней логики), что во многих случаях не сложно

а во многих FPGA стоят дополнительные элементы для мультиплексирования - то есть еще проще

для АЗИКов вроде бы никогда барель-шифтеры не вызывают проблем со времянкой также
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 8 2009, 11:49
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(yes @ Sep 8 2009, 06:15) *
там должно синтезироватся n-мультиплексоров, где n - разрядность shift
даже в примитивной FPGA, это всего n (для 64х битного слова - 6(?) уровней логики), что во многих случаях не сложно

а во многих FPGA стоят дополнительные элементы для мультиплексирования - то есть еще проще

для АЗИКов вроде бы никогда барель-шифтеры не вызывают проблем со времянкой также


так то оно так. но тут 3 одновременно разных сдвигателя, в одном случае надо пихать 0, в другом знак, в третем N ый бит. это даст разрастание логики. собрал для 32 бит 3 сдвигателя квартус оценил в 1655 плиток. ИМХО такое количество плиток, зажатое между двумя 32 бита регистрами, на фпга быстрым не бывает %)


--------------------
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Sep 24 2009, 08:52
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Поглядите в сторону хардверных умножителей 18 * 25 - есть такие в Spartan3A например. У Xilinx на их основе реализован framer для HD/SD SDI.
Сдвиг делается умножением на соответствующую степень двойки.
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 25 2009, 04:52
Сообщение #6


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(yes @ Sep 8 2009, 05:15) *
там должно синтезироватся n-мультиплексоров, где n - разрядность shift
даже в примитивной FPGA, это всего n (для 64х битного слова - 6(?) уровней логики), что во многих случаях не сложно

а во многих FPGA стоят дополнительные элементы для мультиплексирования - то есть еще проще

для АЗИКов вроде бы никогда барель-шифтеры не вызывают проблем со времянкой также


ради любви к исскуству уделил немного внимания сему делу. Получил занятные результаты :

для 32-х бит :
1. решение в лоб 1635 LC
2. умное решение в лоб 1480 LC
3. умное решение на уровне архитектуры 1258 LC
4. лобовое решение на уровне архитектуры для 32-х бит делать "заломало", для 4-х бит результат почти равен варианту 3.

для оценки datapath должен быть что то вроде : мультиплексор 32в1 23LC на бит итого 736LC.

кому интересно в атаче код

ЗЫ. собиралось КВА 9.0 сп1 , он конечно еще не шибко умный, но кое что могет %))
Прикрепленные файлы
Прикрепленный файл  varshifter_tb.v ( 17.12 килобайт ) Кол-во скачиваний: 72
 


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016