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

Про память.

Всем доброго времени суток.

Вот вопрос такой сообществу.

А как написать большую память на большую частоту на VHDL, не используя IP?

Например 70K x 5.

Как вариант представить 75К x 1, а потом объединить. Но у меня получилось сделать быстрой только 64К х 1.

Подскажите где можно почитать про такие вещи. В LogiCORE IP BMG v7.3 приведены схемы с мультиплексорами и Pipeline Stages. Надо в таком ключе действовать?

XST User Guide for Virtex-6 читал, но там они о другом говорят.

Всем спасибо.

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


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

Всем доброго времени суток.

Вот вопрос такой сообществу.

А как написать большую память на большую частоту на VHDL, не используя IP?

Например 70K x 5.

Как вариант представить 75К x 1, а потом объединить. Но у меня получилось сделать быстрой только 64К х 1.

Подскажите где можно почитать про такие вещи. В LogiCORE IP BMG v7.3 приведены схемы с мультиплексорами и Pipeline Stages. Надо в таком ключе действовать?

XST User Guide for Virtex-6 читал, но там они о другом говорят.

Всем спасибо.

Берем библиотеку примитивов для Virtex-6. Там описаны варианты однопортовых одноклоковых блоков памяти. И даны примеры установки этих примитивов в проект. Ну и наверное надо еще указать путь к библиотеке. Но я для симуляции просто переписываю нужные мне модули в рабочую папку. А LogiCORE IP для памяти никогда не пользуюсь...

Заодно там же прочтете и про биты паритета...

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


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

Всем доброго времени суток.

Вот вопрос такой сообществу.

А как написать большую память на большую частоту на VHDL, не используя IP?

Например 70K x 5.

Как вариант представить 75К x 1, а потом объединить. Но у меня получилось сделать быстрой только 64К х 1.

Подскажите где можно почитать про такие вещи. В LogiCORE IP BMG v7.3 приведены схемы с мультиплексорами и Pipeline Stages. Надо в таком ключе действовать?

XST User Guide for Virtex-6 читал, но там они о другом говорят.

Всем спасибо.

Поглядите в language templates. Там есть примеры синтезируемого описания блочной памяти для разных, в том числе и довольно экзотических случаев (например там есть пример с различными разрядностями на шине данных по разным портам). Темплейты есть в составе как ISE, Planahead и Vivado.

 

P.S. Можно пользовать примитивы, как советует iosifk, но ИМХО это - тупиковый путь, ибо код ваш становится непереносимым на других вендоров, а иногда даже и внутри разных семейств одного вендора возникают проблемы переноса. Еще из минусов - при симуляции нужно будет обязательно цеплять вендоровскую библиотеку примитивов, а перед этим сгенерить её. Это не очень сложно, однако требует некоторого времени и кое-каких знаний.

 

P.P.S Почитал первоначальный пост автора ещё раз и понял что я сам фигню написал, совсем не в тему. В данном случае можно собирать "ручками" из примитивов как советует iosifk, можно попытаться дать на откуп это "умному" синтезатору типа синплифая, но тут уже без гарантии успеха.

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


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

Берем библиотеку примитивов для Virtex-6.
P.P.S Почитал первоначальный пост автора ещё раз и понял что я сам фигню написал, совсем не в тему. В данном случае можно собирать "ручками" из примитивов как советует iosifk, можно попытаться дать на откуп это "умному" синтезатору типа синплифая, но тут уже без гарантии успеха.

Получается без примитивов никак не обойтись? :(

 

 

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


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

Получается без примитивов никак не обойтись? :(

Либо Вы - вольный джинн, либо раб лампы...

Блок памяти - это аппаратный кусок кристалла. И в библиотеке примитивов он описан так, как сделан в железе...

Все дело в том, что Вы можете применить библиотечный компонент так, как захотите. И при этом Вы точно будете знать латентность. Если применяете описание "вообще памяти для разных вендоров" - то рискуете пролететь с латентностью. И вообще - " для разных вендоров" нужно только Академикам, но не инженерам...

 

 

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


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

А как написать большую память на большую частоту на VHDL, не используя IP?

Например 70K x 5.

А нельзя ли (алгоритмически) перейти от 70k*5 к 35к*10 плюс логика мукс-демукс и стробы на запись?

Нужен ли рандомный доступ к памяти и если нужен то по всему адресному пространству или только по его части?

Тут при определённых условиях можно нехило соптимизировать...

 

 

 

Если применяете описание "вообще памяти для разных вендоров" - то рискуете пролететь с латентностью.

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

будут использованы регистры внутри примитива (тут мы понятно подразумеваем "умный" синтезатор), что сильно улучшит тайминги.

 

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


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

А нельзя ли (алгоритмически) перейти от 70k*5 к 35к*10 плюс логика мукс-демукс и стробы на запись?

Нужен ли рандомный доступ к памяти и если нужен то по всему адресному пространству или только по его части?

Тут при определённых условиях можно нехило соптимизировать...

Поддерживаю. Моя практика показывает, что как только появляется "сюжет" с нестандартным вопросом, то это значит, что "задавальщик" вопроса не проработал Задание на разработку. Поэтому сам вопрос о "70k*5" скорее всего лишен смысла...

 

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


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

А нельзя ли (алгоритмически) перейти от 70k*5 к 35к*10 плюс логика мукс-демукс и стробы на запись?

В данной ситуации буду пробовать идти этим путем :)

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

Всем спасибо.

 

Поэтому сам вопрос о "70k*5" скорее всего лишен смысла...

Интересно как задача о реализации больших объемах памяти решается в общем случае.

Есть разные решения XST User Guide, IP, примитивы, чистый VHDL с использованием XST User Guide.

Каждое решение имеет свои плюсы и минусы. Хотелось услышать как люди решают подобные задачи.

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


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

Хотелось услышать как люди решают подобные задачи.

Я всегда пишу тупо текстом, ну типа

 

type tRAM is array (depth-1 downto 0) of unsigned (data_width-1 downto 0);

shared variable ram: tRAM;

 

ну и так далее.

 

Недавно заметил, что Вивада раскидала память 12-битной ширины по блокам так,

чтобы ни один бит в используемых блоках не пропал!

Был удивлён. Ожидал что просто возьмёт 18-битные блоки и отбросит лишнее.

Хотя может просто раньше не замечал.

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


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

Я всегда пишу тупо текстом, ну типа

 

type tRAM is array (depth-1 downto 0) of unsigned (data_width-1 downto 0);

shared variable ram: tRAM;

А если для повышения быстродействия нужно будет увеличить латентность, тогда как?

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


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

Приветствую!

 

В данной ситуации буду пробовать идти этим путем :)

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

Всем спасибо.

 

Интересно как задача о реализации больших объемах памяти решается в общем случае.

Есть разные решения XST User Guide, IP, примитивы, чистый VHDL с использованием XST User Guide.

Каждое решение имеет свои плюсы и минусы. Хотелось услышать как люди решают подобные задачи.

 

Универсального решения нет - все очень сильно зависит от синтезатора.

Поэтому Вы и должны знать все +/- этих вариантов для выбора оптимального решения в каждом конкретном случае.

Не забывая проверять что же в результате получается! Потому как программистам пишущим ISE, Vivado, Quartus, Synplify,..... , бывает скучно и они "развлекаются" меня алгоритм синтеза памяти наблюдая затем реакцию "благодарных" пользователей в форумах поддержки :)

 

Я простые случаи памяти (одинаковая разрядность R/W, небольшой размер кратный степени 2, ) быстро пишу (шаблоном) прямо в rtl добавляя атрибуты синтеза. Обычно это 60-70 % от всей памяти в проекте.

Для более сложных вариантов и для универсального применения память описана в отдельных модулях в которых легко можно "разнести" реализацию в зависимости от FPGA , синтезатора и требований оптимизации по скорости или ресурсам. Это 10-30 %.

Ну и без хардкора никак - если нужно выдавить все что возможно или нужны хитрожо... режимы памяти конкретного семейства то без примитивов никуда. Обычно таких в проекте бывает < 5 %

 

 

Успехов! Rob.

 

 

 

 

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


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

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

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

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

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

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

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

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

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

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