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

Побайтовое обращение к памяти.

Долблю 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 и т.д.

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


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

А КАК ПРОЧИТАТЬ 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>

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


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

Плата готовая, рабочая, проект для FPGA мой, теоретически может быть косяк с назначением адресов или byte enable. Только никак не пойму где.

 

IORD_8DIRECT(BASE,i) возвращает правильный байт. Т.е. по адресу 0 =0, адрес 1 =1 и т.д.

 

 

Косяк с внешним ОЗУ точно есть, потому что с ONCHIP_MEM памятью все нормально.

IORD_32DIRECT возвращает

0x03020100

0x03020100

0x03020100

0x03020100

0x07060504

 

IORD

0x03020100

0x07060504

 

т.е. вроде так и должно быть.

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


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

Плата готовая, рабочая, проект для 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 байт начиная с произвольного адреса.

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


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

У NIOS-a есть определенная ерунда с чтением. Конкретно в вашем случае все вроде должно работать правильно, если только вы не подключили свою RAM к авалону как 8-битный слейв.

 

Насчет заморочек с чтением посмотрите мой топик на niosforum.com, может что-то прояснит в вашем случае.

 

Ambiguous ldbuio instruction, how to read 8 bit peripheral?

 

Digitally yours,

cms

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


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

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 на авалоне?

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


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

накосячить есть где.

 

У памяти адресация по 2 байта, а вы читаете с побайтной или по 32-битной адресации. Естественно, что возникает путиница.

 

К тому же когда вы собирали в билдере две параллельных 16битные памяти, билдер мог поставить 2 16-разрядные шины .

 

Самый лучший вариант в вашем случае - запустить симулятор и посмотреть на шинах выглядит 32-разрядное чтение.

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


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

Две штуки параллельно. Сигналы 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 я их не подключал. посмотрите описалку на какой-нибудь кит, как там распиновка сделана

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


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

Заработало всё как надо. При подключении 32-х разрядных устройств к авалону линии А0 и А1 надо не подключать. Я об этом догадывался, но на выходе моста для внешней памяти у меня не было лишних адресов и я решил что это сделано уже внутри моста. А адресов лишних не было потому что в единственной настройке у компонента IDT71V416 SRAM надо указывать не емкость микросхемы, а ёмкость всей памяти. Там я и накололся. Ну и адреса должны подключаться со сдвигом на 2. А2 моста на А0 м/сх, А3 на А1 и т.д.

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


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

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

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

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

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

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

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

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

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

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