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

rloc

Модератор
  • Постов

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

  • Победитель дней

    12

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


  1. В терминах мы не расходимся. (15 downto 0)*(15 downto 0)=(31 downto 0), но никак не (30 downto 0). Берем старшие 16 разрядов и получаем (31 downto 16).
  2. Я предполагал умножение 16*18, прошу прощения если не правильно понял вопроса. Если нужно 16*16 (знаковое расширение старших бит до 18*18), то берутся разряды с 36-4-16 по 36-4-1.
  3. Чуть выше шла речь, как перемножить 16*18, имея 18*18 умножитель, т.е. разница этих двух разрядностей составляет 2, у Вас - (3+3)-5=1. Пример некорректный. Подразумевалось, что 16*18 -> [33:0] и два старших разряда 34, 35 будут равны 33 разряду, и их можно откинуть. Либо 16*18 -> [35:2], тогда два младших разряда 0,1 равны 0 и их тоже можно откинуть.
  4. Из умножителя 18x18 можно сделать умножитель любой разрядности, хоть 2*3 (в меньшую сторону по разрядности конечно), и как Вы думаете значимыми будут 36 бит? Как ни старайтесь, но разрядность на выходе не получите больше, чем Nвход+Nкоэфф (значимую). Может не стоит FIR на FPGA городить, раз такие сложности?
  5. Какую-то ерунду Вы пишите. 1*(-1) = -1 два старших разряда = 1 1*1 = 1 два старших разряда = 0
  6. Если данные 16 бит, и на выходе Вы хотите получить 18 бит, то можно поступить двумя путями: 1) дополнить 16 бит недостающими 2 разрядами, т.е. D(17)=D(16)=D(15), где D(15) - это старший бит (MSB) данных, а после перемножения взять биты с 36-18-2 по 36-2-1 2) сдвинуть 16 бит на 2 в сторону старших бит, а младшие 2 бита обнулить, после перемножения взять биты с 36-18 по 36-1, т.е. старшие 18 бит. В самом простом случае нужно к вашему числу добавить +0.5 и отсечь лишние биты (и для положительных и для отрицательных чисел). Поясняю на примере: если нужно получить 18 бит, то сначала берете на один младший бит больше, т.е. 19 бит, добавляете 1 и отсекаете этот младший бит. Делать это надо на выходе фильтра, используя, скажем, дополнительный сумматор. Сам аккумулятор нужно постараться сделать с достаточно большой разрядностью, чтобы можно было не округлять, подаваемые на него данные.
  7. Если необходим переменный scale, то нужно сдвигать или мультиплексировать (как кому удобнее). Если scale фиксированный, то проще взять с аккумулятора нужные разряды, а какие именно сейчас попробую объяснить. Допустим Вы домножали свои коэффициенты на 2^N, и после такого домножения получилось, что коэффициенты вписались в 16-разрядную сетку. Предположим, что входные данные - 18 бит, выходные - 20 бит (я специально взял разное количество разрядов). Тогда после умножителя необходимо брать 18+16 разрядов и подавать на аккумулятор разрядностью 18+16+log2(64)=18+16+6=40 (нужную разрядность получаем дополнением). С выхода этого аккумулятора необходимо снимать разряды с 16+(N-16)-(20-18) по 16+(N-16)+18-1. Если быть более точным, то дополнительная разрядность аккумулятора должна быть не log2(64), а N-16 (не стоит забывать, что я предполагал коэффициент усиления фильтра, полученный в Матлабе или какой-либо другой программе, равным 1). Напоследок напоминаю, что данные необходимо округлять, а не отсекать.
  8. Ну если Вы только определяетесь с разрядностью аккумулятора, то разрядность коэффициентов желательно брать не меньше разрядности данных. В лучшем случае аккумулятор нужно брать разрядностью не менее Nданные+Nкоэфф+log2(Ntaps), Ntaps - порядок фильтра (соответственно с умножителя брать Nданные+Nкоэфф разрядов). После каждого суммирования ничего округлять или отсекать не надо. Если хотите немного сократить разрядность аккумулятора, то можно с умножителя брать немного меньше разрядов, например в самом худшем случае Nвыход+log2(Ntaps) разрядов.
  9. Очень давно делали эти ядра и с тех пор ничего не меняли. Так что на чем проверяли, на то и осталась совместимость, для всего остального - на свой страх и риск.
  10. Как правило все FIR'ры в FPGA работают с целочисленной арифметикой, так что домножать Вам все равно придется. Для получения максимального динамического диапазона, нужно умножить на такую константу, чтобы максимальный по модулю коэффициент точно вписался в разрядную сетку. При расчете в Матлабе, общий коэффициент усиления фильтра получается равным 1, поэтому если Вы хотите сохранить этот коэффициент, нужно после фильтра поделить данные на ту же константу (операция называется scale). Проще всего, как Вы правильно заметили, это можно сделать если домножать и делить на 2^N.
  11. В CORE Generator выберете сверху в меню Show->All Versions incl. Obsolete Далее: Digital Signal Processing->Filters или Modulation
  12. Просто выводов не хватило для четвертого 16-битного канала. Переходите на GC5016, там вроде таких проблем нет.
  13. Не могу точно утверждать, попробую объяснить как я это понимаю. Обратимся к структуре GC4016 (привожу только левую половинку): SHIFT - этот параметр для целочисленных входных данных нужен в очень редких случаях, он остался от блока, который из данных с плавающей точкой делал целочисленные данные (12 бит мантисса + 3 бит экспонента -> 20 бит целое число). Его назначение - когда при очень большом коэффициенте децимации наступает переполнение разрядной сетки, с помощью SHIFT можно немного уменьшить входную 20 битную разрядность, слегка пожертвовав динамическим диапазоном, для остального большинства случаев TI рекомендует брать MUX20B=1 и SHIFT=4. Этот параметр работает до того как данные подаются на CIC-фильтр. SCALE+6*BIG_SCALE - эти два параметра в основном определяют масштаб. На мой взгляд TI допустила небольшую ошибку - они сделали масштабирование до фильтра, в результате им приходиться выполнять эту операцию с тактовой частотой. Если посчитать суммарный диапазон изменения масштаба, то он будет равен 5+6*7=47 бит. Сделать такой огромный сдвиг с помощью одного мультиплексора им оказалось очень сложно, поэтому они решили разбить его на два последовательных.
  14. Дециматор конечно внутри самого FIR'a находится, сам принцип его таков, что порядок помимо тактовой частоты зависит еще от отношения входной и выходной частоты. Иначе порядок определялся бы отношением тактовой и входной/выходной частот. Вот для полосы 200Гц смысл в CIC есть и самый прямой. Суммарный порядок получается очень большой (может быть несколько тысяч) и по объему выгоднее поставить один CIC, чем несколько каскадно соединенных FIR'ов. Надо точно подсчитать какой коэффициент децимации для него выбрать и сколько стадий взять (по опыту должно немного получиться). К какой литературе обратиться сейчас к сожалению не могу сказать, не помню.
  15. Позвольте поинтересоваться, а какой длительности сигнал нужно сворачивать? Может со сжатием в частотной области поспешили? Точно знаю, что фирма Intel в своих библиотеках MKL перед сверткой определяет длительность и в зависимости от этого уже сворачивает. Исходные данные даны не полностью, а задачку уже решаете.
  16. Более высокая частота дискретизации в данном случае будет выгодна, только тогда, когда собственные шумы квантования АЦП в полосе Найквиста будут больше чем шумы предварительного усилителя в полосе ФАПЧ (200Гц). Тогда за счет сужения полосы мы повысим динамику за счет уменьшения шумов квантования АЦП (получится практически аналог Сигма-Дельта АЦП). Говоря про векторный анализатор цепей, я намекал на то, чтобы от системы ФАПЧ с ее очень сложным расчетом устойчивости, перейти на схему, когда DDS постоянно свипирует в некотором диапазоне частот, а после АЦП векторно детектируется (делится на квадратуры) и анализируется. Причем диапазон свипирования выбирается в зависимости от того, что мы делаем: либо осуществляем поиск, либо следим за резонансом.
  17. Причина простая, в интерсиловских микросхемах, как и в большинстве других, на первых стадиях децимации используется CIC фильтр, причем всего с тремя ступенями (3-я степень). При малых коэффициентах децимации получаются очень узкие полосы режекции алисных полос, и соответственно не удается получить хорошее внеполосное подавление. В GC4016 ситуация немного лучше - CIC фильтр с 5 стадиями, в нем могли бы сделать чуть меньше минимальный коэффициент децимации. У них ограничения в первую очередь из-за внутренней структуры - на двух последних ступенях используются 2 FIR фильтра с фиксированным коэффициентом децимации 2 (как известно, при таком коэффициенте очень сильно упрощается FIR фильтр и уменьшается размер, для GC4016 это особенно актуально для его 4 DDC).
  18. Есть вопросы: 1) 30КГц - 1Мгц - это абсолютные частоты или отстройка от некоторой несущей? 2) Если это абсолютные частоты, то зачем частоту дискретизации брать 50МГц? Я смотрю, Вы в другой ветке уже вовсю пытаетесь решить непростую задачу - сделать DDC на FPGA. Хочется попытаться понять, к чему такие сложности. Там в DDC Вы пытались сделать полосу 2МГц, но зачем, когда сами пишите, что диапазон изменения резонанса - 50-100Гц, т.е. для ФАПЧ Вам нужна полоса ~200Гц. Ваша задача очень напоминает измерительный прибор под названием Vector Network Analyzer, поищите в интернете по этим ключевым словам и найдете очень много полезной информации. Советую начать искать с www.agilent.com - они очень любят писать всякие фундаментальные статьи.
  19. У меня спартан 3, поколение Virtex для меня дороговато. так что особо ресурсами похвастаться немогу. А насчет того, нужна ли мне симметриная ИХ, скорее все равно, если только тут нет каких то скрытых камней. Ставьте два FIR'а последовательно, и то меньше будут чем этот CIC. CIC выгодно использовать, когда коэффициент децимации нужен большой и полоса узкая (не Ваш случай). Коэффициент децимации для CIC придется брать наверное 10 и количество стадий >5, но скорей всего вообще использовать нельзя (слишком большое внеполосное подавление и полоса широкая). Посмотрите по даташиту, сколько ресурсов на это уйдет. По поводу симметрии - в большинстве случаев используются симметричные фильтры и подводных камней не вижу.
  20. В первую очередь хочу принести извенения, два последних файлика, что я прикреплял encode_8b10b_xst.zip decode_8b10b_xst.zip - это всего лишь Behavioral (Simulation) модели. В RTL варианте они также построены на блочной памяти. На RocketIO конечно проще, да и скорости могут быть мультигигабитными. Но если делать на Spartan'е, то вариант только один - на внутренней логике. Разницы в качестве работы между двумя вариантами - никакой. Из даташита на 1Gb Ethernet PCS (физический уровень) написано: Famaly With TBI Using RocketIO Virtex-5 Supported Supported Virtex-4 Supported Supported Virtex-II Pro Supported Supported Virtex-II Supported Not supported Spartan-3 Supported Not supported Spartan-3E Supported Not supported Spartan-3A Supported Not supported Т.е. для семейств Virtex-II Pro, Virtex-4, Virtex-5 можно использовать оба варианта, для остальных - только один (TBI - Ten-Bit-Interface) со внешним сериалайзером-десериалайзером.
  21. В том ядре, что я давал, он лучше, сделан на блочной памяти: маленький и быстрый. Да и потом корегенератор Вам исходников не дает, ограничивая в совместимости и гибкости использования. Сравните с тем, что Вы взяли: encode_8b10b_xst.zip decode_8b10b_xst.zip Останется файл с расширением .7z (архиватор 7zip, к сожалению такое расширение не прикрепляется)
  22. Если что-то мерить, то цифра конечно лучше. Но за такие деньги - это невозможно, даже среди китайских/корейских вариантов. Нечто более скромное уже обсуждали здесь.
  23. Если фильтр нужен симметричный, то никакого CIC для такого порядка не надо, для Virtex-4 или -5 все решается "в лоб" - 2 блока памяти и 3 DSP48 + немного логики.
  24. Посмотрите, как Xilinx делает 1Gb Ethernet, можете кодер и декодер 8b/10b взять оттуда, или все остальное. Выудил из последнего IP1 для ISE v9.2i (расширение .rar потом удалить).
  25. Похоже Вы еще не до конца разобрались. Поток, который идет с декодирующей схемы (см. Figure 6 из xapp224) нужно подавать на 10-битный сдвиговый регистр. Причем в подавляющем большинстве случаев в этот регистр нужно будет задвигать по 1 биту за такт, и иногда либо пропускать, либо задвигать сразу 2 бита за такт (надеюсь, как это делать, объяснять не надо). Как только накапливается 10 бит, подаете на вход схемы декодера 8B/10B, и получаете на выходе 8 бит. Для того, чтобы все это корректно работало, на странице 7 в разделе "Lock Requirements" подробно расписано, как частота появления ошибочного бита связана с разностью частот приемника и передатчика. Плюс прилагается еще исходный код, чтобы можно было это проверить на практике. Люблю Xilinx, всегда очень грамотно и понятно расписывают свои приложения.
×
×
  • Создать...