Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как лучше сделать доступ к множественной маленькой RAM?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
count_enable
Дано большое число (25-100) простых вычислительных блоков, у каждого блока есть свое маленькое ОЗУ на 10-100 8битных слов. Число слов одинаково на всех модулях (назвём их ВБ). Каждый ВБ только читает свою память, и есть один глобальный контроллер который читает и пишет эти памяти, адресуя их 16-битно как номерВБ в старшем байте смещение слова в младшем.
Я так понимаю что памяти будут синтезироваться из BRAM. Но смотрю я на схему CLB Spartan 3 и ломаю голову как минимализировать глобальную шину от контроллера до каждой памяти. Сделать локально махонький улавливатель адреса к каждой ОЗУ, который будет пропускать только запросы к своему адресу, или тянуть линии типа CS (chip select) от контроллера к каждой памяти? Запись-чтение будут выборочными и огромный daisy-chain не выбор. Так же возможен переход на Virtex 5, где уже будет несколько сот блоков.
Как сделать это "по-умному"? Скорость чтения-записи контроллером не имеет значения, доступ для ВБ минимальный - один такт.
krux
Вообще все будет зависеть от модели обмена данными по этой шине - в зависимости от того что вам нужнее: латентность доступа или пропускная способность.

для варианта "один мастер много слейвов" из 25...40 блоков имхо всё равно как вы это будете делать.
Но вот если проект будет разрастаться вширь то для сохранения скорости доступа придётся конвейеризировать+разбивать на подгруппы, и тогда блоки ремаппинга адресов+конвейеризации на подгруппу могут давать лучшие результаты по сходимости времянок.
count_enable
Скорость общения с мастером вообще не критична, более критично чтобы эта шина не сожрала большую часть логики под провода. Я так понял вы предлагаете разбивать ИБ на подгруппы, скажем по 32 и для каждой группы делать промежуточный мастер шины? Я тоже думал над таким вариантом. Какие будут преимущества в этом варианте, в плане hw occupation?
анатолий
Цитата(count_enable @ Oct 5 2013, 19:06) *
Дано большое число (25-100) простых вычислительных блоков, Скорость чтения-записи контроллером не имеет значения, доступ для ВБ минимальный - один такт.

Тогда проще каждому блоку дать свой дешифратор адреса. А если очень мучает вопрос ширины шины, то можно организовать интерфейс I2С.
В любом случае - память двухпортовая обеспечит доступ ВБ за 1 такт.
count_enable
Гм, а можно ли "на пальцах" прикинуть что больше сожрёт: слейв-контроллер в каждом ИБ или обычная 8-битная шина? У меня есть печальный опыт переноса нейросети в Спартан 3, так там начиная с 20 нейронов, соединённых "каждый с каждым" провода занимали больше логики, чем сами нейроны с моделью мембраны и памятью.
iosifk
Цитата(count_enable @ Oct 5 2013, 20:33) *
Скорость общения с мастером вообще не критична, более критично чтобы эта шина не сожрала большую часть логики под провода. ...

А если не критична, то сделайте последовательную шину и в адресной части каждый блок выбирайте одним битом. Это называется частичная дешифрация. Тогда не будет дешифраторов и мультиплексоров...
krux
Цитата
Скорость общения с мастером вообще не критична, более критично чтобы эта шина не сожрала большую часть логики под провода

а мне в таком случае вообще видится что-то JTAG-подобное...
count_enable
Цитата(krux @ Oct 5 2013, 20:48) *
а мне в таком случае вообще видится что-то JTAG-подобное...

daisy-chain? Нет, чтение-запись должны быть со свободным доступом к каждому блоку отдельно.

Цитата
то сделайте последовательную шину и в адресной части каждый блок выбирайте одним битом

То есть код 1 из N и у каждого блока регистр на N, и сигнал выбора подключен к одному биту из регистра? А адрес запихивается в регистр последовательно, по клоку от мастера?

iosifk
Цитата(count_enable @ Oct 5 2013, 22:27) *
То есть код 1 из N и у каждого блока регистр на N, и сигнал выбора подключен к одному биту из регистра? А адрес запихивается в регистр последовательно, по клоку от мастера?

Ну а что тут сложного. Длинный сдвиговый регистр (СР). И у каждого блока "триггер адреса"... Произвели сдвиг. Триггеры подключены к битам СР, каждый к своему биту. Если переписалась 1, то блок выбран... Если 0, то не выбран... Минимум связей и дешифраторов. Если запишите несколько 1 в сдвиговый регистр, то можно одновременно писать данные в блоки...
count_enable
То есть один большой СР на все блоки, и к каждому биту по триггеру? А чем это отличается от пучка линий CS, выходящих из мастера?
_pv
Цитата(count_enable @ Oct 6 2013, 00:46) *
То есть один большой СР на все блоки, и к каждому биту по триггеру? А чем это отличается от пучка линий CS, выходящих из мастера?

зачем большой? много маленьких. все сидят на одной spi шине, по которой прилетает 24битное слово, каждый смотрит в старший байт и если находит свой адрес ВБ берет смещение из среднего и данные из младшего, если нет - игнорирует, никаких чипселектов.
правда чем это лучше 24х разрядной шины - не знаю.
но для шины на 100+ потребителей в источник наверное сигнала должен быть не простым, соответственно если это будет всего 2 линии, а не 24 может и есть смысл.
расскажите, кто знает, что внутри FPGA происходит когда для один выход нагружен на слишком много входов, что роутер с этим сделает?
RobFPGA
Приветствую!

Если обмен не критичен по времени и число модулей ВБ велико то _pv правильно предлагает - реализация ВБ должна НЕЗАВИСИМА от внешнего CP : Последовательная шина на входе с дешифрацией адреса в ВБ, последовательная шина на выходе с 0 уровнем в неактивном состоянии, выходы объединяются OR. Внутрення память в ВБ выполняется на Distributed RAM.

Для синхронной шины (типа SPI) реализация в ВБ может быть очень простой. Для Spartan3 такой интерфейс без проблем запустить на 100-200 МHz а для Virtex5 и на 250-350. MHz. Ну и в дизайне это удобно так как при изменении структуры или количества блоков ВБ не надо будет трогать CP.

Большое число потребителей (fan_out) на шине решается разпаралеливанием источников (чаще всего триггеров) каждый из которых питает свою часть потребителей. Причем такое разпаралеливанием может выполнятся синтезатором (а иногда и мапером) как в автоматическом режиме так и в ручном - указанием специальных constraint синтеза для требуемых цепей.

Удачи! Rob.
count_enable
Большое спасибо всем за дельные советы! В который раз убедился что этот форум лучшая площадка профессиональной помощи.

Теперь несколько другой вопрос: допустим что память ВБ это CAM, то есть приходить будет не линейный адрес, а 16-битный ключ А. Если в данном ВБ в памяти есть такой ключ, то память выставляет значение Б внутри ВБ. Множественные совпадения исключены, каждому А отвечает только одно значение Б.
В школе меня учили делать САМ циклом-перебором, т.е. каждый клок последовательно сравнивать входящий ключ с ключами в памяти. А Core Generator умеет синтезировать САМ с чтением в один цикл. Как я понимаю внутри есть по одному компаратору на каждый ключ. Стоит ли использовать Core Generator для создания маленьких САМ или же вручную набросать компараторов?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.