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

    

Вопрос по использованию on chip ram в cyclone4

Добрый день.

 

Стоит задача организации приема данных по нескольким каналам последовательного интерфейса. Для промежуточного хранения данных создал дуал порт память на m9k.

Для того, чтобы разобраться, как она работает (до этого с ней не работал), в .bdf из графических примитивов собрал примерно такую конструкцию:

 

приемник -> модуль чтения/записи -> ip ядро -> передатчик

 

Приемник и передатчик рабтают по последовательному интерфейсу, выдаю данные на плис и принимаю через терминал на пк.

 

Модуль чтения/записи раздает адреса, тактирование и флаги wr_en/rd_en, для памяти, программа представляет из себя echo, то есть работает по принципу "принимаю n раз по байту, записываю в память, потом считываю n раз, выдаю"

 

На этом этапе было все хорошо. Затем я копипастой размножил эту конструкцию, сделал 4 приемника, 4 модуля rd/wr 4 передатчика, 4 графических примитива dual port ram - получилось 4 одинаковых канала вместо одного, 4 параллельных операции чтения/записи в память. В проекте пропорционально увеличилось количество занимаемых ячеек, использованной памяти. Никаких ошибок не было, на rtl тоже все было хорошо. Однако, из 4 таких каналов постоянно работал только один. Я вывел флаги чтения записи во всех модулях чтения/записи на свободные пины, чтобы посмотреть осциллографом, получилась следующая картина: флаги корректно выдаются только на одном (работающем) канале из 4х. На остальных они отсутствуют, хотя каналы идентичные, без обратных связей, выдачу флагов ничего не должно блокировать.

 

Отсюда возникает несколько вопросов:

 

1. Можно ли на cyclone4 реализовать несколько параллельных процессов чтения/записи в память?

Если да, то в чем моя ошибка? Если нет, то почему квартус не вернул ошибку при компиляции проекта?

 

2. Если на cyclone4 нельзя реализовать несколько параллельных процессов чтения/записи в память, почему из 4 модулей чтения/записи, флаги раздавал только один (хотя они не зависят от памяти, от других каналов, полностью идентичные, корректно отображаются на rtl)?

 

Заранее благодарю за ответы.

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


Ссылка на сообщение
Поделиться на другие сайты
Стоит задача организации приема данных по нескольким каналам последовательного интерфейса. Для промежуточного хранения данных создал дуал порт память на m9k.

Напишите еще как соотносятся частоты приемников и внутренняя тактовая проекта....

Можно ли сделать поочередное чтение памяти или нужен арбитр?

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


Ссылка на сообщение
Поделиться на другие сайты
Напишите еще как соотносятся частоты приемников и внутренняя тактовая проекта....

Можно ли сделать поочередное чтение памяти или нужен арбитр?

 

Вообще, предусматривается, что будет порядка 8 приемников, и несколько передатчиков. Скорость приемопередатчиков лежит в интервале 9600 - 921600, на отладочной плате стоит кварц на 50М. Нужно организовать прием пакетов по нескольким каналам, сбор их в один и выдачу по одному каналу.

 

Если можно делать параллельные операции чтения/записи в разные области памяти (другими словами - на .bdf понаставить много примитивов dual port ram и асинхронно с ними работать), то задача решается быстро. Я это и сделал, описал в первом сообщении.

 

Если так нельзя, то ставится один примитив ram, и данные по всем каналам пишутся/читаются поочередно. Кварца на 50мгц тут будет достаточно. Это вы имели ввиду под словом арбитр?

 

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


Ссылка на сообщение
Поделиться на другие сайты
Если так нельзя, то ставится один примитив ram, и данные по всем каналам пишутся/читаются поочередно. Кварца на 50мгц тут будет достаточно. Это вы имели ввиду под словом арбитр?

Как это делается обычно?

Есть память. С одной стороны ей пользуется кто-то "главный", например процессор.

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

Далее. Либо есть автомат (обычно это - DMA), который поочередно проверяет наличие данных в блоках и переписывает их в память. По кругу, либо по-другому алгоритму, циклически и непрерывно...

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

Ну и должны быть служебные области памяти или регистры. Потому как "главному" надо сообщить сколько данных в каких каналах. А еще неплохо данные записывать не как "кучу байт", а как "кадры". Ну и тогда куда-то писать информацию о "начале", "числе байт", "ошибках" и т.д. Либо эту черновую работу будет делать "главный", но тогда он из области памяти "буфер приема", будет переписывать данные в область памяти "буфер кадров" и загрузка по шине памяти увеличится...

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


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

Есть память. С одной стороны ей пользуется кто-то "главный", например процессор.

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

Далее. Либо есть автомат (обычно это - DMA), который поочередно проверяет наличие данных в блоках и переписывает их в память. По кругу, либо по-другому алгоритму, циклически и непрерывно...

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

Ну и должны быть служебные области памяти или регистры. Потому как "главному" надо сообщить сколько данных в каких каналах. А еще неплохо данные записывать не как "кучу байт", а как "кадры". Ну и тогда куда-то писать информацию о "начале", "числе байт", "ошибках" и т.д. Либо эту черновую работу будет делать "главный", но тогда он из области памяти "буфер приема", будет переписывать данные в область памяти "буфер кадров" и загрузка по шине памяти увеличится...

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

Есть конкретная плис, и конкретный компилятор квартуса, и проблема заключается в них

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


Ссылка на сообщение
Поделиться на другие сайты
Можно ли на cyclone4 реализовать несколько параллельных процессов чтения/записи в память?

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

По моим наблюдениям, первая оценка числа параллельно реализуемых блоков с применением памяти равна числу умножителей 18*18 в ПЛИС.

Более детально уже может только квартус выдать - сможет он запихнуть все или нет.

 

Возможно Ваша беда в том, что реализовав один канал, остальные три остались не востребованными (не выведены сигналы и т.п.)

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


Ссылка на сообщение
Поделиться на другие сайты
Есть конкретная плис, и конкретный компилятор квартуса, и проблема заключается в них

прежде чем кивать на Квартус... А RTL симуляция всех одновременно работающих каналов отработана?

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


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

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

 

...

Стоит задача организации приема данных по нескольким каналам последовательного интерфейса. Для промежуточного хранения данных создал дуал порт память на m9k.

...

 

Отсюда возникает несколько вопросов:

 

1. Можно ли на cyclone4 реализовать несколько параллельных процессов чтения/записи в память?

Если да, то в чем моя ошибка? Если нет, то почему квартус не вернул ошибку при компиляции проекта?

 

2. Если на cyclone4 нельзя реализовать несколько параллельных процессов чтения/записи в память, почему из 4 модулей чтения/записи, флаги раздавал только один (хотя они не зависят от памяти, от других каналов, полностью идентичные, корректно отображаются на rtl)?

 

Заранее благодарю за ответы.

Ответ на вопрос 1 -

Можно - примитив памяти m9k позволяет организовать несколько, а точнее ДВА ОДНОВРЕМЕННЫХ канала (dual-port) четния/записи из блока памяти m9k.

Если же под несколько Вы имели ввиду число больше 2 каналов одновременного доступа в ОДИН блок памяти то физически это сделать нельзя - этом случае Вам придется логически организовывать арбитраж для доступа нескольких каналов в одну память.

 

Ответ на вопрос 2 -

Скорее всего Ваш дизайн содержит логические ошибки.

Выявить их и тем более исправить через телепатический канал пока не представляется возможным (манны не хватает). :laughing:

 

Удачи! Rob.

 

 

 

 

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


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

Насчет ограничений из-за глубины - там в даташитах я видел только какие различные допустимые конфигурации блоков для портов чтения и записи.

 

По моим наблюдениям, первая оценка числа параллельно реализуемых блоков с применением памяти равна числу умножителей 18*18 в ПЛИС.

Более детально уже может только квартус выдать - сможет он запихнуть все или нет.

>> первая оценка, числу умножителей - можно где-то поподробнее про это почитать? Квартус ни на что не ругался

параллельно реализуемых блоков - у вас операции чтения/записи были тоже параллельными?

 

Возможно Ваша беда в том, что реализовав один канал, остальные три остались не востребованными (не выведены сигналы и т.п.)

Пины на входе и выхоле каналов были выведены, а так же - несколько промежуточных

 

прежде чем кивать на Квартус... А RTL симуляция всех одновременно работающих каналов отработана?

На rtl вьюере 4 идентичных канала, если разворачивать примитивы - то они одинаковые по каналам

 

Ответ на вопрос 1 -

Можно - примитив памяти m9k позволяет организовать несколько, а точнее ДВА ОДНОВРЕМЕННЫХ канала (dual-port) четния/записи из блока памяти m9k.

Если же под несколько Вы имели ввиду число больше 2 каналов одновременного доступа в ОДИН блок памяти то физически это сделать нельзя - этом случае Вам придется логически организовывать арбитраж для доступа нескольких каналов в одну память.

 

Я создаю в ip визарде модуль памяти. Собираю на нем условное echo (...работает по принципу "принимаю n раз по байту, записываю в память, потом считываю n раз, выдаю")

 

затем я копирую получившуюся схему (1 канал), и нажимаю вставить 3 раза. получается 4 идентичных канала. назначаю пины, заливаю в отладочную плату. при этом работает все равно один канал из 4. Если один удалить, начинает работать какой-нибудь другой, при этом остальные все равно молчат.

 

Ответ на вопрос 2 -

Скорее всего Ваш дизайн содержит логические ошибки.

Выявить их и тем более исправить через телепатический канал пока не представляется возможным (манны не хватает). :laughing:

Правильно ли я понимаю, когда я создаю примитив памяти например на 1 m9k, и в дизайне он присутствует 4 раза - на деле это 4 разных блока m9k, с каждым из которых можно параллельно с другими работать? если это не так - то да, это логическая ошибка. Ну или я не умею в ctrl c ctrl v. или есть еще какие-то ограничения, о которых я не знаю

 

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


Ссылка на сообщение
Поделиться на другие сайты
затем я копирую получившуюся схему (1 канал), и нажимаю вставить 3 раза. получается 4 идентичных канала. назначаю пины, заливаю в отладочную плату. при этом работает все равно один канал из 4. Если один удалить, начинает работать какой-нибудь другой, при этом остальные все равно молчат.

 

Правильно ли я понимаю, когда я создаю примитив памяти например на 1 m9k, и в дизайне он присутствует 4 раза - на деле это 4 разных блока m9k, с каждым из которых можно параллельно с другими работать? если это не так - то да, это логическая ошибка. Ну или я не умею в ctrl c ctrl v. или есть еще какие-то ограничения, о которых я не знаю

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

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


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

 

Можно написать "главного", который будет работать с памятью, объявить 1 примитив, и писать/читать данные циклически или как-то еще. И это работает. Но как я понял из чтения даташитов, и как сказал Rob:

примитив памяти m9k позволяет организовать несколько, а точнее ДВА ОДНОВРЕМЕННЫХ канала (dual-port) четния/записи из блока памяти m9k.

 

Выходит, что каждый блок памяти может иметь своего "главного", всего в дизайне я задействую 4 блока m9k (4 примитива по одному m9k каждый) и имею 4 "главных". И вот это уже не работает

Изменено пользователем jkabra

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


Ссылка на сообщение
Поделиться на другие сайты
Можно написать "главного", который будет работать с памятью, объявить 1 примитив, и писать/читать данные циклически или как-то еще. И это работает.

....

Выходит, что каждый блок памяти может иметь своего "главного", всего в дизайне я задействую 4 блока m9k (4 примитива по одному m9k каждый) и имею 4 "главных". И вот это уже не работает

Вы что, за каждую букву в кассу деньги платите?

Из Вас клещами надо информацию тянуть, но ответа так и не получил...

 

Итак. Либо многопроцессорность. Это 4 совершенно одинаковых канала и в каждом свой "главный"...

Либо один "главный", но к нему подключено 4 канала через ФИФО. И в этом случае каналы где-то должны объединиться, чтобы их можно было подключить к одному "главному". Что обычно и делают. Потому как впихивать в ПЛИС 4 или 8 микроконтроллеров - это довольно накладно. Да и куда потом от них информацию девать?

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


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

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

...

Правильно ли я понимаю, когда я создаю примитив памяти например на 1 m9k, и в дизайне он присутствует 4 раза - на деле это 4 разных блока m9k, с каждым из которых можно параллельно с другими работать? если это не так - то да, это логическая ошибка. Ну или я не умею в ctrl c ctrl v. или есть еще какие-то ограничения, о которых я не знаю

А Вы что думаете Ctrl-C, Ctrl-V это так просто? :) Тут учится и Ctrl-C, Ctrl-V!

 

Правильно - это будут 4 разных блока памяти.

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

 

Посмотрите результат после P&R на Technology map viewer (Post-Fit) остались ли эти модули в дизайне в целости и сохранности. И куда от них сигналы идут.

 

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
..первая оценка, числу умножителей - можно где-то поподробнее про это почитать? Квартус ни на что не ругался

параллельно реализуемых блоков - у вас операции чтения/записи были тоже параллельными?

Это мои оценки, основанные на попытках создать 32 параллельных канала с объемом двухпортовых блоков в 1кБ на минимальных циклонах 4Е, где всего 15 и 23 умножителя.

 

Что касается не задействованных блоков, натыкался на такую ситуацию:

в каждом блоке есть сигналы сброса и предварительной загрузки, назначаю им принудительные 0 или 1. После компиляции квартус выдавал итог 0 задействованных ресурсов (памяти, регистров и т.п.) при этом в RTL честно рисует все блоки. Загружал - не работает.

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

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


Ссылка на сообщение
Поделиться на другие сайты
Вообще, предусматривается, что будет порядка 8 приемников, и несколько передатчиков. Скорость приемопередатчиков лежит в интервале 9600 - 921600, на отладочной плате стоит кварц на 50М. Нужно организовать прием пакетов по нескольким каналам, сбор их в один и выдачу по одному каналу.

На самом деле как и ожидалось сам по себе вопрос задается неправильно.... Говорилось о том, как "размножить память"...

А теперь давайте посчитаем. Максимальная скорость - "921600". Грубо 1Мбит/с... А когда придет байт, то это 0,1 МБайт/с. А тактовая "внутри", даже без применения умножителей частоты вдвое, - 50Мгц. Теперь считаем такты. Пусть даже у нас будет 10 каналов, тогда за время приема байтов по всем 10 каналам, у нас будет 50 тактов внутренней частоты. Так за 50 тактов можно будет циклически опрашивать эти 10 каналов и полученные данные записать в единственный блок памяти, но соответственно по разным адресам.... И дя этого нужен только один FSM и десяток регистров-указателей для записи слов данных...

Даже более того. Можно и сам приемник сделать только один и к нему крошечный блок двухпортовки. Соответственно за 50 тактов "внутренней" частоты, можно легко обмолотить 10 каналов по 5 тактов на канал... А в этой двухпортовке хранить временные результаты приема по каналам...

 

Как показывает мой опыт работы в техподдержке, большинство вопросов задаются тогда, когда "лобовое" решение не работает, А не работает оно только потому, что задача поставлена неверно. Начинать то надо с карты поля дураков, а то с утра и не вспомнить будет, где закопаны 4 сольдо. :)

 

 

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация