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

Параллельное чтение данных таблицы

Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита.

Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными.

Вопрос как мне перейти чтению по столбцам?

Записать результаты в 32 памяти для чтения по столбцам?

 

Может нужно по другому организовывать архитектуру, если да, то как?

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


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

Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита.

Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными.

Вопрос как мне перейти чтению по столбцам?

Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец.

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


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

Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец.

можно по подробнее, не понял

пожалуйста

 

Для пояснения например - таблица 5х5 (для пояснения вопроса):

 

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

 

Строки (5 памяти для строк) читаю

17 24 1 8 15 - за один такт

23 5 7 14 16 - за один такт

4 6 13 20 22 - за один такт

10 12 19 21 3 - за один такт

11 18 25 2 9 - за один такт

 

Столбцы (5 памяти для столбцов) читаю

17 23 4 10 11 - за один такт

24 5 6 12 18 - за один такт

1 7 13 19 25 - за один такт

8 14 20 21 2 - за один такт

15 16 22 3 9 - за один такт

 

Вопрос как организовать чтение/запись, чтобы при чтении памяти столбцов производить запись результатов обработки в память строк и наоборот?

Памяти для строк и столбцов могут быть разделены, скорее всего так и буду делать

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


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

Для пояснения например - таблица 5х5:

 

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

 

Вопрос как мне писать в 32 памяти (количество строк и столбцов одинаковое) чтобы так организовать чтение/запись?

строки таблицы взаимно вращаете по единице на строку:

модули памяти здесь сгруппированы по столбцам

17 24 1 8 15

5 7 14 16 23

13 20 22 4 6

21 3 10 12 19

9 11 18 25 2

Исходно все элементы столбца лежали в одном модуле памяти, а теперь они распределились по разным и их можно выбрать параллельно( данные столбца теперь выбираются по диагонали, а строки остались по строкам только с вращением). Правда, придётся ещё вращатель поставить, он больше всего места займёт, но всё равно сильно меньше чем двухпортовку на регистрах городить.

 

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


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

строки таблицы взаимно вращаете по единице на строку:

модули памяти здесь сгруппированы по столбцам

17 24 1 8 15

5 7 14 16 23

13 20 22 4 6

21 3 10 12 19

9 11 18 25 2

Уточнение, строки лучше закручивать в другую сторону, тогда при выборке колонок не надо переворачивать данные.

17 24 1 8 15

16 23 5 7 14

20 22 4 6 13

19 21 3 10 12

18 25 2 9 11

Для выбора строк использовать следующие параметры:

address = row_index;

rotation = -row_index;

для выбора столбцов:

address = (-column_index + memory_module_index) mod matrix_width (*пять в данном примере*)

rotation = -column_index;

При выборе строк адрес на все модули подаётся одинаковый, а при выборе столбцов он у каждого модуля свой, в зависимости от

величины memory_module_index, которая является константой для каждого модуля памяти(от 0 до matrix_width-1).

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


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

Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита.

Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными.

Вопрос как мне перейти чтению по столбцам?

Записать результаты в 32 памяти для чтения по столбцам?

 

Может нужно по другому организовывать архитектуру, если да, то как?

Сомневаюсь, что Вы этого не знаете, но, на всякий случай, напишу, что в блочной двух портовой памяти порты могут иметь разную разрядность.

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


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

Сомневаюсь, что Вы этого не знаете, но, на всякий случай, напишу, что в блочной двух портовой памяти порты могут иметь разную разрядность.

Я знаю, но все равно спасибо. :)

Только не знаю как это применить к моему случаю.

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

Задействовать блочную память под 32*4 бит (это для одной строки/столбца), мне кажется, как то не рационально

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


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

Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец.

Много лет назад в точности это делал под ACEX. Интерливер Рамси и Форни.

Только не было требования читать за один такт, как у ув. Maverick.

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


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

Много раз перечитал Ваши сообщения, к сожалению остался вопрос.

 

rotation = -row_index;

Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус. Думаю, что нужен циклический сдвиг влево на № строки... Правильно?

 

 

Спасибо за помощь

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


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

Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус

циклический сдвиг в другую сторону

 

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


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

Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус. Думаю, что нужен циклический сдвиг влево на № строки... Правильно?

 

 

Спасибо за помощь

По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле

new_index = (current_index+rotation) mod n_elements_in_vector

Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного.

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

 

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


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

По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле

new_index = (current_index+rotation) mod n_elements_in_vector

Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного.

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

Большое спасибо за объяснение.

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


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

По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле

new_index = (current_index+rotation) mod n_elements_in_vector

Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного.

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

Вращение данных строки/столбца реализовал циклическим сдвигом влево на № строки/столбца.

Не понимаю как считать адреса для столбцов, для строк, как я понял, это обычный счетчик с инкрементом 1.

 

PS Может поделитесь строчкой описания для счетчика (с пояснением сигналов) или процессом для счетчика адреса для столбцов, если можно только с учетом циклическим сдвигом влево на № строки/столбца.

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


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

Вращение данных строки/столбца реализовал циклическим сдвигом влево на № строки/столбца.

Не понимаю как считать адреса для столбцов, для строк, как я понял, это обычный счетчик с инкрементом 1.

 

PS Может поделитесь строчкой описания для счетчика (с пояснением сигналов) или процессом для счетчика адреса для столбцов, если можно только с учетом циклическим сдвигом влево на № строки/столбца.

Примерчик функции вращения для массива из целых чисел(синтезируемый, но, возможно, неэффективно).

type integer_vector is array (integer range <>) of integer;
function rotation(data:integer_vector, rot:integer)return integer_vector is
  constant length:integer := data'length;
  variable result:integer_vector(0 to length-1);
  variable i:integer;
  alias da:integer_vector(0 to length-1) is data;
begin
  for i in result'range loop
    result((i+rot) mod length) := da(i);
  end loop;
  return result;
end function;

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


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

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

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

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

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

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

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

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

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

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