Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение интервалов меньше 1нс на FPGA
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
АБС
Доброго времени суток.

Видел на днях висел топик по теме. Сейчас не могу найти. Удалили что-ли.
У меня идентичная задача. Надо мерить длительность импульсов на 5 каналах, оцифровывать
и передавать дальше в цифровом виде. LSB должен быть 1 нс.
Делаю так:
Имею 2 PLL 125МГц. Первый PLL дает 125 МГц и 125МГц сдвинутый на 90 градусов.
Второй PLL - соответственно на 45 и 135 градусов. Итого, после несложных манипуляций имею
8 линий частоты 125 МГц сдвинутых друг относительно друга на 45 градусов.

По приходе входного импульса защелкиваю состояния этих линий в регистр. Далее
декодирую его для получения двоичного кода. В итоге имею LSB 1нс.

Варьируя частоты PLL, впринципе можно опустить это значение до ~358пс.
Все упирается в верхнюю частоту PLL.

Если что могу обьяснить поподробнее.
Вот только у меня проблема. Что будет если защелкивание состояния этих 8-и линий
произойдет по фронту двух из них? (Очевидно что можно попасть или на два фронта или на 0).

Как можно решить такую проблему?
И еще. Чтобы расширить динамический диапазон, есть еще обычный счетчик, который работает от тех же
150 МГц. Как быть с моментом когда счетчик меняет состояние?

Заранее благодарю.
Shtirlits
Какая у вас микросхема?
Периодические ли сигналы?
Чем обеспечивается крутизна фронтов входных сигналов и отсутствие иголок?
Может стоит наоборот, захватывать 5 входных сигналов по 8 клокам, а затем для обеспечения таймингов последовательно передавать от фазы к фазе захваченные сигналы, пока не дойдете до клока основной части схемы?
Как вы обходитесь с метастабильностью?
Посмотрите на gray code.
АБС
Цитата(Shtirlits @ Oct 28 2009, 19:55) *
Какая у вас микросхема?
Периодические ли сигналы?
Чем обеспечивается крутизна фронтов входных сигналов и отсутствие иголок?
Может стоит наоборот, захватывать 5 входных сигналов по 8 клокам, а затем для обеспечения таймингов последовательно передавать от фазы к фазе захваченные сигналы, пока не дойдете до клока основной части схемы?
Как вы обходитесь с метастабильностью?
Посмотрите на gray code.


По порядку.
Микросхема Actel ProASIC3.
Сигналы случайные, порядка 50 кГц на канал.
Крутизна и отсутствие иголок обеспечивается стоящим перед FPGA shaper/discriminator-ом.
Насчет "может стоит наоборот...." не совсем понял о чем речь? Можете по подробнее на примере одного входа?
С метастабильностью обхожусь пока-что "никак" - именно для этого поднял этот топик.
О gray code имею понятие. Но вопрос не в том во что "закодировать", а вопрос в том КАК МЕРИТЬ длительность
чтобы код получаемый в результате измерения обладал "устойчивостью" к возможным метастабильным состояниям системы.

Обьясню на примере.(Грубо) Если взять обычную цепочку из стабильных элементов задержки, и подать на нее входной импульс, то
можно снять с этой цепочки код, т.н. "thermometer code" который даст информацию о времени поступления сигнала с точностью до
времени задержки одного элемента. Этот код, абсолютно устойчив к метастабильным состояниям самой цепи задержки - максимальная
ошибка - 1 элемент задержки - тоесть 1 LSB в итоге.
Можно ли добиться того же результата в случае с фазо-сдвиговым методом?

Благодарю
DmitryR
Можно, просто для решения означенной вами проблемы (когда передний фронт входного импульса попадет на фронт одного сигнала, а задний - на фронт следующего) надо эффективную частоту сэмплирования сделать чуть-чуть меньше, чем минимальная ширина импульса. То есть, если импульс 1 ns, фронты у него пусть по 100 ps, то надо сделать, чтобы расстояние между фронтами сэмплирующих частот не превышало 750 ps, и тогда вы хотя бы раз наносекундный импульс захватите надежно. Но тогда может получиться не один, а два фронта внутри наносекундного импульса - будет большая погрешность измерения. Снизить погрешность можно, дальше снижая расстояние между сэмплами.

И еще. Чип вы выбрали очень неудачный для этой задачи. В Xilinx/Altera у каждой PLL по 6 выходов, что позволяет наплодить почти сколько угодно частот, да и скорость у них гораздо выше.
АБС
Цитата(DmitryR @ Oct 28 2009, 21:15) *
Можно, просто для решения означенной вами проблемы (когда передний фронт входного импульса попадет на фронт одного сигнала, а задний - на фронт следующего) надо эффективную частоту сэмплирования сделать чуть-чуть меньше, чем минимальная ширина импульса. То есть, если импульс 1 ns, фронты у него пусть по 100 ps, то надо сделать, чтобы расстояние между фронтами сэмплирующих частот не превышало 750 ps, и тогда вы хотя бы раз наносекундный импульс захватите надежно. Но тогда может получиться не один, а два фронта внутри наносекундного импульса - будет большая погрешность измерения. Снизить погрешность можно, дальше снижая расстояние между сэмплами.

И еще. Чип вы выбрали очень неудачный для этой задачи. В Xilinx/Altera у каждой PLL по 6 выходов, что позволяет наплодить почти сколько угодно частот, да и скорость у них гораздо выше.


Дорогой DmitryR,

Видимо мы не поняли друг друга.
Я имел ввиду не случай описанный вами. Такого в принципе быть не может. Минимальная длительность входного импульса гарантированно больше чем 2нс даже.
Я имел ввиду вот что. Если мы измеряем время прихода переднего фронта например. В моей схеме возможна ситуация когда в момент защелкивания состояния 8 линий частота 150МГц с сдвигом 45 градусов
и частота 150МГц со сдвигом (180+45) градусов будут менять свой уровень. Это даст ошибку никак не 1 LSB. Вот я о чем собственно говорю.

Actel я выбрал по причине наличия FLASH. А о каких конкретно Xilinx/Altera Вы говорите?
Shtirlits
АБС, я подозреваю вас в том, что вы используете входной сигнал в качестве клока, а выходы с PLL в качестве данных. Примерно вот так:
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sampler is
    port(
        ref_clk    : in std_logic;
        probe    : in std_logic
        );
    end sampler;

architecture pa3 of sampler is

    signal clocks, clocks_reg : std_logic_vector(7 downto 0);    -- 0, 45, 90, 135, 180, 225, 270, 315
    signal counter, counter_reg : std_logic_vector(15 downto 0);

begin

    pll_0 : pll port map (clk_in => ref_clk, c0=>clock(0), c90 =>clock(2));
    pll_1 : pll port map (clk_in => ref_clk, c45=>clock(1), c135 =>clock(3));
    clocks(4) <= not clocks(0);
    clocks(5) <= not clocks(1);
    clocks(6) <= not clocks(2);
    clocks(7) <= not clocks(3);
    
    process(clocks(0))
        begin
            if rising_edge(clocks(0)) then
                counter <= counter+1;
            end if;
        end process;

    process(probe)
        begin
            if rising_edge(probe) then
                clocks_reg <= clocks;
                counter_reg <= counter;
            end if;
        end process;

end pa3;



Считаю, что это не к добру, так как FPGA проектируются не для этого и специально сконструированные механизмы доставки клока не используются, как результат, точность доставки сигналов от PLL будет хуже возможной. Как не обкладывай их констрейнами, это не поможет.

Следует делать все наоборот, использовать 8 клоков и по каждому из них захватывать входной сигнал.
Код
    gen_regs : for i in 0 to 7 generate
        process(clocks(i))
            begin
                if rising_edge(clocks(i)) then
                    reg(i) <= D;
                end if;
            end process;
    end generate;


Для существенного уменьшения вероятности сбоя можно применить два приема: последовательный перезахват рядом расположенными регистрами, не имеющими других потребителей (нужно поработать атрибутами или констрейнами) и голосование размноженного сигнала.

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sampler_channel is
    port(
        clk        : in std_logic;
        probe    : in std_logic;
        Q        : out std_logic
        );
    end sampler_channel;

architecture pa3 of sampler_channel is

    attribute syn_keep : boolean;

    signal clk : std_logic;

    signal reg1, reg2 : std_logic;
    signal reg3 : std_logic_vector(2 downto 0);

    attribute syn_keep of reg1 : signal is true;    
    attribute syn_keep of reg2 : signal is true;    
    attribute syn_keep of reg3 : signal is true;    

begin

    process(clk)
        begin
            if rising_edge(clk) then
                reg1 <= probe;    -- sample
                reg2 <= reg1;    -- recapture, shortest as possible
                reg3 <= reg2 & reg2 & reg2;        -- copy
                case reg3 is
                    when "000" => Q <= '0';
                    when "001" => Q <= '0';
                    when "010" => Q <= '0';
                    when "011" => Q <= '1';
                    when "100" => Q <= '0';
                    when "101" => Q <= '1';
                    when "110" => Q <= '1';
                    when "111" => Q <= '1';
                    when others => Q <= '0';
                end case;
            end if;
        end process;


end pa3;


Если 8 раз использовать модуль, набросок которого приведен выше, то у вас окажеся захваченный сигнал, но на разных фазах, а нужно все свести к одной, нулевой. Труднее всего будет сигналам, которые близки к ней. Поэтому сначала перезахватите клоком сдвинутым на 180 градусов те сигналы, которые захватывались на фазах после 180 градусов, а потом перезахватите уже нулевым клоком.
Если будет плохо разводиться, то можно последовательно подтягивать сигналы к 0 фазе не за два шага, а за сколько нужно, хоть за 7.
iosifk
Цитата(АБС @ Oct 28 2009, 18:18) *
По приходе входного импульса защелкиваю состояния этих линий в регистр. Далее
декодирую его для получения двоичного кода. В итоге имею LSB 1нс.


Если не решите проблему метастабильности, то обо всех остальных рассуждениях можно забыть...
Почитайте сначала о метастабильности... Там есть графики, показывающие переходные процессы...
И все это сильно поплывет по температуре...
DmitryR
Кстати да, оверсэплинг-то делается не так: надо наоборот, кучей частот хлопать единственный входной сигнал, переводить эти данные к одной частоте и анализировать. И соответственно проблемы одновременного изменения уровней в такой схеме нет - в каждый момент времени входной сигнал защелкивается только по одной частоте. xapp861 прочтите, вобщем.

Что касается встроенной flash - брать Actel только за это IMHO не имеет смысла, уж больно много с ними геммороя. Есть Spartan-3AN со встроенным flash, если это уж так вам важно, правда у него нет PLL, только DCM. Но вообще у вас проект явно не одночиповый, не вижу проблем поставить еще восьминожечную флэшечку и нормальную FPGA.
АБС
Цитата(Shtirlits @ Oct 29 2009, 01:16) *
АБС, я подозреваю вас в том, что вы используете входной сигнал в качестве клока, а выходы с PLL в качестве данных. Примерно вот так:


Вы положительно догадливы biggrin.gif
Я делаю именно так. Буквально так.

Цитата
Считаю, что это не к добру, так как FPGA проектируются не для этого и специально сконструированные механизмы доставки клока не используются, как результат, точность доставки сигналов от PLL будет хуже возможной. Как не обкладывай их констрейнами, это не поможет.


Можно узнать почему Вы считаете, что механизмы доставки клока в этом случае не используются? Выходами PLL можно питать глобальные и квадрантные клоки. Схема доставки у них
довольно симметричная. Тем более, на симуляторе все показывает в норме. На этом девайсе каждый вход ячейки можно подключить практически ко всем клокам.
Или Вы имеете ввиду что механизм доставки ВХОДНОГО СИГНАЛА будет не тот же самый, что у клоков?


Цитата
Для существенного уменьшения вероятности сбоя можно применить два приема: последовательный перезахват рядом расположенными регистрами, не имеющими других потребителей (нужно поработать атрибутами или констрейнами) и голосование размноженного сигнала.

Да, это похоже очень хорошее решение.

Цитата
Если 8 раз использовать модуль, набросок которого приведен выше, то у вас окажеся захваченный сигнал, но на разных фазах, а нужно все свести к одной, нулевой. Труднее всего будет сигналам, которые близки к ней. Поэтому сначала перезахватите клоком сдвинутым на 180 градусов те сигналы, которые захватывались на фазах после 180 градусов, а потом перезахватите уже нулевым клоком.
Если будет плохо разводиться, то можно последовательно подтягивать сигналы к 0 фазе не за два шага, а за сколько нужно, хоть за 7..

Это я обдумаю, и попытаюсь реализовать.

Как я понял в моей изначальной схеме, отрицательное действие метастабильных состояний не подлежит сомнению.

Благодарю за помощь.
lamination
Цитата(Shtirlits @ Oct 29 2009, 01:16) *
....
Для существенного уменьшения вероятности сбоя можно применить два приема: последовательный перезахват рядом расположенными регистрами, не имеющими других потребителей (нужно поработать атрибутами или констрейнами) и голосование размноженного сигнала.

Код
    signal reg1, reg2 : std_logic;
    signal reg3 : std_logic_vector(2 downto 0);
...
    reg1 <= probe;    -- sample
    reg2 <= reg1;    -- recapture, shortest as possible
    reg3 <= reg2 & reg2 & reg2;        -- copy
    case reg3 is
        when "000" => Q <= '0';
        when "001" => Q <= '0';
        when "010" => Q <= '0';
        when "011" => Q <= '1';
        when "100" => Q <= '0';
        when "101" => Q <= '1';
        when "110" => Q <= '1';
        when "111" => Q <= '1';
        when others => Q <= '0';
        end case;
....


Не совсем понятна цель записи в reg3 значений reg2 - при частотах, меньших fmax дизайна там будет либо "000", либо "111".
Вы вероятно имели в виду следующее?

Код
signal reg1, reg2:std_logic_vector(2 downto 0);
...
reg1(0) <= probe;
reg1(1) <= probe;
reg1(2) <= probe;
reg2 <= reg1;
case reg2 is
    when "000" => Q <= '0';
    when "001" => Q <= '0';
    ..............
Shtirlits
К сожалению, не нашел быстро документ, который содержал наглядные рассчеты MTBF и объяснения.

Помню, что для Virtex-II pro меня устроила схема, при которой сначала всего два расположенных в одном слайсе регистра последовательно перезахватывают сигнал, а затем, выполняется голосование по результатам 3 регистров, тоже недалеко размещенных. Я привел именно такую схему. Размножать сигнал сразу невыгодно, так как увеличивается количество потребителей, что сделает более пологим фронт исходного сигнала и повысит вероятность сбоя. Вот когда уже сигнал "очищен" от метастабильного состояния, можно голосованием выбрать наиболее достоверное значение.
В общем случае, как я считаю, снижение вероятности сбоя выглядит как один сдвиговый регистр на входе, затем ветвление в сколько хочется сдвиговых регистров и после голосование. Чем длиннее регистр, тем меньше вероятность того, что каждый следующий "цапнет" генерацию как раз пока генерирует прошлый. Можно было б понаставить хоть сотню регистров, но площадь растет и задержка набегает. Особенно это неприятно в dual clock FIFO.

Кстати, про FIFO. Применение фирменного компонента dual clock fifo - хорошая отмазка, чтобы самому не думать.
АБС
Цитата(Shtirlits @ Oct 29 2009, 17:12) *
К сожалению, не нашел быстро документ, который содержал наглядные рассчеты MTBF и объяснения.

Помню, что для Virtex-II pro меня устроила схема, при которой сначала всего два расположенных в одном слайсе регистра последовательно перезахватывают сигнал, а затем, выполняется голосование по результатам 3 регистров, тоже недалеко размещенных. Я привел именно такую схему. Размножать сигнал сразу невыгодно, так как увеличивается количество потребителей, что сделает более пологим фронт исходного сигнала и повысит вероятность сбоя. Вот когда уже сигнал "очищен" от метастабильного состояния, можно голосованием выбрать наиболее достоверное значение.
В общем случае, как я считаю, снижение вероятности сбоя выглядит как один сдвиговый регистр на входе, затем ветвление в сколько хочется сдвиговых регистров и после голосование. Чем длиннее регистр, тем меньше вероятность того, что каждый следующий "цапнет" генерацию как раз пока генерирует прошлый. Можно было б понаставить хоть сотню регистров, но площадь растет и задержка набегает. Особенно это неприятно в dual clock FIFO.

Кстати, про FIFO. Применение фирменного компонента dual clock fifo - хорошая отмазка, чтобы самому не думать.


Дорогой Shtirlits,
Цитата
Считаю, что это не к добру, так как FPGA проектируются не для этого и специально сконструированные механизмы доставки клока не используются, как результат, точность доставки сигналов от PLL будет хуже возможной. Как не обкладывай их констрейнами, это не поможет.


Так почему же все таки Вы считаете, что механизмы доставки клока в этом случае не используются?
Metastability Report я нашел у Actela. Почитаю.
В аппноте Xilinx исползуется аж 3 последовательных FF.
http://www.xilinx.com/support/documentation/application_notes/xapp861.pdf

A вообще получается, даже если бы я реализовал это на элементах задержки, все равно надо было бы такую же логику делать чтобы избежать метастабильных состояний?
И еще вопрос.
Стоит ли думать о возможном относительном фазовом сдвиге этих двух PLL?
lamination
Цитата(Shtirlits @ Oct 29 2009, 17:12) *
К сожалению, не нашел быстро документ, который содержал наглядные рассчеты MTBF и объяснения.

Помню, что для Virtex-II pro меня устроила схема, при которой сначала всего два расположенных в одном слайсе регистра последовательно перезахватывают сигнал, а затем, выполняется голосование по результатам 3 регистров, тоже недалеко размещенных.


Понял, ваш случай борется с метастабильностью второго каскада регистров. Тогда в общем случае это лучше, чем то что предложил я.
MTBF ~ (e^t)/(Fclk*Fdata). - расположение двух регистров в одном слайсе именно для увеличения t(slack),насколько я понимаю. каскадирование - это уже для уменьшения вероятности впадания в метастабильность двух регистров подряд. На вопрос о том, насколько это оправдано может ответить только численный расчет, т.к. задержка распространения внутри слайса(первый каскад) меньше, чем задержка между слайсами(второй каскад и далее).
Цитата(АБС @ Oct 29 2009, 17:40) *
В аппноте Xilinx исползуется аж 3 последовательных FF.

У ксайлинкса 3 регистра подряд для приведения всех семплов к одному клоку и уменьшения метастабильности(переходы между различными регистрами не всегда равны 1 clk - page 4).
Shtirlits
Цитата(АБС @ Oct 29 2009, 17:40) *
Так почему же все таки Вы считаете, что механизмы доставки клока в этом случае не используются?

Чую. smile.gif
Вообще мое чутье обусловлено двумя вещами:
1) опытом с virtex, stratix, fpslic, в них перетаскивание клока на вход данных или затягивание сигнала с ресурсов общего назначения на вход тактирования приводят к заметному перекосу. В документации на ProASIC3 я не нашел никаких ограничений на соединения. Так что хоть данные, хоть клок можно цеплять к low skew ресурсам. Остается опасность из пункта 2.
2) опытом с синтезаторами quartus, xst, synplify, leonardo spectrum - если они захотят нагадить незадачливому разработчику, то могут воткнуть где не нужно глобальный буфер или не сделать его где нужно. И все, толкаем веревку, по расчудесной fpga потащится провод мимо глобальных сетей, потому что его не посчитали клоком и плевать им на перекос и на то, что вы хотели сделать, им это не ведомо.

Полистал я документацию на proasic3 и мысли следующие:
Оцифровку нужно делать на одном блоке CCC с PLL. Второй замучаешься синхронизировать.
Если умножить с помощью PLL частоту до 250 MHz, то получается тоже самое, что и с двумя PLL на 125MHz.
После PLL есть 3 селектора фазы с делителем частоты и программируемой задержкой. Но делители нам не помогут, так как VCO больше 350 MHz не разогнать. Остается только выбрать фазы 0 и 90 и с разной задержкой выдать на 4 клоковых сети квадранта.
Например, получится 4 сети тактируемые с периодом 4nS:
GLB 0 + 0 pS = +0 pS/+2000pS (это задний фронт)
YB 0 +600 pS = +600 pS/+2600pS
GLC 90 + 0 pS = +1000 pS/+3000pS
YC 90 +600 pS = +1600 pS/+3600pS
GLA можно сделать 125 MHz со сдвигом 0.
Захватываемый сигнал тоже надо подать на глобальную сеть.
Дальше наверное все равно кого кем захватывать, это вопрос не разрешения, а крутизны фронтов, надежности и предпочтений.

Еще, если учесть:
- джиттер до 5.6% периода ~225 pS
- skew глобальной сети 250 pS, который надо бы удвоить, так как перекос клока и перекос данных.
- ошибку duty cycle +-1.5% ~60 pS
то видно, что точнее 1nS может и не получиться.

Кстати, "градусник" из регистров и элементов задержки может дать результат лучше, если его непрерывно калибровать.
Для этого можно сделать пару экземпляров градусника, один калибруется по биениям частот двух PLL, другой работает, потом меняются.

Еще лучше перестать использовать fpga не по назначению и применить что-то специальное.

Цитата(АБС @ Oct 29 2009, 17:40) *
A вообще получается, даже если бы я реализовал это на элементах задержки, все равно надо было бы такую же логику делать чтобы избежать метастабильных состояний?

Да. Это нужно делать в любой схеме, в которой есть вероятность нарушения таймингов.

Цитата(АБС @ Oct 29 2009, 17:40) *
Стоит ли думать о возможном относительном фазовом сдвиге этих двух PLL?

Да.
DmitryR
Цитата(Shtirlits @ Oct 29 2009, 22:04) *
Еще лучше перестать использовать fpga не по назначению и применить что-то специальное.
На современных FPGA Xilinx/Altera эта задача решается без хлопот. Просто вот Actel - он на самом деле на high speed не очень заточен.
Shtirlits
Цитата(DmitryR @ Oct 30 2009, 12:39) *
На современных FPGA Xilinx/Altera эта задача решается без хлопот. Просто вот Actel - он на самом деле на high speed не очень заточен.

Я имел в виду задачу измерения интервалов, а не 1nS интервалов.
А вы?
DmitryR
На мой взгляд задача измерения интервала сводится к подсчету количества малых интервалов, укладывающихся в измеряемый.
АБС
Цитата(Shtirlits @ Oct 29 2009, 22:04) *
Кстати, "градусник" из регистров и элементов задержки может дать результат лучше, если его непрерывно калибровать.
Для этого можно сделать пару экземпляров градусника, один калибруется по биениям частот двух PLL, другой работает, потом меняются.
...
Еще, если учесть:
- джиттер до 5.6% периода ~225 pS
- skew глобальной сети 250 pS, который надо бы удвоить, так как перекос клока и перекос данных.
- ошибку duty cycle +-1.5% ~60 pS
то видно, что точнее 1nS может и не получиться.
...


А. Можно по-подробнее про калибровку градусника?
Б. Зачем же вы удваиваете skew глобальной сети?
И причем вообще skew глобальной сети? Эта задержка постоянная, и по моему никак не влияет на ошибку измерения.
Джиттер и ошибка duty cycle это да, это надо сложить.
Вы определенно правы насчет двух PLL. В этом случае видимо надо удвоить и jitter и duty cycle.
Или в случае с двумя PLL вообще не стоит расчитывать на хоть какую-то синхронность их работы?


Цитата(DmitryR @ Oct 30 2009, 13:33) *
На мой взгляд задача измерения интервала сводится к подсчету количества малых интервалов, укладывающихся в измеряемый.


Да, моя задача именно в этом и состоит.
Shtirlits
Цитата(АБС @ Oct 30 2009, 15:02) *
А. Можно по-подробнее про калибровку градусника?

Во-первых, я так не делал, а только размышлял на тему.
На входе "градусника" ставим мультиплексор, чтобы выбирать измеряемый сигнал или периодический сигнал с другой PLL, период которого отличается минимально.
Дальше логика должна наблюдать стробоскопический эффект при прокурчивании сдвигов фазы полный оборот.
На каждом такте должно наблюдаться смещение фронта, если разрешение градусника выше, чем разница в периодах. Если сделать много оборотов, то можно попытаться сделать выводы о точности.

Цитата(АБС @ Oct 30 2009, 15:02) *
Б. Зачем же вы удваиваете skew глобальной сети?

Сгоряча, так как не знаю перекос между сетями.
В документации обычно указан перекос между точками одной сети.
Думаю, что это знает статический анализатор таймингов.
АБС
Получается что работать с двумя PLL для такой задачи вообще не реально?
Их фронты будут плавать друг относительно друга? Или поскольку всетаки они запитываются от одного
клока можно ожидать только постоянный фазовый сдвиг, но не разницу в частотах?
Shtirlits
Цитата(АБС @ Oct 30 2009, 17:49) *
Получается что работать с двумя PLL для такой задачи вообще не реально?
Их фронты будут плавать друг относительно друга? Или поскольку всетаки они запитываются от одного
клока можно ожидать только постоянный фазовый сдвиг, но не разницу в частотах?

Проблемы я вижу две - раздать опорный клок и доставить клок к измеряемому сигналу.
Если придумать способ обнаружения перекоса между PLL, то можно подобрать задержку на входе PLL. К счастью CCC на лету можно реконфигурировать. Но делать это нужно именно на ходу, так как задержки не стоят на месте.
На мой взгляд лучше будет, если каждый CCC будет питать свои региональные сети, а измеряемый сигнал через глобальную сеть разойдется по микросхеме.

Про глобальную сеть. Это такой ресурс, из назначения которого следует пара полезных свойств - низкий skew и крутые фронты. Можно пользоваться и другими ресурсами, если есть возможность измерить и устранить skew.

Надеюсь, плавать будет в пределах джиттера обозначенного в документации, гораздо больше будет постоянный фазовый сдвиг.
Не знаю, откуда может взяться разница в частотах, если PLL питаются общим опорным клоком и делители у них одинаковые.
АБС
Цитата(Shtirlits @ Oct 30 2009, 18:11) *
Проблемы я вижу две - раздать опорный клок и доставить клок к измеряемому сигналу.
Если придумать способ обнаружения перекоса между PLL, то можно подобрать задержку на входе PLL. К счастью CCC на лету можно реконфигурировать. Но делать это нужно именно на ходу, так как задержки не стоят на месте.
На мой взгляд лучше будет, если каждый CCC будет питать свои региональные сети, а измеряемый сигнал через глобальную сеть разойдется по микросхеме.

Про глобальную сеть. Это такой ресурс, из назначения которого следует пара полезных свойств - низкий skew и крутые фронты. Можно пользоваться и другими ресурсами, если есть возможность измерить и устранить skew.

Надеюсь, плавать будет в пределах джиттера обозначенного в документации, гораздо больше будет постоянный фазовый сдвиг.
Не знаю, откуда может взяться разница в частотах, если PLL питаются общим опорным клоком и делители у них одинаковые.


Насчет плавания частот - я просто немного запутался уже во всех эти джиттерах и т.д..
У меня на симуляторе была ситуация когда я включил два ПЛЛ от одного и того же клока 40МГц, выход
одного ПЛЛ был 160, а другого 320 (так просто поиграть). Симулятор показал что-то очень странное, как будто бы
частота второго была не 320, а 319,99. Тоесть фаза второго ПЛЛ постепенно уползала, причем с постоянной скоростью
этого самого уползания - что может быть следствием только разных частот. Плюс к этому ваше замечание о том что
Цитата
Оцифровку нужно делать на одном блоке CCC с PLL. Второй замучаешься синхронизировать.
Вот что меня запутало.
При двух ПЛЛ-ах с одинаковой выходной частотой такого не наблюдалось.

Джиттер - это имеется ввиду кратковременные отклонения параметра (в данном случае периода) от заданного, ведь так?
Но никак не разница в частотах, как вы правильно заметили, если ПЛЛ питаются общим опорным клоком.
Тоесть два ПЛЛ они ВПРИНЦИПЕ синхронны в этой схеме, разница фаз будет в пределах 5.6%?
Shtirlits
Цитата(АБС @ Oct 30 2009, 18:56) *
...два ПЛЛ от одного и того же клока 40МГц, выход одного ПЛЛ был 160, а другого 320....
Симулятор показал что-то очень странное, как будто бы частота второго была не 320, а 319,99.

На каком интервале это наблюдалось? Попробуйте помоделировать несколько десятков микросекунд.
Фильтр обратной связи режет частоты выше 15-45kHz.
Возможно, вы наблюдаете tracking jitter, он довольно большой.
Кстати, это и есть причина, по которой две PLL использовать трудно.
Вероятно, у вас коэффициенты 8/1 и 4/1, попробуйте 8/1 и 8/2.

Цитата(АБС @ Oct 30 2009, 18:56) *
Тоесть два ПЛЛ они ВПРИНЦИПЕ синхронны в этой схеме, разница фаз будет в пределах 5.6%?

Упомянутый tracking jitter все и испортит, который может быть до 1.6nS в A3P250 и A3P1000 и до 0.8nS в других моделях при LockControl=1 в худшем случае.
И еще нужно добавить перекос опорного клока, который мне не известен - я не знаю как они у вас соединены, внутри или снаружи микросхемы, а если бы и знал, все равно затруднился бы сосчитать.

PS: Что это за LockControl я так и не понял.
АБС
Цитата(Shtirlits @ Oct 30 2009, 19:43) *
На каком интервале это наблюдалось? Попробуйте помоделировать несколько десятков микросекунд.
Фильтр обратной связи режет частоты выше 15-45kHz.
Возможно, вы наблюдаете tracking jitter, он довольно большой.
Кстати, это и есть причина, по которой две PLL использовать трудно.
Вероятно, у вас коэффициенты 8/1 и 4/1, попробуйте 8/1 и 8/2.


Да, коэффициенты были типа этого. Кажется понимаю о чем речь.

Цитата
Упомянутый tracking jitter все и испортит, который может быть до 1.6nS в A3P250 и A3P1000 и до 0.8nS в других моделях при LockControl=1 в худшем случае.
И еще нужно добавить перекос опорного клока, который мне не известен - я не знаю как они у вас соединены, внутри или снаружи микросхемы, а если бы и знал, все равно затруднился бы сосчитать.

PS: Что это за LockControl я так и не понял.

Я тоже не понял.
Посмотре Виртекс6

Там вообще другие параметры даны. Выходной джиттер не описан, отсылаю к какому то визарду.
есть только duty cycle precision 150-200ps.

Получается что ВООБЩЕ на любой ФПГА сделать такую вещь достаточно стабильную и точную нельзя чтоли?
DmitryR
А чем вас точность в 200 ps не устраивает?
АБС
Цитата(DmitryR @ Oct 30 2009, 21:15) *
А чем вас точность в 200 ps не устраивает?


Duty cycle precision это тот же Jitter?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.