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

 
 
> Измерение интервалов меньше 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
lamination
сообщение Oct 29 2009, 12:52
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 42
Регистрация: 11-04-06
Пользователь №: 16 019



Цитата(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';
    ..............
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
|- - АБС   Цитата(Shtirlits @ Oct 29 2009, 01:16) АБ...   Oct 29 2009, 10:49
- - 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 Текстовая версия Сейчас: 18th July 2025 - 00:48
Рейтинг@Mail.ru


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