Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Побайтовое обращение к памяти.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
slog
Долблю 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
Цитата(slog @ Nov 30 2008, 01:44) *
А КАК ПРОЧИТАТЬ 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
Плата готовая, рабочая, проект для FPGA мой, теоретически может быть косяк с назначением адресов или byte enable. Только никак не пойму где.

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


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

IORD
0x03020100
0x07060504

т.е. вроде так и должно быть.
vadimuzzz
Цитата(slog @ Nov 30 2008, 14:10) *
Плата готовая, рабочая, проект для 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
У NIOS-a есть определенная ерунда с чтением. Конкретно в вашем случае все вроде должно работать правильно, если только вы не подключили свою RAM к авалону как 8-битный слейв.

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

Ambiguous ldbuio instruction, how to read 8 bit peripheral?

Digitally yours,
cms
slog
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
накосячить есть где.

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

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

Самый лучший вариант в вашем случае - запустить симулятор и посмотреть на шинах выглядит 32-разрядное чтение.
vadimuzzz
Цитата(slog @ Nov 30 2008, 20:12) *
Две штуки параллельно. Сигналы 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
Заработало всё как надо. При подключении 32-х разрядных устройств к авалону линии А0 и А1 надо не подключать. Я об этом догадывался, но на выходе моста для внешней памяти у меня не было лишних адресов и я решил что это сделано уже внутри моста. А адресов лишних не было потому что в единственной настройке у компонента IDT71V416 SRAM надо указывать не емкость микросхемы, а ёмкость всей памяти. Там я и накололся. Ну и адреса должны подключаться со сдвигом на 2. А2 моста на А0 м/сх, А3 на А1 и т.д.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.