Вопрос или проблема
В дизайне блоков Vivado у меня есть такая ситуация
Моим единственным руководством является этот документ
Я использую 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 установлены.
Согласно уже упомянутой документации,
Таким образом, ошибка End-Of-Line-Early кажется основной проблемой здесь.
Я подключил ключевые линии к логическому анализатору, чтобы увидеть, что происходит.
И вот увеличенное изображение первой линии в кадре.
Тактовая частота составляет 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) для выявления конкретной причины сбоя.