Yuri124 1 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 1 hour ago, Nikolas72_91 said: автогенератор и еще большие задержки в схеме это уже работа не на пике резонансной кривой а на ее уклоне Сравните полосу пропускания сигнала обратной связи Вашего автогенератора (при его частоте около 300 кГц, вангую, она будет в лучшем случае на порядок меньше, если не на два) с задержкой в ПЛИС при ее тактовой частоте 48 МГц... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 1 час назад, MegaVolt сказал: Я ответил что нужно сделать чтобы их не было вовсе. Я же говорю, что это автогенератор, задерживать сигнал обратной связи чреват тем, что это уход с резонанса. Как бы такой вариант не канает. Как бы пока сигнал пройдет через все цепи это уже задержка и работа уже не на пике резонансной кривой, а если еще и задержать на 10 тактов то вообще плохо дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 1 час назад, Plain сказал: Тогда поправка — сравнивать с константами счётчик, а в регистр переписывать уже нужные события. Итого, задержка на всё — один такт, 20 нс. Вот тут я не могу понять как правильно сделать. Если сравнивать с константой по нижней частоте то тут все просто в процессе счета. При значении счетчика больше константы это по нижней частоте. А как быть по верхней частоте? Там же если там же значение константы будет меньшее, как реагировать на это сообщение я не понимаю или тут надо вычитающий счетчик использовать, чтобы считал в обратную сторону, я вот в этом плане не догоняю как тут реализовать. 1 час назад, Yuri124 сказал: Сравните полосу пропускания сигнала обратной связи Вашего автогенератора (при его частоте около 300 кГц, вангую, она будет в лучшем случае на порядок меньше, если не на два) с задержкой в ПЛИС при ее тактовой частоте 48 МГц... Если задержать на 2 такта в плане синхронизации с клоком то тут не страшно или ввести в клоковый домен. А если 10 тактов то это черезчур. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба Приветствую! Фактически вам нужно сделать в FPGA генератор генерирующий сигнал с максимальными периодом (максимальное время) и синхронизируемый фронтами внешнего сигнала. При чем после синхронизация с фронтом запускается таймер блокировки (минимальное время) синхронизации для следующего фронта. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 53 минуты назад, Nikolas72_91 сказал: не могу понять как правильно сделать Вышеописанная схема размером в три строки кода выдаёт с задержкой 20 нс в выходной регистр двухбитный результат выхода очередного периода её входного сигнала за нижний или верхний пределы соответственно, либо, что куда вероятнее, может сразу совершать по этому результату следующие последствия, т.е. с задержкой ноль, потому что ТЗ мы так и не увидели, но вообще, резонансные БП человечество делает уже больше века, и до сих пор безо всяких там игр с ПЛИС, сейчас в среднем на десятке деталек в сумме 100 рублей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 15 минут назад, Plain сказал: Вышеописанная схема размером в три строки кода выдаёт с задержкой 20 нс в выходной регистр двухбитный результат выхода очередного периода её входного сигнала за нижний или верхний пределы соответственно, либо, что куда вероятнее, может сразу совершать по этому результату следующие последствия, т.е. с задержкой ноль, потому что ТЗ мы так и не увидели, но вообще, резонансные БП человечество делает уже больше века, и до сих пор безо всяких там игр с ПЛИС, сейчас в среднем на десятке деталек в сумме 100 рублей. Как я описал это автогенератор с очень низкой добротностью и он легко сваливается в гармоники от которых надо избавиться на время, для этого и нужно анализировать каждый полупериод и если что не так вернуть его на путь истинный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба Вот выкладываю код модуля самого измерителя с функцией сравнения с диапазонами сравнения 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 12 февраля, 2019 Опубликовано 12 февраля, 2019 · Жалоба 2 часа назад, Nikolas72_91 сказал: Вот выкладываю К чему нам ещё одна асинхронная простыня — вам все участники сказали, что это неработоспособно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба 4 часа назад, Plain сказал: К чему нам ещё одна асинхронная простыня — вам все участники сказали, что это неработоспособно. Может тогда кто нибудь переписать правильно и чтобы это работало все синхронно и реагировало за 1 такт раз сказали, что за 1 такт все будет успевать, а то я думаю даже если я это перепишу на основе рекомендации, то опять, что нибудь асинхронное получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба Так Вы попробуйте сделать по всем правилам. При этом выдавать сигналы управления раньше на столько тактов на сколько у Вас задерживаются данные в регистре-синхронизаторе. В итоге погрешность будет примерно 1 такт. А если ещё и частоту внутри ПЛИС поднять на pll, то можно добиться глитча существенно меньше 20 нс. Фактически точность измерения определяют крутизна фронта измеряемого сигнала и частота измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikolas72_91 0 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба 1 час назад, Flip-fl0p сказал: Так Вы попробуйте сделать по всем правилам. При этом выдавать сигналы управления раньше на столько тактов на сколько у Вас задерживаются данные в регистре-синхронизаторе. В итоге погрешность будет примерно 1 такт. А если ещё и частоту внутри ПЛИС поднять на pll, то можно добиться глитча существенно меньше 20 нс. Фактически точность измерения определяют крутизна фронта измеряемого сигнала и частота измерения. Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба 14 минут назад, Nikolas72_91 сказал: Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32 Ну так поставьте отдельный кварц тогда. Если мне не изменяет память мах2 может на 300 МГц работать если не включён триггер Шмидта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба Приветствую! 17 minutes ago, Nikolas72_91 said: Ну в MAXII нет pll но я и так повысил частоту до 48 вместо 24 выше уже не выйдет плис тактируется от мк stm32 Удвоить частоту можно и без PLL - задержка на LUT или триггерах и xor. Но это не изменит все принципиально. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба А если сделать выход на управление мощным ключом с задержкой на период работы этого нестабильного генератора? Если он сбился - просто пустить повтор последнего правильного импульса до тех пор, пока автогенератор не придет в норму. Если посмотреть схему обычного аналогового резонансного преобразователя, работающего на сотне-другой килогерц, то обратная связь по выходному напряжению довольно медленная, хорошо, если полоса пропускания канала десяток килогерц - поэтому такую задержку на период можно считать несущественной Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 25 13 февраля, 2019 Опубликовано 13 февраля, 2019 · Жалоба 16 часов назад, Nikolas72_91 сказал: Я же говорю, что это автогенератор, задерживать сигнал обратной связи чреват тем, что это уход с резонанса. Как бы такой вариант не канает. Как бы пока сигнал пройдет через все цепи это уже задержка и работа уже не на пике резонансной кривой, а если еще и задержать на 10 тактов то вообще плохо дело. Ну я же просил ТЗ с цифрами допустимой задержки. Ну нельзя задерживать так нельзя. Значит по факту узнавания того что последний полупериод не соответствует заданному нужно запускать генератор с того же состояния которое уже стоит на выходе. Что освобождает от глитча. Т.е. если у нас 010 полупериод оказался не в норме и внешний генератор уже перешел на 0 то значит внутренний генератор должен начать генерить с нуля. И соответственно если был полупериод 101 то с единицы. Вот тут я не могу понять как правильно сделать. Если сравнивать с константой по нижней частоте то тут все просто в процессе счета. При значении счетчика больше константы это по нижней частоте. А как быть по верхней частоте? Там же если там же значение константы будет меньшее, как реагировать на это сообщение я не понимаю или тут надо вычитающий счетчик использовать, чтобы считал в обратную сторону, я вот в этом плане не догоняю как тут реализовать. По верхней проверяется число в счётчике на момент прихода нового фронта. Цитата Если задержать на 2 такта в плане синхронизации с клоком то тут не страшно или ввести в клоковый домен. А если 10 тактов то это черезчур. 10 это я написал от балды. Само собой реально будет меньше. Я просто объяснял принцип работы. Может тогда кто нибудь переписать правильно и чтобы это работало все синхронно и реагировало за 1 такт раз сказали, что за 1 такт все будет успевать, а то я думаю даже если я это перепишу на основе рекомендации, то опять, что нибудь асинхронное получится. Может я думаю. Только это в другой раздел форума. Предлагаю работу называется. А тут можно только научиться самому. Хотя мне очень интересно как у вас сделан обратный переход с внутреннего клока на внешний. Там же как то нужно фронты синхронизировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться