Maverick_ 15 14 января, 2016 Опубликовано 14 января, 2016 · Жалоба Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита. Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными. Вопрос как мне перейти чтению по столбцам? Записать результаты в 32 памяти для чтения по столбцам? Может нужно по другому организовывать архитектуру, если да, то как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 14 января, 2016 Опубликовано 14 января, 2016 · Жалоба Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита. Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными. Вопрос как мне перейти чтению по столбцам? Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 14 января, 2016 Опубликовано 14 января, 2016 · Жалоба Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 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 - за один такт Вопрос как организовать чтение/запись, чтобы при чтении памяти столбцов производить запись результатов обработки в память строк и наоборот? Памяти для строк и столбцов могут быть разделены, скорее всего так и буду делать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 14 января, 2016 Опубликовано 14 января, 2016 · Жалоба Для пояснения например - таблица 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 Исходно все элементы столбца лежали в одном модуле памяти, а теперь они распределились по разным и их можно выбрать параллельно( данные столбца теперь выбираются по диагонали, а строки остались по строкам только с вращением). Правда, придётся ещё вращатель поставить, он больше всего места займёт, но всё равно сильно меньше чем двухпортовку на регистрах городить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба строки таблицы взаимно вращаете по единице на строку: модули памяти здесь сгруппированы по столбцам 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Допустим есть 32 строки организованных на LUT таблицах памяти. В строке 32 данных/чисел по 4 бита. Таким образом, произвожу чтение всей строки за один такт. Потом произвожу обработку над данными. Вопрос как мне перейти чтению по столбцам? Записать результаты в 32 памяти для чтения по столбцам? Может нужно по другому организовывать архитектуру, если да, то как? Сомневаюсь, что Вы этого не знаете, но, на всякий случай, напишу, что в блочной двух портовой памяти порты могут иметь разную разрядность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Сомневаюсь, что Вы этого не знаете, но, на всякий случай, напишу, что в блочной двух портовой памяти порты могут иметь разную разрядность. Я знаю, но все равно спасибо. :) Только не знаю как это применить к моему случаю. Допустим можно сделать разрядность шины данных 32*4 бит, но данные для строк и столбцов разные... Задействовать блочную память под 32*4 бит (это для одной строки/столбца), мне кажется, как то не рационально Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец. Много лет назад в точности это делал под ACEX. Интерливер Рамси и Форни. Только не было требования читать за один такт, как у ув. Maverick. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 22 января, 2016 Опубликовано 22 января, 2016 · Жалоба Много раз перечитал Ваши сообщения, к сожалению остался вопрос. rotation = -row_index; Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус. Думаю, что нужен циклический сдвиг влево на № строки... Правильно? Спасибо за помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 22 января, 2016 Опубликовано 22 января, 2016 · Жалоба Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус циклический сдвиг в другую сторону Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 22 января, 2016 Опубликовано 22 января, 2016 · Жалоба циклический сдвиг в другую сторону Понял. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 23 января, 2016 Опубликовано 23 января, 2016 · Жалоба Как я понимаю это обозначает вращение на № строки, но не понимаю как делать вращение со знаком минус. Думаю, что нужен циклический сдвиг влево на № строки... Правильно? Спасибо за помощь По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле new_index = (current_index+rotation) mod n_elements_in_vector Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного. В нашем случае индексы возрастают слева направо, отрицательный сдвиг будет влево, так что правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 января, 2016 Опубликовано 23 января, 2016 · Жалоба По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле new_index = (current_index+rotation) mod n_elements_in_vector Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного. В нашем случае индексы возрастают слева направо, отрицательный сдвиг будет влево, так что правильно. Большое спасибо за объяснение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле new_index = (current_index+rotation) mod n_elements_in_vector Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного. В нашем случае индексы возрастают слева направо, отрицательный сдвиг будет влево, так что правильно. Вращение данных строки/столбца реализовал циклическим сдвигом влево на № строки/столбца. Не понимаю как считать адреса для столбцов, для строк, как я понял, это обычный счетчик с инкрементом 1. PS Может поделитесь строчкой описания для счетчика (с пояснением сигналов) или процессом для счетчика адреса для столбцов, если можно только с учетом циклическим сдвигом влево на № строки/столбца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 5 февраля, 2016 Опубликовано 5 февраля, 2016 · Жалоба Вращение данных строки/столбца реализовал циклическим сдвигом влево на № строки/столбца. Не понимаю как считать адреса для столбцов, для строк, как я понял, это обычный счетчик с инкрементом 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться