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

Swup

Свой
  • Постов

    127
  • Зарегистрирован

  • Посещение

Весь контент Swup


  1. У вас ведь наверное TSE? а дальше RGMII до phy? Вот кажетcя нужно посмотреть внимательно все ли пакеты заходят правильно в TSE. Если да, то вертеть констрейнты на RGMII. Ну либо кабельное хозяйство, разъемы, сетевая карта...
  2. Делаем много обменов на UDP, скорости под 1000 гбит/с. соединение точка-точка либо через 1-2 свича. Пакеты теряются крайне редко. Кажется дело не в UDP, а у вас что-то не так с реализацией. ПС редко - это пара пакетов в день.
  3. Кажется так: PAGE_SIZE = log2(4096) BLOCK_SIZE = log2(4096*64) 4096 размер страницы 64 количество страниц в блоке
  4. Просто режьте ваш стрим на пакеты, пакеты заворачиваете на проходе в udp. посмотрите вот на этот пример.
  5. А как вы его включаете? Вообще кажется, что он срабатывает снова, сразу как вы его сбрасываете. Посмотрите просто в сигнал тапе и все будет понятно. вот например у меня устанавливается таймер и сбрасывается (но это с VIC, хотя разницы особо нет: void ru_timer_isr() { IOWR(PERIPHERAL_TIMER_RU_BASE,0,0); ... } void ru_timer_irq_init() { alt_u32 timer_cnt = sys_freq; // 1sec IOWR(PERIPHERAL_TIMER_RU_BASE, 2, timer_cnt & 0xFFFF); IOWR(PERIPHERAL_TIMER_RU_BASE, 3, (timer_cnt>>16) & 0xFFFF); IOWR(PERIPHERAL_TIMER_RU_BASE, 0, 0x00); IOWR(PERIPHERAL_TIMER_RU_BASE, 1, 0x07); // timer start, cont, irq alt_ic_isr_register( 0x00, PERIPHERAL_TIMER_RU_IRQ, ru_timer_isr, NULL, 0x00 ); }
  6. да, дата производства, ревизия, страна. подробнее: https://www.micron.com/resource-details/a4b...6c-3d1622a62161
  7. память микрон 1Gb: x8/x16, 3V, MT28EW Embedded Parallel NOR FBGA Code (вторая строчка) decoder на сайте микрона выдает её;
  8. Поставить память рядом и не сбрасывать её, когда сбрасывается процессор. Но не понятно зачем это вообще нужно.
  9. Скобки круглые для индексов массивов и параметров функций, квадратные для явного задания массивов, фигурные - для cell arrays. Ну про функции сложно сказать что-то. Как в любом программировании. Вэйтбар есть строенный: h = waitbar(0,'byte reseived:0/0'); for K = 1 : SLIM B = fread(Port, 2); T = bitor(bitand(B(1),63), bitsll(bitand(B(2),63),6)); M(K) = T; waitbar(K / SLIM,h,['byte reseived:',num2str(K),'/',num2str(SLIM)]) end close(h) Можно сбросить все открытые устройства функцией instrreset.
  10. Это не громоздко и не избыточно. При синтезе это вообще практически бесплатно. Во вторых это и есть изящно и просто, потому что это тот путь, который естественен для среды в которой вы работаете (qsys). И ни у одного пользователя он не вызовет недоумения.
  11. Ксли один такой периферийный модуль и он сам по себе - сложная система, то может и да. Если у вас 10-20 таких модульков, отвечающих за всякое разное, то проще держать все в qsys. Генерировать систему это ведь не что-то невероятно сложное. К тому же интегрируемый модуль обычно уже оттестирован отдельно.
  12. На сколько я понял вашу проблему, то передача этих значений ваших, довольно редкая операция. И вот этот вариант мне кажется наиболее удобным, чем городить отдельную память и так далее. Проблема в том, что вы видимо не достаточно осведомлены как работает qsys и avalon-mm в частности. В общих чертах я бы сделал ваш модуль весь целиком, блоком qsys. Сделал бы на нем avalon-mm slave с 32х битной шиной данных и irq sender. В 0 адресе имел бы регистр управления с прерыванием и маской прерывания. При получении данных писал бы их в регистры по 32 бита в адреса 1,2,3,4 и выставлял бы прерывание. По прерыванию в ниосе читал бы эти 4 регистра (можно через указатель, можно через IORD. Второе лучше). Сбрасывал бы прерывание. Это все достаточно просто. Стоит разобраться один раз. Вариант с памятью вообще выглядит избыточно. А с пио, как-то кривовато. Зато можете сделать прямо сейчас, если спешите.
  13. vec.insert = (vec.end(), a, b+1 ) Почему бы и нет.
  14. vec.insert = (vec.end(), a,b ) данные вставляются перед vec.end() от а до b не включая b. т.е. [a,b ); Вот последний и не вставляется.
  15. Настройки линкера в bsp editor. Если у вас есть еще какая-то память проекте, то может там указано не туда куда нужно. ПС Там еще отдельно в main есть настройка указателей на стек прерываний и стек исключений.
  16. Уберите flash контроллер. Он вам сейчас явно не нужен. Поставьте вектор сброса тоже на ончип память.
  17. logic [7:0] [7:0] data = {0:6 ,4:12, 6:3, default:'0}; Но я бы не стал так писать. Не достаточно прозрачно для беглого понимания и правки. Лучше так: logic [7:0] [7:0] data = {default:'0}; initial begin data[0] = 6; data[4] = 12; data[6] = 3; end ПС Кстати во всех примерах не нужно писать '0, можно просто 0. Черточка подчеркивает, что происходит обнуление массива в контексте битов, а не в контексте чисел. В пример выше на VHDL эту функцию выполняет (others=>'0') как я понял.
  18. вот здесь показано, как работает адресация в многомерных массивах. http://testbench.in/SV_09_ARRAYS.html Это все для SystemVerilog. ПС запакованный массив, он как и просто массив, но в памяти выделяется непрерывным куском (а при синтезе непрерывным вектором). И индексы работают все также. Плюс запакованный массив можно простым присвоением кастить в вектор или запакованную структуру.
  19. Если для синтеза, то: logic [N-1:0] tmp[K-1:0]; не сильно будет отличаться от: logic [K-1:0] [N-1:0] tmp; и тогда можно сделать так: tmp <= '0; или можно еще вот так, для обоих случаев: foreach(tmp[i]) tmp[i] = '0;
  20. Можно просто SPI контроллер взять где-нибудь. Хоть в альтеровской библиотеке, хоть на опенкорс. По поводу инициализации. У них есть программки для программирования фапчей на отладочных платах. Можно в ней нащелкать настройки и получить таблицу регистров.
  21. Либо не приходит данных сколько надо, либо буфер маленький, либо таймаут маленький. 1. проверьте сниффером пакеты 2. проверьте настройки udp при создании 3. сделайте что-то типа pause_step = 0.01; pause_timeout = 1; while u_cmd.BytesAvailable < waiting_packet_length pause(pause_step); pause_cnt = pause_cnt+pause_step; u_cmd.BytesAvailable if pause_cnt>pause_timeout answ = 0; break end end u_cmd.BytesAvailable Увидите как BytesAvailable меняется и сколько в итоге набралось. По результатам увеличьте таймаут. Кстати если быстрая реакция не нужна, сделайте pause_step побольше.
  22. %шлем команду fwrite(u_cmd, send_pack, 'uint32'); % ждем либо таймаут 200мсек либо пока придет 16 байт waiting_packet_length = 4*4; answ = 1; pause_cnt = 0; pause_step = 0.01; pause_timeout = 0.2; while u_cmd.BytesAvailable < waiting_packet_length pause(pause_step); pause_cnt = pause_cnt+pause_step; if pause_cnt>pause_timeout answ = 0; break end end if(answ) % читаем данные answer_buff = fread(u_cmd,waiting_packet_length,'uint32'); reg_data = answer_buff(4); res = 1; else % обрабатываем отсутствие ответа reg_data = 0; res = 0; end %res и reg_data я дальше вывожу в вызывающую функцию Я так читаю управляющие регистры, но с потоками данных и файлами, все примерно также
  23. Предложу другой вариант. Положите обе ваши таблицы в одну ROM по очереди, и в читающем устройстве меняйте базовый адрес для чтения.
  24. Если у вас 4 пакета приходят сразу, то лучше дождаться их всех. В udp объекте есть поле byteAvailable для этого. А потом все данные считать одним fread.
  25. Спасибо, что поправили. Какие-то у меня в голове странные ассоциации сложились по поводу "на месте" и "O(1) потребления памяти".
×
×
  • Создать...