Jump to content

    

Recommended Posts

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

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

 

Share this post


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

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

 

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

Share this post


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

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

Share this post


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

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

 

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
Во многих процах - кристаллах чтение так и сделано, может в "софтовом" тоже также сделали?

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

Share this post


Link to post
Share on other sites
нет, там отдельные инструкции для байта/слова/дв. слова

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

 

 

Share this post


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

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

Share this post


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

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites

мыслей две:

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

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

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

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

 

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

Edited by krux

Share this post


Link to post
Share on other sites
мыслей две:

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

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

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

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

Например:

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

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

Edited by billidean

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this