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

DDRIII+HPCII глюки или руки?

Всех с праздником, мужики.

Уже неделю сижу с проблемой::

есть код (примерный):

...
...
    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, по фронту или по спаду бурста.

 

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


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

Подскажите плз, правильно ли я представляю себе циклограмму при 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:

Изменено пользователем billidean

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


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

Спасибо ОГРОМНОЕ замечательному форуму за такую плотную поддержку.

 

Но я уже сам все сделал.

 

З.Ы. А могли бы подсказать.

 

З.З.Ы. Вот так все здесь и делают: "Я то знаю ответ :tongue: но говорить не буду. Пусть сами пытаются"

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


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

Сочувствую, сам не могу понять в чем проблема в моём случае (см. соседний топик).

 

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


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

Спасибо ОГРОМНОЕ замечательному форуму за такую плотную поддержку.

Ну а объяснить в чем была проблема и в чем состояло решение?

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


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

В документации на HPCII говорится, что использовать сигнал precharge необходимо при переключении банков памяти,

И я этому поверил :blush:

Моя система работает с адресами в пределах одного банка. Запись данных производится пакетаами по 100 слов. Сейчас я использую local_size=4(выше в коде было 2).

Я как честный человек провожу строб сигнала precharge каждый раз перед началом передачи пакета(100).

Опытным путем я выяснил (может это только у меня :wacko: ), что при таком раскладе в память пишутся какие-то битые данный процентов на 5.

Я долго тыкал клаву на всякие кнопки и натыкал выход из моей ситуации.

При каждой установке бурста(local_burstbegin) я загонял строб сигнала precharge, и о чудо :w00t: данные перестали биться.

 

З.Ы.: вот такая моя история борьбы начинающего ПЛИС-схемотехника с HPCII

Изменено пользователем billidean

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


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

При генерации контроллера отключите precharge. Данная опция подробно описана в мануале.

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


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

При генерации контроллера отключите precharge. Данная опция подробно описана в мануале.

Сегодня пробовал отключить эту галочку при насчтройке контроллера DDR3. В результате данные записываются битые на 50 процентов.

Вернул обратно - все ок.

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


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

Сегодня пробовал отключить эту галочку при насчтройке контроллера DDR3. В результате данные записываются битые на 50 процентов.

Вернул обратно - все ок.

Думаю, что после отключения "галочки" поменялась времянка. Вообще основные мучения с ddr/ddr2 у меня были связаны с шиной Avalon. Как только выяснилось это - http://www.alteraforum.com/forum/showthrea....oss=burstbegin , и ещё ряд глюков был устранён Альтерой - всё проблемы ушли.

Физический интерфейс не может так глючить - обычно проблемы либо в таймингах либо в локальной шине. При наличии свободного места в ПЛИС контроллеры памяти обычно без проблем запускаются на максимальных скоростях.

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


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

... и ещё ряд глюков был устранён Альтерой - всё проблемы ушли.

А можете уточнить, какие именно глюки и кто именно устранял???

 

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


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

при local_size=4 и манипулированием сигналами precharge и refresh у меня вроде получилось сделать ОЗУ из DDR3.

Но попытки сделать все то же самое с local_size=64 ничего не получается, данные портиться начинают.

 

Вообще кто-нибудь использовал local_size=64? если да, то ПЛЗ подскажите что-нить :help:

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


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

У меня коллега на работе тоже с такой проблемой мучается, если справится, отпишусь.

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


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

А можете уточнить, какие именно глюки и кто именно устранял???

Конкретные глюки описаны в err data на ddr/dd2/dd3 контроллеры. Устраняет разработчик - Altera.

Проверил свои проекты - local_size меняется от 1 до 32. 64 пока не использовал.

Если при отключении чего-то появляются ошибки - я бы копал в эту сторону. Повторюсь, при генерации оставляю precharge на откуп Altera.

 

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


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

Объясните пожалуйста,

а зачем вобще задирать local_size более чем 2 ?

Ведь burst_begin можно дергать непрерывно.

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


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

...

а зачем вобще задирать local_size более чем 2 ?

...

Если, к примеру, в проекте используется большая локальная шина, со своим интерконнектом и прочими вкусностями.

Мне нужно в рамках спецификации этой шины подключить к ней контроллер ddr/ddr2/ddr3 фирмы Altera. Берётся Avalon и делается переходник между ним и этой локальной шиной, с поддержкой пачек, с handshake и т.д.

И вот чтобы этот переходник не весил много - проще пачки передавать напрямую. Раз контроллер поддерживает - отчего не пользоваться-то?

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


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

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

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

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

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

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

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

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

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

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