|
|
  |
Использование встроенной памяти ПЛИС. |
|
|
|
Sep 22 2010, 00:06
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
Цитата(des333 @ Sep 22 2010, 02:08)  Бумага, ручка и мозг.  5 баллов, ей богу! это в общем именно так, во всяком случае я с автоматизированными системами не знаком (возможно какие-то наработки в области эвристики имеются). Цитата(Shtirlits @ Sep 22 2010, 02:05)  какие есть средства для "эквивалентной трансформации вычислительного метода" ? я на всякий случай (если не понятно о чём именно идёт речь) поясню несколькими простыми примерами: самый простой, что приходит первым делом на ум: умножитель можно сделать матричным, а можно на основе КА (т.е. аккумуляторным). здесь точность не меняется в общем случае, тактовая тоже остаётся на месте, а вот общая производительность меняется за счёт существенного изменения ресурсов. следующий пример: сортировка массивов. есть множество методов и параллельных и более последовательных и они очень сильно различаются по всем показателям, кроме точности (в общем случае о таких трансформациях выпускают книжки в основном для программирования супер-ЭВМ/различных архитектур/). есть копромиссные преобразования, которые как правило меняются и по точности и в общем случае по качеству(о точности можно говорить условно) преобразования. как-то классифицировать их я не берусь. примеров много в области обр. сигналов (в основном точность), и в частности изображений (качество в общем смысле) алаверды
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Sep 22 2010, 11:34
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Цитата теперь, если угодно вопрос на засыпку: а можно ли схему выполняющую те же самые логические преобразования изменить так, чтобы заставить тактироваться всё-таки с периодом в 1нс? Кажется, я понял. Надо добавить 4 регистра для хранения промежуточных результатов. Тактирование тогда станет 1 нс. Хотя в первом случае на получение результата операции потребуются все те же 2-3 нс (2-3 такта), во втором случае мы получим его за 1 нс, а не за 3 нс. Так  ? Сейчас с этой точки зрения посмотрю на свой код. Спасибо. Вооружусь бумагой, ручкой и мозгом  .
Сообщение отредактировал m0use - Sep 22 2010, 11:34
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
Sep 22 2010, 14:53
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Посмотрел код. Может, в этой триаде - бумага+карандаш+мозг - что-то недостаточно развито, но мне показалось, что главный вопрос был сформулирован CaPpuCcino уже давно: Цитата и вообще-то меня терзают смутные сомнения... (правильно ли вы описываете то, что проектируете) Меня тоже терзают, поэтому сначала приведу описание того, что я проектирую на языке Русский, а потом то, как я это описал на языке Veilog. Русский:  Код Функциональная задача такая - на вход поступает изображение, матрицы RGB. Пусть пока это одна матрица I (требуемый порядок - 640x480). Из этой матрицы получается две градиентные матрицы - по x (Ix) и по y (Iy). После этого из этих градиентных матриц строится матрица Харриса по формуле выше.
Собственно, всё. Условно я вижу это в железе как проводки идущие от двух ячеек исходной матрицы через сумматор к одной ячейке градиентных матриц. И также от нескольких ячеек градиентных матриц - к одной ячейке матрицы Харриса (свёртка). Всё это должно выполняться параллельно и потому быстро :). Verilog: Код // ASSIGNES // assign end_load_w = ( int_bytes_loaded == P_IMAGE_ROWS * P_IMAGE_COLS - 1 ); assign end_grad_w = ( int_grad == P_IMAGE_ROWS * P_IMAGE_COLS ); assign end_harris_w = ( int_harris == P_HARRIS_SIZE ); <...>; // END ASSIGNES //
/ ALWAYS-BLOCKS // // ** RESET & LOAD & DBOUTPUT ** // always @( posedge CLK or posedge RESET ) begin if( RESET ) <начальная иницализация>; else if( IN_1_BTN_CLICK && !end_load_w ) begin mem_image[ int_bytes_loaded ] <= IN_8_IMAGE; int_bytes_loaded <= int_bytes_loaded + 1; DB_OUT_7_LED_r <= int_bytes_loaded; end else <после окончания преобразования вывод результата>; end // ** GRADIENT & HARRIS ROUTINE ** // always @( posedge CLK or posedge RESET ) begin if( RESET ) <начальная инициализация> else if( end_load_w && !end_grad_w && !end_harris_w ) for( int_xi = 0; int_xi < P_IMAGE_COLS; int_xi = int_xi + 1 ) for( int_yi = 0; int_yi < P_IMAGE_ROWS; int_yi = int_yi + 1 ) if( int_grad != P_IMAGE_ROWS * P_IMAGE_COLS ) begin mem_image_x[ int_xi + P_IMAGE_COLS*int_yi ] = <разность по x>; mem_image_y[ int_xi + P_IMAGE_COLS*int_yi ] = <разность по y>; int_grad = int_grad + 1; end else; else if( end_load_w && end_grad_w && end_db_output_w && !end_harris_w ) for( int_xi_2 = P_RADIUS; int_xi_2 < ( P_IMAGE_COLS - P_RADIUS ); int_xi_2 = int_xi_2 + 1 ) for( int_yi_2 = P_RADIUS; int_yi_2 < ( P_IMAGE_ROWS - P_RADIUS ); int_yi_2 = int_yi_2 + 1 ) if( int_harris != P_HARRIS_SIZE ) begin mem_harris[ <адрес блока памяти> ] = f_harris_block( int_xi_2, int_yi_2 ); int_harris = int_harris + 1; end else; else; end <...>; // END ALWAYS-BLOCKS //
// FUNCTIONS // // ** TABLE SQRT ** // function integer f_my_sqrt; input integer f_int_x; case( f_int_x ) 0: f_my_sqrt = 0; 3: f_my_sqrt = 1; 4: f_my_sqrt = 2; default: f_my_sqrt = 255; endcase endfunction // ** HARRIS BLOCK ** // function integer f_harris_block; // FARGUMENTS // input integer f_int_x; input integer f_int_y; // FVARIABLES // integer f_int_ki; integer f_int_ri; integer f_int_xx; integer f_int_xy; integer f_int_yy; begin f_int_xx = 0; f_int_xy = 0; f_int_yy = 0; for( f_int_ki = -P_RADIUS; f_int_ki <= P_RADIUS; f_int_ki = f_int_ki + 1) for( f_int_ri = -P_RADIUS; f_int_ri <= P_RADIUS; f_int_ri = f_int_ri + 1 ) begin if( `_ABS( f_int_ri ) <= f_my_sqrt( `_SQR( P_RADIUS ) - `_SQR( f_int_ki ) ) ) begin f_int_xx = f_int_xx + <mem_image_x * mem_image_x>; f_int_xy = f_int_xy + <mem_image_x * mem_image_y>; f_int_yy = f_int_yy + <mem_image_y * mem_image_y>; end else; end f_harris_block = f_int_xx + f_int_xy + f_int_yy; end endfunction // END FUNCTIONS // Я память попробую использовать, это просто как сохранение перед миссией - выложить тот код, который уже есть, чтобы Вы профессиональным взглядом на него посмотрели. Может, что там, действительно не так, что только LUT ест.
Сообщение отредактировал m0use - Sep 22 2010, 14:49
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
Sep 22 2010, 15:02
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
а вы моделировали функционально? результат получается правильным? (это чтоб не проверять математику, а сконцентрироваться только на оптимизацией путей данных) Цитата(m0use @ Sep 22 2010, 14:34)  Хотя в первом случае на получение результата операции потребуются все те же 2-3 нс (2-3 такта), во втором случае мы получим его за 1 нс, а не за 3 нс. так. более того, если у вас через первый вычислитель (или вообще через систему) идёт постоянный поток данных, то результат из системы будет выходить с темпом в 1 нс, т.е. каждые 1 нс вы будете получать новый результат обработки нового набора данных (хоть и с задержкой в несколько тактов для каждого индивидуального набора относительно его входа в систему, но общая производительность такой потоковой системы повысится существенно /если не понятно интуитивно, посмотрите где-нибудь основные принципы конвейера - думаю в википедии д.б./)
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Sep 22 2010, 15:15
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Не, и так понятно, Вы доступно объясняете. Спасибо  . Цитата а вы моделировали функционально? результат получается правильным? В работе я уже код проверял - программировал ПЛИС, код работает, выход правильный, т.е. математика корректная.
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
Sep 22 2010, 15:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(CaPpuCcino @ Sep 22 2010, 19:27)  вы не подскажите вот эти угловые скобки в выражение, это что такое - никак не могу вспомнить их в верилоге f_int_xx = f_int_xx + <mem_image_x * mem_image_x> И не вспомните. У автора их еще много. Цитата(m0use @ Sep 22 2010, 18:53)  Код <...>; ... if( RESET ) <начальная иницализация>; ... mem_harris[ <адрес блока памяти> ] = f_harris_block( int_xi_2, int_yi_2 );
--------------------
|
|
|
|
|
Sep 22 2010, 16:20
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Цитата а какая оценка тактовой даётся синтезатором? Код Timing Summary: --------------- Speed Grade: -4
Minimum period: 206.584ns (Maximum Frequency: 4.841MHz) Minimum input arrival time before clock: 2.793ns Maximum output required time after clock: 4.310ns Maximum combinational path delay: No path found Блин, мало получается. Я думал, по наивности, что 50МГц - то есть как раз то, что с кварца подаётся  . Цитата и почему у вас так регистров-то мало используется вы не думали? 640*480 уже за 300 тыс. слов, а у вас только около 1 тыс бит У меня входная матрица - 8*6. Отладочный вариант. О 640*480 я только мечтать могу с таким кодом  . Цитата это значит требуемые умножители будут реализованы на общей логике Объясните пожалуйста, что значит "на общей логике". Это с помощью LUTов? Угловые скобки - это моё изобретение для экономии места. Я в них суть общую обозначал. Просто очень длинные индексы у матриц  . Цитата вообще есть подозрение, что вы кристалл выбрали слабый - у вас параллельная обработка всего массива за шаг вряд ли получится - придётся делать скользящим окном Получается, что так, Вы правы. Я тоже теперь к этому склоняюсь. Или попробую загружать матрицу в память, а потом оттуда её вытаскивать блоками, или просто на вход буду принимать часть матрицы. 20 умножителей сильно развернуться не дадут, это уж точно. Самое главное, что мне пока не понятно - это почему тактовая частота такая низкая. Как Вы думаете, если перейти к блочной обработке, частота повысится? Цитата есть подозрение, что вы кристалл выбрали слабый А кристалл пока выбирать не приходится - SDK Nexys2  .
Сообщение отредактировал m0use - Sep 22 2010, 16:12
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
Sep 22 2010, 16:52
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
Цитата(m0use @ Sep 22 2010, 19:20)  Самое главное, что мне пока не понятно - это почему тактовая частота такая низкая. Как Вы думаете, если перейти к блочной обработке, частота повысится? нет не повысится. эта мера вынужденная, так как у вас на преобразование большой картинки просто ресурсов кристалла не хватит. частота у вас такая низкая из-за того что преобразования между регистровыми матрицами очень жирные. например если у вас записана операция умножения и она не синтезируется во встроенный умножитель, то она будет реализована в виде столбикового сложения с количеством операндов равным разрядности множителя. а это очень жирный кусок. тут либо нужно принудительно вставлять промежуточные регистры (делать конвейерное умножение, либо реализовывать умножитель на аккумуляторе). Цитата(m0use @ Sep 22 2010, 19:20)  Объясните пожалуйста, что значит "на общей логике". Это с помощью LUTов? да
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Sep 22 2010, 17:02
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Понятно. А есть ли возможность конвеерно выполнять все необходимые умножения на эти 20 аппаратных умножителях? Цитата тут либо нужно принудительно вставлять промежуточные регистры (делать конвейерное умножение, либо реализовывать умножитель на аккумуляторе) Не совсем понятны мне эти термины, ну, это дело такое - загуглю. Но знаю, что есть уже написанные умножители (IP Core в ICE) - применение этих модулей поможет решить вопрос?
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
Sep 22 2010, 17:20
|

тоже уже Гуру
     
Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973

|
Цитата(m0use @ Sep 22 2010, 20:02)  Понятно. А есть ли возможность конвеерно выполнять все необходимые умножения на эти 20 аппаратных умножителях?
Не совсем понятны мне эти термины, ну, это дело такое - загуглю. Но знаю, что есть уже написанные умножители (IP Core в ICE) - применение этих модулей поможет решить вопрос? 1) да именно так и придётся делать (на мой взгляд) - пусть у вас скользящее окно по картинке едит и делает преобразования локально в этом окне. это "едет" означает, что вы из вашей картинки организуете поток, который будет проходить через ваш конвейер преобразований. 2) этого не знаю. всё зависит от того как вы конвейер задумаете реализовывать. я сам себе когда-то разных реализаций умножителей наделал (когда-то софт-процессор лепил) и до сих пор ими по необходимости пользуюсь. ЗЫЖ кстати ISE а не ICE, но это лирика
--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
|
|
|
|
|
Sep 22 2010, 17:34
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-08-10
Пользователь №: 58 790

|
Идею понял, только уточнить хочу. Если у меня в always-блоке будет использоваться не более 20 умножений, то все они будут реализованы на аппаратных умножителях? Софт-процессор - это круто! А с ISE опечатка, верно  .
--------------------
Усложнять - просто, упрощать - сложно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|