Два главных компонента, управляющих одним и тем же ведомым устройством (назначение адресов), Intel Quartus Prime Platform Designer (Qsys) - PullRequest
0 голосов
/ 13 сентября 2018

Я делаю проект с использованием DE1-SoC (FPGA + ARM cortex A9). Вы можете увидеть часть дизайна (Qsys, дизайнер платформы) здесь

Оперативная память (RAM, image_memory) осваивается двумя разными мастерами. Один из мастеров хорошо известен h2f_lw_axi_master (предоставляемый программным обеспечением Quartus Prime для обеспечения обмена данными ARM и FPGA), а другой zpc_1 - это пользовательский мастер-блок, который я разработал .

Основная идея этого проекта заключается в том, что после настройки FPGA необходимо иметь возможность записывать данные во встроенную память, а zpc_1 считывает содержимое памяти и работает с ней.

Длина каждого слова составляет 512 бит (64 байта), и есть 1200 слов (поэтому назначенный адрес начинается с 0x0002_0000 и заканчивается на 0x0003_2bff , достаточно места для 76800 = (512 * 1200) / 8 байт. Hps использует для записи данные типа uint512_t (из библиотеки boost c ++), а zpc_1 имеет ширину readdata 512 бит. Адреса присваиваются по h2f_lw_axi_master .

У меня есть два вопроса, связанных с этой системой.

1. Должен ли адрес для чтения данных в zpc_1 код HDL начинаться со смещения 0x20000 и увеличиваться на 0x40 (64) в каждом цикле для считывания данных слово за словом? (или любой другой метод)

2. zpc_1 способен читать первое слово и постоянно работает в соответствии с инструкциями в первом слове, в чем может быть причина?

Если вам нужна дополнительная информация для ответа на вопрос и / или вопрос недостаточно ясен для понимания, не стесняйтесь спрашивать о дополнительной информации (комментарий).

1 Ответ

0 голосов
/ 18 сентября 2018

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

Попробовал двухпортовый ОЗУ, как показано здесь и изменил компонент, правильно используя сигнал 'waitrequest', и все начало работать правильно.

Теперь ответы:

В1: Должен ли адрес для чтения данных в коде zpc_1 HDL начинаться со смещения 0x20000 и увеличиваться на 0x40 (64) в каждом цикле для считывания данных слово за словом? (или любой другой метод)

A1: Вы можете определить другое смещение адреса относительно пользовательского главного компонента, как вам нужно, и начать чтение с этого смещения адреса (я использовал 0x00000000, как на рисунке). Адрес должен увеличиваться на 0x40 (64) в каждом цикле, чтобы прочитать слово слово за словом, как прокомментировал @Unn.

Q2: zpc_1 умеет читать первое слово и постоянно работает в соответствии с инструкциями в первом слове, в чем может быть причина?

A2: Причина в том, что ведомое устройство (однопортовое ОЗУ) не смогло правильно отреагировать на оба устройства одновременно через один порт, а замена его на двухпортовое ОЗУ решает проблему.

...