Jump to content

    

cerg19

Свой
  • Content Count

    168
  • Joined

  • Last visited

Posts posted by cerg19


  1. Коллеги, добрый день.
    Может кто сталкивался с таким блоком в Arria10 как CMU PLL. Это PLL которая стоит внутри приемопередатчиков и я не понимаю зачем она там, если есть FPLL две штуки.
    Сразу скажу зачем я смотрю про неё, хочется иметь засинхронизированный к RX потоку Serial клок и передать его в качестве опоры на  TX интерфейс. 
    т.е. чтобы RX и TX работали на идентичных частотах с нулевым расхождением
     

  2. Необходимо оперировать пакетами.

    1. Пишите полноценный pcs для RX. он полностью будет работать на восстановленном клоке. потом переводите пакеты на свою частоту через FIFO.

    2. Пишите полноценный pcs для TX. он будет работать на опорном клоке.

    3. Пакеты передвайте на TX pcs через FIFO. если надо, вставляйте IDLE.

  3. Собственно вот какие я выводы сделал. Я не знаю как точно там сделано в вивадо, но при работе с большими проетами(заполненность плис больше 70%) и при довольно больших частотах(больше 200МГц) с разводкой всё плохо. Похоже при процессе рутинга естественно некоторые констрейны не совпадают и вивадо начинает пытаться их исправить переставляя местами регистры и луты, как я понял перестановке подвергаются и те регистры с которыми всё было ок. И вот она исправляет тайминг одного сигнала, но при этом часто портит другого, и всё повторяется. На какомто этапе она всёже останавляивается и иногда с таймингами на некоторых сигналах. Выход из положения это использование OOC. Суть в том что вы компилите и разводите большие и критически важные блоки отдельно. при этом вивадо пытается срутить только его и ей это удаётся(если нет, то переписывай код). Полученный dcp файл потом используется как black box в большом проекте. Этот файл содержит ваш модуль без таймингов и при компиляции большого проекта он не будет его рутить я просто возьмёт из dcp файла, где описано какие элементы и какие луты куда класть. BINGO!

  4. Ну все сигналы тактируются от одного клока, на который есть констрейн. По моей логише это должно автоматически накладывать констрейн на распространение сигналов между регистрами, тактируемые этим клоком. Но вивадо почемуто на них забивает. Частично помогает явное указане set_max_delay в констрейнах на интересуемый сигнал, который собирается с таймингами. Так же немного улучшило ситуацию директива NoTimingRelaxation для route. Ситуация улучшилась, но всёже иногда тайминги вылезают. Неужто на все сигналы мультиплексора необходимо явно указывать set_max_delay?

  5. FIFO и до этого были приколочены, обложил констрейнами 2/3 всех сигналов в мультиплексоре и он стал почти всегда собираться без таймингов.

    После удачной разводки выгрузите размещение компонент вашего мультиплексора в файл констрейнтов (xdc) и затем используйте этот файл при дальнейших сборках вашего проекта.

    Подскажите пожалуйста как это сделать в vivado?

  6. Всем привет.

    Возникла такая проблема. На virtex7 реализован жирный мультиплексор 16 высокоскоростных потоков в один. Идея в том, что по 16 каналам валяться 64 битные слова с частотой 312МГц. Валяться они пакетами и скважность этих пакетов плавает со временем. Выходной поток имеет такую же пропускную способность(64 бит слова, 312МГц). Чтобы не потерять данные, пока в выходной поток пишем данные с одного канала, данные с других каналов пишутся в fifo. Каждый канал имеет своё собственное fifo размерностью 16384x64. Реализован алгоритм постепенного чтения из каждого фифо в определённой очереди, чтобы ни одно фифо не успело переполниться. Фифо получились большие и места этот мультиплексор занимает очень много.

     

    В итоге всё работает и ничего не теряется, но возникла проблема.

    Компиляция производится при помощи vivado 2014 и из раза в раз получается разный результат по таймингам. То их нет, то получаются большие тайминги(до 0.5нс). Причём мультиплексор давно написан и никаких изменений в нём не делается. Ему отведён отдельный регион на кристале где ему разводится и другой логики от других модулей там нет. Из сборки к сборке он не меняется.

     

    Я бы понял если бы тайминги были всегда, но компилятору всёже периодически удаётся его нормально развести.

     

    Может кто-нибудь посоветует как с этим бороться. Можно ли зафиксировать как-то результат разводки мультиплексора, или сказать компилятору разводить его пока не будет ошибок по таймингам?

  7. Добрый день.

    В проекте использую универсадьные SFP модули от фирмы flexoptix. Модули подключены к FPGA и их настройку произвожу сам.

     

    Эти SFP модули могут работать на скорости 0.1-2.67Gbit/s. Как я понял из документации, перед началом работы модуля необходимо выставить скорость работы модуля, а именно записать значения в регистры 4-10 по MSA. При включении прибора я пытаюсь записать необходимые значения по i2c интерфейсу и сразу же их считываю. В итоге значения регистров не соответсвуе тому, что пытаюсь записать. Он вообще не меняется.

     

    Так же возник вопрос с Option(64-65) регистрами. Необходимо ли в них записывать какие настройки, или эти регистры отражают состояния, задаваемые внешними ножками SFP(TX_disable, Rate_Select).

     

    Прошу совета по поводу записи в регистры и Option регистров. Смотрел времянку записи и чтения, всё по документации. Может есть какие особенности?

  8. Всем привет.

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

  9. с читабельным форматированием это значит примерно вот так:

     

    LIBRARY 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

  10. Если честно не совсем понял где сигнал fm управляется в коде. Ннадо бы привести весь код программы(с читаемым форматированием).

     

    Похоже что код написан так, что в некоторый момент выполняется условие перевода выхода fs в значение 1 и 0 одновременно.

  11. Вижу вам много чего дельного насоветовали, внесу и свои 5 копеек.

     

    Как я понял платы сделаны самостоятельно. Я бы проверил каждую плату по отдельности. В приёмопередатчиках есть генераторы и анализаторы псевдослучайных последовательностей с внутренними петлями на разных уровнях. Попробуйте их и посмотрите всё ли работает с внутренними петлями.

     

    Только не сдавайтесь, эти GTP тот ещё квест)

  12. Всем доброго времени суток.

    Мне в проекте для Spartan6 необходима внутренней частота 24,576МГц. При этом у меня есть два внешних источника тактового сигнала 40МГц и 125МГц.

    Я пытаюсь сгенерировать ClockWizard ядро для получения нужной частоты. При подстановки 40МГц в качестве источника тактового сигнала для ядра оно выдаёт, что может сформировать только частоту 24,571МГц а не 24,576МГц. При подстановки 125МГц ядро выдаёт 24,573МГц.

    Подскажите пожалуйста, может есть метод получения заданной частоты из исходных?

  13. Доброго времени суток.

     

    Встала задача написания кода FPGA для записи и чтения данных в NAND flash MT29F128G08CFAAAWP-IT фирмы Micron. Подскажите пожалуйста, может уже есть где готовый модуль для этих целей? Хотелось бы поглядеть на реализацию и переделать со своими особенностями.

     

    Заранее благодарен за ответы.

  14. То остаётся печальный вывод - что модуляционный поток между плис и dds каким -то боком наводится на выходные цепи dds

    Вы имете ввиду, что наводка происходит внутри ПЛИС или между ПЛИС и AD9957?

     

    ..хотя я всё никак не пойму - как это у вас 4-ре идеальных функции sin(kx) сложились в матлабе в эдакое уродство.

    Спектр у меня должен быть не симметричным(как показано на картинке выше). Реализация представлена также на рисунке выше.

     

    Вы посоветовали мне книгу Бетругера Лугнера , "Постцифровая фильтрация составных сигналов." Гугл молчит о такой, а в закрома у меня доступа нет.

    Вы может посоветуйте где мне её можно достать. Хочется её почитать.

  15. Да, проверил.

    Построил в матлабе спектр идеального и вытащенного из modelsim сигнала

    post-48978-1364912502_thumb.jpg

    крсаный-реальный

    синий-идеальный

     

    Некоторое расхождение в спектрах думаю из за применения коррекции Тейлора внутренних DDS. По графикам думаю можно сделать выводы о том, что DDS в спурах не виноват. А вы ка считаете?