Jump to content

    

Пользовательский компонент для Qsys (SOPC Builder)

Помогите, пожалуйста, разобраться с добавление своего компонента в Qsys. Конкретно интересует файл _regs.h, в котором задаются регистры компонента. С одной 32-разрядной шины компонента выводится 5-ть однобитных выходов (подключаются к шилду ethernet). Как правильно распределить оффсеты для управления ими в Nios ii software с помощью IOWR и IORD? По сути интересует как сделать правильную адресацию для своего компонента (в мануалах описаны только альтеровские готовые компоненты с уже заданными регистрами)?

Share this post


Link to post
Share on other sites

IORD_32DIRECT(base, offset) 

IOWR_32DIRECT(base, offset, data) 

offset задаете побайтно. 

 

Share this post


Link to post
Share on other sites
16 часов назад, Darky777 сказал:

IORD_32DIRECT(base, offset) 

IOWR_32DIRECT(base, offset, data) 

offset задаете побайтно. 

 

Спасибо! Со своими пинами разобрался. Понял что они вызываются по адресу, заданному внутри компонента. Теперь пытаюсь понять как из Eclipse (Nios ii software) управляются выводы посаженные на шину Avalon-MM (как например, взвести chipselect?). Подскажете по этому вопросу?

Share this post


Link to post
Share on other sites
On 6/20/2019 at 8:37 AM, effort said:

Спасибо! Со своими пинами разобрался. Понял что они вызываются по адресу, заданному внутри компонента. Теперь пытаюсь понять как из Eclipse (Nios ii software) управляются выводы посаженные на шину Avalon-MM (как например, взвести chipselect?). Подскажете по этому вопросу?

С точки зрения ниоса эти сигналы не управлются вами, этим сигналом как и read, write, byteenable управляет шинный арбитр/контроллер шины (он генерируется Qsys, Sopcbuilder,Platform designer ) , в зависимости от того, в какое окно адреса вы попадете, например, если модуль gpio располжен на шине с адреса 0xF000 и заканчивает 0xF00F то если вы обращаетесь например по адресу 0xF004 , шинный арбитр за вас отправит ему все контрольные сигналы. если обратитесь по другому адресу, то арбитр отправит чипселекты и прочие другим модулям.

  

Edited by Darky777

Share this post


Link to post
Share on other sites

Спрошу тут, даб не плодить схожих тем.

Есть потребность в памяти констант, создал OnChipROM. А как его прочитать поэлементно? Или сделать "дубово" через внешнюю, по отношению ниоса, ПЗУ и читать iord?

Share this post


Link to post
Share on other sites
В 21.06.2019 в 20:48, Darky777 сказал:

С точки зрения ниоса эти сигналы не управлются вами, этим сигналом как и read, write, byteenable управляет шинный арбитр/контроллер шины (он генерируется Qsys, Sopcbuilder,Platform designer ) , в зависимости от того, в какое окно адреса вы попадете, например, если модуль gpio располжен на шине с адреса 0xF000 и заканчивает 0xF00F то если вы обращаетесь например по адресу 0xF004 , шинный арбитр за вас отправит ему все контрольные сигналы. если обратитесь по другому адресу, то арбитр отправит чипселекты и прочие другим модулям.

  

 

Большое спасибо, стало понятно! Еще прочитал важную для понимания вещь, о том что обращение по адресу генерируется для всех подчиненных устройств и те устройства для которых этот адрес не предназначен его просто игнорируют. Еще момент, как правильно описать тестовую модель (modelsim) для пользовательского компонента? В Platform Designer, при генерации выдает такую ошибку: Error: name_custom_module_0: name_custom_module does not support generation for Verilog Simulation. Generation is available for: Quartus Synthesis.
 Как я понимаю, необходимо в ручную написать тестовый модуль?

Share this post


Link to post
Share on other sites
On 6/23/2019 at 7:49 AM, effort said:

Большое спасибо, стало понятно! Еще прочитал важную для понимания вещь, о том что обращение по адресу генерируется для всех подчиненных устройств и те устройства для которых этот адрес не предназначен его просто игнорируют. Еще момент, как правильно описать тестовую модель (modelsim) для пользовательского компонента? В Platform Designer, при генерации выдает такую ошибку: Error: name_custom_module_0: name_custom_module does not support generation for Verilog Simulation. Generation is available for: Quartus Synthesis.
 Как я понимаю, необходимо в ручную написать тестовый модуль?

Я пишу ручками.. А такими инструментами не пользовался.

Речь идет об использвании этого документа? Как-то раз я воспользовался им ради интереса, собрал тестовый проект. Оказался довольно полезным, однако приходилось ручками некоторые исходники подправлять, что было крайне неприятно..

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_avalon_verification_ip.pdf

On 6/22/2019 at 10:30 PM, Александр77 said:

Спрошу тут, даб не плодить схожих тем.

Есть потребность в памяти констант, создал OnChipROM. А как его прочитать поэлементно? Или сделать "дубово" через внешнюю, по отношению ниоса, ПЗУ и читать iord?

Когда-то давно один умный и матерый программист сказал мне, что для чтения и записи у ниоса рекомендуется использовать ТОЛЬКО IOWR и IORD. На чем это основано - без понятия.. 

Share this post


Link to post
Share on other sites
В 24.06.2019 в 22:02, Darky777 сказал:

Я пишу ручками.. А такими инструментами не пользовался.

Речь идет об использвании этого документа? Как-то раз я воспользовался им ради интереса, собрал тестовый проект. Оказался довольно полезным, однако приходилось ручками некоторые исходники подправлять, что было крайне неприятно..

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_avalon_verification_ip.pdf

Когда-то давно один умный и матерый программист сказал мне, что для чтения и записи у ниоса рекомендуется использовать ТОЛЬКО IOWR и IORD. На чем это основано - без понятия.. 

Хорошо, как написать testbench для компонента понятно, а как в ручную описать полную тестовую модель для системы с Nios II? Какие файлы проекта должна содержать тестируемая модель? Какие альтеровские библиотеки необходимо подключить для корректной симуляции? Может сбросите мне тестовый модуль системы с Nios для примера?

Share this post


Link to post
Share on other sites

Я бы с радостью скинул будь еслиб он у меня был... Никогда не приходилось писать тестбенч целостного проекта с работающим на нем nios, да и нужно ли это делать? Мастером может быть кто угодно, в тестбенче это Avalon-MM BFM (bus functional model) cсылку я давал. С помощью него вы можете составить сценарий работы с вашим модулем вместе с остальными. Пример проекта там, кстати, есть.  К тому же интуиция мне подсказывает, что запуск симуляции с ниосом будет проблематичнее, и сама процесс симуляции будет долгим.  

Share this post


Link to post
Share on other sites
18 часов назад, Darky777 сказал:

Я бы с радостью скинул будь еслиб он у меня был... Никогда не приходилось писать тестбенч целостного проекта с работающим на нем nios, да и нужно ли это делать? Мастером может быть кто угодно, в тестбенче это Avalon-MM BFM (bus functional model) cсылку я давал. С помощью него вы можете составить сценарий работы с вашим модулем вместе с остальными. Пример проекта там, кстати, есть.  К тому же интуиция мне подсказывает, что запуск симуляции с ниосом будет проблематичнее, и сама процесс симуляции будет долгим.  

Спасибо за правильные мысли,  общий смысл понятен, буду работать в этом направлении!

Share this post


Link to post
Share on other sites

В общем, немного научился отлаживаться. Отдельно просимулировал в modelsim файлы компонента Platform Designer (QSys), добавил нужные сигналы в SignalTap собрал весь проект и прошил. В Eclipse прошиваю файл elf и запускаю отладку. В SignalTap ставил триггер на разные сигналы и выяснил, что Avalon-MM не взводит chipselect на чтение, но взводит на запись. В Eclipse задаю смещение относительно базового адреса как на рисунке 1. Обращаюсь как на рисунке 2. В SignalTap при установленном на cs триггере получаю рисунок 3. На чтение вообще не реагирует. На всякий случай прикреплю код верхнего уровня компонента Platform Designer (w5500.v). Подскажите в чем может быть дело и куда копать?

eclipse_1.png

 

 

 

eclipse_2.png

signal_tap_3.png

Edited by effort

Share this post


Link to post
Share on other sites
  always @(*)
    begin
      if (reset_n == 0)
          readdata <= 0;
      else if (chipselect && clk_en && (address[2:0] == 3'd2))
          readdata <= {24'd0 | SPI_TO_NIOS[7:0]};
		else if (chipselect && clk_en && (address[2:0] == 3'd3))
		    readdata <= {31'd0 | SPI_FINISH};
		else 
			readdata <= 0;
		
    end	

у вас и * в списке чувствительности у always и неблокирующее присваивание! Так какую логику работу вы закладывали, на последовательную или комбинационную?

 Судя по диаграмме которую вы представили синтезатор сделал комбинационную. Что это значит в вашем случае? Означает что данные на readdata выставится в тот же такт, что и chipselect, то есть с задержкой равной 0 тактов. кстати говоря, почему вы утверждаете что на чтение он не реагирует, вот же, я его отчетливо вижу, прямо перед записью).

Есть такой параметр в шине авалон-мм называемый readLatency. почитайте про него. При создании кастомной корки вы его сами задаете. Задавать его следует в соответствии в вашими характеристиками модуля, тогда PlatformDesigner учтет ваши пожелания. Успехов! 

Share this post


Link to post
Share on other sites
В 05.07.2019 в 15:23, Darky777 сказал:

  always @(*)
    begin
      if (reset_n == 0)
          readdata <= 0;
      else if (chipselect && clk_en && (address[2:0] == 3'd2))
          readdata <= {24'd0 | SPI_TO_NIOS[7:0]};
		else if (chipselect && clk_en && (address[2:0] == 3'd3))
		    readdata <= {31'd0 | SPI_FINISH};
		else 
			readdata <= 0;
		
    end	

у вас и * в списке чувствительности у always и неблокирующее присваивание! Так какую логику работу вы закладывали, на последовательную или комбинационную?

 Судя по диаграмме которую вы представили синтезатор сделал комбинационную. Что это значит в вашем случае? Означает что данные на readdata выставится в тот же такт, что и chipselect, то есть с задержкой равной 0 тактов. кстати говоря, почему вы утверждаете что на чтение он не реагирует, вот же, я его отчетливо вижу, прямо перед записью).

Есть такой параметр в шине авалон-мм называемый readLatency. почитайте про него. При создании кастомной корки вы его сами задаете. Задавать его следует в соответствии в вашими характеристиками модуля, тогда PlatformDesigner учтет ваши пожелания. Успехов! 

Логику реализовывал комбинационную, * для расширения списка чувствительности, чтобы отследить все сигналы в signaltap связанные с readdata. Тот chipselect, который на диаграмме появляется при адресе равном 3 (idle), а не 2 (read). За readLatency спасибо, попробую, реализовать с помощью него задержку чтения данных, но не понятно почему импульс не появляется без задержки и какую смысловую нагрузку она здесь несет?

Share this post


Link to post
Share on other sites
On 7/6/2019 at 8:16 PM, effort said:

Логику реализовывал комбинационную, * для расширения списка чувствительности, чтобы отследить все сигналы в signaltap связанные с readdata

Для комбинационной логике при присваивании в always используется блокирующее присваивание (=). Для последовательной логики используется неблокирующее присваивание (<=). 

 

On 7/6/2019 at 8:16 PM, effort said:

За readLatency спасибо, попробую, реализовать с помощью него задержку чтения

Задержку вы можете сделать какую захотите. Главное сообщить об этом при создании кастомной корки, чтобы PlatformDesigner реализовал контролер с этой задержкой

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now