Как микроконтроллер может читать данные на скорости 1.6 Gbps

    Всем доброго времени суток! никогда такого не было и вот опять. С моей прошлой статьи прошло уже достаточно времени, а оно ставит новые задачи. И если раньше я передавал данные на скорости 100 Mbps, то теперь пришлось замахнуться на 1600 Mbps…

    На КДПВ — герой нашего романа — он смог читать данные на такой скорости!



    Итак, мой очередной проект потребовал читать поток данных вида 32-бита на скорости 50 МГц (это и будет, кстати, тот самый 1.6 Gbps) в количестве заранее известном — пусть будет 10000. Было бы просто отлично читать сразу с помощью DMA из одного порта — но вот, к сожалению, подходящих процессоров не нашлось (надеюсь, в комментариях это дело кто-нибудь поправит), у всех подходящих по скорости порты почему-то 16-битные.

    Но такая мелочь нас не остановит — будем читать из двух портов сразу! Правда, это в общем случае не всегда удастся делать с нужной степенью контроля и синхронности, но в нашем случае все не так печально — есть сигнал, после которого 20 ns данные будут на порту держаться.

    А так как процессор у нас — stm32h750 на 400 Мгц, а шина и таймеры на 200 Мгц, то все должно получиться.

    Казалось бы простой случай — по сигналу запускать одну пересылку DMA. Но вот только у DMA нет такой возможности — порт может выдать прерывание, но не может управлять DMA. Но зато у нашего процессора есть хорошая штука — DMAMUX, в котором есть генератор событий для канала DMA, а вот в этом генераторе есть две подходящие возможности — или использовать прерывание EXTIT0 или сигнал от таймера TIM12 (такая вот странная фантазия была у разработчиков чипа).

    По прерыванию мы не успеем по времени — на даже пустую отработку нужно порядка 47 тактов, а такт у нас — 2.5 ns…

    Зато успеем по таймеру. Осталось только затактировать таймер от внешнего сигнала в 100 МГц, причем длину таймера ставим в 1 и по его выходу TRGO будет срабатывать генератор DMAMUX, а уж он-то задаст команду на пересылку DMA и тот прочитает порт и перешлет данные в память.

    Но стоп! Порт-то 16-бит, а у нас 32… Что же, можно попробовать читать еще второй порт… Только вот для этого нужен второй канал DMA, и еще это займет ту же шину — то есть прочитать-то мы успеем, но вот можем не успеть записать данные в память. Что-же, теоретически, у этого процессора есть разные типы памяти, и на большом рисунке структуры процессора можно видеть, что и DMA и память RAM_D1 сидят на одной и той-же шине с частотой 200 МГц. Осталось проверить практически.

    DMA1->LIFCR |= ~0;
    DMA1_Stream0->CR = (0b11 << DMA_SxCR_PL_Pos) | (0b01 << DMA_SxCR_MSIZE_Pos)
        | (0b01 << DMA_SxCR_PSIZE_Pos) | DMA_SxCR_MINC;
    DMA1_Stream0->M0AR = (uint32_t) data;
    DMA1_Stream0->PAR = (uint32_t) &(GPIOE->IDR);
    DMA1_Stream0->NDTR = 10000;
    DMA1_Stream1->CR = (0b11 << DMA_SxCR_PL_Pos) | (0b01 << DMA_SxCR_MSIZE_Pos)
        | (0b01 << DMA_SxCR_PSIZE_Pos) | DMA_SxCR_MINC;
    DMA1_Stream1->M0AR = (uint32_t) data2;
    DMA1_Stream1->PAR = (uint32_t) &(GPIOD->IDR);
    DMA1_Stream1->NDTR = 10000;
    DMAMUX1_Channel0->CCR = DMAMUX_CxCR_EGE | (1);
    DMAMUX1_Channel1->CCR = DMAMUX_CxCR_EGE | (2);
    DMAMUX1_RequestGenerator0->RGCR = DMAMUX_RGxCR_GE
        | (0b01 << DMAMUX_RGxCR_GPOL_Pos) | (7);
    DMAMUX1_RequestGenerator1->RGCR = DMAMUX_RGxCR_GE
        | (0b01 << DMAMUX_RGxCR_GPOL_Pos) | (7);
    DMA1_Stream0->CR |= DMA_SxCR_EN;
    DMA1_Stream1->CR |= DMA_SxCR_EN;
    TIM12->CNT = 0;
    TIM12->CCMR1 |= TIM_CCMR1_CC2S_0;
    TIM12->CR2 = (0b010 << TIM_CR2_MMS_Pos);
    TIM12->CR1 |= TIM_CR1_CEN;
    while (DMA1_Stream0->NDTR)
        i++;
    TIM12->CR1 &= ~TIM_CR1_CEN;
    

    Ну и конечно, надо разместить массивы data и data2 в нужном сегменте памяти, это делается так:

    __attribute__((section(".dma_buffer"))) uint16_t data[10240],data2[10240];
    

    а в файле для линковщика указываем:

    .dma_buffer : {
     *(.dma_buffer)
     } >RAM_D1
    

    Для проверки, ну и как первый вариант, был реализован просто тупое копирование с помощью
    центрального процессора (все же 400 МГц):

           uint16_t * ptr = cpudata;
            volatile uint16_t * src = &(GPIOE->IDR);
            volatile uint16_t * src2 = &(GPIOD->IDR);
            for (register int i = 0; i < 10000; i++) {
                    *ptr++ = *src;
                    *ptr++ = *src2;
            }
    

    Для проверки данные cpudata размещались в разной памяти, быстрее всего подошла (ну она, правда, всего 64К) сверхбыстрая память (тоже 400 МГц) DTCMRAM.

    Результаты


    В процессе испытаний выяснилось, что с помощью CPU можно читать на скорости 12.5 МГц из двух портов. И 25 МГц из одного. Так что вариант не работает…

    С помощью DMA и такой-то матери TIM12 удалось успешно читать на скорости 50 МГц, причем за несколько часов теста ошибок не было ни одной. Читались оба порта, но замерить, насколько отстает чтение по второму DMA, пока не удалось…

    Так что в моем (немного вырожденном) случае, удалось достигнуть скорости передачи информации в процессор stm32h750 на скорости 32x50 = 1600 Mbps.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 123

      0

      Расскажите, откуда такая широкая шина данных приходит, что то не очень современное?

        0
        хм, мне правда, казалось, что как раз это весьма современно — большие потоки данных :) Странное тут — использование микроконтроллера… А вот откуда — это, вообще-то, тема следующей статьи… но так, по секрету — данные идут из fpga, а туда — из быстрого ацп, я их замедляю в fpga.
          0
          по секрету — данные идут из fpga, а туда — из быстрого ацп, я их замедляю в fpga.

          Делаете DDC SDR приемник?
            +4
            что вы :) — гораздо круче! Ждите, где-то через месяц напишу, что получилось — но там речь пойдет уже об 6.4 Gbps (если все получится, конечно)…
              +1
              Возьмите уже USB 3.0, не мучайтесь
                0
                It implements an architecture that enables 375-MBps data transfer from GPIF II — так вот они пишут. Так что — 375 не играет против 1600! Но за наводку — спасибо.
                  +1
                  Максимум у usb 3.0 5 гигабит/с. 100 мегабайт в секунду делал лично, для 2-х 16-ти разрядных АЦП.
                    0
                    если не секрет — что за АЦП? Они на 100 МГц данные могут давать?
                      0
                      они на 25 МГц были. какие точно, уже не помню. вы лучше скажите зачем 100 МГц. Просто, AD9288, судя по даташиту, не шибко-то хорошие.
                        0
                        жаль, что 25… AD9288 они конечно 8-битные, но довольно бодрые. Хотя и jitter великоват. Но главное — они дешевые…
                        0
                        Даже на 400 мгц.
                          0
                          Это какие?
                            0
                            Я работал с этой. ADS5401, 12-Bit Resolution, Maximum Clock Rate: 800 Msps, Input Bandwidth (3 dB): > 1.2 GHz.
                              0
                              Да уж, я посмотрел — ее и в продаже не очень-то найдешь… а сейчас, видимо, из-за санкций совсем исчезла.
                      +1

                      Я конечно извиняюсь но мне кажется что вы мегобиты(Mbps) путаете с мегабайтами в секунду(MBps)

                        +1
                        375 — это в мегабайтах/с! Там сам порт вообще до 100МГц*32бит, но где-то дальше накладные расходы на сборку пакетов снижают до тех самых 375МБ/с.
                          +1
                          ну тогда да — интересный вариант получается.
                      0
                      А сжатие (хотя бы какое-нибудь простенькое) использовать не пытались? Может, удастся снизить поток данных при помощи него?
                      Если, конечно, приём такого потока не является для вас самоцелью)
                    0
                    А нельзя сильнее нагрузить fpga?
                      0
                      а в каком смысле? Поток-то изначально 1.6 Gbps — просто я его на fpga из 16-битного делаю 32-битным, при этом частота падает с 100 до 50 МГц. Но сам-то поток никуда не девается. Я пробовал вообще 100 МГц пихать в MCU — не лезет! Ну нечем просто читать и писать на такой скорости… И fpga у меня простенькое — MAX-II (в прошлой статье как раз с ним разбирался...), это самое простое и дешевое оказалось решение.
                      Но я бы с удовольствием узнал, как это можно сделать.
                        0
                        может просто fpga взять xilinx какой нибудь у которых ЦП на борту. и там считать?
                          +1
                          Это очень дорого и непонятно для чего — там тоже ведь шина не резиновая. Те же яйца, только в профиль — поток не понятно, как вводить…
                            0
                            У латтис есть плисы как раз для превращения последовательного потока в параллельный

                            Как на счет того, чтобы сделать не 32 бита, а больше? Раза в 4. Тогда скорость ещё упадет и станет легче
                              0
                              так свободных портов мало — максимум еще один можно выделить. И на каждый порт — еще канал DMA, а это еще нагрузка не внутреннюю шину процессора — тут похоже вообще предел для нее 1.6 Gbps
                          0
                          а если использовать встроенный процессор на фпга(ну вроде ниос или зайлинковский аналог)?
                            0
                            вот думал в эту сторону — но сложно и дорого это не мой путь в данном случае…
                            0
                            Извините за профанский вопрос, почему бы не использовать для высокоскоростной передачи данных интерфейс SATA? Реализация SATA в виде IP core доступна для fpga, есть бесплатные реализации. Интерфейс отработанный, быстрый, симметричный, с низкими задержками, простой в аппаратной реализации, без сложной синхронизации, с простыми разъёмами и массой качественных кабелей длиной до 1м.
                              +4
                              Эм-м, как бы объяснить — вот есть такая штука, ацп и у нее просто 16-битный выход, на котором с частотой 100 МГц появляются данные, никакого интерфейса другого нет (SATA уж тем более). И вот надо эти данные как-то читать без задержки даже на 1 ns и так 10000 раз подряд. Кстати, у SATA — это 1-битный поток, на что намекает первая S и скорость у него 300 Mbps (у SDATA — 3 конечно 6 Mbps). Ну и там, в этом SATA свой сложный протокол. К нему и надо подготовить данным, может быть… Но лучше их потом в USB или ETH запихать — легче будет…
                              И вот чтобы эти наши данные превратить в SATA — довольно сложное fpga надо, а я сложное и дорогое тут не хотел бы…
                                0
                                Про требования к отсутствию задержек понял. А АЦП с последовательным выходом, соответственно, дадут ещё 16-кратное увеличение частоты.
                                Но ведь вычислительно SATA должен быть легче USB, и нужно реализовать лишь часть функциональности. Соединение точка-точка, никаких очередей, настроить один раз передачу данных в одну сторону (как делают контроллеры в режиме DMA) и потом просто подавать данные.
                                Про выбор привычного и неизбыточного решения тоже, конечно, понятно.
                                  0
                                  заметьте — про USB я ничего не говорил. Это уже следующая задача будет, куда снятые данные отдавать. Тут именно что надо их взять как-то…
                              0
                              ft601q до 100МГц х 32 бита, правда фифо 16кБ всего. но 1.6Gbps должен через неё непрерывно пролазить.
                              у блэкфинов параллельный порт до 66МГц х 16бит, и у некоторых из них портов больше чем один да и разрядности до 24 бит встречаются,
                              но можно и распараллелить на два самых дешевых bf592 (по 1.99$ за 1k штук у производителя, получится конечно дороже чем stm32f750 за 3.5$, но не намного)
                              хотя может просто взять плисину немного пожирнее,
                              ICE40UP5K-SG48I qfn48, 6$ за штуку и мигабит памяти?
                              а вообще как АЦП 4 штуки lpc4370 будут не особо дороже чем два ad9288, и АЦП 12битный, правда 80МГц, а не 100, зато сразу с памятью и хоть с USB, хоть c ethernetом, хоть с последовательным портом.
                                0
                                Как-то не очень понял про lpc4370 — почему вы думаете, что 80 МГц это частота сэмплирования, а не частота ADC? Так-то у них не больше 6 Msps…
                                Но список вариантов у вам получился большой. Я вот никак не смог придумать, что делать с плисом полезного — большой плис со встроенной памятью дорог, а маленький бесполезен…
                                  +1
                                  встроенный АЦП у lpc4370 — 80Msps, в даташите так написано. откуда вы взяли цифру 6Msps? была какая-то поделка, labtool вроде — просто плата с усилителями и разъёмами для LPCLink2, там полоса была ограничена в несколько МГц просто предусилителями перед АЦП.
                                  а полоса пропускания самого АЦП под 250МГц
                                  вам данные всё равно в результате надо в ПК перегнать, если средний поток данных не сильно большой, и эти 40кБайт данных прилетают, грубо говоря, раз в секунду, то хоть по последовательному порту можно из плис их достать. или через какой-нибудь usb мост от ftdi, например ft232h. ethernet со стороны плис тоже не особо сложно делается.
                                  вышеуказанный ICE40UP5K c мегабитом памяти стоит дешевле stm32f750
                                  а 5к ячеек и на soft процессор хватит чтобы протокол общения с ПК на С/C++ писать, а не на верилоге.
                                    0
                                    действительно, для ADCHS — 80 Msps, правда пишут, что no matter how you juggle with the FIFO, DMA, and interrupt, it will all boil down to the relation that the core has only slightly greater than 5 clock cycles per ADC sample — то есть в реальности без обработки можно только 40 Msps.

                                    Но это не главное — АЦП тут должны быть внешние из-за точного тактирования (речь идет о долях такта).

                                    А вот fpga с памятью может оказаться удачной идеей. Но я пока не нашел таких же дешевых решений. Ту что вы указали — мало пинов (у меня меньше 42 не выходит), мало памяти — 1 кбит (а надо 16 кбит), мала частота — у меня MAX-II 5 грейда еле справляется с его задержками распространения по LUT менее 1 ns, а тут совсем не то.
                                      0

                                      MAX 10 по цене не дороже микроконтроллера + MAX II выйдет. 10M04xxx — 189kbit памяти 4K LE. Если будете покупать много, можно цену в районе 5-6$ выпросить.

                                        0
                                        то что пишут про 5 clock cycles per sample, там человек пытается на ходу ещё и обрабатывать данные и двойная пересылка через два буфера, если же надо просто сложить N отсчётов из АЦП в память, DMA со всеми 80Мsps справляться должно, процессор вообще при этом спать может.
                                        с синхронизацией смотреть надо, думаю есть какая-нибудь возможность аккуратно затактировать ФАПЧ АЦП от внешнего источника с нужной фазой. но если клок не равномерный, а надо по внешнему клоку, со случайной фазой, сэмплировать данные, то не получится.

                                        памяти у ICE40UP5K мегабит, а не килобит, максимум 70МГц х 64 бита = 4.5Гбит/c (4 блока 16 битных по 256кбит)
                                        а количество ног у АЦП: 16бит данных и два клока, это 18, оставшихся 20 ног вполне хватит для любого разумного интерфейса с ПК.
                                          0
                                          да, пожалуй надо рассмотреть решение на ICE40UP5K — очень даже заманчиво! И по цене вполне нормально.
                                            0
                                            я бы всё-таки с ft600q для начала попробовал, напрямую без плис/МК, там возможно лишь пара логических элементов/инверторов понадобится, чтобы АЦП с синхронным fifo склеить, а если требований к 100МГц клокам особых нет, их можно прям с ft600q взять, и потом задержать/инвертировать для interleaving АЦП.
                                              0
                                              так ведь получится только в поток USB 3.0 превратить, а его же потом надо куда-то читать?
                                                0
                                                ну может, воткнуть этот USB провод в ПК?
                                                или вы делаете портативный прибор и данные в этом же stm32 и будут обрабатываться?
                                                  0
                                                  в ПК обязательно воткнем! Но не сразу — в задумке таких блоков аж 4 штуки (как минимум) — все не воткнешь, да и ПК захлебнется и от одного…
                                                    0
                                                    от одного не захлебнётся, но от четырех пожалуй да, только если дополнительные USB3 порты на PCIe воткнуть, но тогда действительно проще всё-таки какое-нибудь достаточно большое fifo и любой медленный интерфейс.
                                            0
                                            посмотрел характеристики — слишком медленная… по памяти 70 МГц, задержки LUT 9 ns. Но идея, может, и стоящая…
                                              0
                                              70МГц * 64бит = 4.5 Gbps
                                                0
                                                откуда же 64 бит — всего (!) пинов-то 39, из них на вход 16, да клоки, да… в общем — 16 бит и всё…
                                                  0
                                                  завести внутрь надо 100МГц х 16бит, а вот уже внутри их можно превратить в 25МГц х 64 бит и спокойно засунуть в 70МГц память. Она там организована так, 4 отдельных блока с 16бит шинами.
                                                    0
                                                    видимо, так можно, но очень смущает время LUT 9 ns — это же почти на пределе для 100 МГц — как-то не очень я представляю какую-нибудь асинхронную схему… А с синхронной можно и пролететь по таймингам…
                                                    У меня вообще пределы по времени не более 1.4 ns выходят для нормальной работы.
                                    0
                                    MAX-II — дикое старье. Предлагаю заказать на Алиэкспрессе отладочную плату с FPGA Cyclone II EP2C5T144. Я покупал рублей за 800. Cyclone II имеет встроенные блоки памяти. Т.к. количество данных вполне определенное, то можно сконфигурировать память как двухпортовую. В один порт писать с большой скоростью, а читать и отдавать наружу через второй порт. Это можно сделать с более низкой частотой, не кратной частоте записи. Можно даже сжатие данных реализовать. Часть семплов передавать полностью, а часть как разницу между сэмплами. Аналогично сжатию видео.
                                      0
                                      я смотрел, подходит разве только начиная с cyclon-iv E (40) — не сказать, чтобы очень дорого. Конечно, сейчас я использую max-II за 89 рублей чип. Если только использовать один циклон на все каналы (их 8), то наверно, будет лучше… Только вот это для меня вызов своего рода — я первую свою программу для fpga написал в этом году только… что-то нет уверенности…
                                        0
                                        Надо верить в свои силы) Когда я впервые столкнулся с плис, мне пришлось писать обработку видео в реальном времени, и все получилось, хотя я видел плис первый раз в жизни. Но там не сложная обработка была, типа автоконтраста, и автояркости и тд). Сейчас сменил работу, с плис года 4 не работал.
                                  +1
                                  а что за ацп используете?
                                    +1
                                    простое AD9288 — там на борту два ацп, клок 100 МГц
                                +1
                                Получилось и отлично, но сразу возникает вопрос о синхронизации таймера на 100МГц с входящим сигналом (да, занудничаю). А если его нет, то рано или поздно данные разъедутся как в детстве показывали по телевизору другой телевизо и плыла полоса кадра, пол кадра были старыми и пол кадра — новыми.

                                И оффтоп, куда столько данных, у H750 мегабайт ОЗУ, если по сусекам поскрести?
                                  +1
                                  я, наверно, не очень подробно описал окружение — дело тут в том, что сигнал 100 МГц и тактирование самого процессора — синхронные. Да, есть, конечно, вероятность сбоя, но, во-первых, сам характер данных таков, что можно (иногда) и пропустить что-то, а, во-вторых, я тут посчитал — сама вероятность где-то 1 сбой на 100000 пересылок. А у меня блок из 10000… и между блоками промежуток времени большой и применяются дополнительные меры по синхронизации.

                                  Ну вот и ответ — куда — данных не очень много всего 40К. А памяти-то меньше можно использовать — только RAM_D1 а это 512К
                                    +1
                                    По идее, можно же дать клок с FPGA?
                                      +2
                                      так и делаю.
                                        0
                                        тогда все шикарно, тем более, H750, про которого толком нет инфы, а RM на 1200 страниц, попробуй освой разом.
                                          +2
                                          да, есть такое — но очень понятный, кроме двух вещей :) — есть там DMA BDMA DMAMUX, а еще MDMA — вот с ним мне ничего не понятно пока. И еще есть странный раздел про DLYB — ну то есть что это, понятно, как работает — тоже, но к нему нет доступа!!! И вот зачем описывать то, до чего нет доступа — непонятно…
                                            0
                                            по той же причине, по которой они кричат про 480МГц тактовой.
                                              0
                                              да нет, 480 реально есть… в ядре! А так шины и 200 и 100. В общем, Cortex-M7 конечно, вещь, но скорости это не особо добавляет
                                  0
                                  А можно всеже узнать, что это такое вы читаете на таких скоростях? (Сетевые пакеты, чтоли, обрабатываете?)
                                  Да и одно дело только прочитать и совсем другое — ещё и обработать, да вернуть результат. Хватает?


                                  (Пока писал, ответили выше...)
                                    +1
                                    все же отвечу — вот так вот оказалось, что использовать stm32h750 — самый дешевый способ обработки потока (он там не очень-то обрабатывается, скорее накапливается и перемешивается)…
                                      0
                                      раз данные у вас поступают с fpga, почему там же их не 'накапливать и перемешивать'?
                                        0
                                        fpga с памятью дороже микроконтроллера
                                    +1

                                    Логично поставить два чипа SRAM и работать с ними по очереди (ping-pong buffers). Дело в том, что H750 обработать эти данные все равно не успеет на такой скорости.

                                      0
                                      Тут такая тактика — читаем 10К данных, потом их спокойно перерабатываем (ну точнее подготавливаем и дальше передаем). А вот два чипа памяти ставить — наверно, можно организовать управление от fpga, но даже не знаю — а они успеют? И потом — все равно надо потом с них читать, время тратить… ну и это все равно дороже выходит — нет же дешевых SRAM? Вот и выходит, что как-бы процессор проще и дешевле.
                                        0

                                        Зато SRAM можно взять широкую и быструю, и кинуть данные на 6,4 Гбит/с.

                                          0
                                          вы удивитесь, но даже SRAM на 50 МГц стоит от $30 и это с организацией 8-бит (ну может и можно найти 32-бит..). А DRAM и все ее разновидности тут не проходят, хотя и дешево… А процессор — $3.50
                                            0
                                            значит у вас что-то массовое? Потому что нам, микробам они достаются по $6.
                                              0
                                              ну $6 это тоже ведь неплохо — до этой партии я такие и использовал, но повезло :)
                                              0
                                              Удивлюсь, т. к. можно найти SRAM с 32-битной шиной на 200 МГц дешевле $10 (или около того).
                                              И удивлюсь, что stm32h750 стоит $3.50, или это не о нём?
                                                0
                                                с такими надо работать по специальному протоколу обычно. Тут надо SRAM типа flow-througthput с двумя портами, а они как раз и стоят от 30.
                                                А $3.50 — это о нем, так вот получилось, повезло…
                                                  +1
                                                  это честные фифо столько стоят, вроде SN74V245.
                                                  а вот тупо память IS61LV6416-10TL — 1.5$,
                                                  АЦП садится ей прямо на шину данных, на шину адреса — просто счётчик.
                                                  и абсолютно любой медленный МК с достаточным количеством ног (или сдвиговых регистров), который сбрасывает счётчик для начала записи в память, а после того как данные легли в память, переводит АЦП в standby и его выходы в третье состояние и уже медленно и печально может доставать данные из памяти на любой скорости.
                                                    0
                                                    оу, это интересный способ! Конечно, тупо память не успеет — тут нужно не более 5 ns, а у нее 10. Но сам способ вообще-то имеет право на существование. Правда, я по мотивам все комментов все-же пробую скомбинировать ацп-плис-мк, так как мк все же нужен (и нужен 480-Mbps USB), ну и получается так проще и дешевле.
                                                      0
                                                      успеет, 100МГц это как раз 10нс цикл памяти.
                                                      вместо МК можно опять же ft[2]232H, но так как всё равно нужна логика чтобы склеить его с памятью, рядом всё равно какую-нибудь cpld ставить придётся, но вот данные через неё протаскивать не обязательно, она может быть совсем мелкая, просто стоять рядом и изображать счётчик адреса.
                                                0
                                                CY7C1338G 4-Mbit (128K × 32) 100-MHz, покупал дешевле 500р в Мск. в баксах будет 7-8 баксов.
                                                  0
                                                  Это ж в партии от 10000шт, если верить сайту производителя. Или с кем то скооперировались?
                                                    0
                                                    просто повезло, но партия перепала небольшая, к сожалению.
                                            0
                                            У чипов stm32h7хх и stm32f7xx -есть интерфейс qspi, сразу на два чипа памяти.
                                            AD9288 при использовании внешней логики — легко формирует DDR режим. Трамбуя один канал в 4 бита на скорости в 100МГц(а каналов два). Железо уже оптимизировано на такую скорость захвата, ничего изобретать не нужно.
                                            Есть минус: пока идёт захват — к быстрой памяти лучше не обращаться.
                                              0
                                              наверно, так тоже можно… но сами видите — QSPI только (!) на два чипа, а у AD9288 — четыре потока по 4 бита — и что делать?
                                                0
                                                У вас 2 чипа AD9288???
                                                А если всё-же один — то все данные прекрасно трамбуются в DDR режиме.
                                                  0
                                                  нет, тут вот что — один чип ad9288 — это по-сути два ADC в одном корпусе, потому у него 2х8 бит на выходе. А так как там еще и интерлив, то данные все равно надо прогонять через fpga. Но как полученный поток трамбовать в DDR? В QSPI я понимаю как — пропускаем установки адреса и команды и гоним подряд данные — будто бы читаем последовательно байты. Но, как я писал — QSPI не справится…
                                                    0
                                                    Ну во первых, пропустить команду в qspi не получится, адрес тоже — на них завязаны внутренние триггеры приёмо/передачи для dma. Но нет требования эти команды обрабатывать, так что можно смело использовать RC задержку на включение передачи логики.
                                                    Во вторых, DDR режим получается ну очень просто — два регистра на 8 бит с Z состоянием на выхлопе. Уровнем тактового сигнала коммутируем на выхлоп первый или второй. На первый регистр заводим старшие 4 бита с первого и второго ацп, на второй — младшие. +Мелкая логика в корпусе sot23-6…
                                                    И да, эта пакасть qspi передаёт и принимает сначала старший бит байта — наследие древнего стандарта spi и uart. Мне пришлось несколько раз плату переделывать…
                                              0
                                              Не понял, зачем использовать таймер, почему не завести на запрос DMA EXTI0 через DMAMUX? Ведь разрешать и обрабатывать это прерывание при этом не нужно, схема EXTI0 используется лишь для генерации импульса запроса по нужному фронту с нужного порта.
                                                0
                                                я тоже так хотел вначале — не работает! Только при включенном прерывании — там у них в даташите написано extit0 а не exti0 — такая вот тонкая, понимаешь, разница… :(

                                                А было бы очень хорошо… Кстати, на BDMA — работает, но BDMA только с медленной памятью domain3 работает, так что тоже только 25 МГц может.
                                                +1
                                                Неужто Power Side-Channel Analysis в реалтайме делаете?
                                                  0
                                                  да нет, тут задача сильно проще — именно что читаю поток…
                                                  +6
                                                  микроконтроллер может читать данные на скорости 1.6 Gbps

                                                  Напомнило анекдот про блондинку — "Я печатаю со скоростью 600 слов в минуту… правда, какая-то фигня получается".

                                                    –4
                                                    И сколько стоило напечатать такой текстолит?
                                                    «В процессе испытаний выяснилось, что с помощью CPU можно читать на скорости 12.5 МГц из двух портов. И 25 МГц из одного. Так что вариант не работает» — это бешеная скорость для подсчета с обоих, особенно разрядив шину по периметру текстолита.
                                                    Тот кого ты подставил, печатая данную статью отрубит тебе руки.
                                                      +1
                                                      Это конечно, хорошо, что вы обратили внимание на КПДВ — тут я сам частично удивлен, эту платку я делал по приколу — вывел все порты в ряд — но самое тут удивительное, что все это именно работает замечательно, даже и на 100 МГц, а не то что на 50…
                                                      Мне кажется, вы недооцениваете черную магию :)
                                                        –9
                                                        Я трату времени идиотами недооцениваю.
                                                          +2
                                                          То есть вы меня назвали идиотом, которому надо отрубить руки…
                                                          Но известно, что каждый говорит о том, чем является сам — не стоит так явно демонстрировать свой невысокий уровень.
                                                            –7
                                                            невысокий уровень идиотизма по сравнению с вами?
                                                              +1
                                                              В чём причина такого высокомерия?
                                                      +2

                                                      Стойкое ощущение героического превозмогания вместо решения проблем. Ну впихнули вы эти данные МК, а дальше-то что? По одному-два такта процессора на выборку? И зачем тогда вам вообще МК? Возьмите любой гетерогенный процессор (NXP i.MX7, TI AM335x, TI AM57x, STM32MP1) и вам не нужно будет решать еще одну задачу по выбросу данных уже из МК.

                                                        +2
                                                        Проблема, которую я решал — получить достаточно дешевое и устойчивое решение для чтения потока данных 1600 Mbps размером в 40К.

                                                        Ваш вопрос — что дальше — это уже именно что дальше. Хорошо, что вы заглядываете за горизонт проблемы, но задача, частью которой является эта, уже, конечно, решена — и решения эти очень дорогие (раз так в 20-40). А я хочу сделать дешевое, но хорошее решение — вот и декомпозиция у меня на подзадачи получается странная.

                                                        Если вы не заметили, но перечисленные вами варианты не лучше, но дороже и сложнее. Собственно, я использую процессор как этакую асинхронную память. Как не удивительно, но это получилось дешевле всего и проще в реализации.

                                                        Получается, что не-героическое должно быть так — че парится, берем суперкомпьютер подходящий и…

                                                        Но вы забываете, что здесь пишут статьи, не как надо что-то сделать, а как получилось. И это да, немного героическое — но я не вижу ничего плохого в этом.
                                                          0
                                                          Было бы гораздо интереснее если бы написали предварительно вводную статью, какую глобальную задачу решаете и как разбили на подзадачи.
                                                          Так работа конечно выглядит интересно, но очень сложно дать её практическую оценку.
                                                            0
                                                            ну тогда подождите немного, в следующей статье замысел автора будет раскрыт более полно :) все как в детективе…
                                                        0
                                                        Это не 1.6 Gbps, это 200 MBps.
                                                          0
                                                          чтобы не было разночтения — у меня Gbps Гига бит в секунду, у вас видимо MBps мега байт в секунду. А так да.
                                                            0
                                                            Ну просто бит/с ассоциируется с последовательной шиной, а байт/с — с параллельной. Т.е. я ожидал увидеть частоту тактирования 1.6 ГГц )
                                                              0
                                                              :)
                                                          0
                                                          Восхищён глубиной проработки вопроса. И у автора, и в обсуждении. Может быть, здесь найдётся человек, которого заинтересует моя проблема? Речь идёт о разработку отечественного секвенатора:
                                                          habr.com/ru/post/455156
                                                          Проблема в том, что нужно снимать информацию с сенсорных чипов (измерять пикоамперные токи), оцифровывать её посредством многоканального АЦП (желательно 16-разрядного), передавать на FPGA, а дальше — по USB 3.0 на компьютер. Это всё уже сделано, но в Великобритании. А нужно сделать что-то подобное у нас. Можно на их родных чипах, ориентированных на секвенирование. Но можно и на неродных — на сборке чипов, усиливающих пикоамперные токи. С неродными (MAX9923FEUB и т.п.) проще, зато с родными (от MinION) может получиться лучше. Но их ещё нужно отреверсить.

                                                          Буду признателен за соучастие и содействие. Если не в работе, то в поисках специалистов, с которыми можно обсуждать подобные проблемы.
                                                            0

                                                            Вы не указали ключевых моментов задачи: частота дискретизации, требование к одновременности семплирования и так далее. Так я не понял из вашей задачи, зачем вам USB3 и FPGA, ведь обычно многоразрядные АЦП как правило не бывают быстрыми

                                                              +1
                                                              Ключевые моменты знают только разработчики нанопоровой технологии секвенирования. А они стараются не делиться информацией. Судить о некоторых параметрах электронной части их приборов можно только по косвенным признакам. И ориентироваться на лучшие показатели. Например, известно, что частота работы чипов AXBIO (1 миллион сенсоров) достигает 110 гигагерц в секунду. И каждый сенсор из этого миллиона работает с частотой 20 опросов в секунду. У оксфордцев сенсоров меньше (512 или 3000), но считываются они быстреее (5...10 тыс. опросов в секунду).
                                                                +1
                                                                110 гигагерц в секунду

                                                                110ГГц полосы — это самый крутой осциллоскоп от Keysight. И даже там всего лишь 256Gsps идет на АЦП. Никаких 16 бит там и рядом нет.
                                                                Полагаю что-то совсем не так, как вы описываете. Сигнал на такой частоте вовсе не означает измерений на этой частоте.


                                                                Ключевые моменты знают только разработчики нанопоровой технологии секвенирования.

                                                                Ох эта разработка по-русски. "Мы не знаем, как оно работает, но должны еще вчера сделать не хуже". Без теоретического обоснования того что, как и, самое главное, зачем мы что-то измеряем любое принятое техническое решение сводится к киданию дротика в доску с развешенными партнамберами. Может быть вам повезет и оно действительно решит задачу, в остальном же — пустая трата времени, сил и средств.

                                                                  +1
                                                                  Ох эта разработка по-русски. «Мы не знаем, как оно работает, но должны еще вчера сделать не хуже».
                                                                  И так вот бродит отечественный нанопоровый секвенатор в комментариях в каждой второй статье про электронику на хабре. И с разработчиками потом надо говорить с такими, которые или сделают все бесплатно, или сами найдут финансирование решения этой красивой научной задачи. И бизнес-план напишут тоже сами.
                                                                  0
                                                                  а вот давайте прикинем простейший вариант. Пусть на входе стоит что-то типа opa4333 а дальше мы читаем в микроконтроллер и данные со всего массива микроконтроллеров объединяем (другой вариант ставим аналоговый мультиплексор после ОУ). У мк 16-разрядных входов обычно до 36 (а 12-разрядных до 42), так что без мультиплексирования на 512 сенсоров уйдет 128 ОУ и 15 мк (это примерно на 20-30 кв.см плата будет), ну и результирующий поток при пусть 1К опросов в секунду (1К*512*16 = 8Mbsp) не выглядит очень уж угрожающим. Такое вполне можно сделать… Будет слегка оригинальная такая плата на кв. дециметр…
                                                                    +2
                                                                    и еще — 110 ГГц — это видимо в сумме такая частота, ну например, миллион микроконтроллеров по 110 кГц :)

                                                                    это как со звуком — на колонках пишут 100W, так это значит, оказывается, что при данной мощности их разрывает :)
                                                                0
                                                                Немного информации к размышлению:
                                                                sci-hub.se/10.1016/j.aca.2019.01.034
                                                                sci-hub.se/10.3390/bios6030042
                                                                www.ncbi.nlm.nih.gov/pmc/articles/PMC4883400
                                                                habr.com/ru/post/455156
                                                                1drv.ms/p/s!Aj-K-u-yGV92mDjxBBlbD7siqlsU?e=taUQ4b

                                                                  0
                                                                  А принимать данные через один порт, но на 100МГц не пробовали? Если проблемы с тактированием — можно использовать тактирование по обоим фронтам и 2 таймера, и 2 канала DMA.
                                                                    0
                                                                    на 100 МГц не работает — скорости шины не хватает, видимо…
                                                                    0
                                                                    Если данные формируются в fpga, то почему бы в ней же не сформировать fifo-буфер (скажем на 1000 строк) с выдачей однократного прерывания на МК по заполнению и читать по такту из МК?
                                                                    Таким образом можно пропустить 400 МБ даже при тактировании GPIO в 100 МГц (32 бита/4 байта х 100 МГц) или 3200 Мбит
                                                                      0
                                                                      пока не находил решение, удовлетворяющее по цене, но вот выше предложили ICE40UP5K — надо пробовать…
                                                                      0
                                                                      Качество распайки платы на КДПВ выглядит печально, особенно грустно от почти замкнутых ножек МК.
                                                                        0
                                                                        да, вот так уж пришлось… но эта плата — инженерный вариант, паяна вручную и потом несколько ножек пришлось отогнуть и на них конденсаторы висят… Но следующий вариант был уже нормальным, жаль никуда не пошел пока…

                                                                        сначала я думал, вообще не заведется — но нет, даже 100 МГц работает на такой плате, а процессор на 480 МГц вообще без проблем пошел… бывает же…
                                                                        0
                                                                        Может быть, я чего то не понял, но я бы прицепил на FPGA память и складывал туда данные, а потом спокойно перекачивал их в контроллер.
                                                                          0
                                                                          Насколько я понял автора, его в первую очередь интересует дешевизна решения, а подходящие ПЛИС — дороги.
                                                                            0
                                                                            все верно. Но под влиянием обсуждения буду пробовать Cyclon-IV вместе с DDR на 400 МГц — может и смогу :) там меня выше в комментах подбадривают :) а то я не очень в fpga (всего одну систему сделал...). Вроде как бы дешево выходит…
                                                                          0
                                                                          Хм, если тактирование синхронное, чтоб не мучиться с разрядностью шины, не думали просто 2 или 4 микроконтроллера в параллель, пусть каждый свою часть шины в свою память кладет, эдакий гоблин-RAID?
                                                                            0
                                                                            так и делал, но у меня там еще четыре таких потока… уже слишком процессоров :)
                                                                            0
                                                                            Дорого сделать не сложно. Здесь главное — дешевизна. Именно это мне и понравилось в этом посте.
                                                                              0
                                                                              Эх… я как-то парсил 60Гб xml… изначально оно парсилось часов за шесть-семь. Я написал парсер, который шустро раскидывал файл со скоростью чтения с жесткого диска. Потом подоткнули его к реальному входному потоку — вполне себе справился.

                                                                              Only users with full accounts can post comments. Log in, please.