billidean 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба Всех с праздником, мужики. Уже неделю сижу с проблемой:: есть код (примерный): ... ... write_data_in : in std_logic_vector(63 downto 0); ... read_data_out : out std_logic_vector(63 downto 0); rdata_valid_out : out std_logic := '0'; ... ... local_size <= "010"; process( phy_clk ) variable var_local_address : std_logic_vector(23 downto 0) := ( others => '0' ); variable counter_write : integer := 0; variable counter_read_req : integer := 0; variable counter_read_data : integer := 0; begin case( step ) is --- when step_pre => if( start_write == '1' ) then counter_write := 100; step := step_write_first; end if; if( start_read == '1' ) then counter_read_req := 100; counter_read_data := 100; step := step_read; end if; local_burstbegin <= '0'; local_write_req <= '0'; local_read_req <= '0'; local_address <= ( others => '0' ); --начинаю с 0-го адреса var_local_address <= ( others => '0' ); --начинаю с 0-го адреса --- when step_write_first => if( counter_write = 0 ) then local_address <= ( others => '0' ); local_write_req <= '0'; local_burstbegin <= '0'; step := step_pre; else if( local_ready = '1' ) then local_address <= var_local_address; local_write_req <= '1'; local_burstbegin <= '1'; local_write_data(63 downto 0) <= write_data_in(63 downto 0); step := step_write_second; end if; end if; --- when step_write_second => local_burstbegin <= '0'; counter_write := counter_write - 1; var_local_address <= (инкремент var_local_address) step := step_write_first; --- when step_read => if( counter_read_req = 0 ) then local_address <= ( others => '0' ); local_read_req <= '0'; local_burstbegin <= '0'; step := step_pre; else if( local_ready = '1' ) then local_address <= var_local_address; local_read_req <= '1'; local_burstbegin <= '1'; var_local_address <= (инкремент var_local_address) counter_read_req := counter_read_req - 1; end if; end if; if( counter_read_data = 0 ) then rdata_valid_out <= '0'; step := step_pre; else if( local_rdata_valid = '1' ) then rdata_valid_out <= '1'; read_data_out(63 downto 0) <= local_rdata(63 downto 0); counter_read_data := counter_read_data - 1; else rdata_valid_out <= '0'; end if; end if; end case; end process; На железе (Stratix IV) получаю данные read_data_out правильные процентов на 99, а 1% битые. Почему так??? Не совсем вник в то, когда менять адрес относительно сигнала local_burstbegin, по фронту или по спаду бурста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 (изменено) · Жалоба Подскажите плз, правильно ли я представляю себе циклограмму при local_size=2: phy_clk : _I`I__I`I__I`I__I`I__I`I__I`I__I`I__I`I__I`I__I`I__I`I__I`I__ local_burstbegin : _I````I____I````I____I````I____I````I____I````I____I````I____ local_address : _<:::::::::><:::::::::><:::::::::><:::::::::><:::::::::>_____ local_write_data : _<:::::::::><:::::::::><:::::::::><:::::::::><:::::::::>_____ Извините за плохую читабельность, торопился :rolleyes: Изменено 23 февраля, 2011 пользователем billidean Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 24 февраля, 2011 Опубликовано 24 февраля, 2011 · Жалоба Спасибо ОГРОМНОЕ замечательному форуму за такую плотную поддержку. Но я уже сам все сделал. З.Ы. А могли бы подсказать. З.З.Ы. Вот так все здесь и делают: "Я то знаю ответ :tongue: но говорить не буду. Пусть сами пытаются" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dinam 1 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба Сочувствую, сам не могу понять в чем проблема в моём случае (см. соседний топик). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба Спасибо ОГРОМНОЕ замечательному форуму за такую плотную поддержку. Ну а объяснить в чем была проблема и в чем состояло решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 2 марта, 2011 Опубликовано 2 марта, 2011 (изменено) · Жалоба В документации на HPCII говорится, что использовать сигнал precharge необходимо при переключении банков памяти, И я этому поверил Моя система работает с адресами в пределах одного банка. Запись данных производится пакетаами по 100 слов. Сейчас я использую local_size=4(выше в коде было 2). Я как честный человек провожу строб сигнала precharge каждый раз перед началом передачи пакета(100). Опытным путем я выяснил (может это только у меня ), что при таком раскладе в память пишутся какие-то битые данный процентов на 5. Я долго тыкал клаву на всякие кнопки и натыкал выход из моей ситуации. При каждой установке бурста(local_burstbegin) я загонял строб сигнала precharge, и о чудо :w00t: данные перестали биться. З.Ы.: вот такая моя история борьбы начинающего ПЛИС-схемотехника с HPCII Изменено 2 марта, 2011 пользователем billidean Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 2 марта, 2011 Опубликовано 2 марта, 2011 · Жалоба При генерации контроллера отключите precharge. Данная опция подробно описана в мануале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 3 марта, 2011 Опубликовано 3 марта, 2011 · Жалоба При генерации контроллера отключите precharge. Данная опция подробно описана в мануале. Сегодня пробовал отключить эту галочку при насчтройке контроллера DDR3. В результате данные записываются битые на 50 процентов. Вернул обратно - все ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 4 марта, 2011 Опубликовано 4 марта, 2011 · Жалоба Сегодня пробовал отключить эту галочку при насчтройке контроллера DDR3. В результате данные записываются битые на 50 процентов. Вернул обратно - все ок. Думаю, что после отключения "галочки" поменялась времянка. Вообще основные мучения с ddr/ddr2 у меня были связаны с шиной Avalon. Как только выяснилось это - http://www.alteraforum.com/forum/showthrea....oss=burstbegin , и ещё ряд глюков был устранён Альтерой - всё проблемы ушли. Физический интерфейс не может так глючить - обычно проблемы либо в таймингах либо в локальной шине. При наличии свободного места в ПЛИС контроллеры памяти обычно без проблем запускаются на максимальных скоростях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 18 марта, 2011 Опубликовано 18 марта, 2011 · Жалоба ... и ещё ряд глюков был устранён Альтерой - всё проблемы ушли. А можете уточнить, какие именно глюки и кто именно устранял??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
billidean 0 19 марта, 2011 Опубликовано 19 марта, 2011 · Жалоба при local_size=4 и манипулированием сигналами precharge и refresh у меня вроде получилось сделать ОЗУ из DDR3. Но попытки сделать все то же самое с local_size=64 ничего не получается, данные портиться начинают. Вообще кто-нибудь использовал local_size=64? если да, то ПЛЗ подскажите что-нить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 19 марта, 2011 Опубликовано 19 марта, 2011 · Жалоба У меня коллега на работе тоже с такой проблемой мучается, если справится, отпишусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 21 марта, 2011 Опубликовано 21 марта, 2011 · Жалоба А можете уточнить, какие именно глюки и кто именно устранял??? Конкретные глюки описаны в err data на ddr/dd2/dd3 контроллеры. Устраняет разработчик - Altera. Проверил свои проекты - local_size меняется от 1 до 32. 64 пока не использовал. Если при отключении чего-то появляются ошибки - я бы копал в эту сторону. Повторюсь, при генерации оставляю precharge на откуп Altera. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nmurzin 0 22 марта, 2011 Опубликовано 22 марта, 2011 · Жалоба Объясните пожалуйста, а зачем вобще задирать local_size более чем 2 ? Ведь burst_begin можно дергать непрерывно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 23 марта, 2011 Опубликовано 23 марта, 2011 · Жалоба ... а зачем вобще задирать local_size более чем 2 ? ... Если, к примеру, в проекте используется большая локальная шина, со своим интерконнектом и прочими вкусностями. Мне нужно в рамках спецификации этой шины подключить к ней контроллер ddr/ddr2/ddr3 фирмы Altera. Берётся Avalon и делается переходник между ним и этой локальной шиной, с поддержкой пачек, с handshake и т.д. И вот чтобы этот переходник не весил много - проще пачки передавать напрямую. Раз контроллер поддерживает - отчего не пользоваться-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться