Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Детектор совпадения импульсов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
lex_84
Как можно реализовать цифровой детектор совпадения импульсов?
Как сделать обычный ФД я знаю, но он показывает только <>
А чтобы реагировал на совпадение фронтов???
Herz
Цитата(lex_84 @ May 28 2008, 22:17) *
Как можно реализовать цифровой детектор совпадения импульсов?
Как сделать обычный ФД я знаю, но он показывает только <>
А чтобы реагировал на совпадение фронтов???

Совпадение фронтов может быть только с определённым допуском. Какие импульсы? И какое временное рассогласование фронтов ещё считается совпадением?
lex_84
Цитата(Herz @ May 29 2008, 00:40) *
Совпадение фронтов может быть только с определённым допуском. Какие импульсы? И какое временное рассогласование фронтов ещё считается совпадением?


Чем меньше тем лучше smile.gif где-то 10-20 нс
Herz
Цитата(lex_84 @ May 28 2008, 22:51) *
Чем меньше тем лучше smile.gif где-то 10-20 нс

А сами импульсы какой длительности, каков период следования?
В общем случае к импульсам можно применить фунцию И-НЕ и дискриминатор. Если на выходе не наблюдается иголок длиннее 10-20 нс, можно считать фронты совпадающими.
rv3dll(lex)
Цитата(lex_84 @ May 29 2008, 00:51) *
Чем меньше тем лучше smile.gif где-то 10-20 нс


генератор на 100-200 мегагерц
2 сдвиговых линии для подавления метастабильности и анализ по фронту одного из сигналов сигнал в соседнем канале в +-1-2 отсчёта вокруг него
Don2
Цитата(lex_84 @ May 28 2008, 22:17) *
Как можно реализовать цифровой детектор совпадения импульсов?
Как сделать обычный ФД я знаю, но он показывает только <>
А чтобы реагировал на совпадение фронтов???


Опишите задачу пдробнее.
lex_84
Цитата(Herz @ May 29 2008, 00:57) *
А сами импульсы какой длительности, каков период следования?
В общем случае к импульсам можно применить фунцию И-НЕ и дискриминатор. Если на выходе не наблюдается иголок длиннее 10-20 нс, можно считать фронты совпадающими.


Длительность импульсов 1-2 мкс. Частота 5-10 МГц.
Необходимо чтобы при совпадении импульсов схема формировала на своем выходе импульс для цепей сброса счетчиков.
Я хочу поэксперементировать с реализацией нониусного метода на ПЛИС. И любопытно насколько это реализуемо и какого наилучшего результата можно добиться.
К сожалению в нете не видел материалов на эту тему. Даже на аглицком.
А в Ратхоре и Дворяшине ничего не написано про такие схемы smile.gif

Цитата(rv3dll(lex) @ May 29 2008, 15:24) *
генератор на 100-200 мегагерц
2 сдвиговых линии для подавления метастабильности и анализ по фронту одного из сигналов сигнал в соседнем канале в +-1-2 отсчёта вокруг него


Вы хотите сказать что чисто цифровую схему не удастся создать и без аналоговой части не обойтись?
Herz
Цитата(lex_84 @ May 29 2008, 17:35) *
Длительность импульсов 1-2 мкс. Частота 5-10 МГц.

Так не бывает.
lex_84
Цитата(Herz @ May 29 2008, 21:40) *
Так не бывает.

Сорри smile.gif
5 МГц с коэффициентом заполнения 50.
rv3dll(lex)
Цитата(lex_84 @ May 29 2008, 19:35) *
Вы хотите сказать что чисто цифровую схему не удастся создать и без аналоговой части не обойтись?


я говорю про реализацию на ПЛИС
lex_84
Цитата(rv3dll(lex) @ May 30 2008, 22:07) *
я говорю про реализацию на ПЛИС
генератор на 100-200 мегагерц
2 сдвиговых линии для подавления метастабильности и анализ по фронту одного из сигналов сигнал в соседнем канале в +-1-2 отсчёта вокруг него

Метод мне не совсем понятен. особенно термин "метастабильность" и "анализ по фронту" smile.gif
Это же раздел для чайников! smile.gif
rv3dll(lex)
Цитата(lex_84 @ May 30 2008, 22:58) *
Метод мне не совсем понятен. особенно термин "метастабильность" и "анализ по фронту" smile.gif
Это же раздел для чайников! smile.gif


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

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

есть ещё вариант сделать на основном клоке клоке.
вы Vhdl знаете???
Kuzmi4
2 rv3dll(lex) - можете описать как это будет на vhdl, а то как то не ясна суть...
Как по мне то там Д-тригера + AND реализация...
lex_84
Цитата(Kuzmi4 @ Jun 2 2008, 16:37) *
2 rv3dll(lex) - можете описать как это будет на vhdl, а то как то не ясна суть...
Как по мне то там Д-тригера + AND реализация...


Интересно было бы посмотреть на временную диаграмму такого детектора



Цитата(rv3dll(lex) @ Jun 2 2008, 08:13) *
метастабильность - это когда у триггера изза того, что фронт клока попадает на фронт входных данных непонятное состояние выхода - лечится установкой нескольких триггеров подрят как бы в линию задержки.

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

есть ещё вариант сделать на основном клоке клоке.
вы Vhdl знаете???


VHDL знаю, но все равно не совсем понятно, хоть бы структуру или ту же временную диаграмму такого метода...
rv3dll(lex)
при мерно так - не пинайте если орфографические ошибки


ARCHITECTURE system_architecture OF system IS
signal syg_1 : std_logic;
signal syg_2 : std_logic;
signal syg_1_del_line : std_logic_vector(0 to 6);
signal syg_2_del_line : std_logic_vector(0 to 6);

signal syg_1_front : std_logic;
signal syg_2_front_t1 : std_logic;
signal syg_2_front_t2 : std_logic;
signal syg_2_front_t3 : std_logic;

signal 100meg : std_logic ;

signal strob_sovp_dlit : std_logic ;
signal strob_sovp : std_logic ;
BEGIN


process (100meg)
begin
if (100meg'event and 100meg = '1') --polog front
then
syg_1_del_line(0 to 6) <= syg_1 & syg_1_del_line(0 to 5) ;
syg_2_del_line(0 to 6) <= syg_2 & syg_2_del_line(0 to 5) ;
end if;
end process ;

syg_1_front <= syg_1_del_line(4) and not(syg_1_del_line(5))
syg_2_front_t1 <= syg_2_del_line(3) and not(syg_2_del_line(4))
syg_2_front_t2 <= syg_2_del_line(4) and not(syg_2_del_line(5))
syg_2_front_t3 <= syg_2_del_line(5) and not(syg_2_del_line(6))


process (100meg)
begin
if (100meg'event and 100meg = '1') --polog front
then
if syg_1_front = '1'
then
if syg_2_front_t1 = '1' or syg_2_front_t2 = '1' or syg_2_front_t3 = '1'
then
strob_sovp_dlit <= '1';
strob_sovp <= '1';
else
strob_sovp_dlit <= '0';
strob_sovp <= '0';
end if;
else
strob_sovp <= '0';
end if;
end if;
end process ;

END system_architecture;
Kuzmi4
2 lex_84 - а чем она вам может не понтавится ?

2 rv3dll(lex) - интересно получилось..
Если правильно вас понял:
Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
--
entity sinc_detector is
port(

strob_sovp            : out std_logic;
strob_sovp_dlit        : out std_logic;
sig100meg                : in  std_logic;
syg_1                : in  std_logic;
syg_2                : in  std_logic
);
end entity sinc_detector;

ARCHITECTURE system_architecture OF sinc_detector IS
--signal syg_1 : std_logic;
--signal syg_2 : std_logic;
signal syg_1_del_line : std_logic_vector(0 to 6);
signal syg_2_del_line : std_logic_vector(0 to 6);

signal syg_1_front : std_logic;
signal syg_2_front_t1 : std_logic;
signal syg_2_front_t2 : std_logic;
signal syg_2_front_t3 : std_logic;

--signal 100meg : std_logic;

--signal strob_sovp_dlit : std_logic;
--signal strob_sovp : std_logic;
BEGIN
--+++++++++++++++++++++++++++++++
process (sig100meg)
    begin
        if (sig100meg'event and sig100meg = '1') --polog front
        then
            syg_1_del_line(0 to 6) <= syg_1 & syg_1_del_line(0 to 5);
            syg_2_del_line(0 to 6) <= syg_2 & syg_2_del_line(0 to 5);
        end if;
    end process;
---
syg_1_front <= syg_1_del_line(4) and not(syg_1_del_line(5));
syg_2_front_t1 <= syg_2_del_line(3) and not(syg_2_del_line(4));
syg_2_front_t2 <= syg_2_del_line(4) and not(syg_2_del_line(5));
syg_2_front_t3 <= syg_2_del_line(5) and not(syg_2_del_line(6));
---
process (sig100meg)
    begin
        if (sig100meg'event and sig100meg = '1') --polog front
        then
            if (syg_1_front = '1') then
                if (syg_2_front_t1 = '1' or syg_2_front_t2 = '1' or syg_2_front_t3 = '1') then
                    strob_sovp_dlit <= '1';
                    strob_sovp <= '1';
                else
                    strob_sovp_dlit <= '0';
                    strob_sovp <= '0';
                end if;
            else
                strob_sovp <= '0';
            end if;
        end if;
end process;
--++++++++++++++++++++++++++++++++
END system_architecture;

В результате RTL выдал такую реализацию:
Нажмите для просмотра прикрепленного файла
Мапа выдала такую гирляндочку:
Нажмите для просмотра прикрепленного файла
А симуляция:
Нажмите для просмотра прикрепленного файла
Странно как то....
rv3dll(lex)
с схематиком - представление регистра сдвига и шин выхода и входа мне не очень понятно ну да ладно

на второй картинке видно - что по паре триггеров можно со входов убрать от души я так их поставил

а симуляция то что - они же не совпадают - фронты в смысле - ну и нет ничего на выходах
Kuzmi4
Так это детктор совпадения фронтов.. Блин.. сплужил.
Теперь идя ясна стала - получается мы прогоняем сигналы по сдвиговому регистру - цифруем типа с частотой 100 мегагерц а потом сравниваем...
Получил такую картинку:
Нажмите для просмотра прикрепленного файла
А почему strob_sovp_dlit не падает ?
rv3dll(lex)
Цитата(Kuzmi4 @ Jun 3 2008, 12:48) *
Так это детктор совпадения фронтов.. Блин.. сплужил.
Теперь идя ясна стала - получается мы прогоняем сигналы по сдвиговому регистру - цифруем типа с частотой 100 мегагерц а потом сравниваем...
Получил такую картинку:
Нажмите для просмотра прикрепленного файла
А почему strob_sovp_dlit не падает ?



это для того., чтобы показать что импульс в канале 1 точнее его фронт всегда совпадает с фронтом в канале 2

нарисуй дальше ещё и не несовпадающие фронты - и он упадёт

три выборки канала 2- это как раз допуск на совпадение
Kuzmi4
И наверно последний вопрос
касательно
Код
syg_1_front <= syg_1_del_line(4) and not(syg_1_del_line(5));

То это - до было("1"), после небыло("0") и AND даст 1 - типа фронт есть.
А вот касательно:
Код
syg_2_front_t1 <= syg_2_del_line(3) and not(syg_2_del_line(4));
syg_2_front_t2 <= syg_2_del_line(4) and not(syg_2_del_line(5));
syg_2_front_t3 <= syg_2_del_line(5) and not(syg_2_del_line(6));
...
if (syg_2_front_t1 = '1' or syg_2_front_t2 = '1' or syg_2_front_t3 = '1') then
...

Типа выборки с линии задержки, но почему именно такая хитрая выборка с 3 по 6 (вроде ж 4-5 даёт нам фронт) ?
Можете обяснить ? smile3046.gif

Понял, там же OR - именно допуск на совпадение.
biggrin.gif
Теперь всё стало на свои места.
rv3dll(lex)
для самостоятельного изучения

6 стробов показывают положение импульсов друг относительно друга - точность выше

лень думать над решающим устройством - но если очень хочется особенно для курсача штука любопытная


ARCHITECTURE system_architecture OF system IS
signal syg_1 : std_logic;
signal syg_2 : std_logic;
signal syg_1_del_line_p : std_logic_vector(0 to 3);
signal syg_2_del_line_n : std_logic_vector(0 to 3);
signal syg_1_del_line_p : std_logic_vector(0 to 3);
signal syg_2_del_line_n : std_logic_vector(0 to 3);

signal syg_1_front_p : std_logic;
signal syg_2_front_p : std_logic;
signal syg_1_front_n : std_logic;
signal syg_2_front_n : std_logic;

signal 100meg : std_logic ;

signal strob_1 : std_logic ;
signal strob_2 : std_logic ;
signal strob_3 : std_logic ;
signal strob_4 : std_logic ;
signal strob_5 : std_logic ;
signal strob_6 : std_logic ;
BEGIN


process (100meg)
begin
if (100meg'event and 100meg = '1') --polog front
then
syg_1_del_line_p(0 to 3) <= syg_1 & syg_1_del_line_p(0 to 2) ;
syg_2_del_line_p(0 to 3) <= syg_2 & syg_2_del_line_p(0 to 2) ;
end if;
end process ;

process (100meg)
begin
if (100meg'event and 100meg = '0') --otr front
then
syg_1_del_line_n(0 to 3) <= syg_1 & syg_1_del_line_n(0 to 2) ;
syg_2_del_line_n(0 to 3) <= syg_2 & syg_2_del_line_n(0 to 2) ;
end if;
end process ;


syg_1_front_p <= syg_1_del_line_p(2) and not(syg_1_del_line_p(3));
syg_2_front_p <= syg_2_del_line_p(2) and not(syg_2_del_line_p(3));
syg_1_front_n <= syg_2_del_line_n(2) and not(syg_2_del_line_n(3));
syg_2_front_n <= syg_2_del_line_n(2) and not(syg_2_del_line_n(3));


process (100meg) --stroby
begin
if (100meg'event and 100meg = '1') --polog front
then
if syg_1_front_n = '1' and syg_2_front_n = '1'
then
signal strob_1 <= '1';
else
signal strob_1 <= '0';
end if;

if syg_1_front_p = '1' and syg_2_front_n = '1'
then
signal strob_3 <= '1';
else
signal strob_3 <= '0';
end if;

if syg_1_front_n = '1' and syg_2_front_p = '1'
then
signal strob_4 <= '1';
else
signal strob_4 <= '0';
end if;

end if;
end process ;

process (100meg) --stroby
begin
if (100meg'event and 100meg = '0') --neg front
then
if syg_1_front_p = '1' and syg_2_front_p = '1'
then
signal strob_2 <= '1';
else
signal strob_2 <= '0';
end if;

if syg_1_front_p = '1' and syg_2_front_n = '1'
then
signal strob_5 <= '1';
else
signal strob_5 <= '0';
end if;

if syg_1_front_n = '1' and syg_2_front_p = '1'
then
signal strob_6 <= '1';
else
signal strob_6 <= '0';
end if;
end if;
end process ;


END system_architecture;
lex_84
Спасибо!!! smile.gif Даст ист фантастиш!!! 08.gif
Судя по диаграмме то что надо! a14.gif
Попробую повторить в Либеро и Моделсиме
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.