lbvf336 0 28 октября, 2021 Опубликовано 28 октября, 2021 · Жалоба Здравствуйте. Возникла некоторая проблема: Есть сигнал, приходящий с ультразвукового датчика определенной длительностью в зависимости от расстояния до цели. Каким образом можно реализовать подсчет данной длительности для дальнейшего расчета расстояния? Возможно это и не проблема для многих разбирающихся, но я только начинаю осваивать данный язык, поэтому кто может, подскажите, пожалуйста, как это можно реализовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitzap 0 29 октября, 2021 Опубликовано 29 октября, 2021 (изменено) · Жалоба Счетчик с разрешением счета. Сбрасываем счетчик по переднему фронту приходящего импульса, регистрируем событие по заднему. Как-то так: input imp; input clk; output reg [15:0] result; reg imp_rg; reg imp_rg2; reg [15:0] count; wire rise_imp, fall_imp; assign rise_imp = imp_rg & ~imp_rg2; assign fall_imp = ~imp_rg & imp_rg2; always @(posedge clk) begin imp_rg <= imp; imp_rg2 <= imp_rg; if (rise_imp) count <= 0; else if (imp_rg) count <= count+1'b1; if (fall_imp) result <= count; end Изменено 29 октября, 2021 пользователем vitzap Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба 10 часов назад, lbvf336 сказал: Здравствуйте. Возникла некоторая проблема: Есть сигнал, приходящий с ультразвукового датчика определенной длительностью в зависимости от расстояния до цели. Каким образом можно реализовать подсчет данной длительности для дальнейшего расчета расстояния? Возможно это и не проблема для многих разбирающихся, но я только начинаю осваивать данный язык, поэтому кто может, подскажите, пожалуйста, как это можно реализовать. 1. Определяем какая точность измерения нам нужна. 2. Переносим сигнал в рабочий домен. 3. Описываем цифровой счётчик, с требуемой разрядностью. 4. Сигнал, длительность которого надо измерить, выступает в качестве сигнала сброса счетчика. Сигнала нет - сбрасываем счетчик. Сигнал есть- счётчик считает. Значение счетчика в момент, когда он сбрасывается это и будет длительность сигнала. 5. Точность измерения плюс-минус 1..2 такта частоты тактирования счётчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба Советую отзнакомится с понятием Time to Digital Converter. Обычного частотного счётя скорее всего будет недостаточно т.к. даже на 200 МГц это погрешность в ~3м Хотя если такой точности достаточно - то пожалуйста, пишите обычный счётчик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба 1 час назад, Nick_K сказал: Обычного частотного счётя скорее всего будет недостаточно т.к. даже на 200 МГц это погрешность в ~3м Скорость звука со скоростью света не попутали часом?:))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба 29 minutes ago, Самурай said: Скорость звука со скоростью света не попутали часом?:))) А да, точно. Спасибо. Но всё равно ошибка будет значительная... В некоторых диапазонах) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба -- Measure the pulse length library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity pulse_len_measure is generic ( N : integer:=8); port ( i_clk : in std_logic; i_rstb : in std_logic; i_input : in std_logic; o_pulse_len_hi : out std_logic_vector(N-1 downto 0); o_pulse_len_lo : out std_logic_vector(N-1 downto 0)); end pulse_len_measure; architecture rtl of pulse_len_measure is constant C_MAX_COUNT : unsigned(N-1 downto 0):=(others=>'1'); signal r_count_hi_ena : std_logic; signal r_count_hi : unsigned(N-1 downto 0); signal r_count_lo : unsigned(N-1 downto 0); signal r_count_lo_ena : std_logic; signal r_rise : std_logic; signal r_fall : std_logic; signal p_input : std_logic_vector(0 to 2); -- input pipe begin p_edge_detector : process(i_clk,i_rstb) begin if(i_rstb='0') then r_rise <= '0'; r_fall <= '0'; p_input <= (others=>'0'); elsif(rising_edge(i_clk)) then r_rise <= not p_input(2) and p_input(1); r_fall <= not p_input(1) and p_input(2); p_input <= i_input&p_input(0 to p_input'length-2); end if; end process p_edge_detector; p_count_hi : process(i_clk,i_rstb) begin if(i_rstb='0') then r_count_hi_ena <= '0'; r_count_hi <= to_unsigned(1,N); o_pulse_len_hi <= (others=>'0'); elsif(rising_edge(i_clk)) then if(r_rise='1') then r_count_hi_ena <= '1'; elsif(r_fall='1') then r_count_hi_ena <= '0'; o_pulse_len_hi <= std_logic_vector(r_count_hi); end if; if(r_count_hi_ena='1') then if(r_count_hi<C_MAX_COUNT)then r_count_hi <= r_count_hi + 1; end if; else r_count_hi <= to_unsigned(1,N); end if; end if; end process p_count_hi; p_count_lo : process(i_clk,i_rstb) begin if(i_rstb='0') then r_count_lo_ena <= '0'; r_count_lo <= to_unsigned(1,N); o_pulse_len_lo <= (others=>'0'); elsif(rising_edge(i_clk)) then if(r_fall='1') then r_count_lo_ena <= '1'; elsif(r_rise='1') then r_count_lo_ena <= '0'; o_pulse_len_lo <= std_logic_vector(r_count_lo); end if; if(r_count_lo_ena='1') then if(r_count_lo<C_MAX_COUNT) then r_count_lo <= r_count_lo + 1; end if; else r_count_lo <= to_unsigned(1,N); end if; end if; end process p_count_lo; end rtl; как тут правильно писал Nick_K лучше это делать с помощью PLL но так как Вы новичок в FPGA то попробуйте вначале менее точное измерение и проверьте в работе, а потом уже поменяете... ниже пример с применением PLL: пример (здесь еще есть нюансы - поддержка платы этого варианта) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба Решение зависит от количества бит, выдаваемых датчиком, один или много. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба 11 часов назад, Flip-fl0p сказал: 5. Точность измерения плюс-минус 1..2 такта частоты тактирования счётчика. Два откуда? Плюс-минус один 13 часов назад, vitzap сказал: reg [15:0] count; wire rise_imp, fall_imp; ... always @(posedge clk) Просили на vhdl Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 29 октября, 2021 Опубликовано 29 октября, 2021 · Жалоба 5 часов назад, MrGalaxy сказал: Два откуда? Плюс-минус один Просили на vhdl Если у строба сигнал с пологими фронтами - то может и поболее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 30 октября, 2021 Опубликовано 30 октября, 2021 · Жалоба 4 часа назад, Flip-fl0p сказал: Если у строба сигнал с пологими фронтами - то может и поболее Так и думал, что Вы это скажете)) Я имел в виду методическую погрешность самой цифровой части уже внутри ПЛИС. А так да, пологие фронты, зашумлённый сигнал дадут свой вклад в точность измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 30 октября, 2021 Опубликовано 30 октября, 2021 · Жалоба 11 часов назад, MrGalaxy сказал: Так и думал, что Вы это скажете)) Я имел в виду методическую погрешность самой цифровой части уже внутри ПЛИС. А так да, пологие фронты, зашумлённый сигнал дадут свой вклад в точность измерения. Внутри плис - плюс минус один такт. От этого не уйти никуда) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 30 октября, 2021 Опубликовано 30 октября, 2021 · Жалоба 2 часа назад, Flip-fl0p сказал: Внутри плис - плюс минус один такт. От этого не уйти никуда) Так я это и сказал)) А вообще говоря, ИМХО, можно извратиться и считать двумя счётчиками, тактируемыми одним сигналом по положительному и отрицательному перепадам и суммировать результаты. Будет точнее, чем плюс-минус один такт. Пишу ИМХО, потому что в железе пока не опробовал, только отсимулировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 30 октября, 2021 Опубликовано 30 октября, 2021 · Жалоба Приветствую. 3 hours ago, MrGalaxy said: А вообще говоря, ИМХО, можно извратиться и считать двумя счётчиками, тактируемыми одним сигналом по положительному и отрицательному перепадам Можно и так. И даже будет достаточно один счетчик на одном фронте и пара триггеров на другом. Но это просто эквивалентно увеличению тактовой в 2 раза. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrGalaxy 9 31 октября, 2021 Опубликовано 31 октября, 2021 · Жалоба 6 часов назад, RobFPGA сказал: эквивалентно увеличению тактовой в 2 раза. Угу, бывает когда тактовую увеличить нельзя, поэтому такая маленькая хитрость бедного инженера)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться