Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOS II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3
doom13
Цитата(serjj @ Jan 26 2015, 11:02) *
Xilinx MPMC
И у Xilinx вроде давно уже есть контроллер памяти на логике, поддержка DDR3 и LPDDR2 в наличие... Про использование хардовых MCB нигде не говорится

Это уж точно должно быть интересно и позновательно... biggrin.gif
Golikov A.
В целом конечно я не прав. Все же вопрос частоты. Я как то не подумал что люди могут ставить DDR3 и работать с ним на 60 МГц... (условно все конечно)
doom13
Цитата(Golikov A. @ Jan 26 2015, 12:26) *
В целом конечно я не прав.

a14.gif

Цитата(Golikov A. @ Jan 26 2015, 12:26) *
Все же вопрос частоты. Я как то не подумал что люди могут ставить DDR3 и работать с ним на 60 МГц... (условно все конечно)

Для FPGA с которой сейчас работаю характеристики DDR3-контроллера на рисунке (или можете просмотреть cv_52006.pdf). Для FPGA Xiinx - поинтересуйтесь пожалуйста сами. Чтобы не получилось
Цитата(Golikov A. @ Jan 20 2015, 15:28) *
ну пипец ваша ...
x66
Цитата(Golikov A. @ Jan 23 2015, 14:59) *
Вам FIFO надо.

Данные поступают в FIFO а оттуда в DDR, через какой либо DMA контроллер.

Если данные нужны кому-то еще вы их читаете из ДДР, это приостанавливает DMA контроллер, и данные на время задержек падают в FIFO.

Ничего руками разруливать не надо, потому что проц не долбиться в шину постоянно (хотя может НИОС опять по чудному сделан, но надеюсь что нет). Вот и пока проц делает что-то еще, ДМА сам займет шину и успеет положить еще кусочек. Систему надо строить именно на таком принципе. Кстати ДДР контроллер разьве изначально не 2 портовый?

Вам надо перейти на следующий уровень абстракции, надо забыть про то какая у вас память, это забота контроллера, вы же не собираетесь еще сами следить за тем вовремя ли он подает ревреши, я надеюсь%)... Так же забота контроллера обеспечивать доступ к памяти по нескольким портам, во всяком случае у ксалинкс контроллер точно несколько портовый с арбитражем, наверяка у вас тоже, если это не так, то надо делать свой контроллер - арбитр, но не лезть к памяти напрямую, это дело контроллера памяти.

Обратите внимание что контроллер памяти ДДР - это не что-то собранное из вентилей ПЛИС, а отдельная область, готовый блок, слишком там все по таймингам не просто.


ФИФО максимум как я понял на 8 кБайт. Требуется считать 1.2 МБайт памяти. Пока будет задержка на переключения ддр2 плюс чтение из ддр2 фифо будет переполнена. Поэтому придется по кусочкам производить чтение. On-chip memory можно сделать двухпортовым, а DDR2 насколько мне известно работает либо на чтение либо на запись.
doom13
Цитата(x66 @ Jan 28 2015, 09:26) *
ФИФО максимум как я понял на 8 кБайт. Требуется считать 1.2 МБайт памяти. Пока будет задержка на переключения ддр2 плюс чтение из ддр2 фифо будет переполнена. Поэтому придется по кусочкам производить чтение. On-chip memory можно сделать двухпортовым, а DDR2 насколько мне известно работает либо на чтение либо на запись.

Что за данные собираетесь писать, какова скорость потока?
x66
Цитата(doom13 @ Jan 28 2015, 09:59) *
Что за данные собираетесь писать, какова скорость потока?


На входе приходят данные с АЦП со скоростью 60 мегаслов в секунду (1 слово = 8 бит). На выходе считываются данные со скоростью 2 мегаслова в секунду. Скорости потоков разные плюс надо не потерять входные данные. Объем выводимых данных 1.2 мегабайта.
doom13
Цитата(x66 @ Jan 28 2015, 10:08) *
На входе приходят данные с АЦП со скоростью 60 мегаслов в секунду (1 слово = 8 бит). На выходе считываются данные со скоростью 2 мегаслова в секунду. Скорости потоков разные плюс надо не потерять входные данные. Объем выводимых данных 1.2 мегабайта.

А поясните, кто такие "вход" и "выход"? 8-бит АЦП с тактовой 60 МГц, а что такое 8-бит на 2МГц? Какое-то тут противоречие - нельзя писать данные 8*60 Mbit/s, а читать со скоростью 8*2 Mbit/s и не переполнить память?
x66
Цитата(doom13 @ Jan 28 2015, 10:26) *
А поясните, кто такие "вход" и "выход"? 8-бит АЦП с тактовой 60 МГц, а что такое 8-бит на 2МГц? Какое-то тут противоречие - нельзя писать данные 8*60 Mbit/s, а читать со скоростью 8*2 Mbit/s и не переполнить память?


То что я пытаюсь сделать является маленьким блоком большого устройства. Входом условно назвал АЦП. Выходом назвал приемник (пользователь), т.е. устройство которое предоставляет пользователю наглядные данные (скорее всего экран). Приемник не постоянно считывает данные, а только по запросу (т.е. пришел человек к терминалу и нажал кнопку сказав: а выведи ка мне ты последние 1.2 МБайта данных которые пришли с АЦП). Между АЦП и Приемником нужно создать такой проект чтобы он связал их, т.к. у них разные скорости работы. Проблема возникает в том, что из-за разницы скоростей возникает момент, когда необходимо где то сохранить данные от АЦП во время чтения из ОЗУ этих 1.2 МБайта.

На рисунке под плис подразумевается процессор NIOS II и другие устройства которые управляют DDR2 и данными.

doom13
Цитата(x66 @ Jan 28 2015, 11:09) *

Из Ваших пояснений не понятно, каким образом получается скорость чтения 8*2 Мbit/s, есть только желание получить объём данных в 1,2 МБ?
x66
Цитата(x66 @ Jan 28 2015, 11:09) *
Из Ваших пояснений не понятно, каким образом получается скорость чтения 8*2 Мbit/s, есть только желание получить объём данных в 1,2 МБ?


Чтение производится готовым блоком, что именно там я не знаю, но оно читает со скоростью 2 Мбайта/с и нужно выводить последние 1.2 МБайта данных
doom13
Цитата(x66 @ Jan 28 2015, 11:31) *
Чтение производится готовым блоком, что именно там я не знаю, но оно читает со скоростью 2 Мбайта/с и нужно выводить последние 1.2 МБайта данных

Т.е. это кусок этой же ПЛИС, который имеет доступ к этой же памяти (DDR2).
x66
Цитата(doom13 @ Jan 28 2015, 11:33) *
Т.е. это кусок этой же ПЛИС, который имеет доступ к этой же памяти (DDR2).


нет, там уже вроде другая плиска или МП
doom13
Цитата(x66 @ Jan 28 2015, 11:35) *
нет, там уже вроде другая плиска или МП

Что-то мне кажется, что сначала Вам нужно разобраться с чтение/записью DDR2, а там можно будет дальше строить систему.
Пока вижу, данные пишутся в DDR с частотой 15 МГц при 32-х разрядной шине DDR2-контроллера (8bit*60MHz = 32bit*15MHz), а читаются из DDR2 с частотой 0.5 MHz (8bit*2MHz = 32bit*0.5MHz). Думаю, DDR2-контроллер потянет. У Вас критична только скорость записи (данные не хотите терять), вот и делайте её приоритетной, а читать будете в свободные от записи моменты (контроллер DDR2 тут сам всё разрулит). Ваш DDR2 контроллер при поступлении новых данных пишет их в память (на максимальной для него скорости), по запросу вычитываете данные. Прочитанные данные, чтобы согласовать скорость с внешним интерфейсом (2 МБ/с) складываете в фифо, а он пусть из него и читает.
Golikov A.
БЛИН!

Ну пипец эта ваша альтера - это так чтобы doom13'а позлитьsm.gif..

Любую память можно сделать хоть милиард портовой уменьшив скорость записи-чтения.

Берете контроллер памяти DDR присоединяете его к DDR. А выход этого контроллера присоединяете к блоку который делает вот что.
0 такт он читает или пишет из первого адреса
1 такт он читает или пишет из второго адреса
и так по кругу. Получаете обычную 2 портовую память с равномерным распределением шины. Да вы теряете 50% пропускной способности памяти, но если память изначально может пропустить через себя в несколько раз больше чем вы в нее пихаете - то проблем нет.

Именно так вашу систему и надо реализовать, поделите память между 2 потоками одни который в нее пишет, другой который из нее читает.
Дальше идет оптимизация, можно писать - читать не по 1 слову, а по нескольку потому что память пишет быстрее чем выходит на режим, допустим делаете запись от 1 до 4 слов, на входе обоих каналов ставите FIFO в N слов, и ничего гарантированно не потеряется. Когда будет такт доступа очередного канала, он из фифо сольет от 1 до 4 слов, в зависимости от того сколько туда напихают.

Можно раздать приоритеты, то есть 1 канал сливает всегда все фифо, сколько бы там ни было слов, а 2 канал сливает не больше К слов, а фифо на 1 канале сровняет паузы.


Если же скорость записи ДДР меньше скорости поступления + чтения данных, то хоть убейтесь ничего не выйдет, даже на ксалинксе, не то что на альтере - ну это тоже чтобы дума позлитьsm.gif
x66
Цитата(doom13 @ Jan 28 2015, 11:58) *
Что-то мне кажется, что сначала Вам нужно разобраться с чтение/записью DDR2, а там можно будет дальше строить систему.
Пока вижу, данные пишутся в DDR с частотой 15 МГц при 32-х разрядной шине DDR2-контроллера (8bit*60MHz = 32bit*15MHz), а читаются из DDR2 с частотой 0.5 MHz (8bit*2MHz = 32bit*0.5MHz). Думаю, DDR2-контроллер потянет. У Вас критична только скорость записи (данные не хотите терять), вот и делайте её приоритетной, а читать будете в свободные от записи моменты (контроллер DDR2 тут сам всё разрулит). Ваш DDR2 контроллер при поступлении новых данных пишет их в память (на максимальной для него скорости), по запросу вычитываете данные. Прочитанные данные, чтобы согласовать скорость с внешним интерфейсом (2 МБ/с) складываете в фифо, а он пусть из него и читает.


на картинке параметры DDR2.
doom13
Цитата(Golikov A. @ Jan 28 2015, 11:59) *
БЛИН!
Ну пипец эта ваша альтера - это так чтобы doom13'а позлитьsm.gif..

Целых два дня и две ночи Вы не спали - думали, что ответить.
Хотелось бы узнать, как там обстоят дела у Xilinx с DDR на логике и железе? Может быть за столь долгий час Вы произвели сравнительный анализ девайсов от обсуждаемых производителей? biggrin.gif
x66
Цитата(doom13 @ Jan 28 2015, 11:58) *


Уточнил кое какую деталь: пользователь нажимает 1 кнопку, тем самым просит зафиксировать 1.2 МБайта данных в DDR2. Нажимает 2 кнопку, просит эти данные считать. Следовательно DDR2 надо разделить на 2 области, т.е. циклически пишем в первую половину, как сработала кнопка 1, сохраняем все данные и пишем во 2 половину памяти DDR2.
doom13
Цитата(Golikov A. @ Jan 28 2015, 11:59) *
Берете контроллер памяти DDR присоединяете его к DDR. А выход этого контроллера присоединяете к блоку который делает вот что.

В Qsys-систему его добавляете и на Avalon-MM вешаете, даёте доступ к контроллеру памяти Nios II, DMA-контроллерам (при необходимости). Пробуете писать/читать данные либо Ниосом либо DMA, должно всё получиться.

Цитата(x66 @ Jan 28 2015, 12:13) *
Уточнил кое какую деталь: пользователь нажимает 1 кнопку, тем самым просит зафиксировать 1.2 МБайта данных в DDR2. Нажимает 2 кнопку, просит эти данные считать. Следовательно DDR2 надо разделить на 2 области, т.е. циклически пишем в первую половину, как сработала кнопка 1, сохраняем все данные и пишем во 2 половину памяти DDR2.

Пробуйте DDR2-контроллер запустить и на максимальной скорости.

Цитата(Golikov A. @ Jan 28 2015, 11:59) *
Если же скорость записи ДДР меньше скорости поступления + чтения данных, то хоть убейтесь ничего не выйдет, даже на ксалинксе

и даже с хардовым контроллером
Golikov A.
Цитата
Целых два дня и две ночи Вы не спали - думали, что ответить.
Хотелось бы узнать, как там обстоят дела у Xilinx с DDR на логике и железе? Может быть за столь долгий час Вы произвели сравнительный анализ девайсов от обсуждаемых производителей? biggrin.gif


не, я работал. У меня сейчас тематика без ПЛИС. Но вижу тема вас задеваетwink.gif

Про контроллеры памяти на ПЛИС вентилях я уже сказал выше, видать надо разжевать. Спартан 6, -2 грейда скорости боле менее сложный блок тянет на частоте около 100 МГц, хорошая ли это частота для DDR3 памяти? По мне так не особо, C железным блоком спартан 6 тянет DDR до 400 МГц это и ответ... Все вопрос частоты.



x66
Цитата(doom13 @ Jan 28 2015, 13:17) *
В Qsys-систему его добавляете и на Avalon-MM вешаете, даёте доступ к контроллеру памяти Nios II, DMA-контроллерам (при необходимости). Пробуете писать/читать данные либо Ниосом либо DMA, должно всё получиться.


Пробуйте DDR2-контроллер запустить и на максимальной скорости.


А что если взять два on-chip memory. Сначала закидываем от АЦП в один on-chip memory, а потом скидываем в DDR2, при этом записывая во второй on-chip memory, и так меняя их
Golikov A.
Цитата
Уточнил кое какую деталь: пользователь нажимает 1 кнопку, тем самым просит зафиксировать 1.2 МБайта данных в DDR2. Нажимает 2 кнопку, просит эти данные считать. Следовательно DDR2 надо разделить на 2 области, т.е. циклически пишем в первую половину, как сработала кнопка 1, сохраняем все данные и пишем во 2 половину памяти DDR2.


У вас процессор еще хоть что-то делает или только данные из памяти в память перекидывает? Просто если так, то все эти коллизии можно решить программно в проце. Вам надо FIFO для входных данных, и пусть процессор его постоянно мониторит, если есть данные складывает их в циклический буфер в DDR. При это просто размещаете буффер в ДДР области памяти и даже не думаете как оно там происходит.

По запросу пользователя, переключаете буфер, и начинаете маленькими порциями выдавать данные пользователю из 1 буфера. Так чтобы на выдачу данных тратилось времени не больше чем на заполнения половины буфера входными данными.

Таким образом арбитраж у вас сделает процессор, данные не потеряются из - за фифо, доступ к памяти организует контроллер. Мне кажется вы усложняете задачу



ФИФО как раз строиться на блочной памяти, только с ним работать удобнее, не надо писать алгоритм циклического буфера, Просто пишите с одного конца и читаете с другого, а порядок следования данных реализуется сам собой

кстати никто не мешает каскадировать ФИФО, выход одного подавать на вход другого, и тема самым увеличивать длину, правда там надо маленький автоматик сделать который данные будет прокидывать и учитывать задержку появления данных на число блоков фифо.
doom13
Цитата(Golikov A. @ Jan 28 2015, 13:35) *
Про контроллеры памяти на ПЛИС вентилях я уже сказал выше, видать надо разжевать. Спартан 6, -2 грейда скорости боле менее сложный блок тянет на частоте около 100 МГц, хорошая ли это частота для DDR3 памяти? По мне так не особо, C железным блоком спартан 6 тянет DDR до 400 МГц это и ответ... Все вопрос частоты.

Я приводил характеристики DDR3-контроллера для Altera Cyclone 5, там чётко видна разница между железным блоком и блоком на логике (400 МГц и 300 МГц соответственно, думаю, это не смертельно, во многих задачах оно себя оправдает). О каких 60 МГц говорили Вы - Вам виднее.
x66
Цитата(Golikov A. @ Jan 28 2015, 13:45) *
У вас процессор еще хоть что-то делает или только данные из памяти в память перекидывает? Просто если так, то все эти коллизии можно решить программно в проце. Вам надо FIFO для входных данных, и пусть процессор его постоянно мониторит, если есть данные складывает их в циклический буфер в DDR. При это просто размещаете буффер в ДДР области памяти и даже не думаете как оно там происходит.

По запросу пользователя, переключаете буфер, и начинаете маленькими порциями выдавать данные пользователю из 1 буфера. Так чтобы на выдачу данных тратилось времени не больше чем на заполнения половины буфера входными данными.

Таким образом арбитраж у вас сделает процессор, данные не потеряются из - за фифо, доступ к памяти организует контроллер. Мне кажется вы усложняете задачу



ФИФО как раз строиться на блочной памяти, только с ним работать удобнее, не надо писать алгоритм циклического буфера, Просто пишите с одного конца и читаете с другого, а порядок следования данных реализуется сам собой

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


Я программно начал делать так: задал min и max адреса в DDR, для каждой половины. Проверяю условия от пользователя провожу запись в блоки. Когда приходит сигнал от пользователя фиксирую конечный адрес и вычитаю до адреса начала этих 1.2МБ, при этом переключаюсь на вторую половину DDR. А вот при чтении из DDR я планировал данные от АЦП передавать на on-chip memory, и выводить данные пользователю (пока ориентировался примерно на 4кбайт), затем скидывать с on-chip memory в DDR то что накопилось.
doom13
Цитата(x66 @ Jan 28 2015, 13:37) *
А что если взять два on-chip memory. Сначала закидываем от АЦП в один on-chip memory, а потом скидываем в DDR2, при этом записывая во второй on-chip memory, и так меняя их

Вы можете так сделать, использовать RAM либо FIFO (это на ваш выбор), данные в DDR2 перекладывать/считывать Ниосом, но лучше разобраться с DMA (SgDMA/mSgDMA).

UP
Ниос работает на 100MHz?
x66
Цитата(doom13 @ Jan 28 2015, 13:54) *
Вы можете так сделать, использовать RAM либо FIFO (это на ваш выбор), данные в DDR2 перекладывать/считывать Ниосом, но лучше разобраться с DMA (SgDMA/mSgDMA).


Можете посоветовать литературу по DMA, где толково расписано.

Цитата(doom13 @ Jan 28 2015, 13:54) *
Вы можете так сделать, использовать RAM либо FIFO (это на ваш выбор), данные в DDR2 перекладывать/считывать Ниосом, но лучше разобраться с DMA (SgDMA/mSgDMA).

UP
Ниос работает на 100MHz?


Да, на 100
doom13
Цитата(x66 @ Jan 28 2015, 13:57) *
Можете посоветовать литературу по DMA, где толково расписано.

Описание на IP-ядра смотрите ну и пример можете какой качнуть.
Golikov A.
Цитата
О каких 60 МГц говорили Вы - Вам виднее.

О сферических в вакууме, естественно wink.gif


Цитата
но лучше разобраться с DMA (SgDMA/mSgDMA).

ДМА имеет смысл если ядро чем то еще полезным нагружено, в данном же случае, я так понимаю вся нагрузка на ядро проца - это тосовка данных. Более того подозреваю что ядро проца появилось как раз из-за необходимости доступа к ДДР, через имеющийся в ядре интерфейс. В таком раскладе ДМА - лишнее усложнение и нестабильность


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

какой смысл хранить данных больше чем у вас могут попросить?


использовать буферы так

Код
uint8_t DataBuf1[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
uint8_t DataBuf2[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
FIFOStr   Buffer1;
FIFOStr   Buffer2;

InitFIFOStr(Buffer1,DataBuf1, sizeof(DataBuf1));
InitFIFOStr(Buffer2,DataBuf2, sizeof(DataBuf2));



дальше пихаете туда данные через AddFIFOData
и забираете через GetFIFOData, буфер чиститься сам при забирании данных, но можно и вызвать функцию очистки

вам надо только поправить функцию добавления данных, потому что она не дает перезаписывать буфер, возвращая код ошибки при переполнении. А также надо понять что делать если данные запросили, но их в буфере меньше 1.2 МБ, может вам вообще надо сделать 1 буфер, и выдавать всегда его целиком, а писать его по кругу...
x66
Цитата(Golikov A. @ Jan 28 2015, 14:12) *
В атаче если будет интересно программное фифо, вам надо создать 2 буфера длинной в 1.2 мегобайта, и набивать один из входящего потока, как получите сигнал выдать данные, переходите на другой буффер, а первый отдаете пользователю.

какой смысл хранить данных больше чем у вас могут попросить?


использовать буферы так

Код
uint8_t DataBuf1[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
uint8_t DataBuf2[1.2*1024*1024+2]; //буфер для хранения его надо в ДДР пихануть
FIFOStr   Buffer1;
FIFOStr   Buffer2;

InitFIFOStr(Buffer1,DataBuf1, sizeof(DataBuf1));
InitFIFOStr(Buffer2,DataBuf2, sizeof(DataBuf2));


Не совсем понял кое что: буффер создается в DDR2 или где? Если в самой плиске, то не совсем понятно, как такого объема создать.
doom13
Цитата(Golikov A. @ Jan 28 2015, 14:12) *
О сферических в вакууме, естественно wink.gif


Цитата(Golikov A. @ Jan 28 2015, 11:59) *
Ну пипец эта ваша альтера - это так чтобы doom13'а позлитьsm.gif..
то хоть убейтесь ничего не выйдет, даже на ксалинксе, не то что на альтере - ну это тоже чтобы дума позлитьsm.gif


Цитата(Golikov A. @ Jan 26 2015, 12:26) *
В целом конечно я не прав. Все же вопрос частоты. Я как то не подумал что люди могут ставить DDR3 и работать с ним на 60 МГц... (условно все конечно)


Цитата(Golikov A. @ Jan 24 2015, 00:48) *
смело...


Цитата(Golikov A. @ Jan 23 2015, 20:44) *
Чего то мне говорит что начиная с ддр2, уже не может, но могу и ошибаться...


Цитата(Golikov A. @ Jan 20 2015, 15:28) *
ну пипец ваша альтераsm.gif....
этож надо было придумать отдельные инструкции записи мимо кеша. Так за этим еще следить надо чтобы кеш был всегда синхронен с памятью под ним...
а вот явно указано
что срали они на понятие изменяемый%) и просто оптимизацию отключают и рады)


Думаю, скоро можно будет менять Ваш статус на "БОЛТУН" biggrin.gif
Timmy
Цитата(Golikov A. @ Jan 28 2015, 14:12) *
В атаче если будет интересно программное фифо, вам надо создать 2 буфера длинной в 1.2 мегобайта, и набивать один из входящего потока, как получите сигнал выдать данные, переходите на другой буффер, а первый отдаете пользователю.

какой смысл хранить данных больше чем у вас могут попросить?

Осталось только разобраться, как бы ухитриться набивать из входящего потока 60М при частоте процессора 100М и ничего не потерятьsm.gif. Хотя, если со стороны АЦП поставить упаковщик и аппаратное ФИФО, то, наверное, успеет.
А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

Данные могут попросить не самые последние, а какие-нибудь старые, например, такая возможность есть в правильных цифровых осциллографах.
doom13
Цитата(Timmy @ Jan 28 2015, 14:50) *
Осталось только разобраться, как бы ухитриться набивать из входящего потока 60М при частоте процессора 100М и ничего не потерятьsm.gif. Хотя, если со стороны АЦП поставить упаковщик и аппаратное ФИФО, то, наверное, успеет.
А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

Данные могут попросить не самые последние, а какие-нибудь старые, например, такая возможность есть в правильных цифровых осциллографах.

Там - 8bit*60M, а шина проца - 32bit*100M, получим - 32bit*15M.

Цитата(Timmy @ Jan 28 2015, 14:50) *
А так SgDMA воткнул и всё путём. Правда, надо ещё научиться правильно его сконфигурировать и запрограммировать.

Лучше тогда mSgDMA, оно новее будет, а в управлении им всё просто.

Цитата(x66 @ Jan 28 2015, 14:34) *
Не совсем понял кое что: буффер создается в DDR2 или где? Если в самой плиске, то не совсем понятно, как такого объема создать.

В DDR2, а она - память Ниоса (Qsys-системы).
Golikov A.
Кстати а какая частота DDR2?
doom13
Цитата(Golikov A. @ Jan 28 2015, 15:23) *
Кстати а какая частота DDR2?

Это видно из рисунка приведённого выше.
x66
Цитата(doom13 @ Jan 28 2015, 15:30) *
Это видно из рисунка приведённого выше.


Проект делается на основе отладочной платы DB4CGX15 Cyclone IV PCIexpress Development Board. Такие параметры взяты из примера для этой платы
Golikov A.
200 МГц
Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?
x66
Цитата(Golikov A. @ Jan 28 2015, 15:39) *
200 МГц
Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?


Как вы получили это значение? Не 3200 МБ/с?
doom13
Цитата(x66 @ Jan 28 2015, 16:02) *
Цитата(Golikov A. @ Jan 28 2015, 15:39) *

200 МГц
Я ошибаюсь или пропускная способность такой памяти порядка 3.2 МБайта в секунду по одному каналу? И даже если там будет 4 чипа, то 15 МБайт не достичь?

Как вы получили это значение? Не 3200 МБ/с?

Вот и я думаю, что товарищ ткнул пальцем в небо.
Для Вашего случая максимальная скорость записи/чтения данных будет:
8 (ширина шины) * 200 MHz(частота тактирования памяти) * 2 (память DDR2 - работает по двум фронтам) = 3200 Mbit/s = 400 MB/s
Golikov A.
а... 3.2 Гигабита...
А с учетом необходимой задержки между выставлением адреса колонки и столбца при выборе адреса?
А когда ДМА и ниос будут по разным адресам щемится?
x66
Цитата(doom13 @ Jan 28 2015, 15:02) *
В DDR2, а она - память Ниоса (Qsys-системы).


Не совсем понятно как делается
Golikov A.
нет.
Надо просто линкеру указать что у него есть такая память.
x66
Цитата(Golikov A. @ Jan 28 2015, 16:54) *
нет.
Надо просто линкеру указать что у него есть такая память.


Ну я все элементы добавил и указал адреса. Сделал несколько проектов в кусис.

Кстати, можно ли как-то внося изменения в кусисе применять их и в ниос2 эклипсе не создавая заново проект. А то не удобно каждый раз заново создавать проект
doom13
Цитата(x66 @ Jan 28 2015, 17:02) *
Кстати, можно ли как-то внося изменения в кусисе применять их и в ниос2 эклипсе не создавая заново проект. А то не удобно каждый раз заново создавать проект

Этого и не надо делать (заново создавать). Правой кнопкой на project_name_bsp->Nios II->Generate BSP/BSP Editor (если хотите настройки генерации BSP менять).
x66
Цитата(doom13 @ Jan 28 2015, 17:14) *
Этого и не надо делать (заново создавать). Правой кнопкой на project_name_bsp->Nios II->Generate BSP/BSP Editor (если хотите настройки генерации BSP менять).


А если я в кусисе переименовал проект, то как можно сделать?
doom13
Цитата(Golikov A. @ Jan 28 2015, 16:39) *
а... 3.2 Гигабита...

Тут я просто обязан был спросить: Вы ошибались, да? wink.gif


Цитата(x66 @ Jan 28 2015, 17:22) *
А если я в кусисе переименовал проект, то как можно сделать?

Тогда есть варианты, но я бы сделал так:
progect_name_bsp->BSP Editor->вылазит окно Nios II BSP Editor
Далее в окне Nios II BSP Editor:
File->New BSP->Выбираете нужный (новый) SOPC Information File Name->снимаете галку Use default locations->Задаёте название progect_name_bsp->Generate

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

Если вам будет приятно потешить местечковое самолюбие вы разработчик конечно гораздо лучше чем я.
Одна идея что DMA контроллер, который работает через туже шину что проц и делит с ним эту шину, будет работать быстрее чем проц отдельного уже говорит о многом.
doom13
Цитата(Golikov A. @ Jan 28 2015, 17:34) *
Если вам будет приятно потешить местечковое самолюбие вы разработчик конечно гораздо лучше чем я.

Не собирался тут с Вами ничем меряться, всего лишь указал на Ваше свойство уверенно давать ответы на вопросы в которых Вы некомпетентны. Извините, если это задело Вас.
Далее был просто стёб, жаль, что Вы не заценили crying.gif

Цитата(Golikov A. @ Jan 28 2015, 17:34) *
Одна идея что DMA контроллер, который работает через туже шину что проц и делит с ним эту шину, будет работать быстрее чем проц отдельного уже говорит о многом.

Я не говорил, что это будет быстрее (если читать/писать данные в одну и ту же память), а говорил, что это разгрузит проц и он сможет делать что-то там ещё во время пока DMA переливает данные.
Golikov A.
Из полезного вот что надо сделать
надо ниосом в память записать кусок данных
считать кусок данных
и записать - считать кусок данных попеременно (то есть 4 байта записали, затем 4 байта считали). Этот режим лучше попробовать в нескольких вариантах (16 байт записали, 4 считали, 32 байта записали, 4 считали).
Писать и читать надо из разных адресов. Данные для записи надо брать из какой-то valotile переменной. А лучше из внешней периферии потому что надо еще через кеш альтеры пробиться, то есть чтобы компилятор поставил правильные команды.

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

при скорости 15 МСлов в секунду и проце 100 МГц, у вас на каждую операцию есть 6 тактов, что-то мне говорит что проц не успеет. Кстати сколько микросхем памяти у проца? то есть реально какой длинны слово оно может записать за такт?

П.С. фраза "что-то мне говорит" означает что я не уверен, но мне так кажется
doom13
Цитата(Golikov A. @ Jan 28 2015, 18:42) *
Кстати сколько микросхем памяти у проца? то есть реально какой длинны слово оно может записать за такт?

Микросхема памяти там одна, это можно посмотреть в доке на плату (название платы ТС приводил выше).
Golikov A.
А сколько тактов доступ к данным по шине Avalon? На чтение, на запись, и в бёрсте? И сколько частота шины в вашем проце?
doom13
Цитата(Golikov A. @ Jan 28 2015, 20:20) *
А сколько тактов доступ к данным по шине Avalon? На чтение, на запись, и в бёрсте? И сколько частота шины в вашем проце?

Частота шины будет равна частоте процессора (100 МГц). Это и будет максимально возможная скорость записи/чтения, если контроллер DDR2 не будет тупить и выставлять waitrequest, и если данные будут записываться потоком. Спецификацию на Avalon MM, если интересно, можете посмотреть тут.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.