Невозможно получить доступ к Znyq AXI BRAM из Linux - PullRequest
0 голосов
/ 12 ноября 2018

В моем проекте данные записываются в BRAM (сгенерированный с помощью IP-генератора Block Ram) с пользовательского IP-адреса. Затем я использую контроллер AXI BRAM, чтобы связать память с шиной AXI и сделать ее доступной для Linux, работающего на ARM.

Базовый адрес для контроллера - 0x4200_0000 с диапазоном 8K (до 0x4200_1FFF). Память также имеет 8K позиций, каждая шириной 32 бита.

Чтобы убедиться, что проблема с доступом не связана с данными, сгенерированными в моем настраиваемом IP-адресе, я инициализирую память, просто нумеруя каждый из адресов 8K (поэтому адрес 1 содержит 0x01 и т. Д. До 0x1fff).

Проблема возникает при попытке прочитать эти значения из Linux. Использование devmem 0x42000001 в командной строке возвращает 0x04000000 и следующее:

Alignment trap: devmem (1257) PC=0x0001ca94 Instr=0xe7902005 Address=0xb6f9d2fd FSR 0x011

Что, по-видимому, указывает на то, что Linux ожидает, чтобы каждое значение адреса отображалось в байт, а не в 32-битное слово. Ловушки выравнивания происходят до тех пор, пока devmem 0x42000004 не вернет 0x00000004, правильное значение для четвертого направления, но к значениям в адресах, не кратных 4, невозможно получить доступ. devmem 0x42000002 возвращает 0x00040000 (обратите внимание на смещение 0x04), а также ловушку выравнивания. Я обнаружил проблему с моим оригинальным скриптом Python, который использует mmap для отображения / dev / mem: мне нужно прочитать каждые 4 значения адреса, поскольку каждый отдельный адрес отображается в байт, но это означает, что я получаю только одно из каждых четырех значений.

Есть идеи, как правильно взаимодействовать с контроллером AXI и с памятью за ним?

******* Редактировать, чтобы уточнить проблему, которая у меня есть. Если сомневаетесь, добавьте картинку:

Figure of the issue

1 Ответ

0 голосов
/ 12 ноября 2018

Что, по-видимому, указывает на то, что Linux ожидает, чтобы каждое значение адреса соответствовало байту

Это стандартное отображение во всех современных процессорах. Когда вы используете AXI с шиной данных шире, чем на 8 бит, нижние биты адреса выбирают байт из шины данных AXI. Перейдите на веб-сайт ARM и загрузите спецификацию AXI.

Базовый адрес для контроллера - 0x4200_0000 с диапазоном 8K (до 0x4200_1FFF). Память также имеет 8K позиций, каждая из которых имеет ширину 32 бита.

Это неправильно, 8K из 32 битов имеет диапазон адресов 8K * 4 = 0x0000 .. 0x7FFF.

Я предлагаю вам пересобрать BRAM, но использовать другие параметры для генератора IP Block Block.


Я изменил ОЗУ, чтобы порт, доступный для контроллера AXI, работал с 8 битами. .....

Ваша шина Zynq AXI, вероятно, имеет ширину 32 бита. Таким образом, стандартная подключенная память должна иметь ширину 32 бита, где вы должны иметь возможность записи байтов.
Если вы подключите 8-битную память к 32-битной шине и не измените адрес или неправильно адаптируете его, вы можете потерять 3 из 4 байтов.

Что мне непонятно, так это поведение, которое вы точно хотите.

  1. Стандартная 8Kx32 битная память с байтовым доступом
    или
  2. 8kx8 битная память, где у вас есть байт в 0x0, 0x4, 0x8 и т. Д.

В случае 2 вы должны использовать адрес AXI по-другому: вы должны сдвинуть биты адреса вверх на две позиции, чтобы каждый байт занимал 4 адреса. Вы также должны решить, где разместить байт:

  • Только позиция LS: привязать 24 бита MS к нулю

  • Только позиция MS: привязать биты LS 24 к нулю

  • Повторяется во всех 4 местах: повторить байт четыре раза по 32 битам.

  • Что бы ты ни думал. (Это ваше оборудование, вы можете делать то, что вы хотите.)

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

...