Всем доброго времени суток! никогда такого не было и вот опять. С моей прошлой статьи прошло уже достаточно времени, а оно ставит новые задачи. И если раньше я передавал данные на скорости 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.

Комментарии (116)


  1. a_freeman
    14.09.2019 19:11

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


    1. oam2oam Автор
      14.09.2019 19:15

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


      1. iliasam
        14.09.2019 19:27

        по секрету — данные идут из fpga, а туда — из быстрого ацп, я их замедляю в fpga.

        Делаете DDC SDR приемник?


        1. oam2oam Автор
          14.09.2019 19:29
          +4

          что вы :) — гораздо круче! Ждите, где-то через месяц напишу, что получилось — но там речь пойдет уже об 6.4 Gbps (если все получится, конечно)…


          1. sinc
            14.09.2019 21:47
            +1

            Возьмите уже USB 3.0, не мучайтесь


            1. oam2oam Автор
              14.09.2019 21:55

              It implements an architecture that enables 375-MBps data transfer from GPIF II — так вот они пишут. Так что — 375 не играет против 1600! Но за наводку — спасибо.


              1. sinc
                14.09.2019 22:02
                +1

                Максимум у usb 3.0 5 гигабит/с. 100 мегабайт в секунду делал лично, для 2-х 16-ти разрядных АЦП.


                1. oam2oam Автор
                  14.09.2019 22:13

                  если не секрет — что за АЦП? Они на 100 МГц данные могут давать?


                  1. sinc
                    14.09.2019 22:18

                    они на 25 МГц были. какие точно, уже не помню. вы лучше скажите зачем 100 МГц. Просто, AD9288, судя по даташиту, не шибко-то хорошие.


                    1. oam2oam Автор
                      14.09.2019 22:20

                      жаль, что 25… AD9288 они конечно 8-битные, но довольно бодрые. Хотя и jitter великоват. Но главное — они дешевые…


                  1. Rullix
                    16.09.2019 17:27

                    Даже на 400 мгц.


                    1. oam2oam Автор
                      16.09.2019 17:29

                      Это какие?


                      1. Rullix
                        16.09.2019 19:33

                        Я работал с этой. ADS5401, 12-Bit Resolution, Maximum Clock Rate: 800 Msps, Input Bandwidth (3 dB): > 1.2 GHz.


                        1. oam2oam Автор
                          16.09.2019 20:31

                          Да уж, я посмотрел — ее и в продаже не очень-то найдешь… а сейчас, видимо, из-за санкций совсем исчезла.


              1. sfclubh
                15.09.2019 06:18
                +1

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


              1. VelocidadAbsurda
                15.09.2019 06:18
                +1

                375 — это в мегабайтах/с! Там сам порт вообще до 100МГц*32бит, но где-то дальше накладные расходы на сборку пакетов снижают до тех самых 375МБ/с.


                1. oam2oam Автор
                  15.09.2019 06:38
                  +1

                  ну тогда да — интересный вариант получается.


          1. S-trace
            15.09.2019 01:05

            А сжатие (хотя бы какое-нибудь простенькое) использовать не пытались? Может, удастся снизить поток данных при помощи него?
            Если, конечно, приём такого потока не является для вас самоцелью)


      1. xFFFF
        14.09.2019 21:37

        А нельзя сильнее нагрузить fpga?


        1. oam2oam Автор
          14.09.2019 21:48

          а в каком смысле? Поток-то изначально 1.6 Gbps — просто я его на fpga из 16-битного делаю 32-битным, при этом частота падает с 100 до 50 МГц. Но сам-то поток никуда не девается. Я пробовал вообще 100 МГц пихать в MCU — не лезет! Ну нечем просто читать и писать на такой скорости… И fpga у меня простенькое — MAX-II (в прошлой статье как раз с ним разбирался...), это самое простое и дешевое оказалось решение.
          Но я бы с удовольствием узнал, как это можно сделать.


          1. AigizK
            14.09.2019 21:59

            может просто fpga взять xilinx какой нибудь у которых ЦП на борту. и там считать?


            1. oam2oam Автор
              14.09.2019 22:02
              +1

              Это очень дорого и непонятно для чего — там тоже ведь шина не резиновая. Те же яйца, только в профиль — поток не понятно, как вводить…


              1. Drottarutarnum
                15.09.2019 06:19

                У латтис есть плисы как раз для превращения последовательного потока в параллельный

                Как на счет того, чтобы сделать не 32 бита, а больше? Раза в 4. Тогда скорость ещё упадет и станет легче


                1. oam2oam Автор
                  15.09.2019 06:37

                  так свободных портов мало — максимум еще один можно выделить. И на каждый порт — еще канал DMA, а это еще нагрузка не внутреннюю шину процессора — тут похоже вообще предел для нее 1.6 Gbps


          1. ukt
            14.09.2019 22:05

            а если использовать встроенный процессор на фпга(ну вроде ниос или зайлинковский аналог)?


            1. oam2oam Автор
              14.09.2019 22:21

              вот думал в эту сторону — но сложно и дорого это не мой путь в данном случае…


          1. drWhy
            14.09.2019 22:11

            Извините за профанский вопрос, почему бы не использовать для высокоскоростной передачи данных интерфейс SATA? Реализация SATA в виде IP core доступна для fpga, есть бесплатные реализации. Интерфейс отработанный, быстрый, симметричный, с низкими задержками, простой в аппаратной реализации, без сложной синхронизации, с простыми разъёмами и массой качественных кабелей длиной до 1м.


            1. oam2oam Автор
              14.09.2019 22:19
              +2

              Эм-м, как бы объяснить — вот есть такая штука, ацп и у нее просто 16-битный выход, на котором с частотой 100 МГц появляются данные, никакого интерфейса другого нет (SATA уж тем более). И вот надо эти данные как-то читать без задержки даже на 1 ns и так 10000 раз подряд. Кстати, у SATA — это 1-битный поток, на что намекает первая S и скорость у него 300 Mbps (у SDATA — 3 конечно 6 Mbps). Ну и там, в этом SATA свой сложный протокол. К нему и надо подготовить данным, может быть… Но лучше их потом в USB или ETH запихать — легче будет…
              И вот чтобы эти наши данные превратить в SATA — довольно сложное fpga надо, а я сложное и дорогое тут не хотел бы…


              1. drWhy
                14.09.2019 22:58

                Про требования к отсутствию задержек понял. А АЦП с последовательным выходом, соответственно, дадут ещё 16-кратное увеличение частоты.
                Но ведь вычислительно SATA должен быть легче USB, и нужно реализовать лишь часть функциональности. Соединение точка-точка, никаких очередей, настроить один раз передачу данных в одну сторону (как делают контроллеры в режиме DMA) и потом просто подавать данные.
                Про выбор привычного и неизбыточного решения тоже, конечно, понятно.


                1. oam2oam Автор
                  15.09.2019 06:29

                  заметьте — про USB я ничего не говорил. Это уже следующая задача будет, куда снятые данные отдавать. Тут именно что надо их взять как-то…


          1. pvvv
            14.09.2019 22:57

            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ом, хоть с последовательным портом.


            1. oam2oam Автор
              15.09.2019 06:34

              Как-то не очень понял про lpc4370 — почему вы думаете, что 80 МГц это частота сэмплирования, а не частота ADC? Так-то у них не больше 6 Msps…
              Но список вариантов у вам получился большой. Я вот никак не смог придумать, что делать с плисом полезного — большой плис со встроенной памятью дорог, а маленький бесполезен…


              1. pvvv
                15.09.2019 11:43
                +1

                встроенный АЦП у lpc4370 — 80Msps, в даташите так написано. откуда вы взяли цифру 6Msps? была какая-то поделка, labtool вроде — просто плата с усилителями и разъёмами для LPCLink2, там полоса была ограничена в несколько МГц просто предусилителями перед АЦП.
                а полоса пропускания самого АЦП под 250МГц
                вам данные всё равно в результате надо в ПК перегнать, если средний поток данных не сильно большой, и эти 40кБайт данных прилетают, грубо говоря, раз в секунду, то хоть по последовательному порту можно из плис их достать. или через какой-нибудь usb мост от ftdi, например ft232h. ethernet со стороны плис тоже не особо сложно делается.
                вышеуказанный ICE40UP5K c мегабитом памяти стоит дешевле stm32f750
                а 5к ячеек и на soft процессор хватит чтобы протокол общения с ПК на С/C++ писать, а не на верилоге.


                1. oam2oam Автор
                  15.09.2019 12:15

                  действительно, для 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, а тут совсем не то.


                  1. bugdesigner
                    15.09.2019 13:45

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


                  1. pvvv
                    15.09.2019 13:51

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

                    памяти у ICE40UP5K мегабит, а не килобит, максимум 70МГц х 64 бита = 4.5Гбит/c (4 блока 16 битных по 256кбит)
                    а количество ног у АЦП: 16бит данных и два клока, это 18, оставшихся 20 ног вполне хватит для любого разумного интерфейса с ПК.


                    1. oam2oam Автор
                      15.09.2019 13:57

                      да, пожалуй надо рассмотреть решение на ICE40UP5K — очень даже заманчиво! И по цене вполне нормально.


                      1. pvvv
                        15.09.2019 14:12

                        я бы всё-таки с ft600q для начала попробовал, напрямую без плис/МК, там возможно лишь пара логических элементов/инверторов понадобится, чтобы АЦП с синхронным fifo склеить, а если требований к 100МГц клокам особых нет, их можно прям с ft600q взять, и потом задержать/инвертировать для interleaving АЦП.


                        1. oam2oam Автор
                          15.09.2019 14:20

                          так ведь получится только в поток USB 3.0 превратить, а его же потом надо куда-то читать?


                          1. pvvv
                            15.09.2019 14:26

                            ну может, воткнуть этот USB провод в ПК?
                            или вы делаете портативный прибор и данные в этом же stm32 и будут обрабатываться?


                            1. oam2oam Автор
                              15.09.2019 14:28

                              в ПК обязательно воткнем! Но не сразу — в задумке таких блоков аж 4 штуки (как минимум) — все не воткнешь, да и ПК захлебнется и от одного…


                              1. pvvv
                                15.09.2019 14:33

                                от одного не захлебнётся, но от четырех пожалуй да, только если дополнительные USB3 порты на PCIe воткнуть, но тогда действительно проще всё-таки какое-нибудь достаточно большое fifo и любой медленный интерфейс.


                    1. oam2oam Автор
                      15.09.2019 14:08

                      посмотрел характеристики — слишком медленная… по памяти 70 МГц, задержки LUT 9 ns. Но идея, может, и стоящая…


                      1. pvvv
                        15.09.2019 14:13

                        70МГц * 64бит = 4.5 Gbps


                        1. oam2oam Автор
                          15.09.2019 14:16

                          откуда же 64 бит — всего (!) пинов-то 39, из них на вход 16, да клоки, да… в общем — 16 бит и всё…


                          1. pvvv
                            15.09.2019 14:19

                            завести внутрь надо 100МГц х 16бит, а вот уже внутри их можно превратить в 25МГц х 64 бит и спокойно засунуть в 70МГц память. Она там организована так, 4 отдельных блока с 16бит шинами.


                            1. oam2oam Автор
                              15.09.2019 14:22

                              видимо, так можно, но очень смущает время LUT 9 ns — это же почти на пределе для 100 МГц — как-то не очень я представляю какую-нибудь асинхронную схему… А с синхронной можно и пролететь по таймингам…
                              У меня вообще пределы по времени не более 1.4 ns выходят для нормальной работы.


          1. xFFFF
            15.09.2019 16:19

            MAX-II — дикое старье. Предлагаю заказать на Алиэкспрессе отладочную плату с FPGA Cyclone II EP2C5T144. Я покупал рублей за 800. Cyclone II имеет встроенные блоки памяти. Т.к. количество данных вполне определенное, то можно сконфигурировать память как двухпортовую. В один порт писать с большой скоростью, а читать и отдавать наружу через второй порт. Это можно сделать с более низкой частотой, не кратной частоте записи. Можно даже сжатие данных реализовать. Часть семплов передавать полностью, а часть как разницу между сэмплами. Аналогично сжатию видео.


            1. oam2oam Автор
              15.09.2019 17:10

              я смотрел, подходит разве только начиная с cyclon-iv E (40) — не сказать, чтобы очень дорого. Конечно, сейчас я использую max-II за 89 рублей чип. Если только использовать один циклон на все каналы (их 8), то наверно, будет лучше… Только вот это для меня вызов своего рода — я первую свою программу для fpga написал в этом году только… что-то нет уверенности…


              1. xFFFF
                15.09.2019 18:27

                Надо верить в свои силы) Когда я впервые столкнулся с плис, мне пришлось писать обработку видео в реальном времени, и все получилось, хотя я видел плис первый раз в жизни. Но там не сложная обработка была, типа автоконтраста, и автояркости и тд). Сейчас сменил работу, с плис года 4 не работал.


      1. AigizK
        14.09.2019 22:00
        +1

        а что за ацп используете?


        1. oam2oam Автор
          14.09.2019 22:01

          простое AD9288 — там на борту два ацп, клок 100 МГц


  1. IgorPie
    14.09.2019 19:20
    +1

    Получилось и отлично, но сразу возникает вопрос о синхронизации таймера на 100МГц с входящим сигналом (да, занудничаю). А если его нет, то рано или поздно данные разъедутся как в детстве показывали по телевизору другой телевизо и плыла полоса кадра, пол кадра были старыми и пол кадра — новыми.

    И оффтоп, куда столько данных, у H750 мегабайт ОЗУ, если по сусекам поскрести?


    1. oam2oam Автор
      14.09.2019 19:26
      +1

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

      Ну вот и ответ — куда — данных не очень много всего 40К. А памяти-то меньше можно использовать — только RAM_D1 а это 512К


      1. IgorPie
        14.09.2019 19:29
        +1

        По идее, можно же дать клок с FPGA?


        1. oam2oam Автор
          14.09.2019 19:30
          +2

          так и делаю.


          1. IgorPie
            14.09.2019 19:42

            тогда все шикарно, тем более, H750, про которого толком нет инфы, а RM на 1200 страниц, попробуй освой разом.


            1. oam2oam Автор
              14.09.2019 19:45
              +2

              да, есть такое — но очень понятный, кроме двух вещей :) — есть там DMA BDMA DMAMUX, а еще MDMA — вот с ним мне ничего не понятно пока. И еще есть странный раздел про DLYB — ну то есть что это, понятно, как работает — тоже, но к нему нет доступа!!! И вот зачем описывать то, до чего нет доступа — непонятно…


              1. IgorPie
                14.09.2019 22:06

                по той же причине, по которой они кричат про 480МГц тактовой.


                1. oam2oam Автор
                  14.09.2019 22:11

                  да нет, 480 реально есть… в ядре! А так шины и 200 и 100. В общем, Cortex-M7 конечно, вещь, но скорости это не особо добавляет


  1. Fox_exe
    14.09.2019 19:44

    А можно всеже узнать, что это такое вы читаете на таких скоростях? (Сетевые пакеты, чтоли, обрабатываете?)
    Да и одно дело только прочитать и совсем другое — ещё и обработать, да вернуть результат. Хватает?


    (Пока писал, ответили выше...)


    1. oam2oam Автор
      14.09.2019 19:47
      +1

      все же отвечу — вот так вот оказалось, что использовать stm32h750 — самый дешевый способ обработки потока (он там не очень-то обрабатывается, скорее накапливается и перемешивается)…


      1. rPman
        15.09.2019 11:04

        раз данные у вас поступают с fpga, почему там же их не 'накапливать и перемешивать'?


        1. oam2oam Автор
          15.09.2019 11:19

          fpga с памятью дороже микроконтроллера


  1. romanetz_omsk
    14.09.2019 20:11
    +1

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


    1. oam2oam Автор
      14.09.2019 20:19

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


      1. jaiprakash
        14.09.2019 21:14

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


        1. oam2oam Автор
          14.09.2019 21:26

          вы удивитесь, но даже SRAM на 50 МГц стоит от $30 и это с организацией 8-бит (ну может и можно найти 32-бит..). А DRAM и все ее разновидности тут не проходят, хотя и дешево… А процессор — $3.50


          1. IgorPie
            14.09.2019 22:05

            значит у вас что-то массовое? Потому что нам, микробам они достаются по $6.


            1. oam2oam Автор
              14.09.2019 22:12

              ну $6 это тоже ведь неплохо — до этой партии я такие и использовал, но повезло :)


          1. jaiprakash
            14.09.2019 22:16

            Удивлюсь, т. к. можно найти SRAM с 32-битной шиной на 200 МГц дешевле $10 (или около того).
            И удивлюсь, что stm32h750 стоит $3.50, или это не о нём?


            1. oam2oam Автор
              14.09.2019 22:23

              с такими надо работать по специальному протоколу обычно. Тут надо SRAM типа flow-througthput с двумя портами, а они как раз и стоят от 30.
              А $3.50 — это о нем, так вот получилось, повезло…


          1. xFFFF
            16.09.2019 10:08

            CY7C1338G 4-Mbit (128K ? 32) 100-MHz, покупал дешевле 500р в Мск. в баксах будет 7-8 баксов.


  1. AVI-crak
    15.09.2019 00:56

    У чипов stm32h7хх и stm32f7xx -есть интерфейс qspi, сразу на два чипа памяти.
    AD9288 при использовании внешней логики — легко формирует DDR режим. Трамбуя один канал в 4 бита на скорости в 100МГц(а каналов два). Железо уже оптимизировано на такую скорость захвата, ничего изобретать не нужно.
    Есть минус: пока идёт захват — к быстрой памяти лучше не обращаться.


    1. oam2oam Автор
      15.09.2019 06:27

      наверно, так тоже можно… но сами видите — QSPI только (!) на два чипа, а у AD9288 — четыре потока по 4 бита — и что делать?


      1. AVI-crak
        15.09.2019 09:24

        У вас 2 чипа AD9288???
        А если всё-же один — то все данные прекрасно трамбуются в DDR режиме.


        1. oam2oam Автор
          15.09.2019 09:29

          нет, тут вот что — один чип ad9288 — это по-сути два ADC в одном корпусе, потому у него 2х8 бит на выходе. А так как там еще и интерлив, то данные все равно надо прогонять через fpga. Но как полученный поток трамбовать в DDR? В QSPI я понимаю как — пропускаем установки адреса и команды и гоним подряд данные — будто бы читаем последовательно байты. Но, как я писал — QSPI не справится…


          1. AVI-crak
            15.09.2019 12:23

            Ну во первых, пропустить команду в qspi не получится, адрес тоже — на них завязаны внутренние триггеры приёмо/передачи для dma. Но нет требования эти команды обрабатывать, так что можно смело использовать RC задержку на включение передачи логики.
            Во вторых, DDR режим получается ну очень просто — два регистра на 8 бит с Z состоянием на выхлопе. Уровнем тактового сигнала коммутируем на выхлоп первый или второй. На первый регистр заводим старшие 4 бита с первого и второго ацп, на второй — младшие. +Мелкая логика в корпусе sot23-6…
            И да, эта пакасть qspi передаёт и принимает сначала старший бит байта — наследие древнего стандарта spi и uart. Мне пришлось несколько раз плату переделывать…


  1. Sun-ami
    15.09.2019 02:02

    Не понял, зачем использовать таймер, почему не завести на запрос DMA EXTI0 через DMAMUX? Ведь разрешать и обрабатывать это прерывание при этом не нужно, схема EXTI0 используется лишь для генерации импульса запроса по нужному фронту с нужного порта.


    1. oam2oam Автор
      15.09.2019 06:22

      я тоже так хотел вначале — не работает! Только при включенном прерывании — там у них в даташите написано extit0 а не exti0 — такая вот тонкая, понимаешь, разница… :(

      А было бы очень хорошо… Кстати, на BDMA — работает, но BDMA только с медленной памятью domain3 работает, так что тоже только 25 МГц может.


  1. 15432
    15.09.2019 02:14

    Неужто Power Side-Channel Analysis в реалтайме делаете?


    1. oam2oam Автор
      15.09.2019 06:26

      да нет, тут задача сильно проще — именно что читаю поток…


  1. Wesha
    15.09.2019 03:04
    +2

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

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


  1. kabuto
    15.09.2019 05:24
    -1

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


    1. oam2oam Автор
      15.09.2019 06:25

      Это конечно, хорошо, что вы обратили внимание на КПДВ — тут я сам частично удивлен, эту платку я делал по приколу — вывел все порты в ряд — но самое тут удивительное, что все это именно работает замечательно, даже и на 100 МГц, а не то что на 50…
      Мне кажется, вы недооцениваете черную магию :)


      1. kabuto
        15.09.2019 09:08
        -2

        Я трату времени идиотами недооцениваю.


        1. oam2oam Автор
          15.09.2019 09:24

          То есть вы меня назвали идиотом, которому надо отрубить руки…
          Но известно, что каждый говорит о том, чем является сам — не стоит так явно демонстрировать свой невысокий уровень.


          1. kabuto
            15.09.2019 14:21
            -2

            невысокий уровень идиотизма по сравнению с вами?


            1. engine9
              15.09.2019 21:08

              В чём причина такого высокомерия?


  1. Dima_Sharihin
    15.09.2019 08:32
    +2

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


    1. oam2oam Автор
      15.09.2019 08:47

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

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

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

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

      Но вы забываете, что здесь пишут статьи, не как надо что-то сделать, а как получилось. И это да, немного героическое — но я не вижу ничего плохого в этом.


      1. ser-mk
        15.09.2019 13:01

        Было бы гораздо интереснее если бы написали предварительно вводную статью, какую глобальную задачу решаете и как разбили на подзадачи.
        Так работа конечно выглядит интересно, но очень сложно дать её практическую оценку.


        1. oam2oam Автор
          15.09.2019 13:14

          ну тогда подождите немного, в следующей статье замысел автора будет раскрыт более полно :) все как в детективе…


  1. robomakerr
    15.09.2019 10:49

    Это не 1.6 Gbps, это 200 MBps.


    1. oam2oam Автор
      15.09.2019 11:21

      чтобы не было разночтения — у меня Gbps Гига бит в секунду, у вас видимо MBps мега байт в секунду. А так да.


      1. robomakerr
        15.09.2019 12:23

        Ну просто бит/с ассоциируется с последовательной шиной, а байт/с — с параллельной. Т.е. я ожидал увидеть частоту тактирования 1.6 ГГц )


        1. oam2oam Автор
          15.09.2019 12:29

          :)


  1. genseq
    15.09.2019 11:04

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

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


    1. Dima_Sharihin
      15.09.2019 11:44

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


      1. genseq
        15.09.2019 12:05

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


        1. Dima_Sharihin
          15.09.2019 12:15

          110 гигагерц в секунду

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


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

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


          1. amartology
            15.09.2019 16:30

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


        1. oam2oam Автор
          15.09.2019 12:25

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


        1. oam2oam Автор
          15.09.2019 12:28

          и еще — 110 ГГц — это видимо в сумме такая частота, ну например, миллион микроконтроллеров по 110 кГц :)

          это как со звуком — на колонках пишут 100W, так это значит, оказывается, что при данной мощности их разрывает :)


  1. genseq
    15.09.2019 12:35

    Немного информации к размышлению:
    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


  1. Sun-ami
    15.09.2019 13:22

    А принимать данные через один порт, но на 100МГц не пробовали? Если проблемы с тактированием — можно использовать тактирование по обоим фронтам и 2 таймера, и 2 канала DMA.


    1. oam2oam Автор
      15.09.2019 13:58

      на 100 МГц не работает — скорости шины не хватает, видимо…


  1. HorrorInfinity
    15.09.2019 13:57

    Если данные формируются в fpga, то почему бы в ней же не сформировать fifo-буфер (скажем на 1000 строк) с выдачей однократного прерывания на МК по заполнению и читать по такту из МК?
    Таким образом можно пропустить 400 МБ даже при тактировании GPIO в 100 МГц (32 бита/4 байта х 100 МГц) или 3200 Мбит


    1. oam2oam Автор
      15.09.2019 13:59

      пока не находил решение, удовлетворяющее по цене, но вот выше предложили ICE40UP5K — надо пробовать…


  1. HiTechSpoon
    16.09.2019 07:20

    Качество распайки платы на КДПВ выглядит печально, особенно грустно от почти замкнутых ножек МК.


    1. oam2oam Автор
      16.09.2019 17:24

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

      сначала я думал, вообще не заведется — но нет, даже 100 МГц работает на такой плате, а процессор на 480 МГц вообще без проблем пошел… бывает же…


  1. GarryC
    16.09.2019 09:40

    Может быть, я чего то не понял, но я бы прицепил на FPGA память и складывал туда данные, а потом спокойно перекачивал их в контроллер.


    1. amartology
      16.09.2019 10:27

      Насколько я понял автора, его в первую очередь интересует дешевизна решения, а подходящие ПЛИС — дороги.


      1. oam2oam Автор
        16.09.2019 17:23

        все верно. Но под влиянием обсуждения буду пробовать Cyclon-IV вместе с DDR на 400 МГц — может и смогу :) там меня выше в комментах подбадривают :) а то я не очень в fpga (всего одну систему сделал...). Вроде как бы дешево выходит…


  1. OloloFine
    16.09.2019 17:20

    Хм, если тактирование синхронное, чтоб не мучиться с разрядностью шины, не думали просто 2 или 4 микроконтроллера в параллель, пусть каждый свою часть шины в свою память кладет, эдакий гоблин-RAID?


    1. oam2oam Автор
      16.09.2019 17:21

      так и делал, но у меня там еще четыре таких потока… уже слишком процессоров :)