Два главных компонента, управляющих одним и тем же подчиненным устройством (назначение адресов), 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 представляет собой пользовательский мастер-блок, который Я разработал.

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

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

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

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

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

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


person ANMOSI    schedule 13.09.2018    source источник
comment
Ответ на первый вопрос зависит от двух вещей, которые неясны из вашего вопроса: какова ширина шины Avalon (т. е. битовая ширина writedata/readdata) и какую единицу представляет каждый адрес (по умолчанию он адресуемый, но он можно изменить, изменив свойство addressUnits шины)? Я не уверен, что вы спрашиваете во втором вопросе.   -  person Unn    schedule 13.09.2018
comment
@Unn Ширина считываемых данных составляет 512 бит, и я не менял свойство addressUnits. Теперь он адресуется по байтам, чтобы убедиться, что я проверил его с помощью небольшого тестового блока оперативной памяти, он работал.   -  person ANMOSI    schedule 14.09.2018
comment
@Unn Я имею в виду, что в соответствии с кодом Verilog zpc_1 он должен иметь возможность смещать адрес и читать содержимое каждого слова одно за другим («адрес‹=адрес + 1;» или «адрес‹=адрес + 64» проверил оба и получил тот же результат, непрерывно считывается только первое слово памяти, никогда не переходит к другому).   -  person ANMOSI    schedule 14.09.2018
comment
Вам нужно будет увеличить адрес на шине на 64, а не на 1; вам нужно будет опубликовать часть кода для вашего модуля zpc_1, чтобы понять, почему он не читает из ОЗУ больше, чем первое 512-битное слово. (address <= address + 'd64 должно быть правильно)   -  person Unn    schedule 14.09.2018
comment
@Unn Спасибо за ваши усилия, проблема решена. Использовал двухпортовую оперативную память, проблема была решена. И сделал адресацию, как ты сказал.   -  person ANMOSI    schedule 18.09.2018


Ответы (1)


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

Попробовал двухпортовую оперативную память, как показано здесь, и модифицировал компонент, правильно используя 'waitrequest' сигнал и все заработало нормально.

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

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

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

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

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

person ANMOSI    schedule 18.09.2018