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

v1vas

Участник
  • Постов

    12
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Парни, просто хочу вас всех поблагодарить, за помощь тут и тут =) Оно с вашими советами всё заработало, причем куда эффективнее, чем я изначально рассчитывал (логику удалось запустить на 320MHz). Отдельное спасибо господам Maverick Bad0512 Timmy des00 ASN и iosifk!
  2. Virtex 6 Есть два частотных домена, 50 MHz и 200 MHz Клоки идут с Xilinx'го ClockWizard, утверждается, что они на 100% совпадают по фазе. Я так понимаю это не гарантированная фигня и из-за роутинга мы в некоторых местах плисины можем получить небольшое различие по времени прихода фронта волны ? Соответственно логика моих рассуждений, раз во фронт медленного клока попадают два фронта быстрого, то во втором фронте быстрого мы можем сэмплить данные с медленного. constant MAINCLK_SAMPLE_STEP : integer := 1; signal main_clk_cnt : integer range 0 to 3 := 0; process (data_clock) --50 MHZ begin if (rising_edge(data_clock)) then data_mainclk <= i_data; data_ready_mainclk <= i_data_ready; o_result <= result_mainclk; end if; end process; process (clock) --200MHZ begin if (rising_edge(clock)) then if (reset = '0') then if (main_clk_cnt = 3) then main_clk_cnt <= 0; else main_clk_cnt <= main_clk_cnt + 1; end if; case SM_STATE is when SM_DATA_INPUT_FIRST_1 => if (data_ready_mainclk = '1') and (main_clk_cnt = MAINCLK_SAMPLE_STEP) then dinp(63 downto 32) <= data_mainclk; SM_STATE <= SM_DATA_INPUT_FIRST_2; end if; ............... и т.д. Сиё творчество в симуляторе работает нормально. Насколько вообще правилен такой подход ? Интуитивно он мне не нравится, чувствую, что тут надо как-то по другому и все законстрейнить, но пока не могу понять как. Ткните меня пожалуйста, как это нормально сделать ?
  3. Это не майнер, это очень специфичный брут-форс для очень экзотичной задачи) Но архитектурно идеи те же, согласен. Схему держу в голове, объёма мозга хватает. Но перенесу на бумагу, хорошо, заодно и здесь выложу. За советы спасибо! Начну воплощать.
  4. Давайте вдаваться в детали, чтобы все не выглядело так ужасно, как это понял iosifk =) Есть вычислительный модуль, в нем достаточно легковесная математика. Он единоразово принимает 34 байта стартовых данных и далее на протяжении примерно 5 500 000 000 шагов (1 шаг - 1 такт) эти данные обрабатывает. При частоте 200МГц - это около 30 секунд. В процессе этих 30 секунд никакие данные модулю больше не нужны. По итогам работы модуля мы на выходе получаем один бит: вычислилось ли интересующее нас значение или нет (флаг data_ready в первом интерфейсе, что я написал). Это происходит в среднем только один раз на 300 000 вариантов входных данных, поэтому мне достаточно просто знать для каких данных это произошло, а все остальное я проверяю на хосте. Ну и соответственно есть флаг done, когда все модули закончили - я им бросаю следующую пачку данных, предварительно принятых по UART, а обратно отправляю номер модуля который что-то вычислил, если он есть. UART - другой частотный домен, заведен на два FIFO - один для отправки данных, один для приемки. Главный модуль: объединяет и контролирует всё это. Общая структура и порядок работы главного модуля: 1) Проверяем FIFO, в котором скапливаются данные прилетевшие с хоста, для каждых 34 байт оказавшихся там - отправляем их в вычислительный модуль. 2) Когда загрузили все модули - ждем, пока все модули посчитают (у всех done = '1') 3) Если у какого-то модуля data_ready = '1' - кидаем номер этого модуля в FIFO для отправки данных на хост 4) Ресетим модули и идем на пункт один Вычислительный модуль: 1) Если data_flag = '1', то в data_input лежат валидные данные. 2) Как накопили 34 байта - начали работу. 3) Если вычислилось то, что нужно data_ready <= '1'; 4) Как закончили done <= '1'; Изначально вычислительные коннектились к основному прозаично: MTMainCores: for i in 0 to NCORES - 1 generate begin CoreEntry: CRMain GENERIC MAP ( CORE_N => i ) PORT MAP ( clock => clk, reset => reset, data_input => core_data, data_flag => data_core_flag(i), done => core_done(i), data_ready => data_mt_ready(i) ); end generate MainCores; Потом добавил регистры, про которые написал в первом сообщении. По совету Timmy добавил им аттрибут "keep": attribute keep : string; attribute keep of reset_corebuf: signal is "true"; attribute keep of data_input_corebuf: signal is "true"; attribute keep of data_flag_corebuf: signal is "true"; attribute keep of done_corebuf: signal is "true"; attribute keep of data_ready_corebuf: signal is "true"; И на текущий момент имею 48084 timing score для 128 модулей и вот такой критический путь: Paths for end point Mmux__n4665412_FRB (SLICE_X98Y138.D3), 312 paths -------------------------------------------------------------------------------- Slack (setup path): -2.621ns (requirement - (data path - clock path skew + uncertainty)) Source: MTMainCores[3].CoreEntry/data_ready_BRB2 (FF) Destination: Mmux__n4665412_FRB (FF) Requirement: 5.000ns Data Path Delay: 7.486ns (Levels of Logic = 5) Clock Path Skew: -0.100ns (1.521 - 1.621) Source Clock: clk_BUFGP rising at 0.000ns Destination Clock: clk_BUFGP rising at 5.000ns Clock Uncertainty: 0.035ns Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.070ns Total Input Jitter (TIJ): 0.000ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Maximum Data Path at Slow Process Corner: MTMainCores[3].CoreEntry/data_ready_BRB2 to Mmux__n4665412_FRB Location Delay type Delay(ns) Physical Resource Logical Resource(s) ------------------------------------------------- ------------------- SLICE_X70Y134.DQ Tcko 0.337 MTMainCores[3].CoreEntry/data_ready_BRB2 MTMainCores[3].CoreEntry/data_ready_BRB2 SLICE_X70Y132.C1 net (fanout=1) 0.710 MTMainCores[3].CoreEntry/data_ready_BRB2 SLICE_X70Y132.C Tilo 0.068 data_mt_ready<3> MTMainCores[3].CoreEntry/data_ready_rstpot SLICE_X97Y70.B3 net (fanout=5) 2.967 data_ready_corebuf<3> SLICE_X97Y70.B Tilo 0.068 data_mt_ready<7> Mmux__n466542 SLICE_X98Y112.D6 net (fanout=1) 1.627 N19372 SLICE_X98Y112.D Tilo 0.068 MTMainCores[21].CoreEntry/SM_STATE_FSM_FFd4_BRB1 Mmux__n466544 SLICE_X98Y138.C5 net (fanout=1) 1.158 N19376 SLICE_X98Y138.C Tilo 0.068 Mmux__n4665412_FRB N19384 SLICE_X98Y138.D3 net (fanout=1) 0.345 N19384 SLICE_X98Y138.CLK Tas 0.070 Mmux__n4665412_FRB Mmux__n4665412 Mmux__n4665412_FRB ------------------------------------------------- --------------------------- Total 7.486ns (0.679ns logic, 6.807ns route) (9.1% logic, 90.9% route)
  5. Дано: Virtex-6 XC6VLX240T Центральный модуль, включающий себя UART и подготовку данных. Есть вычислительные модули, которые коннектятся к центральному, их интерфейс: ( clock : in std_logic; reset : in std_logic; data_input : in std_logic_vector(31 downto 0); data_flag : in std_logic; done : out std_logic; data_ready : out std_logic ) С точки зрения использования ресурсов в плис влезает около 230 таких модулей + центральный. При 64 модулях все это хорошо живет на 200Мгц, данная частота и является целью. При 128 модулях синтезатор уже выдаёт максимальную частоту 140MHz, что не устраивает. Причем, PlanAhead показывает, что критические пути - это линии соединения вычислительных модулей с центральным. Попробовал добавить регистры в эти линии: signal reset_corebuf : std_logic_vector(NCORES - 1 downto 0); signal data_input_corebuf : std_logic_vector((NCORES * 32) - 1 downto 0); signal data_flag_corebuf : std_logic_vector(NCORES - 1 downto 0); signal done_corebuf : std_logic_vector(NCORES - 1 downto 0); signal data_ready_corebuf : std_logic_vector(NCORES - 1 downto 0); process (clk) begin if (rising_edge(clk)) then for i in 0 to NCORES - 1 loop reset_corebuf(i) <= reset; data_input_corebuf((i + 1) * 32 - 1 downto i * 32) <= core_data; data_flag_corebuf(i) <= data_core_flag(i); core_done(i) <= done_corebuf(i); data_core_ready(i) <= data_ready_corebuf(i); end loop; end if; end process; И вот эти промежуточные сигналы уже законнектил к вычислительным модулям. Лучше не стало, хотя по логике - должно. Подскажите пожалуйста, что я делаю не так и куда копать)
  6. Приветствую всех! Я в плис полный новичок, кому несложно - подскажите пожалуйста. Есть алгоритм, для работы которого нужно: 700 32 битных слова памяти (массив) 3 32 битных константы На каждый шаг работы алгоритма делается: 3 обращения к массиву на чтение Два битовых сдвига и одно суммирование Две операции XOR Три сравнения. Одно обращение к массиву на запись. Примерно раз в 4 миллиарда операций нужно пробросить два двойных слова наверх. Требуется обработать огромное количество таких данных (тот же алгоритм, разный входной массив). А теперь собственно вопросы: 1) Насколько эта задача подходит для реализации на плис ? 2) Сколько одновременно выполняющихся таких "алгоритмов" можно засунуть в самую навороченную FPGA ? Текущие тесты пока показывают, что 1) Вычислять на процессорах - совсем плохо 2) Xeon Phi - быстрее, но далеко от желаемой производительности 3) CUDA - Kepler K10 практически в шесть раз быстрее одного Intel Core i7 3.33 Ghz, но хочется большего. Интересует на что можно рассчитывать на плис.
  7. Видите-ли, желательно в дальнейшем (3 - 6 месяцев) поставить процесс считывания флешек на конвеер. Что крайне проблематично сделать выпаивая и впаивая чипы =) Собственно говоря я так и делаю. Но сами понимаете - я по сути в микроэлектронике начинаю с нуля, ибо мои познания ограничены 1-курсом института, где в факультативном порядке объяснялось как И-НЕ на транзисторах сделать. По работе немного сталкивался с TMS, но на уровне программера. Поэтому мне ещё предстоит наступить на кучу грабель, прежде чем я смогу сам снять инфу с флешки вот и прошу помощи у народа. Что именно там за процессор скажу вечером, как буду дома.
  8. Очевидно тем, что придётся "вдувать" их обратно, ибо флешки портить _крайне_ нежелательно. А по отзывам знакомых электронщиков сделать это с BGA-чипами не повредив их - чертовски сложно. согласен. Да вот всё дело в том, что 80-пиновые флешки - вещь вообще не особо стандартная.
  9. Итак, слоёв там 6-ть. Документация - даташиты на 80-пиновые flash-ки, преимущественно цоколёвка самих пинов. Найдено в течение дня поиском в инете. Более чем уверен, что профессионал в микроэлектронике, пользуясь наработанными знаниями в области порталов и хранилищ док, найдёт иные, более полные документы на аналогичные модули. Вполне допускаю, что где-то есть дока и на сам модуль, но мне её найти не удалось.
  10. Собственно этого и ожидаю. Формат придётся вскрывать, было-б что вскрывать =) Этим буду заниматься я, ну или опять же за вознаграждение попрошу помощи на стороне. Я собственно говоря программист с неплохим опытом, но вот впервые напоролся на проблемы в области микроэлектроники, в которой мои познания весьма ограничены. Слой я полагаю один.
  11. Есть модули флеш-памяти, находятся в форм-факторе SIMM, 80-pin. На модуле стоят 4-ре микросхемы Spansion по 16 мегабайт каждая и три FairChild FST16211 (Bus Switch). Документация на чипы - есть, на саму флешку (что как куда разведено) - нет. Есть документация на похожие 80-pin SIMM флешки. Есть возможность посмотреть плату где эти флешки стоят. Нужно найти возможность считывать с этих флешек данные. В качестве решения подойдёт все что угодно: программатор, плата с FPGA и т.п., главное что-бы на выходе я получал файл(ы) с данными на флешке. Оплата работы - $500 Все технические расходы - программатор, платы и т.п. - оплачиваю я. При быстром выполнении работы - премия. Финансовый вопрос обсуждаем при наличии адекватной аргументации. Контакты: [email protected] ICQ: 414038927 или здесь в форуме.
  12. Есть микросхема, выглядит _примерно_ вот так: http://www.4isp.ru/core.asp?main=catalog&a...=2156&cat=2 Примерно - это значит что сами чипы на ней другие, но сама плата и расположение контактов и выемок - такое. Нужно как-то считать с неё данные, никто не подскажет как ? (если нужны фотки самой схемы - могу залить)
×
×
  • Создать...