Jump to content

    
Sign in to follow this  
billidean

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

Recommended Posts

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Edited by billidean

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

 

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

Edited by billidean

Share this post


Link to post
Share on other sites
При генерации контроллера отключите precharge. Данная опция подробно описана в мануале.

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

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

Share this post


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

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

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

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

Share this post


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

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

 

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites
А можете уточнить, какие именно глюки и кто именно устранял???

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

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

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

 

Share this post


Link to post
Share on other sites
...

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

...

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this