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

 
 
> Nios + DDR3, Пробую управлять DDR3 HPC из Niosа
billidean
сообщение Nov 29 2011, 12:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925



Собрал в SOPCе набор компонентов, подключил к проекту в Квартусе9.1, а как теперь читать/писать в DDR-ину не знаю.
В Инете нашел как это делают с DDR2, но тама зачем-то цепляют DMA, а мне бы хотелось так попробовать, без DMA, и еще в том примере ширина локальной шины интерфейса DDR2 = 32, а у меня 64.

Расскажите, кто как делал, плз.

ПС: постарайтесь без "понтов", пожалуйста, т.к. я в этом Ниосе мало понимаю.

Сообщение отредактировал billidean - Nov 29 2011, 12:11
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
billidean
сообщение Dec 7 2011, 03:36
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925



Приветствую всех в очередной раз.
Доработал свою систему до следующего состояния:
SOPC:
Прикрепленное изображение

NiosII:
Код
static volatile int rx_done = 0;

static void dma_done (void* handle, void* data)
{
  rx_done = 1;
}

int main(void)
{
    int rc;
    int pattern, offset;
    alt_dma_txchan txchan;
    alt_dma_rxchan rxchan;
    void* data_written;
    void* data_read;

    int i;

    //выделяю памяти [32 байт] = [8*64-битных слова]
    data_written = (void*)alt_remap_uncached(DMA_WRITE_MASTER_ALTMEMDDR_BASE,0x20);
    data_read = (void*)alt_remap_uncached(DMA_READ_MASTER_ALTMEMDDR_BASE,0x20);

    if( data_written == NULL )
        printf("data_written is NULL\n");
    if( data_read == NULL )
        printf("data_read is NULL\n");

    // дергаю лампочками для визуализации начала работы
    set_leds(0x0f);
    usleep(100000);
    set_leds(0xf0);
    printf("leds ok...\n");

    //-----------------------------------
    // эта часть кода бессмысленна!!, т.к. никакой записи не происходит!!
    for (pattern = 0x0000000f, offset = 0; offset < 0x20; offset+=8)
    {
        IOWR((int)data_written, offset, (alt_u64)pattern);
    }
    printf("data_written MEM inited by:\n");
    for (i=0;i<0x20;i+=8)
    {
        printf("[DDR3]addr %d:\tdata: 0x%2x\n",i,IORD((int)data_written,i));
    }
    //-----------------------------------

    if ((txchan = alt_dma_txchan_open("/dev/dma")) == NULL)
    {
        printf ("Failed to open transmit channel\n");
        exit (1);
    }
    if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL)
    {
        printf ("Failed to open receive channel\n");
        exit (1);
    }

    if(alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_64, NULL)<0)
        printf("NO (txchan, ALT_DMA_SET_MODE_64)\n");
    else
        printf("OK (txchan, ALT_DMA_SET_MODE_64)\n");

    if(alt_dma_rxchan_ioctl(rxchan,ALT_DMA_SET_MODE_64,NULL)<0)
        printf("NO (rxchan,ALT_DMA_SET_MODE_64)\n");
    else
        printf("OK (rxchan,ALT_DMA_SET_MODE_64)\n");

    if(alt_dma_txchan_ioctl(txchan,ALT_DMA_TX_ONLY_ON,data_written)<0)
        printf("NO (txchan,ALT_DMA_TX_ONLY_ON)\n");
    else
        printf("OK (txchan,ALT_DMA_TX_ONLY_ON)\n");

    if ((rc = alt_dma_txchan_send(txchan, data_written, 0x20, NULL, NULL)) < 0)
    {
      printf ("Failed to post transmit request, reason = %i\n", rc);
      exit (1);
    }
    if(alt_dma_txchan_ioctl(txchan,ALT_DMA_TX_ONLY_OFF,NULL)<0)
        printf("NO (txchan,ALT_DMA_TX_ONLY_OFF)\n");
    else
        printf("OK (txchan,ALT_DMA_TX_ONLY_OFF)\n");

    if(alt_dma_rxchan_ioctl(rxchan,ALT_DMA_RX_ONLY_ON,data_read)<0)
        printf("NO (rxchan,ALT_DMA_RX_ONLY_ON)\n");
    else
        printf("OK (rxchan,ALT_DMA_RX_ONLY_ON)\n");

    if ((rc = alt_dma_rxchan_prepare(rxchan, data_read, 0x20, dma_done, NULL)) < 0)
    {
      printf ("Failed to post read request, reason = %i\n", rc);
      exit (1);
    }
    if(alt_dma_rxchan_ioctl(rxchan,ALT_DMA_RX_ONLY_OFF,NULL)<0)
        printf("NO (rxchan,ALT_DMA_RX_ONLY_OFF)\n");
    else
        printf("OK (rxchan,ALT_DMA_RX_ONLY_OFF)\n");

    /* Wait for transfer to complete */
    printf("wait rx_done...\n");
    while (!rx_done);
    printf("rx_done is here\n");
    rx_done = 0;

    printf("data_read MEM:\n");
    for (i=0;i<0x20;i+=8)
    {
        printf("addr %d:\tdata: 0x%2x\n",i,IORD((int)data_read,i));
    }

    alt_uncached_free(data_written);
    alt_uncached_free(data_read);


    return 0;
}

Все это я нарыл на разных форумах.

В "system.h" у меня есть только DMA_WRITE_MASTER_ALTMEMDDR_BASE адрес, он равен адресу DMA_READ_MASTER_ALTMEMDDR_BASE, но нет адреса ALTMEMDDR_BASE, поэтому я пытаюсь писать только по этому адресу.

при этом получаю такую катрину на SignalTap'e:
Прикрепленное изображение


Получается, что вычитывается из DDR-ины, то затем и записывается.

Подскажите, пожалуйста:
1. почему на диаграмме получается так, что сначала начинается процесс чтения, а затем уже процесс записи данных?
2. почему при попытке убрать из кода одну из функций alt_dma_txchan_send или alt_dma_rxchan_prepare
не происходит послыки запросов в DDR3-контроллер ни на запись ни на чтение?
3. как записать какие-то конкретные данные в область памяти DDR-ины???

p.s.: я работал с DDR3, но только в Квартусе, на VHDL, но не используя Ниос, поэтому я знаю как должна выглядеть нормальная циклограмма запросов на DDR3-контроллер, но как все это сделать на Ниосе и с применением DMA, для меня ново.

Сообщение отредактировал billidean - Dec 7 2011, 03:47
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 23:48
Рейтинг@Mail.ru


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