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

Измерение длительности полупериодов

1 hour ago, Nikolas72_91 said:

автогенератор и еще большие задержки в схеме это уже работа не на пике резонансной кривой а на ее уклоне

Сравните полосу пропускания сигнала обратной связи Вашего автогенератора (при его частоте около 300 кГц, вангую, она будет в лучшем случае на порядок меньше, если не на два) с задержкой в ПЛИС при ее тактовой частоте 48 МГц...

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


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

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

Я ответил что нужно сделать чтобы их не было вовсе.

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

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


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

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

Тогда поправка — сравнивать с константами счётчик, а в регистр переписывать уже нужные события. Итого, задержка на всё — один такт, 20 нс.

Вот тут я не могу понять как правильно сделать. Если сравнивать с константой по нижней частоте то тут все просто в процессе счета. При значении счетчика больше константы это по нижней частоте. А как быть по верхней частоте? Там же если там же значение константы будет меньшее, как реагировать на это сообщение я не понимаю или тут надо вычитающий счетчик использовать, чтобы считал в обратную сторону, я вот в этом плане не догоняю как тут реализовать.

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

Сравните полосу пропускания сигнала обратной связи Вашего автогенератора (при его частоте около 300 кГц, вангую, она будет в лучшем случае на порядок меньше, если не на два) с задержкой в ПЛИС при ее тактовой частоте 48 МГц...

Если задержать на 2 такта в плане синхронизации с клоком то тут не страшно или ввести в клоковый домен. А если 10 тактов то это черезчур.

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


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

Приветствую!

Фактически вам нужно сделать в FPGA генератор генерирующий сигнал с максимальными периодом (максимальное время)  и синхронизируемый фронтами внешнего сигнала.  При чем после синхронизация с фронтом запускается таймер блокировки (минимальное время) синхронизации для следующего фронта.  

Удачи! Rob.   

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


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

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

не могу понять как правильно сделать

Вышеописанная схема размером в три строки кода выдаёт с задержкой 20 нс в выходной регистр двухбитный результат выхода очередного периода её входного сигнала за нижний или верхний пределы соответственно, либо, что куда вероятнее, может сразу совершать по этому результату следующие последствия, т.е. с задержкой ноль, потому что ТЗ мы так и не увидели, но вообще, резонансные БП человечество делает уже больше века, и до сих пор безо всяких там игр с ПЛИС, сейчас в среднем на десятке деталек в сумме 100 рублей.

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


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

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

Вышеописанная схема размером в три строки кода выдаёт с задержкой 20 нс в выходной регистр двухбитный результат выхода очередного периода её входного сигнала за нижний или верхний пределы соответственно, либо, что куда вероятнее, может сразу совершать по этому результату следующие последствия, т.е. с задержкой ноль, потому что ТЗ мы так и не увидели, но вообще, резонансные БП человечество делает уже больше века, и до сих пор безо всяких там игр с ПЛИС, сейчас в среднем на десятке деталек в сумме 100 рублей.

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

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


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

Вот выкладываю код модуля самого измерителя с функцией сравнения с диапазонами сравнения

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


entity PULSE_MEASHURE is
generic (
  N                           : integer:=511;         -- Размерность счетчика
  FREQ_CLK	                  : natural := 48000000;  -- Тактовая частота плис (Hz)
  MAX_FREQ_PERIOD             : natural := 280000;    -- Максимальная частота измеряемого при котором переключается на генератор (Hz)
  MIN_FREQ_PERIOD             : natural := 230000     -- Минимальная частота пропускаемого измеряемого периода (Hz)
  );
port (
  clk                         : in  std_logic;        -- порты входа выхода
  RESET                       : in  std_logic;        -- сигнал сброса и выключения
  SIGNAL_IN                   : in  std_logic;        -- измеряемый сигнал, измеряется каждый полупериод
  Period                      : out integer;          -- вывод числа тиков измеренного каждого полупериода
  SWITCH                      : out std_logic;         -- сигнал переключения на генератор
  RESET_OUT                   : out std_logic
     );
end PULSE_MEASHURE;

architecture Behavioral of PULSE_MEASHURE is

signal r_count_hi                         : integer range 0 to N := 0;
signal r_count_lo                         : integer range 0 to N := 0;
signal len_pulse                          : integer range 0 to N := 0;
signal r_count_hi_ena                     : std_logic;
signal r_count_lo_ena                     : std_logic;
signal r_rise                             : std_logic;
signal r_fall                             : std_logic;
signal r0_input                           : std_logic;
signal r1_input                           : std_logic;
signal r2_input                           : std_logic;
signal SWITCH_OUT                         : std_logic;
signal LOW_FREQ                           : std_logic;

begin

edge_detector : process(clk,RESET)     -- детектор фронтов вырабатывает короткие импульсы равные 2 периода клока 

begin
    if(RESET='0') then
    r0_input           <= '0';
    r1_input           <= '0';
	 r2_input           <= '0';
	 r_rise             <= '0';
	 r_fall             <= '0';
  elsif(rising_edge(clk)) then
    r0_input           <= SIGNAL_IN;        --     __________-------_________   измеряемый сигнал 

    r1_input           <= r0_input;
	 r2_input           <= r1_input;
  end if;
  	 r_rise <=  r0_input and not r2_input;   --    ___________п_______________    выдает короткий импульс равный 2 такта по возрастающему фронту
	 r_fall <=  r2_input and not r0_input;   --    __________________п________          выдает короткий импульс равный 2 такта по возрастающему фронту

end process edge_detector;

 
pulse_counter : process(clk,RESET)
begin
  if(RESET='0') then        -- обнуление всех сигналов и счетчиков при 0 сигнала Reset
    r_count_hi_ena  <= '0';
	 r_count_lo_ena  <= '0';
    r_count_hi      <= 0;
	 r_count_lo      <= 0;
    len_pulse  <= 0;
  elsif(rising_edge(clk)) then      -- установка сигналов запуска счетчиков и остановки 
    if(r_rise='1') then
      r_count_hi_ena  <= '1';
		r_count_lo_ena  <= '0';
		len_pulse  <= r_count_lo;     -- запись в регистр хранения данных счетчика низкого уровня сигнала
    elsif(r_fall='1') then          -- установка сигналов запуска счетчиков и остановки 
      r_count_hi_ena  <= '0';
		r_count_lo_ena  <= '1';      
      len_pulse  <= r_count_hi;     -- запись в регистр хранения данных счетчика высокого уровня сигнала
    end if;

    if(r_count_hi_ena='1') then
        r_count_hi <= r_count_hi + 1;
	 elsif(r_count_hi_ena='0') then
	    r_count_hi <= 0;
		 end if;
    if(r_count_lo_ena='1') then
        r_count_lo <= r_count_lo + 1;
	 elsif(r_count_lo_ena='0') then
        r_count_lo <= 0;
    end if;		
  end if;
end process pulse_counter;


compare: process(RESET, clk)    
begin                                                                   

if(RESET='0') then                          -- проверка сигнала по верхнему диапазону
		SWITCH_OUT <= '0';
	elsif (rising_edge(clk)) then
	 if (len_pulse < (FREQ_CLK/(2*MAX_FREQ_PERIOD)) and (len_pulse > 1 )) then
	   SWITCH_OUT <= '1';
	end if;
end if;


if(RESET='0') then                           -- проверка сигнала по нижнему диапазону
	elsif (rising_edge(clk)) then
	 if (len_pulse > (FREQ_CLK/(2*MIN_FREQ_PERIOD)) and len_pulse < N) then
	   LOW_FREQ <= '1';
	end if;
end if;

end process compare;


SWITCH <= SWITCH_OUT; 
RESET_OUT<= RESET and not LOW_FREQ;
Period <= len_pulse;
	
end Behavioral;

 

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


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

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

Вот выкладываю

К чему нам ещё одна асинхронная простыня — вам все участники сказали, что это неработоспособно.

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


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

4 часа назад, Plain сказал:

К чему нам ещё одна асинхронная простыня — вам все участники сказали, что это неработоспособно.

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

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


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

Так Вы попробуйте сделать по всем правилам. При этом выдавать сигналы управления раньше на столько тактов на сколько у Вас задерживаются данные в регистре-синхронизаторе. В итоге погрешность будет примерно 1 такт. А если ещё и частоту внутри ПЛИС поднять на pll, то можно добиться глитча существенно меньше 20 нс. Фактически точность измерения определяют крутизна фронта измеряемого сигнала и частота измерения.

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


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

1 час назад, Flip-fl0p сказал:

Так Вы попробуйте сделать по всем правилам. При этом выдавать сигналы управления раньше на столько тактов на сколько у Вас задерживаются данные в регистре-синхронизаторе. В итоге погрешность будет примерно 1 такт. А если ещё и частоту внутри ПЛИС поднять на pll, то можно добиться глитча существенно меньше 20 нс. Фактически точность измерения определяют крутизна фронта измеряемого сигнала и частота измерения.

Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32

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


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

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

Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32

Ну так поставьте отдельный кварц тогда. Если мне не изменяет память мах2 может на 300 МГц работать если не включён триггер Шмидта.

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


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

Приветствую!

17 minutes ago, Nikolas72_91 said:

Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32

Удвоить частоту можно и без PLL - задержка на LUT или триггерах и xor.  Но это не изменит все принципиально. 

Удачи! Rob.

 

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


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

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

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

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


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

16 часов назад, Nikolas72_91 сказал:

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

Ну я же просил ТЗ с цифрами допустимой задержки. 

Ну нельзя задерживать так нельзя. Значит по факту узнавания того что последний полупериод не соответствует заданному нужно запускать генератор с того же состояния которое уже стоит на выходе. Что освобождает от глитча. Т.е. если у нас 010 полупериод оказался не в норме и внешний генератор уже перешел на 0 то значит внутренний генератор должен начать генерить с нуля. И соответственно если был полупериод 101 то с единицы.
 

Вот тут я не могу понять как правильно сделать. Если сравнивать с константой по нижней частоте то тут все просто в процессе счета. При значении счетчика больше константы это по нижней частоте. А как быть по верхней частоте? Там же если там же значение константы будет меньшее, как реагировать на это сообщение я не понимаю или тут надо вычитающий счетчик использовать, чтобы считал в обратную сторону, я вот в этом плане не догоняю как тут реализовать.

По верхней проверяется число в счётчике на момент прихода нового фронта.

Цитата

Если задержать на 2 такта в плане синхронизации с клоком то тут не страшно или ввести в клоковый домен. А если 10 тактов то это черезчур.

10 это я написал от балды. Само собой реально будет меньше. Я просто объяснял принцип работы. 

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

Может я думаю. Только это в другой раздел форума. Предлагаю работу называется. А тут можно только научиться самому.

 

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

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


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

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

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

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

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

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

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

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

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

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