реклама на сайте
подробности

 
 
> Microblaze, виснет при работы со SRAM, 8-битное чтение работает, на 16/32 повисает
AVR
сообщение Jun 11 2013, 11:36
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Имеется Microblaze из состава ISE 14.4.
К процессору подключена асинхронная SRAM 512 Кбайт, интерфейс - 8ми битный.

Когда я делаю test_sram_8bit - всё отлично. Когда попытка обратиться к 16-ти битам - сразу повисает и код разумеется тем более не работает.

В чем может быть хотя бы отдаленно проблема? Пробовал и с кэшами и без кэш-памяти - результат один: память вроде и работает, а по сути нет.

Память 10 нс (100 МГц), процессор тоже на этой частоте, шина AXI - тоже. Смотрю даташит - вроде контроллер целиком на логике, а значит реально частота еще меньше, ибо делится там у себя на циклы. Не должно быть такой проблемы.

Попробовал добавить xil_printf между записью и чтением - стало работать. Значит надо тайминги корректировать, ибо исполнение кода нужно...

Код
#include <stdio.h>
#include "xparameters.h"

void test_sram_8bit(int off)
{
    int max = 0;
    unsigned char *p = (unsigned char*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
    for(int i = 0; i < 10E9; i++)
    {
//        xil_printf("8bit = %d\n\r", i);
        unsigned int v = (i + off) % 0xFF;
        p[i] = v;
        if(v != p[i])
        {
            max = i;
            break;
        }
    }
    xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 1024, max);
}

void test_sram_16bit(int off)
{
    int max = 0;
    unsigned short *p = (unsigned short*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
    for(int i = 0; i < 10E9; i++)
    {
        xil_printf("16bit= %d\n\r", i);
        unsigned short v = (i + off) % 0xFFFF;
        p[i] = v;
        if(v != p[i])
        {
            max = i;
            break;
        }
    }
    xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 512, max * 2);
}

int main()
{
    int test = 0;
    while(true)
    {
        xil_printf("test %d\n\r", test++);
        test_sram_8bit(test);
        test_sram_16bit(test);
    }
    return 0;
}


Результат работы (вываливается в последовательный порт, вот что вижу):
Код
test 0
SRAM 512 Kbytes (524288 bytes)
16bit= 0


Тут видно что первый тест с 8-ми битным доступом проходит отлично, а 16-битным виснет намертво при первой же попытке. Соответственно я не могу исполнять свой код из SRAM - виснет на первой же инструкции.

З.Ы.
При подключении DDR2 как внешней памяти - всё было отлично, а ведь это сложнее...


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01361 секунд с 7
ELECTRONIX ©2004-2016