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

SRAM и NIOS

Как-то можно производить побайтное чтение с 8-битной внешней SRAM, подключенной через MM Tristate Slave? Независимо от типа указателя всегда производится считывание 4 байтов подряд. Запись происходит нормально, если *int, пишет 4 байта, если *char - один.

Если нужны какие-то скриншоты или листинги, выложу.

 

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


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

Как-то можно производить побайтное чтение с 8-битной внешней SRAM, подключенной через MM Tristate Slave? Независимо от типа указателя всегда производится считывание 4 байтов подряд. Запись происходит нормально, если *int, пишет 4 байта, если *char - один.

Если нужны какие-то скриншоты или листинги, выложу.

 

Возможно это кэш балуется? Через IORD() наверное тоже не получится- он, вроде, по определению 32-разрядный. Может на уровне ассемблерных инструкций можно пошаманить.

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


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

Возможно это кэш балуется? Через IORD() наверное тоже не получится- он, вроде, по определению 32-разрядный. Может на уровне ассемблерных инструкций можно пошаманить.

Кеша данных у меня нет, только инструкций. Через IORD() пробовал - то ж самое.

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


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

Как-то можно производить побайтное чтение с 8-битной внешней SRAM, подключенной через MM Tristate Slave? Независимо от типа указателя всегда производится считывание 4 байтов подряд. Запись происходит нормально, если *int, пишет 4 байта, если *char - один.

Если нужны какие-то скриншоты или листинги, выложу.

 

А попробуйте создать проект из заготовок ниоса, называется "тестирование памяти". Там как раз тестируются и 32- и 16- и 8-бит операции чтения записи. Там не пробовали посмотреть шину при 8 -ми битных обращениях?

Там кстати видел функции что-то типа IORD8, IORD16, IORD32

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


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

А попробуйте создать проект из заготовок ниоса, называется "тестирование памяти". Там как раз тестируются и 32- и 16- и 8-бит операции чтения записи. Там не пробовали посмотреть шину при 8 -ми битных обращениях?

Там кстати видел функции что-то типа IORD8, IORD16, IORD32

Да, есть там функция IORD_8DIRECT, но она тоже вызывает 4 цикла чтения, а возвращает один байт, номер которого указан в параметре.

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


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

а читать 32 бита, и вырезать маской? Во многих процах - кристаллах чтение так и сделано, может в "софтовом" тоже также сделали?

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


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

Во многих процах - кристаллах чтение так и сделано, может в "софтовом" тоже также сделали?

нет, там отдельные инструкции для байта/слова/дв. слова

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


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

нет, там отдельные инструкции для байта/слова/дв. слова

Так все-таки возможно организовать побайтное чтение, или только "считал 4 байта и выкинул лишнее" ? Если бы я подключал просто SRAM, да фиг с ним, но я подключаю W3150, а там приходится читать кучу 8-ми и 16-ти битных значений. В результате, что бы считать , например, 16-битное значение, расположенное в одной тетраде, приходится эту тераду считвывать два раза. Или для каждого регистра делать свою функцию чтения с учетом его расположения относительно тетрад.

 

 

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


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

Как-то можно производить побайтное чтение с 8-битной внешней SRAM, подключенной через MM Tristate Slave? Независимо от типа указателя всегда производится считывание 4 байтов подряд.

Уже подзабылось немного все, связанное с этими SOPC деталями, так что сильно не пинайте, если спрошу глупость. А какова у вас ширина порта MM Tri-State Slave, обращенная в сторону Avalon interconnect'а?

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


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

Уже подзабылось немного все, связанное с этими SOPC деталями, так что сильно не пинайте, если спрошу глупость. А какова у вас ширина порта MM Tri-State Slave, обращенная в сторону Avalon interconnect'а?

 

32 бита, такая же, как и у Авалона

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


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

Так все-таки возможно организовать побайтное чтение, или только "считал 4 байта и выкинул лишнее" ? Если бы я подключал просто SRAM, да фиг с ним, но я подключаю W3150, а там приходится читать кучу 8-ми и 16-ти битных значений. В результате, что бы считать , например, 16-битное значение, расположенное в одной тетраде, приходится эту тераду считвывать два раза. Или для каждого регистра делать свою функцию чтения с учетом его расположения относительно тетрад.

организовать можно. но подозреваю, что проблема не в инструкциях, для этого достаточно глянуть ассемблер. думаю, что это как-то связано с мостом, надо его в сигналтапе поглядеть (как чтение и запись байта происходят)

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


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

мыслей две:

первая - в Avalon-MM шина адреса адресует сразу 32бита = 4 байта.

В код не лазил, не вникал, но предполагаю, внутри тристейт-контроллера для экономии адресного пространства 4 последовательных байта со стороны SRAM мапятся в один адрес

если смотреть со стороны Avalon.

в этом случае для соответствия "одно обращение- одно чтение" можно имитировать что у вас SRAM 32-битный, подключив только первый байт. При этом замапленная область адресов раздуется в 4 раза.

 

вторая мысль связана с тем что 4 байта - это типовой размер burst-а на шине Avalon.

Изменено пользователем krux

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


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

мыслей две:

первая - в Avalon-MM шина адреса адресует сразу 32бита = 4 байта.

В код не лазил, не вникал, но предполагаю, внутри тристейт-контроллера для экономии адресного пространства 4 последовательных байта со стороны SRAM мапятся в один адрес

если смотреть со стороны Avalon.

в этом случае для соответствия "одно обращение- одно чтение" можно имитировать что у вас SRAM 32-битный, подключив только первый байт. При этом замапленная область адресов раздуется в 4 раза.

 

вторая мысль связана с тем что 4 байта - это типовой размер burst-а на шине Avalon.

 

Burst у меня выключен, если только по дефолту какая-то минимальная очередь все равно создается...

А вот сделать наружу 32 бита надо попробовать...

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


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

НИОС при записи/чтении по Авалону использует 32-хбитную шину, но при этом он оперирует шиной BYTEENABLE, адресация всегда остается 4-байтовой.

Используя типы данных можно заставить его писать и по 8 бит.

Например:

alt_u8 temp_8 = 0xab;
IOWR(EXTERNAL_MEM_0_BASE, 0, temp);

а вот зпись IOWR(EXTERNAL_MEM_0_BASE, 0, 0xAB); приведет действительно к записи 4-хбайтового слова.

Изменено пользователем billidean

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


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

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

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

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

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

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

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

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

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

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