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

Где можно найти информацию по этим "специальным дергающим" функциям?

Если можете предложить помощь, буду рад совершенно любой информации, пока все никак не может собраться в общую картину

Когда в Nios EDK (или как там) будете формировать BSP, то эти фукнции там будут уже готовые, достаточно лишь header подключить к программе и указывать этим функциям BASE ADDRESS периферийного блока. Например ALT_GPIO_WR(GPIO_0, 0x1234); <- название функции от балды, но они как-то там называются, нужно просто покопать .h файлы в каталоге проекта BSP

 

то есть процессор+память можно обставить двумя PIO на вх/вых и программно в прошивке с них бросать данные, обрабатывать и посылать на второй PIO. Потом моделировать в modelSim? Тогда Quartus как участвует? BlockSchematicFile вообще предполагается при таком раскладе?

Да да, именно так. Modelsim отдельно от Quartus. BlockSchematicFile не обязателен, я например в тексте это всё делаю :)

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


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

Огромное спасибо вам, постараюсь все переварить и прощупать. Кстати, какую лучше версию Quartus использовать? Сейчас есть QII 9.1sp2+AlteraModelSim к ней+для прошивки софт на WIN7x32. Так же есть Quartus Prime 16.1 Lite Edition на WIN10x64?

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


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

Огромное спасибо вам, постараюсь все переварить и прощупать. Кстати, какую лучше версию Quartus использовать? Сейчас есть QII 9.1sp2+AlteraModelSim к ней+для прошивки софт на WIN7x32. Так же есть Quartus Prime 16.1 Lite Edition на WIN10x64?

Лучше всего v16.1 на Win7 x64 (ну или а Linux x64).

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


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

при попытке построить в эклипсе hello_nios проект выдает ошибки:

 

[bSP build complete]

Info: Linking prosh.elf

nios2-elf-g++ -T'../prosh_bsp//linker.x' -msys-crt0='../prosh_bsp//obj/HAL/src/crt0.o' -msys-lib=hal_bsp -L../prosh_bsp/ -Wl,-Map=prosh.map -O0 -g -Wall -mno-hw-div -mno-hw-mul -mno-hw-mulx -mgpopt=global -o prosh.elf obj/default/proch.o -lm -msys-lib=m

c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x86d0 of prosh.elf section `.rwdata' is not within region `onchip_memory'

c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x9114 of prosh.elf section `.bss' is not within region `onchip_memory'

c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x86d0 of prosh.elf section `.rwdata' is not within region `onchip_memory'

c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x9114 of prosh.elf section `.bss' is not within region `onchip_memory'

collect2.exe: error: ld returned 1 exit status

make: *** [prosh.elf] Error 1

 

С чем связано? уже и объем подергал. в Qsys собрал следующее - самый дохлый ниос с первым дебаггером, рам на 16кб, два pio - генерация прошла успешно

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


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

при попытке построить в эклипсе hello_nios проект выдает ошибки:

Скорее всего или с адресным пространством и настройками bsp накосячили, или printf в имеющийся объем памяти не помещается.

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


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

С чем связано? уже и объем подергал. в Qsys собрал следующее - самый дохлый ниос с первым дебаггером, рам на 16кб, два pio - генерация прошла успешно

Оно тупо не влезает... 16 Кбайт для такой ерунды не хватает - это правда.

Вместо printf я использую невесомую alt_putstr, вместо полноценных библиотек использую IORD_ALTERA_AVALON_UART_STATUS IORD_ALTERA_AVALON_UART_RXDATA и прочие функции (скорее макросы для обращения к регистрам Nios2 напрямую).

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


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

С чем связано? уже и объем подергал. в Qsys собрал следующее - самый дохлый ниос с первым дебаггером, рам на 16кб, два pio - генерация прошла успешно

Смотрите раздел Reducing Code Footprint in Embedded Systems в Nios II Gen2 Software Developer's Handbook

И рекомендацию уважаемого AVR относительно alt_putstr (ну или alt_printf) - см. тот же документ.

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


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

Расширил память до 128кб. Проект построился, *.elf сформировался.

1. Как я понимаю это именно файл прошивки?

2. Увидеть приветствие применяя Run AS NiosII Hardware не удалось, так как нет подключенных устройств, но я так понимаю это не самая большая проблема.

3. Теперь нужно в этом файле прошивки, который *.С нужно соорудить оперирование с регистрами NIOS'а и уже непосредственно организовать какой то конкретный алгоритм после чего моделировать МоделСим?

 

Понимаю, что вопросы полуриторические, мне просто нужно понимать в правильном ли направлении я двигаюсь

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


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

Расширил память до 128кб. Проект построился, *.elf сформировался.

1. Как я понимаю это именно файл прошивки?

2. Увидеть приветствие применяя Run AS NiosII Hardware не удалось, так как нет подключенных устройств, но я так понимаю это не самая большая проблема.

3. Теперь нужно в этом файле прошивки, который *.С нужно соорудить оперирование с регистрами NIOS'а и уже непосредственно организовать какой то конкретный алгоритм после чего моделировать МоделСим?

 

Понимаю, что вопросы полуриторические, мне просто нужно понимать в правильном ли направлении я двигаюсь

Направление абсолютно верно, двигаемся дальше :)

0. "Расширил память до 128кб" - и правильно, ведь это не железо, можно какой угодно размер увеличить

1. Да, но точнее это https://ru.wikipedia.org/wiki/Executable_and_Linkable_Format - формат универсальный, и для прошивок микроконтроллеров годится, из него можно в другой преобразовать если надо

2. Да, это только для живых ниосов в работающей ПЛИС, подключенных через JTAG например

3. Да, нужно оперировать регистрами. Конкретно для параллельных GPIO в Nios2 нужно читать ug_embedded_ip.pdf раздел 11 PIO core. Там есть еще Register Map, это значит что по смещению 1 лежит регистр для настройки "направления" работы порта GPIO: на вход или на выход. Смещение - от чего оно? От того адреса что мы автоматически назначили в Nios2 и теперь видим в файле system.h проекта BSP, это так называемый базовый адрес (base address, например #define PIO_0_BASE 0x5020) периферийного блока. В файле типа altera_avalon_pio_regs.h можно увидеть эти смещения, для удобства они в виде констант там. Ну а дальше работаем через функции (макросы на самом деле) IORD_ALTERA_AVALON_PIO*** указывая при обращении базовый адрес (ведь оно же должно знать с каким блоком PIO работаем, ведь их может быть много, а есть не только PIO).

4. Да, а потом этот ELF файл назначаем процессору Nios2, чтобы при загрузке прошивки и старте ПЛИС (или старте симуляции) в ней уже была программа по которой ей работать, ведь как "загрузить в симуляцию" прошивку для Nios2 я не знаю как делается если это возможно, поэтому задаем заранее жестко эту привязку процессора и прошивки. Затем моделируем в Modelsim

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


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

4. Да, а потом этот ELF файл назначаем процессору Nios2, чтобы при загрузке прошивки и старте ПЛИС (или старте симуляции) в ней уже была программа по которой ей работать, ведь как "загрузить в симуляцию" прошивку для Nios2 я не знаю как делается если это возможно, поэтому задаем заранее жестко эту привязку процессора и прошивки. Затем моделируем в Modelsim

Так, конечно, тоже можно. Но это не лучший вариант, т.к. он предполагает запуск квартусовского P&R, ну или, в лучшем случае, ассемблера. А это дополнительное время.

 

Обычно для проведения моделирования в ниосовском эклипсе создают таргет mem_init_geneate, который преобразует elf в hex- и dat-файлы. Dat-файл нужен для моделирования (он содержит данные, которыми при старте моделирования будет проинициализирована модель памяти).

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


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

3. Да, нужно оперировать регистрами. Конкретно для параллельных GPIO в Nios2 нужно читать ug_embedded_ip.pdf раздел 11 PIO core. Там есть еще Register Map, это значит что по смещению 1 лежит регистр для настройки "направления" работы порта GPIO: на вход или на выход. Смещение - от чего оно? От того адреса что мы автоматически назначили в Nios2 и теперь видим в файле system.h проекта BSP, это так называемый базовый адрес (base address, например #define PIO_0_BASE 0x5020) периферийного блока. В файле типа altera_avalon_pio_regs.h можно увидеть эти смещения, для удобства они в виде констант там. Ну а дальше работаем через функции (макросы на самом деле) IORD_ALTERA_AVALON_PIO*** указывая при обращении базовый адрес (ведь оно же должно знать с каким блоком PIO работаем, ведь их может быть много, а есть не только PIO).

 

"Прочитал" файл, что вы советовали. В кавычках, потому что английский, к сожалению не хватает знаний языка для того что бы вникнуть. Возможно есть что то похожее не русском? И что то мне подсказывает что должна быть инструкция по конкретным методам обращения к регистрам. Пока только понял что altera_avalon_pio_regs.h подключается библиотекой, которая и содержит методы. Но есть ли по ним какое то обьяснение, желательно на русском? или на русский в этой теме можно не рассчитывать :biggrin:

 

 

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


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

"Прочитал" файл, что вы советовали. В кавычках, потому что английский, к сожалению не хватает знаний языка для того что бы вникнуть. Возможно есть что то похожее не русском? И что то мне подсказывает что должна быть инструкция по конкретным методам обращения к регистрам. Пока только понял что altera_avalon_pio_regs.h подключается библиотекой, которая и содержит методы. Но есть ли по ним какое то обьяснение, желательно на русском? или на русский в этой теме можно не рассчитывать :biggrin:
Ну вот документ: https://www.altera.com/en_US/pdfs/literatur...rst_nios_sw.pdf Там написано про IOWR_ALTERA_AVALON_PIO_DATA(base, data) это записывает данные в параллельный порт, а IORD считывает (WR write, RD read). Аналогичные функции для настройки направления работы параллельных портов.

 

Документацию и научные статьи я бы рассчитывал видеть лишь в англоязычном варианте.

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


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

Ну в общем то с PIO вроде обстановка примерно понятна. У меня два блока в Qsys'е собиралось вх/вых. В коде попытался каждый дернуть. Теперь буду пробовать симулировать. Вот только вопрос, для того что бы в IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE); что то бросить, надо же создавать схему (уже в Квартусе) и там каким то образом подсовывать значения?

 

#include <stdio.h>
#include "altera_avalon_pio_regs.h"
#define PIO_0_BASE 0x41000
#define PIO_BASE 0x41010 //Скопировал адреса с system.h

int main()
{
int in;
in = IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE);//Предполагаю в переменную записать число
in=in+1;//Минимальные действия с числом
IOWR_ALTERA_AVALON_PIO_DATA(PIO_BASE, in);//Вывод получившегося значения
 return 0;
}

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


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

Ну в общем то с PIO вроде обстановка примерно понятна. У меня два блока в Qsys'е собиралось вх/вых. В коде попытался каждый дернуть. Теперь буду пробовать симулировать. Вот только вопрос, для того что бы в IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE); что то бросить, надо же создавать схему (уже в Квартусе) и там каким то образом подсовывать значения?
Разумеется, надо создать обвязку вокруг процессора, чтобы она вводила значения. Можно просто на входе повесить одно значение, а можно выход на вход подать - и будет оно так бесконечно инкрементировать по кругу, что можно будет легко увидеть в симуляторе.

 

wire [31:0] my_loop;
my_cpu cpu(
.clock(clock50mhz),
.reset(my_reset),
.input_pio(my_loop),
.ouput_pio(my_loop)
);

Только с reset это отдельный разговор - он должен продержать уровень после включения схемы и затем сняться.

 

Код я бы немного изменил:

#include <stdio.h>
#include "altera_avalon_pio_regs.h"
#define PIO_0_BASE 0x41000
#define PIO_BASE 0x41010 //Скопировал адреса с system.h

int main()
{
int in;

while(1) { // пусть бесконечно крутится для начала, а то отработает и замолчит
in = IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE);//Предполагаю в переменную записать число
in=in+1;//Минимальные действия с числом
IOWR_ALTERA_AVALON_PIO_DATA(PIO_BASE, in);//Вывод получившегося значения
}
 return 0;
}

 

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


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

я не очень понимаю. Обвязку в самом квартусе составлять? если так то у меня в *.bsf, который после Qsys, только один вход clk, то есть pio нет. И первый кусок кода, который вы написали, в какой файле находиться должен?

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


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

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

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

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

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

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

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

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

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

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