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

    

cerg19

Свой
  • Публикаций

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

  • Посещение

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


  1. Всем доброго время суток. Встала такая задача реализовать на цифровом приёмнике фильтр с частотой дискритизации сигнала на выходе 480кГц, полосой пропускания 7кГц, неравномерность в полосе пропускания 3дБ, неравномерность в полосе заграждения 50дБ и коэффициентом прямоугольности фильтра 1,3. Я выбрал AD6652 и попытался смоделировать необходимый фильтр в программе Filter Design, которую скачал с сайта analog devices для данного цифрового приёмника. Задав необходимые параметры фильтра программа выдаёт переменные для цифрового приёмника и полученную АЧХ. Но встала проблема. Полученная АЧХ никак не удовлетворяет заданной. Методом научного тыка и подгона параметров фильтра задаваемые в программе удаётся влезть по некоторым параметрам АЧХ, но не во все, а именно в полосу пропускания. Прошу совета если кто с этим сталкивался. Неужто фильтр проектируется методом подгона или есть другой способ, и что значит галочка в программе LHB Enabled. Заранее всем спасибо. P.S. Спрашиваю здесь первый раз, точно не знаю в какой раздел, написал сюда.
  2. Необходимо оперировать пакетами. 1. Пишите полноценный pcs для RX. он полностью будет работать на восстановленном клоке. потом переводите пакеты на свою частоту через FIFO. 2. Пишите полноценный pcs для TX. он будет работать на опорном клоке. 3. Пакеты передвайте на TX pcs через FIFO. если надо, вставляйте IDLE.
  3. Всем доброго времени суток. В данный момент разбираюсь с AD9957 и у меня возник вопрос. Как показано на рисунке в QDUC режиме AD9957 имеет 18 битные IQ компоненты, но внутренний АЦП 14 битный. [attachment=76062:Screenshot___01.04.jpg] Что происходит с младшими разрядами компонент, они отсекаются?
  4. Собственно вот какие я выводы сделал. Я не знаю как точно там сделано в вивадо, но при работе с большими проетами(заполненность плис больше 70%) и при довольно больших частотах(больше 200МГц) с разводкой всё плохо. Похоже при процессе рутинга естественно некоторые констрейны не совпадают и вивадо начинает пытаться их исправить переставляя местами регистры и луты, как я понял перестановке подвергаются и те регистры с которыми всё было ок. И вот она исправляет тайминг одного сигнала, но при этом часто портит другого, и всё повторяется. На какомто этапе она всёже останавляивается и иногда с таймингами на некоторых сигналах. Выход из положения это использование OOC. Суть в том что вы компилите и разводите большие и критически важные блоки отдельно. при этом вивадо пытается срутить только его и ей это удаётся(если нет, то переписывай код). Полученный dcp файл потом используется как black box в большом проекте. Этот файл содержит ваш модуль без таймингов и при компиляции большого проекта он не будет его рутить я просто возьмёт из dcp файла, где описано какие элементы и какие луты куда класть. BINGO!
  5. Всем привет. Возникла такая проблема. На virtex7 реализован жирный мультиплексор 16 высокоскоростных потоков в один. Идея в том, что по 16 каналам валяться 64 битные слова с частотой 312МГц. Валяться они пакетами и скважность этих пакетов плавает со временем. Выходной поток имеет такую же пропускную способность(64 бит слова, 312МГц). Чтобы не потерять данные, пока в выходной поток пишем данные с одного канала, данные с других каналов пишутся в fifo. Каждый канал имеет своё собственное fifo размерностью 16384x64. Реализован алгоритм постепенного чтения из каждого фифо в определённой очереди, чтобы ни одно фифо не успело переполниться. Фифо получились большие и места этот мультиплексор занимает очень много. В итоге всё работает и ничего не теряется, но возникла проблема. Компиляция производится при помощи vivado 2014 и из раза в раз получается разный результат по таймингам. То их нет, то получаются большие тайминги(до 0.5нс). Причём мультиплексор давно написан и никаких изменений в нём не делается. Ему отведён отдельный регион на кристале где ему разводится и другой логики от других модулей там нет. Из сборки к сборке он не меняется. Я бы понял если бы тайминги были всегда, но компилятору всёже периодически удаётся его нормально развести. Может кто-нибудь посоветует как с этим бороться. Можно ли зафиксировать как-то результат разводки мультиплексора, или сказать компилятору разводить его пока не будет ошибок по таймингам?
  6. Ну все сигналы тактируются от одного клока, на который есть констрейн. По моей логише это должно автоматически накладывать констрейн на распространение сигналов между регистрами, тактируемые этим клоком. Но вивадо почемуто на них забивает. Частично помогает явное указане set_max_delay в констрейнах на интересуемый сигнал, который собирается с таймингами. Так же немного улучшило ситуацию директива NoTimingRelaxation для route. Ситуация улучшилась, но всёже иногда тайминги вылезают. Неужто на все сигналы мультиплексора необходимо явно указывать set_max_delay?
  7. FIFO и до этого были приколочены, обложил констрейнами 2/3 всех сигналов в мультиплексоре и он стал почти всегда собираться без таймингов. ЦитатаПосле удачной разводки выгрузите размещение компонент вашего мультиплексора в файл констрейнтов (xdc) и затем используйте этот файл при дальнейших сборках вашего проекта. Подскажите пожалуйста как это сделать в vivado?
  8. Цитата(Vascom @ Oct 8 2015, 22:41) Попробуй Vivado 2015.3, текущий. У старых версий Vivado вообще куча проблем существует. нет возможности, только 2014.4
  9. MSA SFP

    Добрый день. В проекте использую универсадьные SFP модули от фирмы flexoptix. Модули подключены к FPGA и их настройку произвожу сам. Эти SFP модули могут работать на скорости 0.1-2.67Gbit/s. Как я понял из документации, перед началом работы модуля необходимо выставить скорость работы модуля, а именно записать значения в регистры 4-10 по MSA. При включении прибора я пытаюсь записать необходимые значения по i2c интерфейсу и сразу же их считываю. В итоге значения регистров не соответсвуе тому, что пытаюсь записать. Он вообще не меняется. Так же возник вопрос с Option(64-65) регистрами. Необходимо ли в них записывать какие настройки, или эти регистры отражают состояния, задаваемые внешними ножками SFP(TX_disable, Rate_Select). Прошу совета по поводу записи в регистры и Option регистров. Смотрел времянку записи и чтения, всё по документации. Может есть какие особенности?
  10. VC-2 в STM-16

    Всем привет. Я написал для FPGA модуль, который принимает STM16 поток, парсит его и вытаскивает содержащиеся в нём VC-2. Реального потока у меня пока нет, так что хотел пока это всё промоделировать в modelsim. Может кто знает где можно взять реальный дамп STM16 потока с VC2 в нём?
  11. FPGA разработчик

    Отписался в личку
  12. Всем спасибо за развёрнутые ответы, всё понятно.
  13. Здравствуйте. Сталкнулся с конструкцией написанной на SystemVerilog. A = B[5-:4]; Скажите пожалуйста, какие биты вектора В передаются в вектор А?
  14. вот видео для ZC702, там подробно рассказывают как первый проект сделать: https://www.youtube.com/watch?v=u0bW6lQvsVI
  15. с читабельным форматированием это значит примерно вот так: CODELIBRARY IEEE; USE IEEE.std_logic_1164.all; LIBRARY IEEE; USE IEEE.std_logic_unsigned.all; use IEEE.STD_LOGIC_ARITH.ALL; ENTITY SinTR IS GENERIC( koef : INTEGER := 2 --:= 3 --:= 1 ); PORT ( TAKT : in std_logic; strob : in std_logic; sdvig : in std_logic; data_serial : in std_logic; Clr : in std_logic; fout : out std_logic; Dfm : out std_logic; fmod_out : out std_logic_vector (4 downto 0) ); END SinTR; ARCHITECTURE beh OF SinTR IS signal fm1 : std_logic_vector (4 downto 0) := ( others => '0' ); signal ff256 : std_logic_vector (3 downto 0); signal freq2_5_1, f2_5, freq15, f15, f50k, freq50k, fm256, fm :std_logic := '0'; signal rs_s1, rs_s : std_logic_vector (41 downto 0):= (others => '0'); BEGIN -- -- << TAKT >> == 15 MHz --сначала делаем меандр до частоты 2,5 MHz, из него формируем уже частоту f50k (50 kHz) frequency2_5MHz: process (TAKT) variable f1: integer range 0 to koef :=0; begin if Clr = '1' then f1 := 0; freq2_5_1<='0'; ELSIF true THEN IF rising_edge(TAKT) THEN IF f1 = 0 THEN f1:=koef; freq2_5_1<='1'; ELSIF true THEN f1:=f1-1; freq2_5_1<='0'; END IF; END IF; END IF; END PROCESS; freq2_5MHz: process (TAKT) begin if clr='1' then f2_5<='0'; elsif true then if rising_edge (TAKT) then if freq2_5_1='1' then if f2_5='0' then f2_5<='1'; elsif true then f2_5<='0'; end if; end if; end if; end if; end process; -- делаем частоту f50k frequency50kHz: process (f2_5) variable f50k: integer range 0 to 25:=0; begin if Clr = '1' then f50k := 0; freq50k<='0'; ELSIF true THEN IF rising_edge(f2_5) THEN IF f50k = 0 THEN f50k:=25; freq50k<='1'; ELSIF true THEN f50k:=f50k-1; freq50k<='0'; END IF; END IF; END IF; END PROCESS; freq50kHz: process (f2_5) begin if clr='1' then f50k<='0'; elsif true then if rising_edge (f2_5) then if freq50k='1' then if f50k='0' then f50k<='1'; elsif true then f50k<='0'; end if; end if; end if; end if; end process; Fout <= f50k;-- сигнал подаем на выходной порт frequency1Hz: process (f50k, fm1) -- формируем частоту по тому же принципу, что и f50k, но добавляем case видимо как-то неправильно(( variable f15: integer range 0 to 641:=0; variable f15_1: integer range 0 to 641:=0; begin if Clr = '1' then f15_1:=0; f15:=0; freq15<='0'; ELSIF true THEN if rising_edge(f50k) THEN if f15_1 = 0 then case fm1 is when "00000" => f15_1 := 16; when "00010" => f15_1 := 119; when "00011" => f15_1 := 104; when "00100" => f15_1 := 92; when "00101" => f15_1 := 83; when "00110" => f15_1 := 75; when "10110" => f15_1 := 64; when "00111" => f15_1 := 641; when others => null; end case; end if; if f15=0 then f15 := f15_1; freq15<='1'; else f15:=f15-1; freq15<='0'; end if; end if; end if; END PROCESS; freq15Hz: process (f50k) --меандр begin if clr='1' then f15<='0'; elsif true then if rising_edge (f50k) then if freq15='1' then if f15='0' then f15<='1'; elsif true then f15<='0'; end if; end if; end if; end if; end process; fm <= f15; --перезаписываем сигнал Dfm <= fm; --на выходной порт -----------дальше для загрузки fm1 mr1_1 : PROCESS ( strob ) BEGIN IF rising_edge(strob) THEN fm1<=rs_s1( 4 downto 0 ); END IF; END PROCESS; fmod_out<=fm1; msdvig : PROCESS ( sdvig ) BEGIN IF rising_edge(sdvig) THEN rs_s(41 downto 1)<=rs_s(40 downto 0); rs_s(0)<=data_serial; end if; end process; process (takt,clr,rs_s1) begin if clr = '1' then rs_s1 <=( others => '0' ); elsif (takt'event and takt = '1') then rs_s1(41 downto 0) <= rs_s(41 downto 0); end if; end process; END beh; не ленитесь делать код читаемым. Что касается самой проблемы, то возможно её решение в процессе mr1_1 КодBEGIN     IF rising_edge(strob) THEN         fm1<=rs_s1( 4 downto 0 );     END IF; END PROCESS; fm1 загружается не синхронно относительно тактовой частоты f50k. Попробуйте так: Код    mr1_1 : PROCESS (f50k)     BEGIN         IF rising_edge(f50k) THEN             if strob = '1' then                 fm1<=rs_s1( 4 downto 0 );             end if;         END IF;     END PROCESS; при этом сигнал strob импульсный длительностью в 1 такт клока f50k
  16. Если честно не совсем понял где сигнал fm управляется в коде. Ннадо бы привести весь код программы(с читаемым форматированием). Похоже что код написан так, что в некоторый момент выполняется условие перевода выхода fs в значение 1 и 0 одновременно.
  17. Вижу вам много чего дельного насоветовали, внесу и свои 5 копеек. Как я понял платы сделаны самостоятельно. Я бы проверил каждую плату по отдельности. В приёмопередатчиках есть генераторы и анализаторы псевдослучайных последовательностей с внутренними петлями на разных уровнях. Попробуйте их и посмотрите всё ли работает с внутренними петлями. Только не сдавайтесь, эти GTP тот ещё квест)
  18. Всем доброго времени суток. Мне в проекте для Spartan6 необходима внутренней частота 24,576МГц. При этом у меня есть два внешних источника тактового сигнала 40МГц и 125МГц. Я пытаюсь сгенерировать ClockWizard ядро для получения нужной частоты. При подстановки 40МГц в качестве источника тактового сигнала для ядра оно выдаёт, что может сформировать только частоту 24,571МГц а не 24,576МГц. При подстановки 125МГц ядро выдаёт 24,573МГц. Подскажите пожалуйста, может есть метод получения заданной частоты из исходных?
  19. Цитата..если джитер не волнует, а на сколько он будет плохим? Мне эту частоту необходимо использовать для тактирования внутри ПЛИС
  20. ЦитатаСделал "по книге" а что за книга, если не секрет. А искажения происходят только в словах Comma или в любом слове передаваемого потока? Используется ли clock correction?
  21. Доброго времени суток. Встала задача написания кода FPGA для записи и чтения данных в NAND flash MT29F128G08CFAAAWP-IT фирмы Micron. Подскажите пожалуйста, может уже есть где готовый модуль для этих целей? Хотелось бы поглядеть на реализацию и переделать со своими особенностями. Заранее благодарен за ответы.
  22. Lmx2315, спасибо вам за помощь. Цитата..редкий экземпляр, его упоминаю обычно раз в году - на первое апреля, как впрочем и выдачу 14 битным цапом, 28 битного сигнала по частям. юмор не оценил((
  23. ЦитатаТо остаётся печальный вывод - что модуляционный поток между плис и dds каким -то боком наводится на выходные цепи dds Вы имете ввиду, что наводка происходит внутри ПЛИС или между ПЛИС и AD9957? Цитата..хотя я всё никак не пойму - как это у вас 4-ре идеальных функции sin(kx) сложились в матлабе в эдакое уродство. Спектр у меня должен быть не симметричным(как показано на картинке выше). Реализация представлена также на рисунке выше. Вы посоветовали мне книгу Бетругера Лугнера , "Постцифровая фильтрация составных сигналов." Гугл молчит о такой, а в закрома у меня доступа нет. Вы может посоветуйте где мне её можно достать. Хочется её почитать.
  24. Да, проверил. Построил в матлабе спектр идеального и вытащенного из modelsim сигнала [attachment=76148:Screensh..._02.04_4.jpg] крсаный-реальный синий-идеальный Некоторое расхождение в спектрах думаю из за применения коррекции Тейлора внутренних DDS. По графикам думаю можно сделать выводы о том, что DDS в спурах не виноват. А вы ка считаете?
  25. померил для 65536 точек(раньше было 8192) и отношение сигнал\шум трёх палок справа почти не изменилось [attachment=76146:Screensh..._02.04_1.jpg] Может ли это говорить что именно сигнал с DDS даёт мне такие спуры?