slog 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Долблю Nios + внешнее ОЗУ в 32 разряда. Хочу писать в память байты а читать слова по 4 байта за раз. Че то не получается. Перепробовал всё и вообще запутался. Выполняю запись по байтам for(i=0; i<8; i++) { IOWR_8DIRECT(SRAM_BASE, i, i); } Потом читаю IORD_32DIRECT(SRAM_BASE, i); получаю 0x00000000 0x00000100 0x00020000 0x03000000 Если читаю IORD(SRAM_BASE, i); получаю 0x00000000 0x00000004 А КАК ПРОЧИТАТЬ 0x03020100 ? Всяко пробовал, не получается. Может дело в Native Address Alignment или Dynamic Bus Sizing? Только не врублюсь в чем разница если я пишу по всем адресам подряд байты, а читаю их потом по 4 за раз. Они же физически должны лежать в памяти как адрес 0 = 0x03020100, адрес 1 = 0x07060504 и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба А КАК ПРОЧИТАТЬ 0x03020100 ? должны работать и IORD_32DIRECT(SRAM_BASE, i), и IORD(SRAM_BASE, i). они отличаются тем, что в первом случае смещение измеряется в байтах, а во втором в словах. т.е. будет либо IORD_32DIRECT(SRAM_BASE, 0); IORD_32DIRECT(SRAM_BASE, 4); либо IORD(SRAM_BASE, 0); IORD(SRAM_BASE, 1); может запись косячит? выведите IORD_8DIRECT(SRAM_BASE, i); плата своя или кит? сигналы правильно подключены? про IORD/IOWR посмотрите в <io.h> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба Плата готовая, рабочая, проект для FPGA мой, теоретически может быть косяк с назначением адресов или byte enable. Только никак не пойму где. IORD_8DIRECT(BASE,i) возвращает правильный байт. Т.е. по адресу 0 =0, адрес 1 =1 и т.д. Косяк с внешним ОЗУ точно есть, потому что с ONCHIP_MEM памятью все нормально. IORD_32DIRECT возвращает 0x03020100 0x03020100 0x03020100 0x03020100 0x07060504 IORD 0x03020100 0x07060504 т.е. вроде так и должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба Плата готовая, рабочая, проект для FPGA мой, теоретически может быть косяк с назначением адресов или byte enable. Только никак не пойму где. IORD_8DIRECT(BASE,i) возвращает правильный байт. Т.е. по адресу 0 =0, адрес 1 =1 и т.д. Косяк с внешним ОЗУ точно есть, потому что с ONCHIP_MEM памятью все нормально. IORD_32DIRECT возвращает 0x03020100 0x03020100 0x03020100 0x03020100 0x07060504 IORD 0x03020100 0x07060504 т.е. вроде так и должно быть. тоже про byte enable подумал. стоит посмотреть SignalTap-ом. попробуйте еще так: int* x __attribute__ ((aligned (1))); int y; x=(BASE+i); y=*x; по идее, это чтение 4 байт начиная с произвольного адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cms 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба У NIOS-a есть определенная ерунда с чтением. Конкретно в вашем случае все вроде должно работать правильно, если только вы не подключили свою RAM к авалону как 8-битный слейв. Насчет заморочек с чтением посмотрите мой топик на niosforum.com, может что-то прояснит в вашем случае. Ambiguous ldbuio instruction, how to read 8 bit peripheral? Digitally yours, cms Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба int* x __attribute__ ((aligned (1))); int y; x=(BASE+i); y=*x; работает точно так же как и IORD32_DIRECT. Т.е. из ончип памяти читает 0x03020100 из внешней 0x00000000 0x00000100 и т.д. Внешняя RAM у меня 32 разряда подключена через стандартный компонент из SOPC билдера который называется IDT71V416 SRAM + tristate brige. Память у меня не точно такая же, но очень похожа IS61LV51216. Это просто 512к х16 бит SRAM. Две штуки параллельно. Сигналы byte enable 4 штуки подключены, адреса памяти 18..0 подключены к адресам 18..0 tristate brige. Вроде накосячить не где, сигналы с tristate brige точно соответствуют сигналам с SRAM. Побайтово писать и читать - работает, пословно писать-читать тоже работает, писать по байтам - читать по словам не работает. Вроде есть идея - а надо ли при подключении 32-разрядной памяти к Avalon не подключать младние линии адреса A1..A0? Они вроде как лишние должны остаться, байты адресуются сигналами byte enable. Память имеет адреса 18..0 и я их должен подключить на 20..2 авалона. А адрес A0 с выхода моста для внешней 32 бит памяти это А0 или А2 на авалоне? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cms 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба накосячить есть где. У памяти адресация по 2 байта, а вы читаете с побайтной или по 32-битной адресации. Естественно, что возникает путиница. К тому же когда вы собирали в билдере две параллельных 16битные памяти, билдер мог поставить 2 16-разрядные шины . Самый лучший вариант в вашем случае - запустить симулятор и посмотреть на шинах выглядит 32-разрядное чтение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба Две штуки параллельно. Сигналы byte enable 4 штуки подключены, адреса памяти 18..0 подключены к адресам 18..0 tristate brige. Вроде накосячить не где, сигналы с tristate brige точно соответствуют сигналам с SRAM. Побайтово писать и читать - работает, пословно писать-читать тоже работает, писать по байтам - читать по словам не работает. Вроде есть идея - а надо ли при подключении 32-разрядной памяти к Avalon не подключать младние линии адреса A1..A0? Они вроде как лишние должны остаться, байты адресуются сигналами byte enable. Память имеет адреса 18..0 и я их должен подключить на 20..2 авалона. А адрес A0 с выхода моста для внешней 32 бит памяти это А0 или А2 на авалоне? во, уже интереснее. по-моему младшие биты нафик не нужны. во всяком случае на ките с flash и sram я их не подключал. посмотрите описалку на какой-нибудь кит, как там распиновка сделана Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба Заработало всё как надо. При подключении 32-х разрядных устройств к авалону линии А0 и А1 надо не подключать. Я об этом догадывался, но на выходе моста для внешней памяти у меня не было лишних адресов и я решил что это сделано уже внутри моста. А адресов лишних не было потому что в единственной настройке у компонента IDT71V416 SRAM надо указывать не емкость микросхемы, а ёмкость всей памяти. Там я и накололся. Ну и адреса должны подключаться со сдвигом на 2. А2 моста на А0 м/сх, А3 на А1 и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться