Jump to content

    

Kronac

Участник
  • Content Count

    48
  • Joined

  • Last visited

Everything posted by Kronac


  1. Недавно воевал с этим же цапом, правда на XILINX... натерпелся я от него конечно.. У меня было 4 таких ЦАПа (8 каналов). В Xilinx для управления задержками используется определённая мегафункция "IDELAYE3". Устанавливается она на вход DATA и FRAME и двигает данные и фрейм относительно опорного клока. Я наивно полагал, что задав один раз правильные значения, система будет стабильно работать. На практике же оказалось, что кристал огромный, а загрузка ПЛИС небольшая. От компиляции к компиляции элементы по кристалу раскидывало так, что у меня от прошивки к прошивке работали то одни, то другие каналы. Иногда от нагрева вылетали некоторые каналы в процессе работы.. Иногда просто клок вставал не в то место и данные терялись.. Пришлось городить механизм калибровки, при котором процессор через регистры подставлял разные задержки до тех пор, пока канал не начнёт принимать данные верно. Могу только сказать, что задержки для данных и фрейма я в итоге ставил одинаковые. По Quartus, к сожалению, ничего подсказать не смогу по данной теме, могу только пожелать удачи.
  2. Добрый день. Спасибо, про это знаю, читал. У меня не много замудрённая схема (придуманная разработчиком платы). Суть в том, что я формирую у себя в ПЛИС SYSREF, отдаю его на выход (SYSREF_out), там он проходит уже по плате через синхронизатор с опорным клоком и поступает на АЦП (у меня их 2) и обратно в ПЛИС (SYSREF_in). Когда SYSREF (SYSREF_in) возвращается в ПЛИС, я его уже напрямую подаю в 2 ядра JESD. В общем я как думаю формировать SYSREF_out, есть входная частота полученная со специального пина для ядер JESD (как rx_core_clk ). Хочу завести её на PLL и с неё поделить на 32.
  3. Добрый день. Поднимаю JESD204B для работы с АЦП AD9208BBPZ-3000. Работаю с XILINX в Vivado 2018. ПЛИС - Kintex Ultrascale. Перечитал мануалы по IP ядрам, другую документацию.. Не могу разобраться какой частоты требуется формировать сигнал "SYSREF". Моя опора для АЦП: 1792 MHz. Опора для ядра JESD: 224 MHz. L - 8 Линий; M- 1 конвертер; F - 2 Фрейма; К - 32 Мультифрейма; Line Rate - 8.96 Gbps; Subclass 1. В некоторых мануалах видел, что sysref должен быть кратен частоте мультифрейма. 224 /32 . Но я не уверен что это точно, потому что в другом месте читал, что он должен быть не больше 5 МГц, а у меня вышло 7... Буду очень благодарен, если найдутся люди, которые просветят меня в этом вопросе. AD9208BBPZ-3000.pdf pg066-jesd204.pdf
  4. В общем поборол я проблему. Конкретных причин я не нашёл, только догадки. Если вкратце, то я создавал большие мегабайтовые слейвы на перспективу для будущих проектов, чтобы хватило места. По факту же я использовал не больше 8К адресного пространства. Плюс я хотел сделать красивые адреса для того, чтобы упростить дешифрацию адреса в интерконнекте (Выставить чисто старшие выровненные адреса для слейвов). Забил в итоге на всё. Сделал в лоб. Сколько требуется фактически, столько и выделил, подтянул все адреса друг к другу и заработало. Из бара 0 есть доступ ко всем слейвам. Не знаю какая проблема при работе с большим объёмом адресного пространства, пока разбираться не хочу. Работает, пускай себе работает. Всем спасибо за советы.
  5. Да, в чём проблема не понимаю? Адресация AXI 64-битная. От 0x0000_0000_0000_0000 до 0x0000_0001_FFFF_FFFF у меня располагается 8 ГБ ДДР-ка первым слейвом на интерконнекте. Работаю я с ней отдельными барами (BAR2 и BAR3) буферными (окнами) по 4 мб. Следом за ней идут регистровые слейвы, я и назначаю бару (BAR0) стартовый адрес на AXI : 0x0000_0002_0000_0000. Далее в системе выделяется для данного бара диапазон памяти в пространстве PCIe устройств. Вот например запустил одну из прошивок которая у меня была уже на ходу, тут правда первый бар не 4МБ как на скрине выше, а 1МБ, но разницы нет. Система выделяет на BAR0: от 0x0000 9090 0000 до 0x0000 909F FFFF (что собственно равно 1 МБ, сколько назначишь столько система и выделит). Далее адрес PCIe 0x0000 9090 0000 при проходе через контроллер PCIe преобразовывается в адрес 0x0000_0002_0000_0000 на шине AXI, а при чтении адрес AXI 0x0000_0002_0000_0004 станет = PCIe 0x0000 9090 0004 И тд..
  6. Доброе утро. Сама адресация баров PCIe для AXI задаётся на предыдущей вкладке ядра, где задаются все настройки AXI Эта же галочка "64 bit" Выбирает какого размера у нас будут бары и адресация в пределах одного бара. Имеется 6: 32-битных бара (размер каждого из которых может быть не больше 2ГБ) и 3: 64-битных бара (размер которых собственно огромен до экзабайт). В ядре 2 соседних бара как бы объединяются в один. К сожалению такая структура мне не подходит, так как моя материнка не запускается с баром больше 2ГБ (пробовал на 2 компах и сервере).
  7. Сейчас попробую понятнее. Вот последний проект с которым пытался побороть проблему. Есть 4 SLAVE AXI . Интересует S0 и S1. Их адреса на AXI S0: 0x2 0000 0000 (512К в последнем проекте, в котором пробовал) S1: 0x2 0008 0000 (512K) Я назначаю на BAR0 базовый адрес: 0x2 0000 0000. Размер бара: 4МБ. Получаю следующую картину: где S00 - PCIe; S01 - JTAG . Читая через компьютер первый бар, я имею доступ только к M02 (S0: 0x2 0000 0000) При попытке доступа к M03 (S1: 0x2 0008 0000) адресация закручивается в интерконнекте и снова обращается к M02.. При этом в системе есть ещё JTAG консоль. И с её помощью я спокойно читаю\пишу в M02 и M03. Либо если я назначу на BAR1 базовый адрес 0x2 0008 0000, то по PCIe через BAR0 будет доступ к M02, а через BAR1 будет доступ к M03, но больше никуда.. Вот сейчас, надеюсь, доступно объяснил =) Понимаю, что тяжело понять, что творится в голове у другого человека и что он хочет донести со своей колокольни.. Исходных данных маловато, понимаю)
  8. Извиняюсь. Я немного не тот скриншот выложил. Много разных вариантов пробовал запутался сам и Вас всех запутал..
  9. на слейвы выделял по мегабайту, адреса стояли друг за другом. На бар выделял 2 мегабайта, потом пробовал 4, безрезультатно.
  10. Подключал ILA до интерконнекта и после. В итоге мне приходит не тот адрес.. Допустим есть два слейва по мегабайту, у первого адрес: 0x1000 0000 у другого 0x2000 0000. Я назначаю бару PCIe базовый адрес на амбе 0x1000 0000. Значит после того как закончится адрес 0x1FFF FFFF , должен прийти на интерконнект адрес 0x2000 0000... Но я его не вижу, от ядра приходит снова 0x1000 0000. С размерами точно не напутал, проверял несколько раз и игрался по разному..
  11. Специфика построения системы. Огромная пропускная способность не нужна. только иногда записывать и иногда вычитывать. ДМА тоже есть но он занимается другими задачами в автоматическом режиме без связи с ПК. Программе на ПК нужен только иногда доступ к памяти на небольших скоростях.
  12. Добрый день. "Размер этого BAR при этому должен покрывать пространство адресов всех слейвов." Вот так и не могу, моя материнка не запускается при создании бара больше 2G. Собственно по этому и использую два бара по 4 МБ для создания окон для работы с ДДР. Проблема как раз в том, что не получается сделать так, как Вы описали выше. Я правда пытался покрыть не все адреса всех слейвов а склеить хотя бы два слейва. Выделил объём памяти для бара равный 2-м подряд идущим слейвам. Первый нормально работает, далее вижу что адреса заворачиваются в начало и снова идёт обращение к началу первого слейва. Не понимаю почему так...
  13. Продолжаю осваивать Vivado на Xilinx (пока с огромной натяжкой). Есть некая система: мастер PCIe -> AXI interconnect -> 5 слейвов (регистры, память, Jesd и прочее). У каждого слейва свой адрес на шине AXI (выровнял адреса до старших бит, для более простой дешифрации) Ну далее всё просто, беру в настройках корки, каждому бару присваиваю базовый адрес какого либо из слейвов, назначаю размер и всё норм. Через программу верхнего уровня спокойно читаю/пишу по каждому бару связанный с ним слейв. Проблема в том, что я ограничен 6-ю барами (в дальнейшем нужно будет больше слейвов). Решил попробовать простое решение, расширить один из баров в два раза и просто обращаться через него к последовательно стоящим друг за другом слейвам. Ну по логике, думаю, когда кончится адресное пространство первого, интерконнект должен перескочить на второй и работать уже с ним. Но не так-то всё просто, IP ядро PCIE почему то заворачивает адресное пространство на начало первого слейва и снова работает с ним, только сначала. К такому финту я не был готов.. Читал, искал инфу пока ничего не нашёл. Почему ядро так делает и как от этого можно избавиться? Сталкивался кто нибудь с такой проблемой? Буду очень благодарен разъяснениям =)
  14. Ну значит не стоит расслабляться при написании кода =)
  15. Слава тем, кто эти хорошие инструменты ломает и выкладывает для общего пользования =)
  16. Да была такая проблема. Было даже хуже. При рускоязычном пользователе даже проекты нормально не открывались. Проект открывался как набор файлов, без структуры и верхнего уровня. Переустановка не помогала и только потом допёрли, что дело в пользователе. После смены всё стало вроде норм.
  17. Мне тоже больше нравится Квестасим, в ней всё очень удобно, большой функционал. Хорошо работает с систем верилогом при написании тестбенчей. Простой и понятный интерфейс. Позволяет на ранних стадиях быстро выкинуть все системные ошибки. Можно подтянуть ip-ядра и их промоделить, если не очень понятно как там и что работает. В общем каждому своё, но инструмент очень полезный. По скорости работы и вылетам тоже не было нареканий. В своё время писал код только блочками в VHDL/verilog. При работе в больших проектах с большой вложенностью голова дурела вспоминать где и что лежит и что к чему относится, следить за разрядностью портов, сигналов in/out.. Любое кардинальное изменение приводило к куче опечаток и дальнейшему поиску ошибок... Как перешёл на HDL Designer, в другом ни в чём уже работать не могу и не хочу. Очень удобно, всё видно и понятно. Сложно заблудиться в коде. Легко следить за подключениями шин, сигналов и прочим. Так что скажу, что мне он определённо нравится, работа с комбинированием графики и кода намного удобнее для меня. После него оглядываясь на прочие старые проекты из десятков файлов vhd/verilog не понимаю как я там вообще ориентировался.. Много лишнего времени уходило никуда.
  18. Пока не пробовал её ещё. В квартусе с ней тоже какие то проблемы были, по этому стараюсь не использовать её.
  19. Да конечно, я изначально под квартусом так и работал. Сам проект собираю в Mentor HDL Designer (2016 версии), подтягиваю к нему ip ядра из квартуса (или Вивадо) в виде блэкбоксов. Моделирование прохожу в QuestaSim, потом синтез в Precision. Он очень классно всё собирает, утаптывает тайминги, помогает понять каки были системные ошибки и тд. На выходе получаю большой verilog/vhdl/vqm файл и его уже подтягиваю как верхний уровень в квартус. Очень удобный подход и приносит очень положительные результаты. Можно и автоматически запускать всё это вместе. Но не стал с этим заморачиваться. Ручками как то привычнее.
  20. Добрый день. Чтож, звучит всё очень чудесно. У меня пока так не выходит. Малейшие изменения приводят к появлению больших слэков и вся система начинает работать нестабильно.. Буду дальше сам разбираться, спасибо за ответы.
  21. Вот так как Вы пишите я и пробовал изначально, начитавшись мануалов. С радостью впихнул слейвы на 32 бита, надеясь на конвертеры, JTAG консоль на 32 бита данных и тд.. в итоге становилась настолько сложная система из конвертеров данных и клоков, что вивада загнулась.. Огромные слеки на переходах различных конвертеров внутри ядра интерконнекта привели к тому, что терялись биты данных при чтении или записи в регистры или память.. Методом проб и ошибок пришёл к тому, что на разрядности шины в 256 бит у всех мастеров и слейвов (кроме AXI CTL только там остался конвертер, так как там AXI LITE) и при определённых клоках вся структура стабильно задышала без потери данных. Но в дальнейшем мне нужно будет повышать частоту работы ДДР до 1200, а следовательно от этого изменятся все частоты AXI и опять вернётся проблема с потерей данных. Как мне добиться максимальной производительности без потери скорости? Даже сейчас при шине 256 бит и при пачках данных в 256 задержка по чтению между ARVALID и ARLAST 320 тактов а по записи между AWVALID и BVALID 300 тактов. При конвертерах это число увеличится
  22. Вы сами и ответили на этот вопрос =) У меня комп не включается и кричит при таком раскладе =)
  23. "Много работал с PCIe" Если не затруднит, могу тогда ещё закидать вопросами? =) В Альтере можно на PCIe делать несколько мастеров, чтобы обращаться из ОС по разным окнам памяти к ДДР (обычно одно для записи используют, другое для чтения). Окна обычно создают небольшого размера в 4 мегабайта и обращаясь по AXI CTL можно менять базовый адрес окна, тем самым сдвигаясь по памяти ДДР за пределы окна в 4 МБ. Тут я не нашёл такого регистра. Есть только константа базового адреса, которую мы задаём в настройках ядра во вкладке "PCIe:BARs" Поменять этот базовый адрес на ходу, не нашёл как. На форумах ребята пишут, что если нужен полный доступ к памяти ДДР, создавайте бар на 8ГБ или 2 по 4ГБ и радуйтесь. Мне такой вариант не подходит... Пришлось хитрить костылями. Создал два бара (BAR2 и BAR3 на картинке выше) Задал размер им в 4 МБ. На верхнем уровне создал у себя два регистра базовых адреса для окон. Вывел шину AXI на ружу и там асинхронно подменяю старшую часть адреса записи и чтения ДДР из своих регистров базового адреса. Таким образом могу пользуясь барами по 4МБ иметь полный доступ ко всей памяти ДДР. Но подход костыльный и не совсем правильный. Можете подсказать более правильное решение? У PCIe потолок 256 бит, если увеличить шину, интерконнект будет городить более сложную систему из конвертеров данных что значительно ухудшит тайминги... Пробовал так уже. "И ни на одной не помню таких проблем с обычным interconnect" а сколько было мастеров, пишущих в DDR?
  24. Я понимаю, что на вкус и цвет все фломастеры разные и каждому своё. Я новичок в Vivado, очень многого ещё не знаю, только изучаю. Но многие сложности мне кажутся просто не обоснованными =) Дизайн разумеется моделировали, верификатор сидит специально для этих целей, отработку протокола AXI от и до проверяет разными тестами, тут затыка точно нет. Все какие были, давно устранены. С таймингами в старом интерконекте когда работал ставил "other slise registers" на выходе и пакетную фифошку 512deep на входе мастеров. Лучше не становилось. Сама шина данных интерконнекта (XBAR который) 256, куда уж больше накручивать? Опора для интерконнекта частота AXI DDR (250МГц).