Перейти к содержанию
    

Неопределенное состояние детектора фронтов, как победить?

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

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity edgedetector is

port (
  clk                         : in  std_logic;      
  signal_in                   : in  std_logic;       
  all_edge                    : out  std_logic
	);
end edgedetector;

architecture Behavioral of edgedetector is

signal shift_reg    : std_logic_vector(1 downto 0);

begin
 

edge_detector : process(clk)   
begin
 if(rising_edge(clk)) then
    shift_reg <= shift_reg(0) & signal_in;            
 end if;
end process edge_detector;
    all_edge <=  shift_reg(0) xor shift_reg(1);        
end Behavioral;

 

 

Снимок экрана 2019-04-14 в 12.01.30.png

Изменено пользователем Nikolas72_91

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Nikolas72_91 сказал:

 

 

Описание вполне корректное. Скорее всего задана слишком высокая тактовая частота для симуляции. И поскольку Вы моделируете с учетом задержек, то и результат получается соответствующий.

И измените входной синхронизатор до двух триггеров. 

2 триггера на синхронизатор.

1 триггер на детектор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Plain сказал:

Увеличьте масштаб до видения тактовой.

Вот увеличил, чтобы видно было, тактовая частота 48 МГц.

Снимок экрана 2019-04-14 в 13.02.42.png

4 минуты назад, Flip-fl0p сказал:

Описание вполне корректное. Скорее всего задана слишком высокая тактовая частота для симуляции. И поскольку Вы моделируете с учетом задержек, то и результат получается соответствующий.

Так а как мне симулировать, если в реальном устройстве так же работает с косяками. Поэтому и проверяю с реальными задержками, тактовая частота у меня 48 МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Nikolas72_91 сказал:

Вот увеличил, чтобы видно было, тактовая частота 48 МГц.

Снимок экрана 2019-04-14 в 13.02.42.png

Так а как мне симулировать, если в реальном устройстве так же работает с косяками. Поэтому и проверяю с реальными задержками, тактовая частота у меня 48 МГц.

Обычно симуляция с задержками не нужна. Достаточно провести функциональное моделирование. А правильность работы схемы задается констрейнами. Какие ошибки Вам говорит временной анализатор ?

P.S. Я предпочитаю синхронизатор держать отдельным модулем, с правильными атрибутами синтеза. Т.е отдельно модуль для синхронизации с клоковым доменом, отдельно модуль детектора фронтов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Nikolas72_91 said:

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


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity edgedetector is

port (
  clk                         : in  std_logic;      
  signal_in                   : in  std_logic;       
  all_edge                    : out  std_logic
	);
end edgedetector;

architecture Behavioral of edgedetector is

signal shift_reg    : std_logic_vector(1 downto 0);

begin
 

edge_detector : process(clk)   
begin
 if(rising_edge(clk)) then
    shift_reg <= shift_reg(0) & signal_in;            
 end if;
end process edge_detector;
    all_edge <=  shift_reg(0) xor shift_reg(1);        
end Behavioral;

 

 

Снимок экрана 2019-04-14 в 12.01.30.png

 

shift_reg(1) <= shift_reg(0) & signal_in;  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Volkov сказал:

shift_reg(1) <= shift_reg(0) & signal_in;  

Что это даст? Так вписал вообще ошибку выдает.

9 минут назад, Flip-fl0p сказал:

Обычно симуляция с задержками не нужна. Достаточно провести функциональное моделирование. А правильность работы схемы задается констрейнами. Какие ошибки Вам говорит временной анализатор ?

P.S. Я предпочитаю синхронизатор держать отдельным модулем, с правильными атрибутами синтеза. Т.е отдельно модуль для синхронизации с клоковым доменом, отдельно модуль детектора фронтов...

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

Снимок экрана 2019-04-14 в 13.24.54.png

Снимок экрана 2019-04-14 в 13.25.01.png

Снимок экрана 2019-04-14 в 13.25.30.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, Nikolas72_91 said:

Что это даст? Так вписал вообще ошибку выдает.

Та да, что то я не так читаю конкатанацию.

Определите начальное cостояние регистра 

signal shift_reg    : std_logic_vector(1 downto 0):=(others=>'0');

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Volkov сказал:

Та да, что то я не так читаю конкатанацию.

Определите начальное cостояние регистра 


signal shift_reg    : std_logic_vector(1 downto 0):=(others=>'0');

Да про начальное состояние я забыл, спасибо, но это не решает проблему с неопределнным состоянием.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, Nikolas72_91 сказал:

в реальном устройстве так же работает с косяками

Одно с другим не связано, у Вас выход схемы неоднозначный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Plain сказал:

Одно с другим не связано, у Вас выход схемы неоднозначный.

И что это значит, как быть в этом случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увеличьте длину сдвигового регистра (как предлагали выше). Так, чтобы первые минимум два триггера пересаживали входной сигнал на частоту CLK (борьба с метастабильностью), а дальнейшие триггера - ваш выделитель фронта.

И не забудьте описать констрейнты по частоте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Plain сказал:

Синхронизируйте его.

У меня входной сигнал синхронизируется с клоком с этого же синхронизатора снимаются данные для детектора фронтов. Выход зачем еще синхронизировать то с клоком?

 

Только что, Zig сказал:

Увеличьте длину сдвигового регистра (как предлагали выше). Так, чтобы первые минимум два триггера пересаживали входной сигнал на частоту CLK (борьба с метастабильностью), а дальнейшие триггера - ваш выделитель фронта.

И не забудьте описать констрейнты по частоте.

Скинь пожалуйста где про это можно почитать? Я просто про это вообще не в курсе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот, вообще не понимаю.

Схема выделения фронтов, на плис, при постоянной тактовой и постоянном входном сигнале, и при этом 12 фронтов выделяет а 13-й нет!!!

Как такое может быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...