Jump to content

    

billidean

Свой
  • Content Count

    245
  • Joined

  • Last visited

Everything posted by billidean


  1. Добрый день всем. Имеется два проекта: 1. проект с использованием PCI_Express ядра (версия 9.1) 2. проект с использованием процессора NIOS_II - без лицензии(time limited) Оба этих проекта компилятся в квартусе 11.1 SP2 и работают на железе (Stratix IV GX) по отдельности. Когда же я соединил эти два ядра в одном проекте, то после компиляции получил следующее: кто с таким сталкивался и как это победить?
  2. При написании такого кода ... process clk begin if ( rising_edge(clk) ) then ... ram_wren <= '1'; --сигнал чтения памяти ... end if; ... end process; ... в моделсиме получаю задержку выходных данных из памяти в 1 такт, но уже при коде ... process clk begin if ( rising_edge(clk) ) then ... ram_wren <= '1' after 1 ns; --сигнал чтения памяти ... end if; ... end process; ... получаю нормальную рабочую задержку, как в железе, в 2 такта. Т.е. получается, что проекты заточенные конкретно для железа нельзя сразу моделировать, не расставив задержки по всем устанавливаемым сигналам?
  3. Вообще-то обе этих памяти в железе (циклон,стратикс...) имеют одинаковую задержку выходных данных относительно сигнала rden, два такта. Или Вы с ними в железе не сталкивались?
  4. В том то и дело, что обе памяти у меня сформированы на основе библиотечного компонента altsyncram, обе в синхронном режиме, и обе имеют регистры на выходе, даже тактируются одной частотой, но вот ведут себя по разному, одна имеет на выходе задержку в 1 такт, другая - 2 такта.
  5. Вот vhd-файл, сгенеренный Визардом: qwerty.vhd Покажител, плз, где настраивается задержка
  6. Ладно... Разрабатываю проект в Квартусе (VHDL), где Визардом создал памяти( RAM:1-Port и RAM:2-Port ). Перед отладкой проекта на железе решил промоделировать систему в МоделСиме и наткнулся на проблему.
  7. Какую "read latency"??? :01: В МегаВизарде вообще нет такой опции для памяти %) З.Ы.: прошу отвечать тех, кто сталкивался с такой проблемой или знает решение.
  8. Добрый день всем. Работая с ModelSim заметил странную вещь. В одном проекте имеются два компонента памяти: 1-портовая и 2-портовая, обе синхронные. При симуляции проекта, во время чтения каждой из памятей получаю разные задержки данных на выходе относительно сигнала "rden". Вот две картинки: для однопортовой: для двухпортовой: По нулевому адресу в обеих памятях лежит значение "F00..", т.е. не ноль. Подскажите что делать, если Вы знаете.
  9. Есть еще решение - двойная буферизация, т.е. будете иметь значение счетчика с опозданием на два такта, но это есть вариант обычно для синхронизации двух процессов на разных частотах. Но для Вас тоже должно подойти. На счет гонок на частоте 100МГц - тоже оччень сомневаюсь, хотя...
  10. мы легких путей не ищем Да уж, я это уже понял :laughing: Но я рад, что наконец победил эту проблему. З.Ы.: Спасибо за помощь всем, кто отозвался
  11. Я глубоко извиняюсь, но проблема с "open-drain" была по моей причине. Дело в том, что в Квартусе 9.1 DDR3-ядро после генерации имело для выводов mem_ck и mem_ck_n тип "inout", а в Квартусе 11.1 они имеют уже тип "out". Поэтому пользуясь старыми скриптами, я подключал ядро к прежнему проекту, где тип выводов был описан как "inout", и при компиляции появлялись эти ошибки. Создал новый проект в Квартусе 11.1, создал МегаВизардом DDR3-ядро с UniPHY, подкорректировал типы выводов, запустил компиляцию... и опять мимо... ошибка получилась такая, что фиттер не смог развести две диф-пары(это уже обуждалось в одной из моих тем Проблема с пинами в Q_11.1). Из документа "MegaCore IP Library - Release Notes and Errata" нашел следующее: подкорректировал по их описанию, и, О ЧУДО, компилер не выдал ошибки. А мой проект заработал наконец. З.Ы.: если кому-то помогла моя тема, я буду рад.
  12. Установил СервисПак 2 для квартуса 11.1, теперь МегаВизард генерит ядро контроллера с UniPHY. Но при компиляции ошибка та же самая.
  13. Ага, только теперь(в Квартусе11.1) нужно использовать контроллер с UniPHY, т.е. генерить не через МегаВизард (не генерится), а через qSys. После генерации ядра с UniPHY в qSys (только DDR3-ядро) я подключил полученный компонент к своему проекту, обвязал его и... получил ошибку, что фиттер не может сделать режим open-drain для ног mem_ck[0] и mem_ck_n[0], т.е. для тактовых ног. Может я что-то не так понимаю и делаю?? :help: З.Ы.: моя система в qSys: ошибки при компиляции:
  14. Спасибо всем за ответы. Буду думать, что дальше делать. Может обратно на Q9.1 перейду.
  15. Здравствуйте. Имеется проект под StratixIV на Q9.1, который качает данные в DDR3 и из нее. Используется HPC II. Все работает отлично. Далее, взял этот проект и вставил его как компонент в другой проект, который создан в Q11.1. Здесь-то и началось все веселье. Сначала Квартус потребовал перегенерить ядро HPC II, ладно сделал, проект вроде скомпилился. Заливаю в кристалл, обмена с DDR-кой нет. Смотрю на SignalTap'е, сигнал local_ready='0' с самого начала, т.е. он даже не был в '1'. Перекомпилил проект, залил, обмен есть, но поведение сигнала local_ready мне не нравится, при записи данных в DDR-ку он иногда падает в '0'. Такого поведения от него я не видел при отладке начального проекта в Q9.1, там этот сигнал падал в '0' только при вычитывании большого объема данных из DDR-ки, когда буфер контроллера HPC II заполнялся. Кто может что-нибудь посоветовать, как победить проблему в Q11.1??? З.Ы.: после каждой перекомпиляции поведение конртоллера HPC II меняется, и это не есть гуд.
  16. Доброго всем.. Я работаю над обменом Стратикса4GX с DDR3-кой, пробую по-всякому ее использовать. Сначала сделал обмен с ДДР-кой в Кваартусе9.0 на VHDL. Недавно работал над обменом с использованием SOPC в Квартусе9.0. В обоих случаях используется альтеровский DDR3-контроллер, кто с этим работал, тот в курсе. Так вот, у этого контроллера есть внешний интерфейс, который подключается непосредственно к самому чипу ДДР-ки, и имеются два вывода: mem_ck : inout std_logic_vector(0 downto 0) и mem_ck_n : inout std_logic_vector(0 downto 0) Первый подключается к ноге D24, а второй к C24 (это диф.пара). Теперь о проблеме: Перешел на Квартус_11.1 и создал такую же систему, как и прежде, но только уже с использованием Qsys, и теперь эти выводы перестали быть "INOUT", а стали просто "OUT", (КАК ТАК??), а самое главное в том, что теперь проект не компилится, а я получаю ошибку: , где видно(обведено "А"), что компилер не признал пару mem_ck+mem_ck_n как диф.пару, и далее(подчеркнуто) уже видим следствие этого. Настройки этих выводов следующие (из AssignmentEditor'а): В чем может быть косяк, и почему это выводы перестали быть "INOUT", ведь сама микросхема DDR3 не поменялась, в чем изюм весь, может кто знает???
  17. Спасибо за подсказки и советы. Я уже нашел на сайте alterawiki похожую конструкцию, и немного описания по данной теме. Да, кстати, вы правы, что сначала нужно было добиться рабочих транзакций при использовании IOWR/IORD, а затем уже поднимать вопрос о необходимости DMA. Да и не обязательно пользоваться макросами IOWR/IORD, можно просто работать с выделенной памятью как с массивом. А проблема моя была в настройках системы в SOPC'е. Пока у меня немного кривые пакеты ходят от/к DDR, но изменяя параметры, я кое-чего добился уже.
  18. Приветствую всех в очередной раз. Доработал свою систему до следующего состояния: 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, для меня ново.
  19. как я привел в примере, IORD/IOWR - результата не приносит. после чтения получаю 0xfff... это мне ничего нового не сообщило И вообще, я прошу помощи у тех, кто так же пробовал, маялся, и парил Инет в поисках работающего варианта. Если кто не юзал данной связки: "DDR3+NiosII", то и незачем комменты левые оставлять, а если работал, то зажимать ответ стремно :mad:
  20. Создал следующий проект: SOPC: пробовал два варианта (из примера для DDR2): и подключил полученный компонент в проект квартуса, подцепил все внешние ноги. Создал проект в Ниосе, с-код (на основе примера): #include "count_binary.h" static volatile int rx_done = 0; static void dma_done (void* handle, void* data) { rx_done++; } static void set_leds(alt_u8 data) { alt_u8 b = data; /* Logic to make the LEDs count from right-to-left, LSB on the right. */ IOWR_ALTERA_AVALON_PIO_DATA( PIO_BASE, ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16 ); } int main(void) { alt_u64 w; alt_u64 r; int rc; int pattern, offset; alt_dma_txchan txchan; alt_dma_rxchan rxchan; void* data_written; void* data_read; int compare; /* Get a couple buffers for the test */ data_written = (void*)alt_uncached_malloc(0x1000); data_read = (void*)alt_uncached_malloc(0x1000); set_leds(0x0f); usleep(100000); set_leds(0xf0); printf("leds ok...\n"); w = 0xf0f0f0f0; IOWR(DMA_WRITE_MASTER_ALTMEMDDR_BASE,0,w); r = IORD(DMA_READ_MASTER_ALTMEMDDR_BASE,0); printf("%x\n",r); /* Fill write buffer with known values */ for (pattern = 1, offset = 0; offset < 0x1000; pattern++, offset+=4) { IOWR_32DIRECT((int)data_written, offset, pattern); } /* Create the transmit channel */ if ((txchan = alt_dma_txchan_open("/dev/dma")) == NULL) { printf ("Failed to open transmit channel\n"); exit (1); } /* Create the receive channel */ if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL) { printf ("Failed to open receive channel\n"); exit (1); } //-------------------------------------------- /* Use DMA to transfer from write buffer to memory under test */ /* Post the transmit request */ if ((rc = alt_dma_txchan_send(txchan, data_written, 0x1000, NULL, NULL)) < 0) { printf ("Failed to post transmit request, reason = %i\n", rc); exit (1); } /* Post the receive request */ if ((rc = alt_dma_rxchan_prepare(rxchan, (void*)DMA_WRITE_MASTER_ALTMEMDDR_BASE, 0x1000, dma_done, NULL)) < 0) { printf ("Failed to post read request, reason = %i\n", rc); exit (1); } /* Wait for transfer to complete */ printf("wait rx_done...\n"); while (!rx_done); printf("rx_done is here\n"); rx_done = 0; /* Clear the read buffer before we fill it */ memset(data_read, 0, 0x1000); /* Use DMA to read data back into read buffer from memory under test */ /* Post the transmit request */ if ((rc = alt_dma_txchan_send(txchan, (void*)DMA_READ_MASTER_ALTMEMDDR_BASE, 0x1000, NULL, NULL)) < 0) { printf ("Failed to post transmit request, reason = %i\n", rc); exit (1); } /* Post the receive request */ if ((rc = alt_dma_rxchan_prepare(rxchan, data_read, 0x1000, dma_done, NULL)) < 0) { printf ("Failed to post read request, reason = %i\n", rc); exit (1); } /* Wait for transfer to complete */ printf("wait rx_done...\n"); while (!rx_done); printf("rx_done is here\n"); rx_done = 0; compare = memcmp(data_written, data_read, 0x1000); printf("compare = %i\n",compare); //-------------------------------------------- alt_uncached_free(data_written); alt_uncached_free(data_read); return 0; } После запуска проекта на кристалле (StratixIV GX) в консоли печатается следующее: leds ok... (это просто моргание лампочками для визуализации начала работы) ffffffff (это результат выполнения printf("%x\n",r);) wait rx_done... (после выполнения первого alt_dma_rxchan_prepare(...)) - на этом всё заканчивается. Подключил СигналТап и получаю картинку: на которой видно, что адрес=0, local_size почему-то =1(??), а данные тоже = 0. Подскажите, что я делаю не так? Ну и просто можно прокомментировать получившийся проект.
  21. Собрал в SOPCе набор компонентов, подключил к проекту в Квартусе9.1, а как теперь читать/писать в DDR-ину не знаю. В Инете нашел как это делают с DDR2, но тама зачем-то цепляют DMA, а мне бы хотелось так попробовать, без DMA, и еще в том примере ширина локальной шины интерфейса DDR2 = 32, а у меня 64. Расскажите, кто как делал, плз. ПС: постарайтесь без "понтов", пожалуйста, т.к. я в этом Ниосе мало понимаю.
  22. Смотрел осциллографом: на ноге Mute-1,5В, Bypass-2,5В. Если вы работали с этим китом, скажите, светодиод D30 (из схемы на плату - на выходе CD чипа эквалайзера приемника) должен гореть? у меня горит. Пробовал сделать проект используя ALTGX(в режиме SDI), настраивал "вроде" правильно, НО тот же отрицательный результат. Мне нужно просто перегнать некий объем данных от передатчика к приемнику используя интерфейс SDI... я не думал, что все так сложно. Нужно ли кроме компонентов (ALTGX, например), что-то подключать? если кто-нибудь поделится минимальным работающим похожим проектом для кристалла Stratix IV GX, буду очень признателен.
  23. Мах управляет загрузкой конфига из флэшки в Стратикс + управляет входами, указанными выше, чипа приемника. Если я еще могу выдать какие-то уровни на ноги Мах-а, то написать конфиг управления загрузкой кода из флэшки - это я (пока) не умею. И вообще, я что первый, кто столкнулся с этой проблемой??? Или все вокруг только и делают, что переписывают код управления загрузкой конфигурации из флэшки в ПЛИС??? Мне кажеься, что нужный .pof-файл для этого Мах-а для этой платы где-то есть, просто я его пока не нашел :)
  24. в примере по SDI-интерфейсу лежит .pof файл для MaxII, который какраз-таки и управляет чипом приемника, его режимами Mute и Bypass, а в документации на этот пример написано, что перед конфигурированием Стратикса необходимо прошить Мах этим файлом. Вот только пример этот для StratixII GX, и плата отладочная там другая, и Мах там другой. :( Кто-нить знает где найти этот .pof файл для моей отладочной платы, для Мах-а, который там стоит ( MAX II CPLD EPM2210 вроде на 250 ног)???