Jump to content

    

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

Всем здравствуйте, подскажите как то можно побороть это явление, детектор фронтов иногда сваливается в неопределенное состояние, от чего все остальное в моем коде криво работает. Входной сигнал синхронизируется в сдвиговом регистре и с этого же регистра сигнал снимается на детектор фронтов. На картинке 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

Edited by Nikolas72_91

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 часа назад, Nikolas72_91 сказал:

 

 

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

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

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

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

Share this post


Link to post
Share on other sites
12 минут назад, Plain сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, Nikolas72_91 сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
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;  

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
6 minutes ago, Nikolas72_91 said:

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

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

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

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

 

Share this post


Link to post
Share on other sites
2 минуты назад, Volkov сказал:

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

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


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

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

 

Share this post


Link to post
Share on other sites
31 минуту назад, Nikolas72_91 сказал:

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

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

Share this post


Link to post
Share on other sites
1 минуту назад, Plain сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
1 минуту назад, Plain сказал:

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this