Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Darky777 сказал:

IORD_32DIRECT(base, offset) 

IOWR_32DIRECT(base, offset, data) 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 , шинный арбитр за вас отправит ему все контрольные сигналы. если обратитесь по другому адресу, то арбитр отправит чипселекты и прочие другим модулям.

  

Изменено пользователем Darky777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.
 Как я понимаю, необходимо в ручную написать тестовый модуль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. На чем это основано - без понятия.. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 для примера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, Darky777 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, немного научился отлаживаться. Отдельно просимулировал в 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

Изменено пользователем effort

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  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 учтет ваши пожелания. Успехов! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 реализовал контролер с этой задержкой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...