prussta 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Всем доброго времени суток! Подскажите, как лучше организовать систему. Система в целом выглядит так: Есть софт процессор NiosII - он выполняет основные задачи: отвечает на запросы пользователя, принимает какие-то данные, обрабатывает их, выдает ответы и прочее. Также есть два SPI: SPI1 - он принимает данные из вне как только вся система запустилась и SPI2 в который мне нужно эти данные (определенное количество) выплюнуть (этот SPI от Ethernet платки). Получается, что мне нужно постоянно гнать данные из SPI1 в SPI2. Причем, иногда мне нужно в этот поток данных добавлять еще байт своих данных. Как это можно организовать с минимальным участием проца? Чтобы он успевал делать свою основную работу и меньше отвлекался на эту передачу? Может есть какая-то переферия для таких задач? Подскажите куда посмотреть? Частота работа Niosa 100MГц, а данные на SPI1 приходят с частотой 24Мгц. Пока у меня рисуется стандартный вариант: по прерыванию на прием по SPI1 я через DMA записываю поступившие данные в память, как только пришло необходимое кол-во байт, выставляю флаг. И в основном цикле программы по этому флагу отправляю эти данные в SPI2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Всем доброго времени суток! Подскажите, как лучше организовать систему. Система в целом выглядит так: Есть софт процессор NiosII - он выполняет основные задачи: отвечает на запросы пользователя, принимает какие-то данные, обрабатывает их, выдает ответы и прочее. Также есть два SPI: SPI1 - он принимает данные из вне как только вся система запустилась и SPI2 в который мне нужно эти данные (определенное количество) выплюнуть (этот SPI от Ethernet платки). Получается, что мне нужно постоянно гнать данные из SPI1 в SPI2. Причем, иногда мне нужно в этот поток данных добавлять еще байт своих данных. Как это можно организовать с минимальным участием проца? Чтобы он успевал делать свою основную работу и меньше отвлекался на эту передачу? Может есть какая-то переферия для таких задач? Подскажите куда посмотреть? Частота работа Niosa 100MГц, а данные на SPI1 приходят с частотой 24Мгц. Пока у меня рисуется стандартный вариант: по прерыванию на прием по SPI1 я через DMA записываю поступившие данные в память, как только пришло необходимое кол-во байт, выставляю флаг. И в основном цикле программы по этому флагу отправляю эти данные в SPI2. Мне кажется тут проще иметь столько буферных хранилишь для данных, сколько типов данных. Т.о. в момент готовности передать в SPI2 нужно взять в соответствии с протоколом данные из разных буферных хранилищь и передать. В качестве хранилишщь удобно использовать FIFO. Если функционально расписать по блокам: 1)блоки FIFO; 2) простенький блочек, который соберет в кучу данные с разных FIFO в соответствии с протоколом; 3) SPI передатчик. FIFO может заполняться с различной частотой, а вычитываться из всех FIFO будет с одной частотой равной частоте передачи данный SPI2. В итоге процессор сможет в режиме прямого доступа в память все сливать в своё FIFO, другие типы памятей тоже заполнятся как им будет удобно, а все вычитываться будет строго со скоростью SPI2. ИМХО Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба 2) простенький блочек, который соберет в кучу данные с разных FIFO в соответствии с протоколом; я правильно понимаю, что этот блочек это просто небольшая функция, которую будет выполнять тот же NiosII в основном цикле? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба я правильно понимаю, что этот блочек это просто небольшая функция, которую будет выполнять тот же NiosII в основном цикле? Можно и процессором, но мне кажется fpga здесь разумней выбрать. Все что я описал я предполагал реализовать на fpga я правильно понимаю, что этот блочек это просто небольшая функция, которую будет выполнять тот же NiosII в основном цикле? Если не ясно как его реализовать, тогда спрашивайте...поясню Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Можно и процессором, но мне кажется fpga здесь разумней выбрать. Все что я описал я предполагал реализовать на fpga Если не ясно как его реализовать, тогда спрашивайте...поясню Так я и так реализую на fpga, использую софтпроцессор NiosII для управления всей подключенной переферией - SPI, FIFO, DMA и т.д. Делаю на Cyclone III. Или я не так понимаю? Если не ясно как его реализовать, тогда спрашивайте...поясню Поясните, пожалуйста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Так я и так реализую на fpga, использую софтпроцессор NiosII для управления всей подключенной переферией - SPI, FIFO, DMA и т.д. Делаю на Cyclone III. Или я не так понимаю? Тогда я все верно понял. Поясните, пожалуйста У вас есть допустим 2 FIFO. 1-ая (FIFO1) заполняется процессором в режиме DMA, а вторая с порта SPI1 (FIFO2). (На этом этапе необходимо разобраться с принципом FIFO и организацией DMA.) Как известно FIFO позволяет согласовывать различные клоковые домена. В вашем случае можно предположить 3 клоковых домена, а именно 1-ый ПРОЦЕССОРНЫЙ, 2-ой SPI1, 3-ий SPI2. Т.е. в FIFO1 с удобной скоростью для процессора, в FIFO2 пишется с скоростью прихода данных от SPI1, а SPI2 загружаются данные с удобной для SPI2 скоростью. ________________________________________________________________________________ __________________________________________________________ Мы разобрались как записать в память. Теперь разберемся как из нее вычитать. Вычитываем из памятей FIFO1, FIFO2 c скоростью SPI2. Но так как мы передаем данные от двух источников (FIFO1, FIFO2) необходимо вычитанные данные миксовать необходимым образом (это из протокола SPI2 видно). Если микс реализовать на verilog, тогда это будет цикл case. ___________________________________________ уточняйте свой вопрос. Что именно не ясно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Ах, вот оно что! Спасибо, Дмитрий, за разъяснения. Я просто не пишу на аппаратных языках, поэтому и забыла про этот вариант и рассматривала стандартные компоненты, которые уже есть. Но теперь все стало понятно. Будем обдумывать этот вариант. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Я просто не пишу на аппаратных языках, поэтому и забыла про этот вариант и рассматривала стандартные компоненты, которые уже есть. Схемотехническом редакторе? рисуете схемки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба Схемотехническом редакторе? рисуете схемки? Да, иногда приходится и этим заниматься)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 3 апреля, 2015 Опубликовано 3 апреля, 2015 · Жалоба У вас есть допустим 2 FIFO. 1-ая (FIFO1) заполняется процессором в режиме DMA, а вторая с порта SPI1 (FIFO2). Dmitriyspb, а как вы предлагаете с порта SPI1 заполнять FIFO2? Есть варианты его заполнения без участия процессора? Даже если использовать DMA, то получается, что надо при приходе данных в регистр SPI1 нужно вызывать ф-ию alt_dma_rxchan_prepare(...), чтобы DMA передал эти данные в FIFO2 . Можно ли как-нибудь это обойти? В идеале хотелось бы так настроить передачу, чтобы данные приходя в SPI1 сразу бы записывались в FIFO2, и проц при этом не беспокоить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 3 апреля, 2015 Опубликовано 3 апреля, 2015 · Жалоба Dmitriyspb, а как вы предлагаете с порта SPI1 заполнять FIFO2? Есть варианты его заполнения без участия процессора? Даже если использовать DMA, то получается, что надо при приходе данных в регистр SPI1 нужно вызывать ф-ию alt_dma_rxchan_prepare(...), чтобы DMA передал эти данные в FIFO2 . Можно ли как-нибудь это обойти? В идеале хотелось бы так настроить передачу, чтобы данные приходя в SPI1 сразу бы записывались в FIFO2, и проц при этом не беспокоить. вы настоящий программист :). не проще сделать отдельный контроллер, реализующий запись SPI1->FIFO2, который снимет с процессора эту задачу? SPI протокол известен, скорость записи в фифо гораздо выше скорости SPI. все сведется к сдвиговому регистру, собирающего слова от SPI, и выставляющим строб записи для фифо как только это слово будет собрано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 5 апреля, 2015 Опубликовано 5 апреля, 2015 · Жалоба Да, подобное и нужно)) контроллер этот как реализовать? написать на аппаратном языке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 6 апреля, 2015 Опубликовано 6 апреля, 2015 (изменено) · Жалоба с фифошкой никогда плотно не работал, но на скорую руку набросал логику фунциклирования - как себе это представляю. в принципе осталось только порты прописать и разобраться с фифо и ее подключить. зы переменные в капсе - ин/аут порты, строчные - внутренние переменные ззы отцы-профессионалы, поправьте меня если что - сам то я начинающий лошарик :) process (CLK_SPI) rgs:std_logic_vector(31 downto 0); ct:std_logic_vector(4 downto 0); begin if CLK_SPI'event and CLK_SPI='1' then if CS_SPI='1' then rgs(31 downto 0)<=rgs(30 downto 0)&IN_SPI after 100 ps; else rgs<=rgs after 100 ps; end if; if CS_SPI='1' then ct<=ct+1 after 100 ps; else ct<=ct after 100 ps; end if; end if; end process; data_ready_spi<= '1' when ct="11111" else '0'; process (CLK_FIFO) data_ready_fifo, data_ready_fifo_d:std_logic; begin if CLK_FIFO'event and CLK_FIFO='1' then data_ready_fifo<=data_ready_spi after 100 ps; data_ready_fifo_d<=data_ready_fifo after 100 ps; if RESET='1' then WREN_FIFO<='0' after 100 ps; elsif data_ready_fifo='1' and data_ready_fifo_d='0' then WREN_FIFO<='1' after 100 ps; else WREN_FIFO<=WREN_FIFO after 100 ps; end if; DATA_FIFO<=rgs after 100 ps; end if; end process; тут же первый косячок - надо следить за тем чтобы данные всегда были по 32 бита - иначе собьется насчет в счетчике, из-за того что он привязан к синхре SPI, а она появляется уже после того как выставится CS_SPI. в общем стоит вопрос обнуления счетчика :) Изменено 6 апреля, 2015 пользователем GAYVER Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 6 апреля, 2015 Опубликовано 6 апреля, 2015 · Жалоба Да, подобное и нужно)) контроллер этот как реализовать? написать на аппаратном языке? Для Вас это задача сложная потому, что вы не совсем разобрались с такими ресурсами как: 1. Система на кристалле (что такое и для чего она была рождена на свет) 2. FPGA - принцип реализации КЦУ и ПЦУ на базе ПЛИС. Не суть важно как вы будете реализовывать контроллер записи/чтения. Можно в схемотехническом редакторе нарисовать или же описать работу устройства используя языки программирования HDL. ________________________________________________________________________________ _____ И САМОЕ ГЛАВНОЕ!!!!!!!!! Срочно нарисуйте структуру, того устройства который разрабатывайте. Укажите задачи которые решает процессор, а какие решает fpga. Иначе Ваш монстр погибнет в зачатом состоянии. Разберитесь с принципом работы Вашего будущего устройства на функциональном уровне. И желательно бы знать особенности программирования на ПЛИС. Потому как (К БОЛЬШОМУ СОЖАЛЕНИЮ ВСЕГО СООБЩЕСТВА ПРОГРАММИСТОВ) программировать FPGA и программировать процессор вещи достаточно сильно разные. ________________________________________________________________________________ __ Вернемся к вашим вопросам. Spi приёмники и передатчики, fifo также удобно реализовать на плис. А задача организации процесса записи в память или передатчик - это достаточно простая задача требующая конкретных вопросов. _______________________________________________________________________________ Поэтому рекомендую реализовать FIFO, SPI_TX, SPI_RX по отдельности на базе FPGA. А блок (контроллер) обеспечивающий запись и чтение для сопряжения процессора, FIFO, SPI_TX, SPI_RX реализовывать имея конкретные сигналы и вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prussta 0 6 апреля, 2015 Опубликовано 6 апреля, 2015 · Жалоба Для Вас это задача сложная потому, что вы не совсем разобрались с такими ресурсами как: ...... Dmitriyspb, да Вы правы, что-то разрабатывать на ПЛИС приходится впервые, поэтому много темных мест)) и спаисбо за советы! программировать FPGA и программировать процессор вещи достаточно сильно разные. да, знаю, я только обзорно знакома с аппаратными языками, поэтому и возникают "новичковые" вопросы) программировать fpga сама не буду(если что). А здесь же хотелось получить альтернативные идеи по общей организации системы, потому что мои идеи не удались. Я так понимаю, что без блока на fpga, организующего прием данных с SPI1 не обойтись, потому что если данные идут постоянно, то программа все время "висит" в обработчике прерывания по приему SPI1 и даже не выходит в основной цикл. ( Это я попробовала при помощи Niosа принимать) Хотя не совсем мне понятно почему так, ведь данные идут с частотой 30 Мгц, а процессор работает на 157МГц. Почему он не успевает выходить в основной цикл? В прерывании только считываю пришедшие данные. Неужели так много занимает это времени....хмм... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться