реклама на сайте
подробности

 
 
> Измерение интервалов меньше 1нс на FPGA
АБС
сообщение Oct 28 2009, 14:18
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 28-10-09
Пользователь №: 53 261



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

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

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

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

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

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

Заранее благодарю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Shtirlits
сообщение Oct 28 2009, 22:16
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



АБС, я подозреваю вас в том, что вы используете входной сигнал в качестве клока, а выходы с 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.
Go to the top of the page
 
+Quote Post
АБС
сообщение Oct 29 2009, 10:49
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 28-10-09
Пользователь №: 53 261



Цитата(Shtirlits @ Oct 29 2009, 01:16) *
АБС, я подозреваю вас в том, что вы используете входной сигнал в качестве клока, а выходы с PLL в качестве данных. Примерно вот так:


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

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


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


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

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

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

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

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

Благодарю за помощь.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- АБС   Измерение интервалов меньше 1нс на FPGA   Oct 28 2009, 14:18
- - Shtirlits   Какая у вас микросхема? Периодические ли сигналы? ...   Oct 28 2009, 15:55
|- - АБС   Цитата(Shtirlits @ Oct 28 2009, 19:55) Ка...   Oct 28 2009, 16:18
|- - DmitryR   Можно, просто для решения означенной вами проблемы...   Oct 28 2009, 18:15
|- - АБС   Цитата(DmitryR @ Oct 28 2009, 21:15) Можн...   Oct 28 2009, 19:39
|- - lamination   Цитата(Shtirlits @ Oct 29 2009, 01:16) .....   Oct 29 2009, 12:52
- - iosifk   Цитата(АБС @ Oct 28 2009, 18:18) По прихо...   Oct 29 2009, 06:28
|- - DmitryR   Кстати да, оверсэплинг-то делается не так: надо на...   Oct 29 2009, 08:29
- - Shtirlits   К сожалению, не нашел быстро документ, который сод...   Oct 29 2009, 14:12
|- - АБС   Цитата(Shtirlits @ Oct 29 2009, 17:12) К ...   Oct 29 2009, 14:40
|- - Shtirlits   Цитата(АБС @ Oct 29 2009, 17:40) Так поче...   Oct 29 2009, 19:04
|- - DmitryR   Цитата(Shtirlits @ Oct 29 2009, 22:04) Ещ...   Oct 30 2009, 09:39
||- - Shtirlits   Цитата(DmitryR @ Oct 30 2009, 12:39) На с...   Oct 30 2009, 09:41
||- - DmitryR   На мой взгляд задача измерения интервала сводится ...   Oct 30 2009, 10:33
|- - АБС   Цитата(Shtirlits @ Oct 29 2009, 22:04) Кс...   Oct 30 2009, 12:02
|- - Shtirlits   Цитата(АБС @ Oct 30 2009, 15:02) А. Можно...   Oct 30 2009, 13:40
|- - АБС   Получается что работать с двумя PLL для такой зада...   Oct 30 2009, 14:49
|- - Shtirlits   Цитата(АБС @ Oct 30 2009, 17:49) Получает...   Oct 30 2009, 15:11
|- - АБС   Цитата(Shtirlits @ Oct 30 2009, 18:11) Пр...   Oct 30 2009, 15:56
|- - Shtirlits   Цитата(АБС @ Oct 30 2009, 18:56) ...два П...   Oct 30 2009, 16:43
|- - АБС   Цитата(Shtirlits @ Oct 30 2009, 19:43) На...   Oct 30 2009, 17:28
|- - DmitryR   А чем вас точность в 200 ps не устраивает?   Oct 30 2009, 18:15
|- - АБС   Цитата(DmitryR @ Oct 30 2009, 21:15) А че...   Nov 4 2009, 12:17
- - lamination   Цитата(Shtirlits @ Oct 29 2009, 17:12) К ...   Oct 29 2009, 16:20


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016