Jump to content

    
Sign in to follow this  
AlexBel

NIOS для начинающих

Recommended Posts

Вот проект тестовый

Primer_1.rar

Похоже вы давно не чистили папку с проектом.

Для генерации BSP вы используете файл CPU.sopcinfo,

а ваша система генерирует CPU_SOPC.sopcinfo.

 

Последний сгенерировал нормально.

Share this post


Link to post
Share on other sites
Похоже вы давно не чистили папку с проектом.

Для генерации BSP вы используете файл CPU.sopcinfo,

а ваша система генерирует CPU_SOPC.sopcinfo.

 

Последний сгенерировал нормально.

Попробую пересоздать

Share this post


Link to post
Share on other sites

Здравствуйте, я полнейший новичок, но так вышло, что сразу попал в пекло на работе. Есть Stratix IV, готовый .ptf - файл. К плате подключена EEPROM AT24C1024 (даташит, очень коротенький: 24c1024.pdf ). Задача такая - записать что-то в эту память и считать оттуда это что-то. На данном этапе хотя бы одно слово, чтобы мне разобраться, что куда. Создал шаблонный проект "hello world", собрал, получил system.h. Все, что мне нужно из system.h, - это:

 

/*

* i2c_comod configuration

*

*/

 

#define I2C_COMOD_NAME "/dev/i2c_comod"

#define I2C_COMOD_TYPE "i2c_alt"

#define I2C_COMOD_BASE 0x0240a61c

#define I2C_COMOD_SPAN 4

#define ALT_MODULE_CLASS_i2c_comod i2c_alt

 

Интерфейс работы с AT24C1024 - два 16-разрядных регистра, объединенных в один. Описание интерфейса (одна страничка): i2c_master__ComMod_.doc .

 

В чем проблема - я первый раз в жизни встретился с NIOS, Altera, EEPROM и т.д. Все, что я знаю, это программирование на C++ и университетский курс цифровой схемотехники. Таким образом, если это не составит труда, хотелось бы услышать более разжеванное объяснение в терминах программирования, чего же от меня хотят, т.к. пока что не представляю, как вообще эти регистры интерфейса увязать с самой памятью, то есть проблемы на фундаментальном уровне понимания. Понимаю, как гвозди забивать, но не знаю, куда, и что вообще требуется сколотить. Особо буду рад примерам кода или каким-то ссылкам на то, что мне следовало бы изучить, чтобы понять всё это дело. Еще раз - мне не требуется полноценная программа работы с памятью, только пример записи/считывания слова, чтобы понять фундамент. Дальше сам. Спасибо.

 

Share this post


Link to post
Share on other sites
Здравствуйте, я полнейший новичок,...

В чем проблема - я первый раз в жизни встретился с NIOS, Altera, EEPROM и т.д. Все, что я знаю, это программирование на C++ и университетский курс цифровой схемотехники.

Если Вы правильно описали свой опытто мой совет - начните с мигания светодиодами.

Share this post


Link to post
Share on other sites
Если Вы правильно описали свой опытто мой совет - начните с мигания светодиодами.

 

Светодиодами уже мигал. Тут просто не моя инициатива, на работе надо что-то делать, вот дали задание следующее после светодиодов. Парень сказал, что очень легко, но он мне не расскажет, а то мне будет неинтересно. А я прям не знаю, с какой стороны подступиться :biggrin:

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

Share this post


Link to post
Share on other sites

...А я прям не знаю, с какой стороны подступиться :biggrin: ...

Используйте нисходящее программирование, изучите datasheet 24c1024.pdf и задавайте вопросы автору i2c_master__ComMod_.doc.

 

Если светодиодом успешно помигали, то сможете добавить в проект четыре файла I2C.c, I2C.h, I2C_ioctl.c и I2C_ioctl.h. Добавили? Теперь, самое главное не забыть написать имя автора в заголовках этих файлов. :biggrin:

I2C.h - уже можно отдать программисту, который будет использовать обмен с EEPROM.

 

/*

* I2C.h

*

* Created on: 03.03.2012

* Author:

*/

 

#ifndef I2C_H_

#define I2C_H_

#include "alt_types.h"

 

// результаты выполнения функций (коды ошибок)

#define I2C_OK 0

#define I2C_IO_ERROR -1

#define I2C_ADDRESS_OVERFLOW -2

 

// максимальный байт, который можно адресовать в AT24C1024

#define EEPROM_LENGTH 131071

 

// размер страницы для AT24C1024

#define EEPROM_PAGE_LENGTH 256

 

/*

*

* Чтение "len" байт в массив "data" начиная с адреса "eeprom_offset" EEPROM.

* Функция возвращает результат выполнения чтения из EEPROM AT24C1024

*

*/

alt_8 I2C_read(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

/*

*

* Запись "len" байт начиная с адреса "eeprom_offset" EEPROM из массива "data". Значение "len" должно быть от 1 to 255

* Функция возвращает результат выполнения записи в EEPROM AT24C1024

*

*/

alt_8 I2C_write(alt_u32 eeprom_offset, alt_u16 len, alt_u8* data);

 

 

#endif /* I2C_H_ */

Модули I2C.c, I2C_ioctl.c и I2C_ioctl.h Вы будете еще дорабатывать.

I2C.7z

Share this post


Link to post
Share on other sites

Используйте нисходящее программирование, изучите datasheet 24c1024.pdf и задавайте вопросы автору i2c_master__ComMod_.doc.

 

Если светодиодом успешно помигали, то сможете добавить в проект четыре файла I2C.c, I2C.h, I2C_ioctl.c и I2C_ioctl.h. Добавили? Теперь, самое главное не забыть написать имя автора в заголовках этих файлов. :biggrin:

I2C.h - уже можно отдать программисту, который будет использовать обмен с EEPROM.

 

/*

* I2C.h

*

* Created on: 03.03.2012

* Author:

*/

 

#ifndef I2C_H_

#define I2C_H_

#include "alt_types.h"

 

// результаты выполнения функций (коды ошибок)

#define I2C_OK 0

#define I2C_IO_ERROR -1

#define I2C_ADDRESS_OVERFLOW -2

 

// максимальный байт, который можно адресовать в AT24C1024

#define EEPROM_LENGTH 131071

 

// размер страницы для AT24C1024

#define EEPROM_PAGE_LENGTH 256

 

/*

*

* Чтение "len" байт в массив "data" начиная с адреса "eeprom_offset" EEPROM.

* Функция возвращает результат выполнения чтения из EEPROM AT24C1024

*

*/

alt_8 I2C_read(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

/*

*

* Запись "len" байт начиная с адреса "eeprom_offset" EEPROM из массива "data". Значение "len" должно быть от 1 to 255

* Функция возвращает результат выполнения записи в EEPROM AT24C1024

*

*/

alt_8 I2C_write(alt_u32 eeprom_offset, alt_u16 len, alt_u8* data);

 

 

#endif /* I2C_H_ */

Модули I2C.c, I2C_ioctl.c и I2C_ioctl.h Вы будете еще дорабатывать.

 

Спасибо большое :rolleyes:

Share this post


Link to post
Share on other sites
Спасибо большое :rolleyes:

Добро пожаловать в Nios II :rolleyes:

 

Уверен, что программист, который будет использовать обмен с EEPROM вернет Вам I2C.h со следующими вопросами:

  • Почему Вы дали ему I2C.h, хотя он работает с EEPROM и знать не желает, через какой интерфейс идет обмен.
  • Почему у функции I2C_write() ограничение на запись в 256 байт. Ему совсем не интересно знать про Ваши ограничения.
Тогда Вы перепишете Ваши модули и отдадите этому привереде файл EEPROM.h:

/*

* EEPROM.h

*

* Created on: 03.03.2012

* Author:

*/

 

#ifndef EEPROM_H_

#define EEPROM_H_

#include "alt_types.h"

 

// результаты выполнения функций (коды ошибок)

#define EEPROM_OK 0

#define EEPROM_IO_ERROR -1

#define EEPROM_ADDRESS_OVERFLOW -2

 

// максимальный байт, который можно адресовать в AT24C1024

#define EEPROM_LENGTH 131071

 

 

/********************************************************************************

*******************************

*

* Чтение "len" байт в массив "data" начиная с адреса "offset" EEPROM.

* Функция возвращает результат выполнения чтения из EEPROM AT24C1024

*

********************************************************************************

*******************************/

alt_8 eeprom_read(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

/********************************************************************************

*******************************

*

* Запись "len" байт начиная с адреса "offset" EEPROM из массива "data".

* Функция возвращает результат выполнения записи в EEPROM AT24C1024

*

********************************************************************************

*******************************/

alt_8 eeprom_write(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

#endif /* EEPROM_H_ */

В свою очередь, у Вас появится желание задать вопрос автору i2c_master__ComMod_.doc - может ли он создать такой контроллер связи с EEPROM, который будет отображать содержимое EEPROM на область памяти процессора Nios II.

Скорее всего ответ автора контроллера связи с EEPROM будет в духе: "Идите, идите, я не подаю по понедельникам". Но попробовать можно :biggrin:

EEPROM.7z

Share this post


Link to post
Share on other sites
Добро пожаловать в Nios II :rolleyes:

 

Уверен, что программист, который будет использовать обмен с EEPROM вернет Вам I2C.h со следующими вопросами:

  • Почему Вы дали ему I2C.h, хотя он работает с EEPROM и знать не желает, через какой интерфейс идет обмен.
  • Почему у функции I2C_write() ограничение на запись в 256 байт. Ему совсем не интересно знать про Ваши ограничения.
Тогда Вы перепишете Ваши модули и отдадите этому привереде файл EEPROM.h:

/*

* EEPROM.h

*

* Created on: 03.03.2012

* Author:

*/

 

#ifndef EEPROM_H_

#define EEPROM_H_

#include "alt_types.h"

 

// результаты выполнения функций (коды ошибок)

#define EEPROM_OK 0

#define EEPROM_IO_ERROR -1

#define EEPROM_ADDRESS_OVERFLOW -2

 

// максимальный байт, который можно адресовать в AT24C1024

#define EEPROM_LENGTH 131071

 

 

/********************************************************************************

*******************************

*

* Чтение "len" байт в массив "data" начиная с адреса "offset" EEPROM.

* Функция возвращает результат выполнения чтения из EEPROM AT24C1024

*

********************************************************************************

*******************************/

alt_8 eeprom_read(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

/********************************************************************************

*******************************

*

* Запись "len" байт начиная с адреса "offset" EEPROM из массива "data".

* Функция возвращает результат выполнения записи в EEPROM AT24C1024

*

********************************************************************************

*******************************/

alt_8 eeprom_write(alt_u32 eeprom_offset, alt_u32 len, alt_u8* data);

 

 

#endif /* EEPROM_H_ */

В свою очередь, у Вас появится желание задать вопрос автору i2c_master__ComMod_.doc - может ли он создать такой контроллер связи с EEPROM, который будет отображать содержимое EEPROM на область памяти процессора Nios II.

Скорее всего ответ автора контроллера связи с EEPROM будет в духе: "Идите, идите, я не подаю по понедельникам". Но попробовать можно :biggrin:

 

Сел разбираться. Насколько я понимаю, функция eeprom_write должна записывать данные из массива data в EEPROM. Открыл EEPROM.c и вижу, что функция eeprom_write вызывает I2C_start_io, которая выдает в регистр REG_COMMAND_WRITE команду начала обмена, адрес устройства, бит P0 (так и не понял его назначение) и признак записи/чтения.

Если я правильно понимаю, мне нужно при помощи команд IOWR и IORD записывать/читать по содержащемуся в REG_COMMAND_WRITE адресу информацию из data. А разряды REG_STATUS_READ, помеченные как информация для чтения, должны помещать в себе читаемую информацию.

Share this post


Link to post
Share on other sites
...Открыл EEPROM.c и вижу, что функция eeprom_write вызывает I2C_start_io...

Это просто пример использования регистра REG_COMMAND_WRITE. В I2C.h я использую макрос с именем COMOD_WR_CONTROL. Действительно, правильнее использовать для этого макроса имя REG_COMMAND_WRITE.

... бит P0 (так и не понял его назначение)...

Нужно изучить pdf.gif 24c1024.pdf. Емкость EEPROM AT24C1024 составляет 128 Кбайт. То есть, чтобы адресовать байт используется 17-разрядный адрес. Младшие 16 разрядов выдаются двумя байтами после Device Address (см. рис. 2, 3, 5, 6). А старший разряд адреса, который не поместился в эти два байта, выдается в разряде P0 байта Device Address.

 

Если я правильно понимаю...

По-моему, Вам нужно попросить автора i2c_master__ComMod_.doc упростить жизнь и себе и Вам. На самом деле нет никакого выигрыша от применения этого контроллера связи с EEPROM. Ни по времени обращения к EEPROM ни по размеру программы процессора Nios II. Для работы с EEPROM необходимо управлять всего двумя сигналами SCL и SDA. Интерфейс FPGA с EEPROM должен содержать два регистра на чтение и запись. Они так и должны называться SCL и SDA. Через младшие разряды этих регистров процессор Nios II будет устанавливать и считывать состояние линий SCL и SDA. Значение старших разрядов этих регистров должно игнорироваться при записи и устанавливаться в ноль при считывании.

Таким образом, автор i2c_master__ComMod_.doc должен добавить к SOPC два компонента PIO и закончить разработку "контроллера связи с EEPROM" в течение 5 минут. А Вы потратите пару дней на изучение pdf.gif 24c1024.pdf, написание и отладку программы.

Share this post


Link to post
Share on other sites

Прошу помочь с программированием EPCS4, уже 4-й день мучаюсь но не могу запустить из неё nios II.

Сразу скажу что форум перерыл весь, за 4 дня испробовал всё что тут нашёл, но ничего не работает.

 

Скриншоты ключевых моментов прилагаются.

 

Содержание файла nios2-flash-override.txt, не уверент что тут всё правильно написано поправте если что:

[EPCS-FF] # EPCS4N
sector_size = 65536
sector_count = 8

 

таким скриптом пользовался:

#!/bin/sh
sof2flash --input=EPCS4_SRAM.sof --output=epcs.flash --epcs --verbose
elf2flash --input=software/soft/soft.elf --output=soft.flash --epcs --after=epcs.flash --verbose
nios2-elf-objcopy -I srec -O ihex soft.flash soft.hex

 

Что бы я не делал через nios2-flash-programmer заливаю ли я прошивку или что то подобное, флешка стирается (erase) но прогресс не уходит дальше 0% и имеем то что видим на terminal_bad.gif(прикрепл.).

 

Пробовал создавать по методике с сайта naliwator.narod.ru там где elf файл добавляли к sof конвертировали в hex и затем конвертером в jic.

Аппаратная часть работает NIOS II так и не смог оживить.

Вектор сброса указал на контроллер EPCS. (eclipse_BSP_editor.gif)

 

Что дальше делать не знаю, подскажите кто чем может, уже даже не знаю за что и хвататься, что делаю не так?

post-66096-1331177323_thumb.png

post-66096-1331177329_thumb.png

post-66096-1331177340_thumb.png

post-66096-1331177344_thumb.png

post-66096-1331177764_thumb.png

Edited by Orochi

Share this post


Link to post
Share on other sites
Orochi, пробовали на залитой системе активизировать проект, загрузив через Eclipse elf файл? В какой версии Quartus II работаете? Пробовали ли прочитать ончип память после старта процессора? Пробовали ли вы не в Qsys, а в Sopc Builder создать подобный проект?

Share this post


Link to post
Share on other sites

В итоге, после 5 дней "напряжённого труда" удалил проект и создал его заново. И как не странно Flash Programmer с первого раза всё прошил на ура без единой ошибки. А если бы у меня был проект не "тестовый" ... даже страшно думать ... время жалко)

 

PS: Quartus 11.1 sp2 32-bit/Windows 7 - 32-bit

Edited by Orochi

Share this post


Link to post
Share on other sites

Доброго времери суток, товарищи программеры :)

Подскажите такую штуку: вставляю свои библиотеки в проект (виртуальный каталог с системы), но не все файлы из этих библиотек я использую. Проектов много, и в одних нужно использовать одни файлы, в других другие, но библиотеки общие. Так вот, когда я делаю на ненужных файлах "Exclude from build..." - файл помечается другим значком (типа стал игнорируемым), но при компиляции он остаётся в Makefile и соответственно вкомпиливается и выдаёт ошибки (ошибки связанные с наличием перифирии, которой нет в этом проекте, но используется в других проектах). Если создать несколько файлов в корне проекта - то вроде как функция исколючения файлов с компиляции работает нормально, но именно на виртуальных каталогах непонятный глюк. Подскажите пожалуйста, может я не правильно каталог библиотек добавил, или же нужно как-то по-другому осуществлять менеджмент библиотек?

В примере я исключил FRAM.C но видно, что в Makefile он остался.

ЗЫЖ В Nios II 11й версии уже всё отлично работает, и хорошо всё сделано, НО сам квартус очень глючный,а SOPC вообще неизвестно как компилит :(

post-70841-1331906127_thumb.jpg

Edited by StripSmile

Share this post


Link to post
Share on other sites

Возникла такая проблема. Самый простой пример с прерываниями не работает - count_binary (который идет в комплекте с квартусом и ниосом). Подобные обработчики прерываний раньше уже писал на версии 9.1 - все работает. При переносе проекта на новый квартус 11.1 - ни в какую. В среде NIOS II SBT при компиляции выводит сообщение об ошибке - undefined reference to alt_ic_irq_register (использую vectored interrupt controller). Т.е. не может зарегистрировать обработчик прерывания. Заголовочный файл "sys\alt_irq.h" добавлен. Все по идее должен видеть - но результат нулевой. Не работает также функция alt_irq_register.

 

На форуме альтеровском смотрел - там были подобные вопросы, но никто толком так ничего и не ответил. Кто что подскажет?

Edited by _Desh_

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.

Sign in to follow this