|
|
  |
NIOS II, программирование ниос2 на СИ |
|
|
|
Jan 28 2015, 08:35
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(doom13 @ Jan 28 2015, 11:33)  Т.е. это кусок этой же ПЛИС, который имеет доступ к этой же памяти (DDR2). нет, там уже вроде другая плиска или МП
|
|
|
|
|
Jan 28 2015, 08:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(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 МБ/с) складываете в фифо, а он пусть из него и читает.
|
|
|
|
|
Jan 28 2015, 08:59
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
БЛИН! Ну пипец эта ваша альтера - это так чтобы doom13'а позлить  .. Любую память можно сделать хоть милиард портовой уменьшив скорость записи-чтения. Берете контроллер памяти DDR присоединяете его к DDR. А выход этого контроллера присоединяете к блоку который делает вот что. 0 такт он читает или пишет из первого адреса 1 такт он читает или пишет из второго адреса и так по кругу. Получаете обычную 2 портовую память с равномерным распределением шины. Да вы теряете 50% пропускной способности памяти, но если память изначально может пропустить через себя в несколько раз больше чем вы в нее пихаете - то проблем нет. Именно так вашу систему и надо реализовать, поделите память между 2 потоками одни который в нее пишет, другой который из нее читает. Дальше идет оптимизация, можно писать - читать не по 1 слову, а по нескольку потому что память пишет быстрее чем выходит на режим, допустим делаете запись от 1 до 4 слов, на входе обоих каналов ставите FIFO в N слов, и ничего гарантированно не потеряется. Когда будет такт доступа очередного канала, он из фифо сольет от 1 до 4 слов, в зависимости от того сколько туда напихают. Можно раздать приоритеты, то есть 1 канал сливает всегда все фифо, сколько бы там ни было слов, а 2 канал сливает не больше К слов, а фифо на 1 канале сровняет паузы. Если же скорость записи ДДР меньше скорости поступления + чтения данных, то хоть убейтесь ничего не выйдет, даже на ксалинксе, не то что на альтере - ну это тоже чтобы дума позлить
|
|
|
|
|
Jan 28 2015, 09:03
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(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.
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 28 2015, 09:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 28 2015, 11:59)  БЛИН! Ну пипец эта ваша альтера - это так чтобы doom13'а позлить  .. Целых два дня и две ночи Вы не спали - думали, что ответить. Хотелось бы узнать, как там обстоят дела у Xilinx с DDR на логике и железе? Может быть за столь долгий час Вы произвели сравнительный анализ девайсов от обсуждаемых производителей?
|
|
|
|
|
Jan 28 2015, 09:13
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(doom13 @ Jan 28 2015, 11:58)  Уточнил кое какую деталь: пользователь нажимает 1 кнопку, тем самым просит зафиксировать 1.2 МБайта данных в DDR2. Нажимает 2 кнопку, просит эти данные считать. Следовательно DDR2 надо разделить на 2 области, т.е. циклически пишем в первую половину, как сработала кнопка 1, сохраняем все данные и пишем во 2 половину памяти DDR2.
|
|
|
|
|
Jan 28 2015, 10:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(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)  Если же скорость записи ДДР меньше скорости поступления + чтения данных, то хоть убейтесь ничего не выйдет, даже на ксалинксе и даже с хардовым контроллером
|
|
|
|
|
Jan 28 2015, 10:37
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(doom13 @ Jan 28 2015, 13:17)  В Qsys-систему его добавляете и на Avalon-MM вешаете, даёте доступ к контроллеру памяти Nios II, DMA-контроллерам (при необходимости). Пробуете писать/читать данные либо Ниосом либо DMA, должно всё получиться.
Пробуйте DDR2-контроллер запустить и на максимальной скорости. А что если взять два on-chip memory. Сначала закидываем от АЦП в один on-chip memory, а потом скидываем в DDR2, при этом записывая во второй on-chip memory, и так меняя их
|
|
|
|
|
Jan 28 2015, 10:45
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Уточнил кое какую деталь: пользователь нажимает 1 кнопку, тем самым просит зафиксировать 1.2 МБайта данных в DDR2. Нажимает 2 кнопку, просит эти данные считать. Следовательно DDR2 надо разделить на 2 области, т.е. циклически пишем в первую половину, как сработала кнопка 1, сохраняем все данные и пишем во 2 половину памяти DDR2. У вас процессор еще хоть что-то делает или только данные из памяти в память перекидывает? Просто если так, то все эти коллизии можно решить программно в проце. Вам надо FIFO для входных данных, и пусть процессор его постоянно мониторит, если есть данные складывает их в циклический буфер в DDR. При это просто размещаете буффер в ДДР области памяти и даже не думаете как оно там происходит. По запросу пользователя, переключаете буфер, и начинаете маленькими порциями выдавать данные пользователю из 1 буфера. Так чтобы на выдачу данных тратилось времени не больше чем на заполнения половины буфера входными данными. Таким образом арбитраж у вас сделает процессор, данные не потеряются из - за фифо, доступ к памяти организует контроллер. Мне кажется вы усложняете задачу ФИФО как раз строиться на блочной памяти, только с ним работать удобнее, не надо писать алгоритм циклического буфера, Просто пишите с одного конца и читаете с другого, а порядок следования данных реализуется сам собой кстати никто не мешает каскадировать ФИФО, выход одного подавать на вход другого, и тема самым увеличивать длину, правда там надо маленький автоматик сделать который данные будет прокидывать и учитывать задержку появления данных на число блоков фифо.
|
|
|
|
|
Jan 28 2015, 10:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(Golikov A. @ Jan 28 2015, 13:35)  Про контроллеры памяти на ПЛИС вентилях я уже сказал выше, видать надо разжевать. Спартан 6, -2 грейда скорости боле менее сложный блок тянет на частоте около 100 МГц, хорошая ли это частота для DDR3 памяти? По мне так не особо, C железным блоком спартан 6 тянет DDR до 400 МГц это и ответ... Все вопрос частоты. Я приводил характеристики DDR3-контроллера для Altera Cyclone 5, там чётко видна разница между железным блоком и блоком на логике (400 МГц и 300 МГц соответственно, думаю, это не смертельно, во многих задачах оно себя оправдает). О каких 60 МГц говорили Вы - Вам виднее.
|
|
|
|
|
Jan 28 2015, 10:53
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(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 то что накопилось.
|
|
|
|
|
Jan 28 2015, 10:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(x66 @ Jan 28 2015, 13:37)  А что если взять два on-chip memory. Сначала закидываем от АЦП в один on-chip memory, а потом скидываем в DDR2, при этом записывая во второй on-chip memory, и так меняя их Вы можете так сделать, использовать RAM либо FIFO (это на ваш выбор), данные в DDR2 перекладывать/считывать Ниосом, но лучше разобраться с DMA (SgDMA/mSgDMA). UP Ниос работает на 100MHz?
|
|
|
|
|
Jan 28 2015, 11:05
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-05-10
Пользователь №: 57 122

|
Цитата(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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|