Информация об изменениях

Сообщение Re: Апдейт от 07.07.2017 4:06

Изменено 07.07.2017 4:52 koandrew

Re: Апдейт
Здравствуйте, koandrew, Вы писали:

Только что проверил работу своего доморощенного контроллера оперативной памяти типа HyperRAM на своей плате (на ней установлено два таких чипа, по 16x4Мбит=64Мбит каждый, оставшиеся две BGAшки на плате). Контроллер работает с обоими чипами одновременно, по сути получая общую шину в 16 бит. При этом чипы работают в режиме DDR на частоте в 166.667 МГц (то есть эффективная частота 333.334 МГц), суммарно обеспечивая полосу пропускания в ~667 Мбит/с, что примерно соответствует самым медленным чипам DDR3.
Контроллер написал примерно недели за две вечерами после работы. Он, конечно, ещё сыроват, однако тот факт, что он вообще завёлся на реальном железе, имеет для меня очень больше значение.
Ну и для любителей задать вопрос "а нафига" — вот списочек достижений:
1. Научился работать со встроенными примитивами tristate ввода/вывода в режиме DDR, дифференциального вывода (для тактового сигнала), а также примитивом задержки ввода (нужно для обеспечения setup time для входных триггеров в режиме чтения шины).
2. Научился работать с MCMM/PLL. В принципе тут невелика заслуга — всего-то надо потыкать мышкой в менюшки. Но на нём я научился встраивать в свой код IP-компоненты, сгенерированные средой.
3. Научился работать с FIFO на базе имеющихся на чипе Block RAM, а также с их использованием "маршаллить" данные между разными тактовыми доменами — главный модуль работает на частоте в 100 МГц, в то время как сам контроллер работает на частоте памяти — 166 МГц.
4. Т.к. эти частоты не кратны друг другу, пришлось проявить некоторую креативность при борьбе с нарушениями таймингов. Оказалось, что если с выхода триггера напрямую управлять сигналом CE (Clock Enable) сразу 10 буферов ввода/вывода (да ещё и расположенных в разных "байт-регионах" FPGA, то роутер оказывается не в состоянии расположить триггер так, чтобы обеспечить нужные тайминги сразу для всех буферов. Покупать же более быструю версию чипа (для которой роутер нормально разводил) не хотелось. После некоторого чесания репы придумал решение — дополнительно пробуферизировать сигнал к каждому буферу отдельным триггером. На этот раз роутер сумел раскидать эти буферные триггеры так, что все сигналы доходили вовремя — хотя и выплюнул мне ворнинг, что типа так делать не рекомендуется, и лучше использовать сигнал CE
5. Освоил эффективную работу с симулятором, а также разработал testbench, в котором использовал распространяемые производителем чипов памяти модели. Правда, оказалось, что железо работает немного не так, как их симулятор — но это уже история для другого раза
6. Научился работать с ILA (Integrated Logic Analyzer) в процессе дебага прошивки на реальном железе. Думается мне, что из его названия понятно, зачем он нужен
7. Подтвердил, что развёл эти чипы правильно, верно рассчитал ширину дорожек для нужного импеданса (и производитель плат не подкачал, хоть я и не заказывал controlled impedance дабы съэкономить бабло), выдержал требования по выравниванию длины дорожек, а также корректно развёл дифференциальные линии тактового сигнала. Ну и само собой подтвердил, что все BGAшки на плате пропаялись без проблем и "непропаев". Лично для меня это самое главное достижение, т.к. в этом было больше всех сомнений

Вообще если честно, эти чипы мне очень сильно понравились — они сравнительно дешёвые ($3.3 за чип при покупке "поштучно"), весьма неприхотливы в плане разводки, требуют всего 12 пинов, что позволяет легко развести даже несколько чипов на 4-слойной плате(для сравнения — DDR3 требует 50+ пинов, и развести его на 4-слойке весьма непросто), используют очень простой протокол — его описание умещается на всего нескольких страницах даташита — что делает контроллер очень простым и компактным в плане использования ресурсов FPGA (мой двухчиповый контроллер использует 348 триггеров и 299 LUT-ячеек, в то время как контроллер DDR3 занимает 10000+ ячеек), также — что для меня очень важно — поставляются в корпусах с шагом шаров в 1 мм, что позволяет использовать очень дешёвый 0.15/0.15/0.3 техпроцесс для платы (DDR2/3/3L бывают только в корпусах с шагом в 0.8 мм, что требует существенно более дорогой 0.125/0.125/0.25 процесс). Из недостатков можно отметить относительно невысокую скорость работы — отчасти это можно компенсировать размещением нескольких чипов "в параллель", а также сравнительно небольшой объём памяти (пока реально доступны на рынке только 8-мегабайтные чипы, хотя производитель и обещает выпускать более ёмкие чипы). Последний недостаток более серьёзный, т.к. разводить целые вязанки чипов может оказаться не так уж и просто — для получения 1 Гигабита придётся разводить аж 16 чипов. Но пока мне не требуется большой объём памяти, а как потребуется — ну придётся возиться с DDR3

Теперь осталось только проверить чип моста в USB — но с ним должно быть всё просто
Re: Апдейт
Здравствуйте, koandrew, Вы писали:

Только что проверил работу своего доморощенного контроллера оперативной памяти типа HyperRAM на своей плате (на ней установлено два таких чипа, по 16x4Мбит=64Мбит каждый, оставшиеся две BGAшки на плате). Контроллер работает с обоими чипами одновременно, по сути получая общую шину в 16 бит. При этом чипы работают в режиме DDR на частоте в 166.667 МГц (то есть эффективная частота 333.334 МГц), суммарно обеспечивая полосу пропускания в ~667 Мбит/с, что примерно соответствует самым медленным чипам DDR3.
Контроллер написал примерно недели за две вечерами после работы. Он, конечно, ещё сыроват, однако тот факт, что он вообще завёлся на реальном железе, имеет для меня очень большое значение.
Ну и для любителей задать вопрос "а нафига" — вот списочек достижений:
1. Научился работать со встроенными примитивами tristate ввода/вывода в режиме DDR, дифференциального вывода (для тактового сигнала), а также примитивом задержки ввода (нужно для обеспечения setup time для входных триггеров в режиме чтения шины).
2. Научился работать с MCMM/PLL. В принципе тут невелика заслуга — всего-то надо потыкать мышкой в менюшки. Но на нём я научился встраивать в свой код IP-компоненты, сгенерированные средой.
3. Научился работать с FIFO на базе имеющихся на чипе Block RAM, а также с их использованием "маршаллить" данные между разными тактовыми доменами — главный модуль работает на частоте в 100 МГц, в то время как сам контроллер работает на частоте памяти — 166 МГц.
4. Т.к. эти частоты не кратны друг другу, пришлось проявить некоторую креативность при борьбе с нарушениями таймингов. Оказалось, что если с выхода триггера напрямую управлять сигналом CE (Clock Enable) сразу 10 буферов ввода/вывода (да ещё и расположенных в разных "байт-регионах" FPGA), то роутер оказывается не в состоянии расположить триггер так, чтобы обеспечить нужные тайминги сразу для всех буферов. Покупать же более быструю версию чипа (для которой роутер нормально разводил) не хотелось. После некоторого чесания репы придумал решение — дополнительно пробуферизировать сигнал к каждому буферу отдельным триггером. На этот раз роутер сумел раскидать эти буферные триггеры так, что все сигналы доходили вовремя — хотя и выплюнул мне ворнинг, что типа так делать не рекомендуется, и лучше использовать сигнал CE
5. Освоил эффективную работу с симулятором, а также разработал testbench, в котором использовал распространяемые производителем чипов памяти модели. Правда, оказалось, что железо работает немного не так, как их симулятор — но это уже история для другого раза
6. Научился работать с ILA (Integrated Logic Analyzer) в процессе дебага прошивки на реальном железе. Думается мне, что из его названия понятно, зачем он нужен
7. Подтвердил, что развёл эти чипы правильно, верно рассчитал ширину дорожек для нужного импеданса (и производитель плат не подкачал, хоть я и не заказывал controlled impedance дабы съэкономить бабло), выдержал требования по выравниванию длины дорожек, а также корректно развёл дифференциальные линии тактового сигнала. Ну и само собой подтвердил, что все BGAшки на плате пропаялись без проблем и "непропаев". Лично для меня это самое главное достижение, т.к. в этом было больше всех сомнений

Вообще если честно, эти чипы мне очень сильно понравились — они сравнительно дешёвые ($3.3 за чип при покупке "поштучно"), весьма неприхотливы в плане разводки, требуют всего 12 пинов, что позволяет легко развести даже несколько чипов на 4-слойной плате(для сравнения — DDR3 требует 50+ пинов, и развести его на 4-слойке весьма непросто), используют очень простой протокол — его описание умещается на всего нескольких страницах даташита — что делает контроллер очень простым и компактным в плане использования ресурсов FPGA (мой двухчиповый контроллер использует 348 триггеров и 299 LUT-ячеек, в то время как контроллер DDR3 занимает 10000+ ячеек), также — что для меня очень важно — поставляются в корпусах с шагом шаров в 1 мм, что позволяет использовать очень дешёвый 0.15/0.15/0.3 техпроцесс для платы (DDR2/3/3L бывают только в корпусах с шагом в 0.8 мм, что требует существенно более дорогой 0.125/0.125/0.25 процесс). Из недостатков можно отметить относительно невысокую скорость работы — отчасти это можно компенсировать размещением нескольких чипов "в параллель", а также сравнительно небольшой объём памяти (пока реально доступны на рынке только 8-мегабайтные чипы, хотя производитель и обещает выпускать более ёмкие чипы). Последний недостаток более серьёзный, т.к. разводить целые вязанки чипов может оказаться не так уж и просто — для получения 1 Гигабита придётся разводить аж 16 чипов. Но пока мне не требуется большой объём памяти, а как потребуется — ну придётся возиться с DDR3

Теперь осталось только проверить чип моста в USB — но с ним должно быть всё просто