Jump to content

    

des00

Модераторы
  • Content Count

    8653
  • Joined

Everything posted by des00


  1. Ндя, в песочнице кубики перекладывать неа, я как на хилых сел, так и потерялся) микрочип начал печь или это чьето наследие?
  2. В свое время, нужно мне было забить артикс 200ку (кто знает, он внутри устроен как буква Н) на 98% по логике, 100% дсп и 50% памяти, на частотах 100/200МГц. Сколько не крутил эти регионы, ничего не помогало. Результат был от немогу развести, до задержек раза в 3-4 больше чем сборка в лоб)
  3. Ну я про это и говорил сразу +-1 слово выходного интерейса, девиация задержки. Вот и наблюдает ТС эту девиацию, затем умножает на ширину слова и получает те самые свои "коллосальные" задержки. но вот дальше продолжаем вашу же мысль, эта неопределенность даст вам комбинации сдвига фазы восстановленных клоков низкой частоты -1/0, 0/0, 0/-1. Что при оценке, относительно одной опорной частоты может дать вам +-1 слово интерфейса. Все зависит от фазировки этой опорной частоты относительно восстановленных клоков. Один попал до фронта, второй после фронта. Об этом я сразу и написал. А если вы один из восстановленных клоков используете в качестве измерительного, то там тем более будет девиация +-1 символ который у вас N бит. Но итоговая то будет недетерменированная. Понятно, у нас с вами разные подходы к термину "детерминированная задержка", точнее разные системы интерпретации этой задержки.
  4. вот тут у меня диссонанс. Вы же сами пишете про разную фазу восстановленной низкой частоты, но при этом пишете про детерминированную задержку. Я же верно прочитал: у вас фаза восстановленной частоты плавает от 0 до 360 градусов, но при этом задержка фиксированна? Тогда относительно чего и в чем вы ее измеряете? Измерение проводится в тактах восстановленной частоты? Мысленный экспиремент: если взять не плавающую опорную, синхронную по частоте относительно восстановленной. Затактировать ей логику плис, что принимает данные с GTX. Вывести эту опорную частоту синхронно с восстановленной, при сдвиге ее фазы в 0, тогда при сдвиге фазы в 360 градусов, данные, относительно опорной частоты лягут на +1 такт, т.е. появится задержка, зависящая от фазы восстановленного RX клока на низкой частоте и временных параметров триггеров при перекладке из сдвигового регистра GTX в регистр логики.
  5. ЕМНП там пропускается одна фаза счета: не добавляется следующий бит в сдвиговый регистр и нет инкрементирования счетчика выходного слова. Может мы про разные GTX/GTH говорим или я готовить не умею, но на 7-Series у меня разбегались потоки. даже те которые шли с одной плисы, с двух GTX на два GTX другой плисы. В итоге я поставил небольшое FIFO + метки времени и все выравнивалось автоматически. ЗЫ. Еще вспомнил проект на Ария 5. Делал заворот на двух плисах, хотел задержку оптического кабеля измерить, в символах. В GTX все по минимуму, все синхронно, ничего лишнего на завороте. В итоге +-1 символ относительно среднего, от включения к включению. Даже если просто оптику перетыкать, не выключая плис.
  6. да, но вы же работаете снаружи корки не с битовым потоком, а со словным. И интерфейс у вас на широком слове. И вот эта разбержка на бит может перейти в разбежку на символ. Т.к. сам символ у вас соберется позже/раньше. Попробую на пальцах. Есть битовый поток, положим слово у нас 6 бит. Слово мы кладем с нулевого бита на стороне передатчика. Отравили Т Е В И Р П. В каналы пришло х х Т Е В И Р П х х х - положим удачно попали что буква Т - пришлась на нулевой бит сдвигового регистра, х х х Т Е В И Р П х х х х - а вот здесь вам нужно додвинуть поток бит влево на 1 битовый интервал. ЕМНП штатно для этого нужно будет сделать 5 сдвигов вправо. И в итоге слово соберет свои 6 бит на один выходной символ позже. Ну оке, решили выровнять регистром на широком слове, поставили, но при другом включении порядок прихода бит может поменяться). ЕМНП это влияние CDR + эквалайзера. И в итоге снова мимо. Если бы работали на уровне битов, проблем было бы меньше, но не тянет плиса.
  7. да легко. он выравнивается в разные стороны. один в минус символ, второй в плюс символ. ЕМНП там выравнивание идет за счет отбрасывания бита bitslib. два потока могут встать как -1/0 так и 0/-1 (где 0 это точная фаза бита потока), это следствие работы CDR, если выравнивать их дропами, то они как раз и разбегаются на символ. ЕМНП там же две CDRки сделанные по приницпу DLL, поэтому, не смотря на то что частота будет одинаковая фаза семплирования может будет разная.
  8. если уникальный 146% и будет уникальный до окончания чтения памяти, то, как написал @RobFPGA AND-OR мультиплексор, Если не уникальный то либо простой приоритетный арбитраж, как предложил @Flip-fl0p или RRA арбитр. Вот псевдокод ядра RRA typedef logic [pN-1 : 0] request_t; typedef logic [pN_LOG2-1 : 0] winner_t; logic request ; winner_t last_winner ; winner_t winner ; assign request = (ireq != 0); assign winner = get_winner(ireq, last_winner); always_ff @(posedge iclk) begin if (request) begin last_winner <= winner; grant <= '0; grant[winner] <= request; end end function automatic winner_t get_winner (input request_t request, input winner_t last_winner); get_winner = last_winner; // for (int i = 0; i < pN; i++) begin get_winner = get_winner + 1'b1; if (get_winner == pN) begin get_winner = 0; end if (request [get_winner]) begin return get_winner; end end endfunction ну а дальше уже, зная того кто победил, интегрируете это в ваш FSM по чтению
  9. и все равно ИМХО разбежитесь на выраванивании в десериализаторе. там +-1 бит, потом будет словный выравниватель и пошло поехало. Причем недетерминированно. Когда мне нужно было синхронизировать 12 каналов, я ставил метку времени и внешней логикой привязывал каналы к восстановленной метке.
  10. синус не совсем хорошо для тестирования фильтров. Если можно записать ваш сигнал, то захватить его в файл и потом, в офлайне, попробовать разные фильтр в любом ПО, которым владете. В том же питоне например, с либами а-ля матлаб. Данный скил в любом случае пригодиться)
  11. Сколько не баловался, ничего путного не выходило. Компенсация времени сборки, съедалась неудачной сборкой когда надо было грохать всю базу. Из всего полезного была только smart compilation, когда добавляешь signal tap probes.
  12. ничоси https://www.intel.com/content/www/us/en/programmable/documentation/vgo1439451000304.html 2.5. Force-to-Zero The Force-to-Zero feature helps improve timing when a RAM memory block selected is larger than a single memory block. This feature is applicable only for M20K blocks. For example, if the selected RAM memory block has a memory depth of 4096, the M20K block, which supports only a maximum memory depth of 2048, will require two RAMs to be multiplexed together. When you engage with this feature, you can replace OR gate with multiplexing circuitry at the output of the M20K block when performing address width stitching. As the MSB of address controls the read enable signal in the Force-to-Zero mode, the outputs of other memory blocks are forced to zero when the read enable signal is deasserted. This results the data output being read out from the output of the selected memory block only. You have the option to turn on Enable Force-to-Zero feature in the parameter editors of the RAM/ROM IPs. Note: When you turn on Enable Force-to-Zero feature, the read enable signal does not retain previous values when you deassert the signal. похоже дело во встроенной ECC. Figure 7. ECC Block Diagram for M20K Memory Судя по схеме нет ее обхода и она всегда работает. Отсюда и ноги растут. Ну и 2.12. Intel Stratix 10 Embedded Memory Configurations четко написано 2048х8(10) самая разрядная схема. Про DSP ячейки: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/stratix-10/ug-s10-dsp.pdf 3.1.2. Multiplier Adder Sum Mode и 3.1.3. Independent Complex Multiplier, прямо указано что должно все четко ложиться, с 4 слоями регистров в DSP блок. Так что надо смотреть, либо действительно глюк квартуса, либо что-то по управлению регистрами/DSP ячейками не так описано. Например 3.1.2, показано что управление add/sub должно тоже проходить через все слои регистров) Ну еще, как вариант (с хилыми мне помогло), набить четкую разрядность операнда как у IP блока
  13. ReadEnable/WriteEnable задействованы. Работают как clock_enable. Вам не нравиться что именно сам порт inclkockena не задействован? А есть разница? Не большой мукс, а несколько декодеров. Вы же пишете. Для 16 блоков памяти это будет 16 LUT5, использовать триггер по выбору.
  14. нету квартуса под рукой. так бы проверил. ИМХО что-то тут не то, думаю давно бы уже заметили кривость квартуса и откатили бы его.
  15. Что-то тут не то. Комплексные умножители у меня в лет синтезтировались из RTL описания. Правда на квартусах до 15го))
  16. Вы же помните, что у альтеры, архитектура дсп ячейки, в варианте комплексный умножитель отличается от xilinx? Там сумматор сразу на выходе умножителя, без регистра. Поэтому RTL описание, относительно xilinx, нужно менять.
  17. а если обычный фир, с целочисленными коэффициентами поставить и посмотреть? Может округление где накапливается? Ну и я все же за тест в матлабе)
  18. а может быть не в фильтре дело, а в данных массива есть разрыв? По коду вроде все четко, как вариант взять матлаб, сделать этот фильтр и подсунуть ему данные, посмотреть будет ли вести себя аналогично
  19. Тогда вам нужно корретно задавать вопросы. Опишите нормально что у вас происходит и что не работает. Телепатов на форуме, за 20 лет я не припомню)
  20. третья ссылка гугла https://marsohod.org/plata-marsokhod3/proekty-dlya-platy-marsokhod3/310-max10-adc
  21. эмм, убрать из списка sdc файлов проекта?
  22. блин точно, там же деление через умножение) вспомнил)
  23. с этой нет, я кордик сам делал, там работы минут на 15-20. Точность зависит от количества шагов. Вот например для кордика с разрядностью углов 16 бит и коэффициента масштабирования 8 бит в формате u1.7, до 16 шагов localparam int cANGLE_W = 16 ; // script defined typedef logic signed [cANGLE_W-1 : 0] angle_t; localparam angle_t cALPHA_DEG [0 : 15] = '{ 8192, 4836, 2555, 1297, 651, 326, 163, 81, 41, 20, 10, 5, 3, 1, 1, 0}; localparam int cK_W = 8 ; // script defined localparam logic [cK_W-1 : 0] cK [0 : 15] = '{ 181, 162, 157, 156, 156, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155 }; # angle in degrees '{45, 26.5649, 14.035, 7.12463, 3.57605, 1.79077, 0.895386, 0.444946, 0.22522, 0.109863, 0.0549316, 0.0274658, 0.0164795, 0.00549316, 0.00549316, 0} # k '{1.41406, 1.26563, 1.22656, 1.21875, 1.21875, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094, 1.21094} Вот только сейчас, подняв старый проект, обратил внимание на цифры. 1.6, хмм, странная константа, откуда она у них взялась то. ЗЫ. Ну и как видно, количество шагов ограничено разрядностью угла. Если у вас углы 8 бит, то и делать больше чем 8 шагов не имеет смысла. ЗЗЫ. Про углы, есть еще особенность масштабирования и интерпретации. У меня скрипт мог делать кордик где 360 градусов это 2^N, а мог, где градусы задаются в нативном формате, например s8.8 (+-180 градусов). Там отображение нативное. Как работает корка от альтеры незнаю.
  24. не с точностью, а сходится к числу, при устремлении количества итераций в бесконечность. Число зависит от количества шагов, ЕМНП, после 8го шага, оно константа, для типового альтеровского 18 битного умножителя. Про формат не знаю, но скорей всего, что-то типа fixed point u1.16 или u1.17 и умножитель знаковый или беззнаковый стоит