Jump to content
    

Здравствуйте, пишу программу на Си в ниос2 эклипс. Проект был собран в qsys, там имеется ниос2, DDR2, PIO, on-chip memory2 и т.д. Возник вопрос: как на языке Си обратиться например именно к выводу PIO или к шине адреса DDR2? Вставил несколько строк, но не знаю правильно ли сделал

ALT_MODULE_CLASS_pio_in (PIO_IN_BASE, data_inp);

ALT_MODULE_CLASS_pio_out_on (PIO_OUT_ON_BASE, data_out_on);

ALT_MODULE_CLASS_pio_out (PIO_OUT_BASE, data_out);

ALT_MODULE_CLASS_onchip_memory2_0 (ONCHIP_MEMORY2_0_BASE, on_chip);

Share this post


Link to post
Share on other sites

Здравствуйте, пишу программу на Си в ниос2 эклипс. Проект был собран в qsys, там имеется ниос2, DDR2, PIO, on-chip memory2 и т.д. Возник вопрос: как на языке Си обратиться например именно к выводу PIO или к шине адреса DDR2? Вставил несколько строк, но не знаю правильно ли сделал

ALT_MODULE_CLASS_pio_in (PIO_IN_BASE, data_inp);

ALT_MODULE_CLASS_pio_out_on (PIO_OUT_ON_BASE, data_out_on);

ALT_MODULE_CLASS_pio_out (PIO_OUT_BASE, data_out);

ALT_MODULE_CLASS_onchip_memory2_0 (ONCHIP_MEMORY2_0_BASE, on_chip);

Смотрите в BSP папку drivers, там есть всё необходимое.

Share this post


Link to post
Share on other sites

Смотрите в BSP папку drivers, там есть всё необходимое.

 

Все что есть в папке. Где взять DDR2 и on-chip memory2 ?

post-57122-1421742208_thumb.jpg

Share this post


Link to post
Share on other sites

Все что есть в папке. Где взять DDR2 и on-chip memory2 ?

Bsp перегенерили после добавления DDR2? Должны драйвера под контроллер DDR2 появиться, для On-Chip memory и не требуются, ну а для GPIO - altera_avalon_gpio_regs.h.

 

Share this post


Link to post
Share on other sites

DDR2 - это не просто статичная память, даже когда вы ее не трогаете там много всего происходит. Потому олопачиванием ее занимается специальный контроллер. Который дергает адреса, производит рефреши, выдбирает столбики и колонки.

 

Из этого следует что в целом вам не зачем и нельзя обращаться к шине что идет на память, иначе вы этот процесс собьете.

 

Чтобы просто пошевелить ножками проца - для этого существует модули которые подключаются к шине проца и данные переводят в пины GPIO. Если же есть острая необходимость шевелить ногами памяти (что скорее всего не выйдет), надо писать свой модуль между контроллером и памятью и с шиной к процу. Но скорее всего после внедрения этого модуля ваша память перестанет работать...

 

Применение контроллера DDR должно встроить память в адресное пространство вашего процессора, во всяком случае это логично и у ксалинкс сделано именно так, потому обращение в память подключенную к процу через контроллер происходит просто по адресам (чтение, запись по указателю в С)

Share this post


Link to post
Share on other sites

Обманул Вас, для DDR2 как и для On-Chip Memory не будет драйверов в BSP. При условии правильных настроек в Qsys для DDR2-контроллера и соблюдения всех таймингов будет работать как обычная память - создаём указатель на адреса DDR, по нему обращаемся к памяти.

Share this post


Link to post
Share on other sites

получается, что я могу работать только с адресами ОЗУ? Адресное пространство вроде задал верно, qsys не ругался.

 

Bsp перегенерили после добавления DDR2? Должны драйвера под контроллер DDR2 появиться, для On-Chip memory и не требуются, ну а для GPIO - altera_avalon_gpio_regs.h.

 

altera_avalon_gpio_regs.h получается общем для нескольких PIO? я в qsys сделал несколько PIO (PIO_IN, PIO_OUT, PIO_OUT_ON)

Share this post


Link to post
Share on other sites

altera_avalon_gpio_regs.h получается общем для нескольких PIO? я в qsys сделал несколько PIO (PIO_IN, PIO_OUT, PIO_OUT_ON)

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

Share this post


Link to post
Share on other sites

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

Спасибо, начинаю понимать. Везде в примерах даются строки, например IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, leds), но не объясняются.

Share this post


Link to post
Share on other sites

получается, что я могу работать только с адресами ОЗУ? Адресное пространство вроде задал верно, qsys не ругался.

Не совсем понял, что Вы этим хотели сказать. Если к Ниосу прикручен DDR2 и On-chip memory, то и тот и тот есть ОЗУ.

Для работы с DDR2 можно использовать что-то типа:

int *ddr2_ptr = (int *) DDR2_START_ADDRESS;

или в BSP Editor определяете секции, которые будут ложится в DDR2 (например .heap - тогда при динамическом выделении памяти, она и будет выделяться в DDR2).

 

Share this post


Link to post
Share on other sites

Да, только там есть параметр BASE, а он для всех GPIO разный.

 

В моем случае надо так вводить строки?

IOWR_ALTERA_AVALON_PIO_DATA(pio_in, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out_on, data)

 

Вместо data вводится свое имя переменной

Share this post


Link to post
Share on other sites

С DDR можно работать как с памятью вообще

Для этого надо узнать ее адрес и по адресу читать - писать

А можно как с памятью процессора, для этого надо линкеру про нее рассказать, и тогда все остальное будет происходить само. переменные в ней создадутся, куча там будет и так далее..

 

Можно комбинировать, часть разметить и отдать процу, а часть использовать самому по указателю.

 

Неужели альтера не дает примеров с тестом памяти? посмотрите его, там же все очевидно

Share this post


Link to post
Share on other sites

Не совсем понял, что Вы этим хотели сказать. Если к Ниосу прикручен DDR2 и On-chip memory, то и тот и тот есть ОЗУ.

Для работы с DDR2 можно использовать что-то типа:

int *ddr2_ptr = (int *) DDR2_START_ADDRESS;

или в BSP Editor определяете секции, которые будут ложится в DDR2 (например .heap - тогда при динамическом выделении памяти, она и будет выделяться в DDR2).

 

Имеется внешняя DDR2, также есть On-chip memory, которая необходима для моментов времени, когда происходит чтение из DDR2. В эклипсе для работы с адресами я использую строки, например int addr_on_chip=0x4008000; Правильная ли такая запись?

Share this post


Link to post
Share on other sites

нет

потому что нужно адрес не

int addr_on_chip=0x4008000

 

а

int *addr_on_chip = (int *)0x4008000;

 

записать туда *addr_on_chip = 10;

считать оттуда

int Temp = *addr_on_chip;

 

 

при условии что 0x4008000 - это адрес в ДДР

Share this post


Link to post
Share on other sites

В моем случае надо так вводить строки?

IOWR_ALTERA_AVALON_PIO_DATA(pio_in, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out, data)

IOWR_ALTERA_AVALON_PIO_DATA(pio_out_on, data)

 

Вместо data вводится свое имя переменной

Да, data - то, что хотите видеть на выходе порта или то, что читаете.

Адреса pio_in, pio_out, pio_out_on берёте из system.h.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...