Почему AXI VDMA выдает мне ошибку EOL Early?

Вопрос или проблема

В дизайне блоков Vivado у меня есть такая ситуация

VDMA01

Моим единственным руководством является этот документ

https://docs.amd.com/r/en-US/pg020_axi_vdma/AXI-Video-Direct-Memory-Access-v6.3-LogiCORE-IP-Product-Guide

Я использую Microblaze для инициализации VDMA:

    // S2MM
    // инициализация адресов буферов записи VDMA
    *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0x30) = 4; // сброс
    usleep(1);
    *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0x30) = 0x408b;   // 100 0000 1000 1011;
    // бит14 - прерывание по ошибке включено
    // бит7 - внутренний генератор тактовых сигналов;
    // бит3 - синхронизация по генератору тактовых сигналов или динамическая синхронизация по генератору тактовых сигналов включена. S2MM синхронизирован с входом кадрового сигнала генератора;
    // бит1 - круговой режим - движок непрерывно проходит через кадровые буферы.
    // бит0 - запуск - начать операции VDMA

    for(int i = 0; i<VDMA_NUM_BUFFERS; i++) {
        *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xAC + i*4) = VDMA_ADDRESS_BASE + VDMA_BUFFER_OFFSET * i;
    }
    *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xA8) = 256;       // fdelay/stride
    *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xA4) = 140;       // hres
    *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xA0) = 2160;       // vres - начинает передачу

И… что я вижу, так это следующее. В функции опроса Microblaze считывает регистр состояния для VDMA S2MM (регистр состояния VDMA S2MM – смещение 34h) и считывает значение 0x15100. То есть, биты 8, 12, 14 и 16 установлены.

Согласно уже упомянутой документации,

status reg doc

Таким образом, ошибка End-Of-Line-Early кажется основной проблемой здесь.

Я подключил ключевые линии к логическому анализатору, чтобы увидеть, что происходит.

LA01

И вот увеличенное изображение первой линии в кадре.

LA02

Тактовая частота составляет 100 МГц, так что все это выглядит нормально – в этом ряду 140 допустимых циклов, как и должно быть. tready опускается в начале каждого кадра, но на выполнение этого ряда уходит значительно больше времени.

Итак, почему VDMA выдает мне эту ошибку? Пожалуйста, помогите.

Я понял, что ошибка может быть не той, что вызывает сигнал прерывания. Поэтому я изменил инициализацию VDMA, чтобы отключить бит14. По сути, я изменил одну строку в своем коде MB на:

*(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0x30) = 0x008b;   // 000 0000 1000 1011;

И, как и ожидалось, сигнал s2mm_introut никогда не поднимается. Он навсегда остается 0.

Ответ или решение

Ошибка EOL Early (End-Of-Line Early) в AXI VDMA (Video Direct Memory Access) может возникать по нескольким причинам, и важно разобраться в конкретной ситуации, чтобы эффективно ее устранить. В вашем случае, несмотря на то что вы уже провели некоторые диагностические действия, давайте рассмотрим возможные источники проблемы и стратегии их решения.

1. Понимание ошибки EOL Early

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

2. Проверка конфигурации VDMA

На основании вашего кода и конфигурации VDMA, вот некоторые ключевые моменты, которые стоит проверить:

  • Параметры разрешения (hres и vres): Убедитесь, что ваши разрешения, указанные в *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xA4) и *(unsigned int *) (DMA_DEVICE_REG_BASE_ADDR + 0xA0), правильно соответствуют формату данных, которые вы передаете. В данном случае, ширина строки (hres) равна 140 пикселей. Убедитесь, что VDMA правильно настроен для обработки именно этого разрешения.

  • Строковые задержки и синхронизация: Исходя из ваших наблюдений с логическим анализатором, проверьте, нет ли задержек между линиями Ltf и Tready. Tready должен быть низким на протяжении всего времени передачи, и если он уходит в низкий уровень слишком рано, это может вызвать ошибку EOL Early.

3. Проверка конфигурации источника данных

Важно также удостовериться, что ваша передающая сторона (в данном случае, какой-либо источник видео или другой компонент, блокирующий данные на VDMA) корректно настроена:

  • Интерфейс передачи: Убедитесь, что данные передаются с ожидаемой частотой и в правильной последовательности. Неправильные данные или их формат могут вызвать неожиданное поведение.

  • Правильное время граничных сигналов: Граничные сигналы, такие как Tready и Tvalid, должны правильно синхронизироваться с данными, чтобы VDMA мог корректно интерпретировать поток данных.

4. Диагностика с помощью логических анализаторов

Вы уже начали диагностику с помощью логического анализатора, что является хорошей практикой. Используйте его для проверки следующего:

  • Частота и временные задержки: Убедитесь, что данные соответствуют временным ожиданиям VDMA и что частота передачи не превышает 100 МГц.

  • Процесс передач данных: Проверьте, как именно данные передаются между компонентами, и убедитесь, что каждый временной интервал соответствует ожиданиям системы.

5. Настройки прерываний и регистров

Интересно, что вы упомянули изменение конфигурации прерываний в своем коде, что, вероятно, отключило сигнал s2mm_introut. Это может быть полезно для диагностики, однако, важно также убедиться, что все регистры настроены должным образом и что прерывания действительно нуждаются в активировании для вашего случая.

Рекомендации по исправлению

  • Проверьте все сигналы, связанные с передачей данных, и убедитесь, что они соответствуют спецификациям вашего устройства.
  • Проверьте, корректны ли данные, которые передаются в VDMA, что снизит вероятность возникновения ошибок.
  • Проверьте все настройки VDMA и их полное соответствие документации, убедитесь, что выбран правильный режим работы (например, Circular Mode).

Эти шаги должны помочь устранить ошибку EOL Early в вашем проекте. Если проблема сохраняется, может потребоваться более глубокая диагностика на уровне RTL (Register Transfer Level) для выявления конкретной причины сбоя.

Оцените материал
Добавить комментарий

Капча загружается...