Два главных компонента, управляющих одним и тем же ведомым устройством (назначение адресов), Intel Quartus Prime Platform Designer (Qsys)
Я делаю проект с использованием 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 (из библиотеки повышения) C++) типа данных для записи, и zpc_1 имеет ширину readdata 512 бит. Адреса присваиваются относительно h2f_lw_axi_master.
У меня есть два вопроса, связанных с этой системой.
1. Должен ли адрес для чтения данных в коде zpc_1 HDL начинаться со смещения 0x20000 и увеличиваться на 0x40 (64) в каждом цикле для считывания данных слово за словом? (или любой другой метод)
2. zpc_1 умеет читать первое слово и постоянно работает в соответствии с инструкциями первого слова, в чем может быть причина?
Если вам нужна дополнительная информация для ответа на вопрос и / или вопрос недостаточно ясен для понимания, не стесняйтесь спрашивать о дополнительной информации (комментарий).
1 ответ
Проблема заключалась в том, что когда один из мастеров взаимодействовал с подчиненным, подчиненный не разрешал другим правильно (в протоколе есть сигнал под названием "waitrequest", я не использовал этот сигнал должным образом, когда использовал его, этот сигнал правильно, раб всегда отправлял запрос ожидания, который также помог мне отладить проблему).
Попробовал двухпортовую оперативную память, как показано здесь, и изменил компонент, правильно используя сигнал "waitrequest", и все начало работать должным образом.
Теперь ответы:
Q1: Должен ли адрес для чтения данных в коде zpc_1 HDL начинаться со смещения 0x20000 и увеличиваться на 0x40 (64) в каждом цикле для считывания данных слово за словом? (или любой другой метод)
A1: Вы можете определить другое смещение адреса относительно пользовательского главного компонента, как хотите, и начать чтение с этого смещения адреса (я использовал 0x00000000, как на рисунке). Адрес должен увеличиваться на 0x40 (64) в каждом цикле, чтобы прочитать слово слово за словом, как прокомментировал @Unn.
Q2: zpc_1 умеет читать первое слово и постоянно работает в соответствии с инструкциями первого слова, в чем может быть причина?
Ответ 2. Причина в том, что ведомое устройство (однопортовое ОЗУ) не смогло правильно отреагировать на оба устройства одновременно через один порт, а замена его на двухпортовое ОЗУ решает проблему.