Jump to content

    
Sign in to follow this  
vpd

Контроллер памяти DDR2 для Altera Cyclone

Recommended Posts

Вот хочу поднять тему о принципах построения контроллера DDR2 памяти для Altera Cyclone. На данный момент делаю его для Cyclone 3. Но суть то как раз в том, что в отличие от альтеровских коров он написан просто на VHDL с использованием только IEEE.numeric_std. И поэтому он в принципе универсален, может применяться для Spartan, например.

 

Собственно интерес возник вот по какой причине. С самого начала продвижения DDR в FPGA альтеровцы нагородили там какую-то специальную поддержку DDR прямо в IOE. И вот, апофеоз всех их страданий, в Cyclone 3 руководство по применению контроллера - увесистый документ, объясняющий, в частности, что для реализации правильной времянки памяти нужно чуть ли не 5 выходов PLL, причем для простого циклона -С8 можно рассчитывать на тактовую частоту только около 133 МГц (По крайней мере визард больше не дает). И это при том, что максимальная частота самого Cyclone III (и даже Cyclone II) ограничена значением в 402 МГц. А, следовательно, даже лобовое решение, когда DDR эмулируется на удвоенной частоте, должно дать реализацию в 200 МГц даже для speed grade 8. Причем для этого потребуется весьма простая PLL с тремя выходами, и в настройке такое решение весьма неприхотливо. Фазы можно двигать с помощью настроек PLL, а на выводах не нужны никакие DDR опции, что освобождает от мучительного размещения выводов по группам DQ/DQS, как это было раньше.

 

Ну вот исходя из этих соображений я и сел рисовать такой контроллер, с целью проверить, какова будет в итоге у него предельная частота. Ограничения собственно два.

1) Удастся ли логику всего контроллера реализовать с частотой 200 МГц.

2) Удастся ли реализовать входную и выходную часть шины данных с переходом 32бита*200МГц в 16бит*400МГц.

 

Еще до конца не доделал, но предварительно удалось. Проект бегает в ModelSim'е с двумя моделями, от Micron и от Samsung, правда данные там пока автосинтезируемые, но в правильных местах. При этом квартус собирает это и дает нормальные частоты даже для C8, 201 МГц для контроллера и 402 для данных (и то, - это программное ограничение, без указания явных проблемных путей).

 

Уже недолго осталось, чтобы на железке проверить, но все-таки кажется странным, что же это за столбовая дорога у Альтеры такая, что столько возни, столько правил и такой чахлый результат.

"Гора родила мышь!"

 

У кого какие мысли?

 

 

Share this post


Link to post
Share on other sites
[...] но все-таки кажется странным, что же это за столбовая дорога у Альтеры такая, что столько возни, столько правил и такой чахлый результат.

"Гора родила мышь!"

 

У кого какие мысли?

 

По-моему, одна из причин пользоваться альтеровскими контурами для DDR2 (DQ/DQS groups, dynamic termination, автокалибрация, DLL's etc.) это гарантированная устойчивость к вариациям по температуре, процессу, погрешностям времянки, и т. п.

 

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

 

В любом случае - желаю успеха с проектом, вещь полезная. Сам уже намучался и возненавидел альтеровские IP и их документацию :)

Share this post


Link to post
Share on other sites

Немного поторопился я с п.2. 402 МГц не получается, если добавляю опцию Fast Output(enable) Register. Причем возникает довольно странная картина, проблема с частотой связана с разделами Minimum Pulse Width Requirement (High/low).

 

-0.178 ns    1.428 ns    1.250 ns    ddr2_pll:mem_pll|altpll:altpll_component|ddr2_pll_altpll2:auto_generated|wire_pll1_clk[1]    mem1_data[2]~reg0

 

Квартус пишет, что он зарубил частотку до 350 МГц по причине минимальной длительности тактового импульса. Смотрел даташит и так и не смог понять, откуда там такое ограничение взялось? Получается, что несмотря на 402 МГц внутри кристалла на триггеры в IOE нельзя подавать частоту выше 350МГц? Что-то я с таким ограничением раньше не встречался, где-нибудь подробнее оно описано?

Share this post


Link to post
Share on other sites
Что-то я с таким ограничением раньше не встречался, где-нибудь подробнее оно описано?

раздел даташита Maximum Input & Output Clock Toggle Rate

 

Share this post


Link to post
Share on other sites

Кстати, а возможно ли описывая контроллер исключительно на HDL (без задействования мегафункций) заставить Quartus укладывать сигналы в DQ/DQS группы?

Share this post


Link to post
Share on other sites

Насколько мне известно, ни в VHDL, ни в Verilog*, нет выразительных средств для управления размещением и разводкой. Есть инструменто-зависимые средства работы с атрибутами, позволяющие почти не пользоваться дополнительными файлами констрейнов.

Share this post


Link to post
Share on other sites
Кстати, а возможно ли описывая контроллер исключительно на HDL (без задействования мегафункций) заставить Quartus укладывать сигналы в DQ/DQS группы?

 

Так я и начал разговор с того, что это не нужно. Во всяком случае в этом заключается идея альтернативной реализации. Группы DQ/DQS - это наследие от первых циклонов и первой реализации DDR, у которой сигнал DQS был тактовым в обе стороны. В результате возникала привязка группы DQ к DQS, поскольку тактирование входных регистров в IOE от общего DQS было реализовано аппаратно. Это нагородило кучу проблем, о которых написано в свежих руководствах. Например, когда DQS был тактовым сигналом, то нужно было правильно его блокировать, поскольку при переключении с выхода на вход были возможны выбросы, которые приводили к тому, что данные защелкивались лишний раз. В DDR2 ситуация иная. Входной DQS выровнен с данными и служит просто селектором регистра приема. Если явно работать на двойной частоте, то проблема групп вообще уходит, поскольку все линии данных могут работать независимо, по внутреннему клоку.

 

Мне доводилось делать несколько проектов с современными DSP от TI, где тоже применяется память DDR2. Причем я делал там и схему, и плату, и программирование контроллера DDR2 памяти в самом DSP. И доподлинно известно и проверено на практике, что на частотах до 250 МГц и близком расположении памяти к контроллеру вся эта задачка решается в лоб, не требует никаких согласований длины цепей, не требует ODT, и т.п. Причем TI в итоге в этом честно сознался и просто написал доки, где сказано, что делайте по-простому, и будет хорошо. А альтеровцы нагородили самый сложный вариант, объявили его интеллектуальной собственностью, и в итоге получили какую-то абсолютно жалкую производительность. Таких тормозных чипов DDR2, какие нужны для их контроллеров, сейчас уже и не производится. Даже самый медленный чип уже от 333 МГц, а контроллер только до 133 МГц тянет. Все эти доводы и наводят на мысль попробовать сделать свой вариант.

 

По-моему, одна из причин пользоваться альтеровскими контурами для DDR2 (DQ/DQS groups, dynamic termination, автокалибрация, DLL's etc.) это гарантированная устойчивость к вариациям по температуре, процессу, погрешностям времянки, и т. п.

Вообще, муть это все. Об этом можно начинать задумываться, когда частоты существнно выше 200МГц. Вариации по температуре можно смоделировать, так как квартус умеет аннотировать задержки для разных температур. Для прогнозируемой работы схемы все равно нужно использовать триггеры в IOE.

 

Единственное серьезное ограничение связано с токовыми способностями банков и вследствие этого шумами, создаваемыми переключающимися выводами адреса и управления. Квартус не дает плотно упаковать в один банк и шину данных, и шину адреса. Поэтому для проверки схемы соединений FPGA с DDR2 SDRAM мне приходилось сначала собирать простую болванку, в которой есть все сигналы, им назначены правильные I/O стандарты и все они как-нибудь шевелятся на предельной частоте. И в итоге часть выводов банка приходится оставлять пустыми.

 

 

раздел даташита Maximum Input & Output Clock Toggle Rate

 

Сейчас специально выкачал весь cyclone3_handbook.pdf и не вижу там указанного раздела. Что я делаю не так, и как его искать? Проглядывал раздел по имени Periphery Performance, там, во-первых, нет внятного параметра максимальной частоты для отдельно взятого IOE, а, во-вторых, вообще ни для одного параметра нет предельного значения в 350 МГц, который выдает мне квартус. Чудеса...

Edited by Hoodwin

Share this post


Link to post
Share on other sites
По-моему, одна из причин пользоваться альтеровскими контурами для DDR2 (DQ/DQS groups, dynamic termination, автокалибрация, DLL's etc.) это гарантированная устойчивость к вариациям по температуре, процессу, погрешностям времянки, и т. п.

 

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

 

В любом случае - желаю успеха с проектом, вещь полезная. Сам уже намучался и возненавидел альтеровские IP и их документацию :)

 

Присоединяюсь к ненавистникам альтеровских IP и их документации :)

 

Делал интерфейс с DDR на Virtex-4 года 3 назад. Запустил за неделю. С альтерой бился 3 месяца - читал, пробовал, снова читал. В результате перед самой сдачей схемы обнаружил еще одни группы - VREF, которые не могут тянуть более 9 ножек. В итоге все работает, однако на 150 Мгц Cyclone-IV 7

Купил себе отладочную плату на Spartan-6 с железным контроллером памяти. Вот это сказка!

Share this post


Link to post
Share on other sites
Сейчас специально выкачал весь cyclone3_handbook.pdf и не вижу там указанного раздела. Что я делаю не так, и как его искать?

это сейчас мода такая у альтеры, даташиты укорачивать. сейчас они пишут, что смотрите сообщения от квартуса, они самые точные. в аттаче хендбук от 2008 года, там этот раздел еще есть (стр. 406).

cyclone3_handbook.pdf

Share this post


Link to post
Share on other sites

to Hoodwin

Я сейчас тоже озаботился написанием собственного контроллера DDR2.

Может, скинете мне на почту (BSA-one(собака)яндекс.ру) HDL код вашего контроллера.

Я хочу попробовать взять его за основу. Правда, писать собираюсь на SV.

Share this post


Link to post
Share on other sites

vadimuzzz

Спасибо, посмотрел. Странно, но там частота указана 300 МГц, а квартус дает все 350.

 

Буду доделывать тогда для C8 под 175 тактовую МГц. Но там еще есть заморочка с предельной частотой входных триггеров в IOE. 175 Всяко больше, чем 133.

Share this post


Link to post
Share on other sites

Там еще заморочка с setup/hold и оставшимся окошечком для данных.

Для наглядности в модели стоит приделать нечто превращающее данные в 'U' во время setup и для контроля добавить проверку на hold.

 

Со скепсисом схрумкал еще попкорна.

 

Share this post


Link to post
Share on other sites
Я сейчас тоже озаботился написанием собственного контроллера DDR2.

тоже что ли плюнуть на все и потратить недельку на переписку hssdrc в hsd2drc контроллер :wacko:

Share this post


Link to post
Share on other sites

Во многих проектах использую Альтеровские контроллеры DDR & DDR2. Один раз помучался - и теперь просто тиражирую.

Было бы интересно взглянуть на самописные архитектурно независимые контроллеры. Есть возможность проверить на arria GX & arriaII GX в боевых проектах с загрузкой вплоть до 100% ПЛИС.

Пока что я присоединюсь к Shtirlits.

 

Со скепсисом схрумкал еще попкорна.

 

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