реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Разделение внешней памяти между NIOS и HDL-модулем, Обработка видеоизображения процессором
altlogic
сообщение Jun 30 2012, 05:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Необходимо создать систему обработки видеоизображений с применением софт-процессора NIOS II. Задача такая: записать изображение с CMOS-камеры в оперативную память и произвести над ним некоторую обработку при помощи процессора.

Аппаратное обеспечение: стенд DE2-115 (Cyclone 4), плата с камерой TRDB-D5M.
Нашел пример от альтеры DE2_115_CAMERA, в котором реализовано на верилоге примерно следующая система:
захват изображения->декодер->контроллер SDRAM->ТВ-деодекодер

Подумал, что всего-то делов - подключить к этой системе NIOS и забрать данные из SDRAM. Не тут-то былоsm.gif Задачу решаю уже не первый день...

Мои варианты решения задачи:

1. Решил отказаться от идеи расшаривания SDRAM. Решил писать картинку в SRAM, и расшарить её. От SDRAM отказался по следующим соображениям: не понимаю, может ли быть в одной системе два контроллера памяти - один у HDL, другой - у NIOS. Если такое возможно, то как будет происходить разделение шины между ними, и самое главное - какой из контроллеров будет заниматься регенерацией памяти. SRAM подключил через Avalon MM Tristate Bridge ( по инструкции http://naliwator.narod.ru/les/les_nios_sram_00.html). В Top-level дизайн проекта DE2_115_CAMERA добавил соответсвенно свою систему из сопц-билдера. Софт-процессор с памятью SRAM заработал. Когда я попытался подключить шину моста SRAM к декодеру изображения - ничего не получилось. От ошибки разделения пинов

Цитата
Error: The pin "SRAM_ADDR[1]" has multiple drivers due to the non-tri-state driver "nios:u9|bridge_2_sram_avalon_slave_arbitrator:the_bridge_2_sram_avalon_slav
e|bridge_2_sram_address[1]"
не смог избавиться. Точнее для шины данных ошибку смог побороть, а для шины адреса - нет(?). Пришёл к выводу, что таким образом Расшарить SRAM у меня не получится. Подключение HDL-дизайна к выводам FPGA (assign SRAM_ADDR[19:0] = rSRAM_ADDR[19:0]wink.gif приводит к описанной выше ошибке.

2. Создание в SOPC-Builder компонента на основе HDL описания всей камеры целиком. То есть создать такой компонент в который запихать всё - и блок захвата, и блоки обработки и контроллер SDRAM. Как управлять этим монстром - не понятно. Не ясно что делать с разнородными интерфейсами модуля - там и Conduit и Memory Mapped. Предлагаемый подход я нашёл в реализации "Nios II CRC Acceleration Example Design v2.2.0"(http://www.altera.com/support/examples/nios2/exm-crc-acceleration.html). Но там компонент попроще - всего лишь генератор CRC.

3. Создание в SOPC-Builder компонента на основе HDL модуля контроллера SDRAM. Придётся перенести SDRAM-контроллер с HDL в процессор. Возможно самый правильный подход. Пока не рассматривал.

В итоге вопрос, как же обмениваться данными между HDL и NIOS так и повис в воздухе. Видел советы по использованию в подобных ситуациях SGDMA, DMA... Но мне не дает покоя мысль, что всё должно быть гораздо проще. Какой путь более правильный и менее трудозатратный в моем случае? Подскажите пожалуйста.

top-level по первому варианту решения - в приложении. Ниже приведен отрывок топ-левела, где к выводам NIOS подключен HDL код инициализации SRAM памяти.

...
nios u9(
.clk_0 (CLOCK_50),
.reset_n (reset_n),
.bridge_2_sram_address (SRAM_ADDR),
.bridge_2_sram_byteenablen ({SRAM_UB_N, SRAM_LB_N}),
.bridge_2_sram_data (SRAM_DQ),
.bridge_2_sram_writen (SRAM_WE_N),
.in_port_to_the_sw (in_port_to_the_sw),
.out_port_from_the_led (out_port_from_the_led),
.rxd_to_the_uart (rxd_to_the_uart),
.txd_from_the_uart (txd_from_the_uart)
);
...
always@(posedge CLOCK_50 or negedge iRST)
begin
if(!iRST)
begin
writen_pixel <= 0;
nDW <= 1'b1;
end
else
begin
if (writen_pixel < 400*300)
begin
nDW <= 1'b1;
writen_pixel <= writen_pixel + 1;
rSRAM_ADDR[19:0] <= writen_pixel;
rSRAM_CE_N <= 1'b0;
rSRAM_DQ[15:0] <= 16'h5555;
rSRAM_LB_N <= 1'b0;
rSRAM_OE_N <= 1'b0;
rSRAM_UB_N <= 1'b1;//сташий байт не используется
rSRAM_WE_N <= 1'b0;
end
else
begin
rSRAM_ADDR[19:0] <= 20'hZZZZZ;
rSRAM_CE_N <= 1'bz;
rSRAM_DQ[15:0] <= 16'hZZZZ;
rSRAM_LB_N <= 1'bZ;
rSRAM_OE_N <= 1'bZ;
rSRAM_UB_N <= 1'bZ;//сташий байт не используется
rSRAM_WE_N <= 1'bZ;
nDW <= 1'b0;
end
end //else (nRST==1)
end

assign SRAM_DQ = rSRAM_DQ;
assign SRAM_ADDR[19:0] = rSRAM_ADDR[19:0];
assign SRAM_CE_N = rSRAM_CE_N;
assign SRAM_LB_N = rSRAM_LB_N;
assign SRAM_OE_N = rSRAM_OE_N;
assign SRAM_UB_N = rSRAM_UB_N;
assign SRAM_WE_N = rSRAM_WE_N;
...
Прикрепленные файлы
Прикрепленный файл  camera.v ( 10.78 килобайт ) Кол-во скачиваний: 510
 


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
barabek
сообщение Jul 2 2012, 00:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Вариант в общем-то один. Есть система с Nios. В ней есть контроллер памяти (SRAM или SDRAM), который является slave на шине AvalonMM и соединен с master процессора NIOS (на его шину данных и/или программ). К этому контроллеру памяти необходимо подключить внешний модуль от Вашей камеры. Т.е. в описании проекта камеры перед памятью должен стоять контроллер интерфейса AvalonMM, мастер. Вы подключите оба мастера (nios и камеру) к одному слейву. Когда будете подключать в Qsys (SOPC-builder) автоматически добавится арбитр шины. А уже DMA это следующий шаг для улучшения системы
Go to the top of the page
 
+Quote Post
Shivers
сообщение Jul 2 2012, 03:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



А я бы контроллер камеры сделал так: внутреннее фифо на двупортовой памяти, наружу интерфейс как у SDRAM. И подключить к сгенерированному контроллеру SDRAM.
Go to the top of the page
 
+Quote Post
Petr_I
сообщение Jul 2 2012, 15:58
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 28-09-10
Из: Москва
Пользователь №: 59 793



Цитата(altlogic @ Jun 30 2012, 09:13) *
В итоге вопрос, как же обмениваться данными между HDL и NIOS так и повис в воздухе. Видел советы по использованию в подобных ситуациях SGDMA, DMA... Но мне не дает покоя мысль, что всё должно быть гораздо проще. Какой путь более правильный и менее трудозатратный в моем случае? Подскажите пожалуйста.


Это и есть самый "более правильный и менее трудозатратный". Пишите к своему модулю камеры только интерфейс Avalon-ST. Остальное: DMA, FIFO и прочее уже есть в SOPC. Плюс есть готовые примеры софта (не маловажный момент с точки зрения трудозатрат). SDRAM или SRAM или оба сразу можете использовать в данном варианте без проблем.
Остальные танцы с бубнами имеют смысл при дефиците ресурсов или быстродействия.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 2 2012, 22:28
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Цитата(barabek @ Jul 2 2012, 11:59) *
Есть система с Nios. В ней есть контроллер памяти (SRAM или SDRAM), который является slave...

То есть вы предлагете выбросить из существующего проекта контоллер памяти, написанный на Verilog, и заменить его контроллером SOPC-Builder'а? Я боюсь, всплывут подводные камни по настройке контроллера и подгонке его под VGA-контроллер. Эти два блока тесно связаны между собой в сущесвтующем проекте.


Цитата(Shivers @ Jul 2 2012, 14:37) *
...наружу интерфейс как у SDRAM. И подключить к сгенерированному контроллеру SDRAM.

То есть всё-таки варинат с двумя контоллерами SDRAM имеет право на жизнь?


Цитата(Petr_I @ Jul 3 2012, 02:58) *
Пишите к своему модулю камеры только интерфейс Avalon-ST.

Много сигналов. И не для всех понятно соответсвие шине Avalon... Но если это правильный путь, то тогда нужно идти имsm.gif


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
barabek
сообщение Jul 3 2012, 02:47
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(altlogic @ Jul 3 2012, 08:28) *
То есть вы предлагете выбросить из существующего проекта контоллер памяти, написанный на Verilog, и заменить его контроллером SOPC-Builder'а? Я боюсь, всплывут подводные камни по настройке контроллера и подгонке его под VGA-контроллер. Эти два блока тесно связаны между собой в сущесвтующем проекте.


Можно оставить и Ваш контроллер памяти, добавив в удобном месте прослойку из авлоновских миастера и слейва.


Цитата
То есть всё-таки варинат с двумя контоллерами SDRAM имеет право на жизнь?


Скорее нет. Или это будет такой геморой что ну его.


Цитата
Много сигналов. И не для всех понятно соответсвие шине Avalon... Но если это правильный путь, то тогда нужно идти им sm.gif


Может Вам действительно написать прослойку от шины авалон внутрь Вашего модуля.


При любом раскладе не забудьте добавить арбитр. Просто в сопц он добавляется автоматически и расшаривание памяти там легко реализовать.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 16 2012, 01:14
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Цитата(Petr_I @ Jul 3 2012, 02:58) *
Это и есть самый "более правильный и менее трудозатратный". Пишите к своему модулю камеры только интерфейс Avalon-ST.

На счет Avalon-ST. Оказывается, там ничего и писать то не надо. У Altera есть IP-Core Clocked Video Input, который позволяет ввести изображение с камеры в систему. Но ввод осуществляется в соответсвии с протоколом Avalon-ST Video Protocol. Каким образом затем вывести информацию с интерфейса Avalon-ST на интерфейс Avalon Memory Mapped я не понимаю. Ни одного примера не нашел. Как поток данных с Avalon-ST направить в память?

Похоже нашел где искать ответ. Мне нужен On-Chip FIFO Memory Core. Данный модуль позволяет осуществлять обмен между Avalon-ST и Avalon-MM в обоих направлениях. Читаю документацию на него... Освоил. Не то. Данные с выхода этого буфера должен считывать программно NIOS. Естественно меня такое положение дел не устраивает. Мне нужна аппаратная запись данных с видеокамеры в память. Видимо это сможет сделать контроллер прямого доступа в память Scatter-Gather DMA Controller Core. Почитаю его документацию.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 16 2012, 04:34
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Опишу способ программного ввода данных с видеокамеры в NIOS.
Необходимые компоненты SOPC Builder:
Clocked Video Input (Video and Image Processing\IO\)
On-Chip FIFO Memory (Memories and Memory Controllers\External Memory Interfaces\On-Chip\)
Так как ширина шины камеры сотавляет обычно 10-12 бит, что меньше ширины шины данных NIOS, необходимо добавление адаптеров System->Insert Avalon-ST Adapters, после чего добавляются следующие адаптеры:

Avalon-ST Channel Adapter (Bridges and Adapters\Streaming\)
Avalon-ST Data Format Adapter (Bridges and Adapters\Streaming\)
Streaming\Avalon-ST Timing Adapter (Bridges and Adapters\Streaming\)

FIFO необходимо сконфигурировать в режим Avalon-ST sink to Avalon-MM read slave.

В прграммном обеспечении созданной МПС необходимо также сконфигурировать созданный буфер FIFO при помощи On-Chip FIFO Memory API. Чтение данных из буфера, как я понял осуществляется функциями вида int altera_avalon_fifo_read_fifo().
К выходу FIFO в SOPC Builder в принципе можно цеплять обычный DMA Controller Core, как я понимаю для аппаратного захвата данных.

Документация на On-Chip FIFO Memory Core приведена в главе 16 Embedded Peripherals IP User Guide.
Документация на Clocked Video Input MegaCore Function в главе 10 Video and Image Processing Suite User Guide


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 18:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016