Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOS для начинающих
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
W1nneR
Благодарю, пошел грызть гранит науки.
juvf
Доброго времени. Подключил к 2-хпортовому озу ниос. вопрос - как из ниоса достучатся до озу? как писать туда? В эклипсе в BSP создал секцию памяти и разместил её на своем Avalon Memory Mapped Tristate Slave. теперь из кода программы пытаюсь записать в озу что-нибудь. пишу так
Код
__attribute__ ((section (".dac"),used)) unsigned int dacData[512];
....
while(1)
{
dacData[16] = 0x55aa;
pauseMm(1000);
}

смотрю сигналТапом сигнал WR- нету. В нуле всегда. на шине данных и шине адреса что-то меняется. а WR - нет. Может я не правильно dacData[512] разместил?
juvf
Во млин!!! Удалось записать в озу данные, и даже тайминги все правильно расставленны. Пишу с помощю IOWR_16DIRECT(DAC_MEM_BASE, 10, 0x55aa); - кто бы мог подумать, что доступ к внешнему озу..... через IOWR_16DIRECT. Хотя тут же SDRAM стоит, через альтеровский контроллер подключенна: обращяюсь к ней без всяких IOWR_16DIRECT.

ps в порты PIO пишу через IOWR_ALTERA_AVALON_PIO_DATA(IOLED_BASE, led);. По идее, если сделать секцию памяти .myPio в BSP и разместить её по адресу IOLED_BASE ..... яже могу потом обращаться без всяких IOWR_ALTERA_AVALON_PIO_DATA , а как-то
Код
__attribute__ ((section (".myPio "),used)) unsigned int led;
...
//а потом писать в порт
led = 0x12;

По идее так должно работать?
vadimuzzz
Цитата(juvf @ Mar 4 2011, 17:04) *
ps в порты PIO пишу через IOWR_ALTERA_AVALON_PIO_DATA(IOLED_BASE, led);. По идее, если сделать секцию памяти .myPio в BSP и разместить её по адресу IOLED_BASE ..... яже могу потом обращаться без всяких IOWR_ALTERA_AVALON_PIO_DATA , а как-то
Код
__attribute__ ((section (".myPio "),used)) unsigned int led;
...
//а потом писать в порт
led = 0x12;

По идее так должно работать?

IOWR_16DIRECT пишет в обход кэша данных. причина непоняток с памятью, видимо, в этом. можете создать указатель с адресом IOLED_BASE и писать/читать, используя разыменование указателя, следите только, чтобы 31-й бит был взведен.
W1nneR
Создал простейшую систему в SOPC Builder (Nios tiny, On Chip Memory (4k), 3 - PIO, Timer) хотел проверить заработает ли она, и написать некое подобие команды Ping. На PIO загружаю какой то код, делаю проверку первых 8 бит, если они равны - ААh, то [7:31] вываливаю на PIO иначе на PIO нули. Т.к. с Nios(ом) еще пока дел не имел, есть пара вопросов.
1. При создании Nios II Application and BSP from Tample указал файл *.sopcinfo и тот создал мне 2 папки:
1 - Имя проекта;
2 - Имя проекта _ bsp;
Файл со своим текстом программы создавать в (1) или (2)?
2. В файле с программой каким образом можно обратится к первым восьми линиям PIO?
В файле system.h нашел кучу присваиваний, но конкретных имён линий не увидел.

Простите за глупые вопросы, я самоучка и спросить у других специолистов возможности нет, приходится спотыкаться на элементарных вещах.
vadimuzzz
Цитата(W1nneR @ Mar 9 2011, 20:48) *
Файл со своим текстом программы создавать в (1) или (2)?

(1)
Цитата
2. В файле с программой каким образом можно обратится к первым восьми линиям PIO?
В файле system.h нашел кучу присваиваний, но конкретных имён линий не увидел.

подключаете altera_avalon_pio_regs.h и читаете через макрос IORD_ALTERA_AVALON_PIO_DATA, потом маску накладываете. base address в system.h смотрите
W1nneR
Спасибо, щас опробуем.
W1nneR
Ну, вот стряпал кое что.


#include <stdio.h>
#include <system.h>
#include "altera_avalon_pio_regs.h"

void main() {

BYTE PING = AA;
BYTE COMMAND;
BYTE CODE = FF;
BYTE ERROR = F0;

COMMAND = IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE);

if(COMMAND == PING) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, CODE); }
else IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, ERROR);

}

только почему то не хочет подключать указанные в INCLUDE файлы, если они находятся не в одной папке с главным файлом.
Приходится перетаскивать всё в одну папку с _bsp. Это можно как-нибудь исправить?
barabek
Цитата(W1nneR @ Mar 10 2011, 08:23) *
только почему то не хочет подключать указанные в INCLUDE файлы, если они находятся не в одной папке с главным файлом.
Приходится перетаскивать всё в одну папку с _bsp. Это можно как-нибудь исправить?

Странно, стандартные должны находиться. А вообще, свойства проекта -> c/c++build->general->include paths плюсиком добавляете нужные пути.
W1nneR
Кто нибудь имел дело с Nios системами ведущих обмен с FTDI?
alexPec
Цитата(W1nneR @ Mar 10 2011, 20:38) *
Кто нибудь имел дело с Nios системами ведущих обмен с FTDI?

Да, с FT245.
W1nneR
alexPec, не осталось прошивки ознакомится? Буду бесконечно благодарен.
vilary
При добавлении в систему компонента с шиной данных 8 бит появляется warning: "cpu.data_master/device.avalon_slave does not have byteenables. Narrow (less than 32-bit) writes from cpu.data_master will result in spurious writes to device.avalon_slave". При добавлении byteenable пишет ошибку, что byteenable не может быть меньше 2, хотя в спецификации написано что может быть и 1. Может это повлиять на работу системы если не ставить byteenable?

Еще quartus при компиляции пишет "Found Invalid timing asssignments". При просмотре ошибок minimum slack для Clock Hold: nios pll имеет отрицательное значение и pll_offset = -1,667 ns.
При попытке на данную прошивку загрузить софт Nios пишет: "ID value doesn't match. Timestamp value doesn't match: image on board is older than expected". При чем данная ошибка появляется только когда в системе присутствуют компоненты со Stream интерфейсом. Что это может быть и как это можно исправить?
naliwator
Ваши вопросы напрямую зависят от вашего проекта, выложите проект для просмотра.
barabek
Цитата(vilary @ Apr 1 2011, 17:51) *
При добавлении в систему компонента с шиной данных 8 бит появляется warning: "cpu.data_master/device.avalon_slave does not have byteenables. Narrow (less than 32-bit) writes from cpu.data_master will result in spurious writes to device.avalon_slave". При добавлении byteenable пишет ошибку, что byteenable не может быть меньше 2, хотя в спецификации написано что может быть и 1. Может это повлиять на работу системы если не ставить byteenable?

Раз Вы можете добавить byteenable то, смею предположить, что это Ваш самописный компонент. Если так, то можно либо выставить NATIVE адресацию у компонента, тогда и byteenable не нужен. Либо оставить DYNAMIC, но сделать шину 32-х битную, вставить byteenable, при этом логику внутри компонета можно сделать такой, что старшие 3 байта игнорировать. Выбирайте.


alexPec
Цитата(W1nneR @ Mar 16 2011, 23:57) *
alexPec, не осталось прошивки ознакомится? Буду бесконечно благодарен.

В файлике ф-ии записи и чтения в/из USB и пример использования этих ф-й. На стороне компа после установки драйверов запись/чтение происходит как в обычный ком-порт.

Думаю названия портов интуитивно понятно каким выводам FT245 соответствуют. Порт data - двунаправленный.
W1nneR
Спасибо большое, что откликнулись на зов моей помощи, но что то не могу файлик пощупать, ни скачивается и не просмативается... (
alexPec
Цитата(W1nneR @ Apr 7 2011, 09:37) *
Спасибо большое, что откликнулись на зов моей помощи, но что то не могу файлик пощупать, ни скачивается и не просмативается... (


И правда ерунда какая-то. Напишите письмо на alex@udsu.ru с пометкой о чем, вышлю.
Reanimator++
На заметку.

1. Если хотите чтобы работал Nios II Flash Programmer то ставьте версию 9.1 SP1. На SP2 и без SP не работает (неправильно конвертирует sof->flash).


2. Чтобы работать с UART в неблокирующем режиме нужно открывать его следующим образом:

Код
static int fdterm; // FILEDESCRIPTOR RETURNED BY OPEN
..
fdterm = open("/dev/uart1", O_RDWR | O_NONBLOCK | O_NOCTTY | O_SYNC);
..


reading is done by

..
res=read(fdterm,uart1_tempbuff,sizeof(uart1_tempbu ff)-1);
if(res>0) {
... we have received some bytes
}

Тогда при чтении данных исполнение программы блокироваться не будет. Удивительно но не нашел доку где это было бы описано, спасибо альтерафоруму.
inventor
подскажите пожалуйста, где взять таблетку от жадности
для квартуса 7.2 ?
ну или от десятки?
juvf
Как писать/читать флешку CFI из ниоса?
На борту DE0 стоит флешка. Собрал контроллер. в программе пробовал alt_write_flash() - при вызове второй раз это функции старые данные стираются. Нашел в доках, что эта функция стерает блок.
Есть функция alt_write_flash_block() - но про ней мало что понятно. Есть ещё какие то загадочные alt_flash_cfi_init() alt_flash_cfi_read() ... Про них вообще ни чего не нашел.

Чем отличаются alt_flash_cfi_write и alt_write_flash_block/ alt_write_flash?

ps Вообще хотелось бы получить функцию типа write(alt_u32 addressInFlash, alt_u8 *source, alt_u32 length); Пока видется путь писать свою используя alt_write_flash_block/read/open/close, в которой проверять перекрытие границы блока. Но там адская функция получается. Ещё не понятно что такое регион? С чем его есть и для чего он нужен?
vadimuzzz
самое простое - использовать функции alt_write_flash, alt_read_flash. тогда можно о блоках не думать. то, что вы перечислили - низкоуровневые функции, они вызываются в alt_write_flash, alt_read_flash. можно делать и на низком уровне, но код будет менее универсальный, больше привязан к железу. см. http://www.altera.com/literature/hb/nios2/n2sw_nii52010.pdf

Цитата(juvf @ Apr 19 2011, 13:44) *
Ещё не понятно что такое регион? С чем его есть и для чего он нужен?

см. alt_flash_types.h
juvf
Цитата(vadimuzzz @ Apr 19 2011, 13:31) *
самое простое - использовать функции alt_write_flash, alt_read_flash. тогда можно о блоках не думать. то, что вы перечислили - низкоуровневые функции, они вызываются в alt_write_flash,

изночально нписал

alt_write_flash(...); // пишу 1234 в адрес 0
alt_write_flash(...); // пишу 5678 в адрес 20

alt_read_flash(...); //читаю из адреса 0, получаю 0xffff
alt_read_flash(...); //читаю из адреса 20, получаю то, что записал, т.е. 5678

такое чувство что вторая запись сначала стерла первую запись, а потом записала 5678.
vadimuzzz
см. Nios II Software Developer’s Handbook, глава 6 Developing Programs Using the
Hardware Abstraction Layer, раздел Using Flash Devices. там все эти случаи разобраны

juvf
Цитата
тогда можно о блоках не думать.
как же не думать? Вот из документации на апи, стр 6-21

Цитата
Generally, flash memory is divided into blocks. alt_write_flash() might need to
erase the contents of a block before it can write data to it. In this case, it makes no
attempt to preserve the existing contents of the block. This action can lead to
unexpected data corruption (erasure), if you are performing writes that do not fall on
block boundaries. If you wish to preserve existing flash memory contents, use the
fine-grained flash functions.
These are discussed in the following section.

...

Fine-Grained Flash Access
Three additional functions provide complete control for writing flash contents at the
highest granularity:
■ alt_get_flash_info()
■ alt_erase_flash_block()
■ alt_write_flash_block()



как то не понятно, как эту флеш писать читать?


vadimuzzz
Цитата(juvf @ Apr 19 2011, 15:13) *
как то не понятно, как эту флеш писать читать?

считали блок->изменили часть данных->записали блок
Stewart Little
Цитата(juvf @ Apr 19 2011, 12:13) *
как то не понятно, как эту флеш писать читать?

Вы сперва разберитесь, как вообще Flash работает. Чтение из флэши возможно и побайтное, и пословное. А вот стирание и запись - посекторные. См. предыдущий ответ ув. vadimuzzz
juvf
Цитата(Stewart Little @ Apr 19 2011, 17:12) *
Вы сперва разберитесь, как вообще Flash работает. Чтение из флэши возможно и побайтное, и пословное. А вот стирание и запись - посекторные. См. предыдущий ответ ув. vadimuzzz

Ну это от флеша к флешу. Есть флешки с побайтной записью. Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм. Я и хочу с этим разобраться. В доках от альтеры написанно, что alt_write_flash() сотрет весь блок. Нужно заботится о том, чтоб не потерять данные. Также альтера предлагает alt_write_flash_block(), якобы в этой функции не надо об этом заботится. Да и вообще, коль есть апи, можно было и более высокоуровневую функцию сделать, типа write(адрессФлэш, указательИсточника, длинна). Причем если данные 1 байт, или данные перекрывают 3 блока (например 1/3 блока 8кб, 1 блок 8 кб и 100 байт из блока в 64 кб), то эта write должна сама сделать все низкоуровневые операции типа "считали блок->изменили часть данных->записали блок". Удевительно что в hal нет такой функции. придёться самому писать ((.

Потом, тут есть регион и есть блок. Что такое регион я так и не понял. Что такое блок - понятно. Вся флеш разбита на блоки (по пдф), причем размер блоков разный. А вот что такое регион - ???
смотрю Alt_flash_types.h, структура
Код
typedef struct flash_region
{
  int   offset;
  int   region_size;
  int   number_of_blocks;
  int   block_size;
}flash_region;


int region_size - размер региона. Что такое регион?

Пока не понятно как работать с alt_flash_cfi_write? Есть у когонибудь демо проект с флешкой cfi? Поделитесь, заранее благодарен.
vadimuzzz
Цитата(juvf @ Apr 20 2011, 09:28) *
Ну и "считали блок->изменили часть данных->записали блок" это какой-то низкоуровневый алгоритм.

для флешек с блочным стиранием это обычное дело. 3-4 вызова функций HAL, что тут низкоуровневого? вот дергать alt_flash_cfi_write - это и есть низкоуровневый доступ. а так можно и с SPI-ными флешками работать
Цитата
Потом, тут есть регион и есть блок. Что такое регион я так и не понял. Что такое блок - понятно. Вся флеш разбита на блоки (по пдф), причем размер блоков разный. А вот что такое регион - ???

смотрите даташит на свою флешку, там все расписано. например, у меня интеловская p30. имеет 2 региона с разными размерами блоков в первом 32кбайтные, во втором (основном) - 128 кбайтные.
пример кода:
CODE

#include <stdio.h>
#include "alt_types.h"
#include "system.h"
#include <io.h>
#include <sys/alt_flash.h>
#include <unistd.h>
int main()
{
flash_region* regions;
alt_flash_fd* fd;
int number_of_regions;
int ret_code;
int i;
printf("Hello from Nios II!\n");
fd = alt_flash_open_dev(CFI_FLASH_0_NAME);
if (fd)
{
ret_code = alt_get_flash_info(fd, &regions, &number_of_regions);
for (i=0;i<number_of_regions;i++)
{
printf("Offset: %d\r\n", regions[i].offset);
printf("Region Size: %d\r\n", regions[i].region_size);
printf("Number of Blocks: %d\r\n", regions[i].number_of_blocks);
printf("Block Size: %d\r\n\r\n", regions[i].block_size);
}
}
}

выхлоп:
Цитата
Hello from Nios II!
Offset: 0
Region Size: 131072
Number of Blocks: 4
Block Size: 32768

Offset: 131072
Region Size: 16646144
Number of Blocks: 127
Block Size: 131072

ну, и пример 6-11 посмотрите, как запись организована. имейте в виду, что там не производится проверка адресов на предмет перекрытия соседних блоков. эту проверку вы должны делать сами.
juvf
Цитата(vadimuzzz @ Apr 20 2011, 09:30) *
3-4 вызова функций HAL, что тут низкоуровневого?
да уш не 3-4. А отслежывать перекрытие блоков..... Вызовов может и 3-4, но + к этому целый алгоритм мутить по отслежованию перекрытий.


Цитата
например, у меня интеловская p30. имеет 2 региона с разными размерами блоков в первом 32кбайтные, во втором (основном) - 128 кбайтные.

спасибо, все стало понятно.

пока у меня новая проблема: alt_flash_open_dev(CFI_FLASH_0_NAME) возвращает 0. Если не правильно распинать флешку, неправильно подключить, или если её физически нет, но в ниосе есть контроллер cfi - то что вернёт alt_flash_open_dev? ноль?


ps Есть у алтеры дока "HAL API Reference". В ней говорится о функциях open(), read(), write(), close(). В частности
Цитата
The open() function opens a file or device and returns a file descriptor (a small, nonnegative
integer for use in read, write, etc.)
эта open(),,,,,,,, она работает (должна работать) с cfi flash?
vadimuzzz
Цитата(juvf @ Apr 20 2011, 11:41) *
да уш не 3-4. А отслежывать перекрытие блоков..... Вызовов может и 3-4, но + к этому целый алгоритм мутить по отслежованию перекрытий.

драйвер делает ровно то, что позволяет флешка. может, вы захотите еще и файловую систему поверх водрузить - этим тот же драйвер должен заниматься?
что вы хотите хранить на флешке, какая задача?
Цитата
пока у меня новая проблема: alt_flash_open_dev(CFI_FLASH_0_NAME) возвращает 0.

а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите.
Цитата
Если не правильно распинать флешку, неправильно подключить, или если её физически нет, но в ниосе есть контроллер cfi - то что вернёт alt_flash_open_dev? ноль?

нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет.

Цитата(juvf @ Apr 20 2011, 11:41) *
эта open(),,,,,,,, она работает (должна работать) с cfi flash?

не должна
juvf
Цитата(vadimuzzz @ Apr 20 2011, 12:01) *
а она у вас CFI_FLASH_0_NAME называется? в system.h посмотрите.
У меня CFI_FLASH_NAME, соответственно вызов делаю с именем CFI_FLASH_NAME. пробовал "/dev/cfi_flash" (из тогоже систем.аш) - тозе возвращает 0

Цитата
нет. диагностировать подключение удобно при помощи nios2-flash-programmer. пускаете его с ключом --debug и смотрите, что он там пишет.

выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки?
vadimuzzz
Цитата(juvf @ Apr 20 2011, 15:03) *
выхлоп nios2-flash-programmer на картинке. Это нормальная работа флешки?

нет, похоже проблема с подключением.
вот как примерно должно выглядеть:
CODE

Resetting and pausing target processor: OK
Found CFI table in 16 bit mode
Raw CFI query table read from device:
0: 89 00 1B 88 01 00 01 00 89 00 CF BF 01 00 01 00 ................
10: 89 00 1B 88 01 00 01 00 89 00 CF BF 01 00 01 00 ................
20: 51 00 52 00 59 00 01 00 00 00 0A 00 01 00 00 00 Q.R.Y...........
30: 00 00 00 00 00 00 17 00 20 00 85 00 95 00 08 00 ........ .......
40: 09 00 0A 00 00 00 01 00 01 00 02 00 00 00 18 00 ................
CFI query table read from device:
10: 51 52 59 01 00 0A 01 00 00 00 00 17 20 85 95 08 QRY......... ...
20: 09 0A 00 01 01 02 00 18 01 00 06 00 02 03 00 80 ................
30: 00 7E 00 00 02 00 00 00 00 FF FF FF FF FF FF FF .~..............
40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
CFI extended table read from device:
0: 50 52 49 31 34 E6 01 00 00 01 03 00 18 90 02 80 PRI14...........
10: 00 03 03 89 00 00 00 00 00 00 10 00 04 03 04 01 ................
Read autoselect code 0089-881B (in 16 bit mode)
No CFI override data for [FLASH-0089-881B]
Target timeout loop runs 1497780 times/s
Timeout set to 767 loops
Device size is 16MByte
Erase regions are:
offset 0: 4 x 32K
offset 20000: 127 x 128K
Device supports Intel style programming algorithm
Multi-byte programming with 64 byte buffer
Sector erase timeout is 4s
Word program timeout is 512us
Buffer program timeout is 1ms
Leaving target processor paused


а какая у вас борда?
juvf
Цитата(vadimuzzz @ Apr 20 2011, 14:10) *
а какая у вас борда?


DE0
Reanimator++
Собственно, даже если вы напишите функции которые позволяют дописать два байта в произвольное место флеши (по принципу чтение блока, модификация блока, запись байтов), то пользоваться ими беспроблемно не получится - время записи блока у флешей может быть достаточно большим (0.1 - 0.5 секунды), так что наваливать по десятку байт скорее всего окажется накладно - придется так или иначе учитывать специфику флеши.
gosu-art
Здравствуете! Начинаю работать с Ниос!

Создал свой компонент, прицепил к ниосу, все нормально!

Далее начинаю писать по адресу (через указатель) - тоже все работает!

А вот чтение не получается! Может подскажете как надо!?

прилагаю код компонента:
Код
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity PC104 is
    port (
        ats_s0_address      : in    std_logic_vector(15 downto 0):=(others => 'Z');      
        ats_s0_read_n       : in    std_logic                     := '1';                              
        ats_s0_data         : inout std_logic_vector(15 downto 0) := (others => 'Z');
        ats_s0_chipselect_n : in    std_logic                     := '1';                          
        ats_s0_write_n      : in    std_logic                     := '1';                          
            
        clk                 : in    std_logic                     := '1';                            
        reset               : in    std_logic                     := '1';                            
        
        
        
        cos_RD_n            : out    std_logic                    := '1';  
        cos_WR_n            : out    std_logic                    := '1';
        cos_CS_n            : out    std_logic                    := '1';
    --    cos_data_ISA : inout std_logic_vector(15 downto 0) := (others => 'Z');
        cos_ADDR_ISA          : out std_logic_vector(15 downto 0) := (others => '0')
        

        
    );
end entity PC104;

architecture rtl of PC104 is
begin

    cos_RD_n<=ats_s0_read_n;
    cos_WR_n<=ats_s0_write_n;
    cos_CS_n<=ats_s0_chipselect_n;
    
    cos_ADDR_ISA<=ats_s0_address;
    
    --cos_data_ISA<=ats_s0_data when ats_s0_write_n='0' else (others => 'Z');
    --ats_s0_data<=cos_data_ISA when ats_s0_read_n='0' else (others => 'Z');

end architecture rtl; -- of new_component


И код программы:


Цитата
#include "sys/alt_stdio.h"
#include "system.h"
#include "alt_types.h"

int main()
{
alt_u16 *p=(alt_u16*) (0x20054);
alt_putstr("Hello from Nios II!\n");
alt_u16 a,b=0;

while(1)
{

a++;
*p=a;//работает

b+=5;
*p=b;//работает

a=*p;//не читает!!!

}


return 0;
}




UPD: попробовал вот так:

Цитата
while(1)
{

IOWR_16DIRECT(0x20054, 0, a);

c=IORD_16DIRECT(0x20054, 0);

}


Вроде пишет и читает, но почему при чтении происходит два обращения?

Нажмите для просмотра прикрепленного файла

vadimuzzz
Цитата(gosu-art @ Apr 26 2011, 14:12) *
Вроде пишет и читает, но почему при чтении происходит два обращения?

возможно, занята шина. надо еще waitrequest смотреть
gosu-art
Почитал стандарт на авалон и вот что нашел:

Цитата
If the master is wider than the slave, data bytes in the master address space map to
multiple locations in the slave address space. For example, when a 32-bit master port
performs a read transfer from a 16-bit slave port, the system interconnect fabric
executes two read transfers on the slave side on consecutive addresses, and presents
32-bits of slave data back to the master port.


У меня компонент с 16ти разрядными данными на Авалоне, точнее на тристэйте! Получается, что при записи происходит одно обращение, т.к. переменная объявлена как 16ти разрядная (объявил указатель 32х.р. пошло 2е записи). При чтении же Ниосу нужно 32 разряда, поэтому он и обращается дважды. Придется доработать компонент.
gosu-art
Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть?
vadimuzzz
Цитата(gosu-art @ Apr 28 2011, 14:13) *
Заинтересовала меня вот эта штука Remote System Upgrade. Только не догоняю, она может полностью переконфигурировать плис (СIII)? Даже если новая прошивка будет без ниоса? Или тут какие то нюансы есть?

да, может. ниос не обязателен, компонент в SOPC - это просто обертка к мегафункции. но с процом, конечно, удобнее
juvf
Нужно сделать тестовый проект для самопроверки устройства на плис. нужно проверить всю периферию на борде. В том числе и озу (ддр2). Для проверки озу есть алгоритмы которые стирают/пишут/читают каждую ячейку озу. Можно тестовую программу разместить в он-чип и проверить внешнее озу. Но проверка всей остальной периферии не влезит в он-чип. Как тут быть? В голову приходит 2 мысли:
1) разбить программу на 2 части. проверку озу разместить в он-чип. ресет прерывания на он-чип. После ресета из epcs автоматом загрузится конфигурация и кусок программы в ончип. Стартует программа в ончипе. Проверится озу. если все в порядке, то нужно программно из епцс исполняемый код загрузить в озу и сделать jmp ADR_RAM; или что-то подобное. Такое реально сделать с ниосом/CIII/квартусом/IDE NIOS?
2) не делить программу а сразу всю её залить в внешнее озу и от туда стартовать. там же проверить все озу. только как? как-то же подобное делается в тестах типа memTest86. Как в подобных утилитах проверяется озу? Ведь сам исполняемый код находится в этом же озу. Или во время теста мемТест копирует исполняемый код из одного места в другое чтоб проверить всё озу полностью? кто нибудь знает как memTest86 работает?
vadimuzzz
посмотрите http://www.altera.com/literature/an/an458.pdf
вы можете сделать свой загрузчик из EPCS и встроить в него проверку SDRAM. после проверки SDRAM загрузчик должен скопировать туда код (включая проверку периферии) и передать управление
juvf
Пробую свой загрузчик сделать по an458.pdf. Вроде все элементы танца сделал, всё залил - в итоге при включении борды моя прога не работает.

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

1 в SOPC билдере вектор ресета на ончип
2 указываю ончип инициализировать файлом boot_rom.hex
3 собираю ниос
4 компилирую проект квартуса
5 генерирую в эклипсе bsp
6 собираю программу халловорд для этого проекта и получаю elf
7 в консоли выполняю "elf2hex name.elf --base=0x1810000 --end=0x181c9f --width=32 --create-lanes=0 boot_rom.hex" и получаю хекс файл.
8 из квартуса заливаю sof в плис
9 запускаю терминал
10 жму кнопку ресет на борде

ожидаю увидеть Hallo World! в терминале

после 10 по идее ресетится проц, а ресет прерывания на он чип. в ончипе программа хелловрд. но она почему-то не выполняется.
прожег этот sof флэшпрограмматором в епцс, борду выкл\вкл\ресет - не помогает, тоже не вижу хэлловорда. что я делаю не так?
Reanimator++
Между 7-м и 8-м пунктом нужно выполнить ассемблер в квартусе (ну или полную компиляцию если не найдете) чтобы он подхватил .hex файл и встроил его в .sof. Вы заливаете в борду голое железо без ПО, собранное на 3-4 пункте.

И еще, 7-й пунк эклипс иногда делает автоматом (я наблюдал появление .hex файла при компиляции проекта с onchip).

И еще, уверены что Reset на борде относится именно к ниосу а не реконфегурирует всю плис например?
vadimuzzz
сумбур какой-то. чтобы после сброса выполнился код из он-чип, достаточно вектор сброса туда нацелить. после этого достаточно залить sof и программа сразу запустится. если надо кинуть во флешку - пользуйтесь jic или sof2flash+nios2-flash-programmer.
примеры загрузчиков смотрели:
http://www.altera.com/support/examples/nio...ot-methods.html ?
juvf
Цитата
Reset на борде относится именно к ниосу
именно к ниосу.
Цитата
примеры загрузчиков смотрели:
с него и начал. an458-ой до дыр перечитал. примеры от туда скачал - не работают они.

нашел я как из ниоса делать 7-ой пункт.

Цитата
Между 7-м и 8-м пунктом нужно выполнить ассемблер в квартусе (ну или полную компиляцию если не найдете) чтобы он подхватил .hex файл и встроил его в .sof.
??? не понял, а когда hex в ончип попадает? я думал что достаточно залить sof, и во время этой заливки hex подхватится.

naliwator
Цитата(Reanimator++ @ May 13 2011, 11:09) *
Между 7-м и 8-м пунктом нужно выполнить ассемблер в квартусе (ну или полную компиляцию если не найдете) чтобы он подхватил .hex файл и встроил его в .sof. Вы заливаете в борду голое железо без ПО, собранное на 3-4 пункте.

Или можно поставить галку Use smart compilation и запустить компилятор.
Он должен обновить Hex файл конфигурации on-chip памяти.


Цитата
И еще, уверены что Reset на борде относится именно к ниосу а не реконфегурирует всю плис например?

Мне тоже так показалось. По идее после прошивки sof файлом процессор автоматически сбрасывается и должен исполнять программу.

Если хотите, есть пример проекта со стандартным загрузчиком.
И даже перевод AN-458.
santa2.gif
juvf
Цитата
По идее после прошивки sof файлом процессор автоматически сбрасывается и должен исполнять программу.
а в программе printf("hallo wrld") в jtag-uart. поэтому чтоб увидеть выхлоп нужно после заливки соф запустить терминал и нажать ресет.

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

Цитата
Между 7-м и 8-м пунктом нужно выполнить ассемблер в квартусе
вот это я пропустил. Но сделав компиляции всего проекта после создание хекс файла - непомогло. не запускается программа.
naliwator
Цитата(juvf @ May 13 2011, 13:13) *
а в программе printf("hallo wrld") в jtag-uart. поэтому чтоб увидеть выхлоп нужно после заливки соф запустить терминал и нажать ресет.

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

вот это я пропустил. Но сделав компиляции всего проекта после создание хекс файла - непомогло. не запускается программа.

Сейчас сделал - у меня всё запустилось.

Файл архива проекта почему то не могу прикрепить...

Вносим изменения в программу.
Конвертируем elf to hex.
Жмем smart compilation и вуаля!
1111493779.gif
Reanimator++
Но сделав компиляции всего проекта после создание хекс файла - непомогло. не запускается программа.

Тогда проверяйте что имя файла прописанное в свойствах ончип в сопц билдере (параметр memory initialization file) сопадает с именем того .hex файла который вы подсовываете квартусу после ниос иде.
В принципе если ничего не трогать то они автоматом совпадают, как у naliwator-а.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.