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

Подсчет длительности импульса на VHDL

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

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


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

Счетчик с разрешением счета. Сбрасываем счетчик по переднему фронту приходящего импульса, регистрируем событие по заднему.

Как-то так:

 

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

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

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


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

10 часов назад, lbvf336 сказал:

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

1. Определяем какая точность измерения нам нужна.

2. Переносим сигнал в рабочий домен.

3. Описываем цифровой счётчик, с требуемой разрядностью.

4. Сигнал, длительность которого надо измерить, выступает в качестве сигнала сброса счетчика. Сигнала нет - сбрасываем счетчик. Сигнал есть- счётчик считает. Значение счетчика в момент, когда он сбрасывается это и будет длительность сигнала.

5. Точность измерения плюс-минус 1..2 такта частоты тактирования счётчика. 

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


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

Советую отзнакомится с понятием Time to Digital Converter. Обычного частотного счётя скорее всего будет недостаточно т.к. даже на 200 МГц это погрешность в ~3м

Хотя если такой точности достаточно - то пожалуйста, пишите обычный счётчик

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


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

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

Обычного частотного счётя скорее всего будет недостаточно т.к. даже на 200 МГц это погрешность в ~3м

Скорость звука со скоростью света не попутали часом?:)))

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


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

29 minutes ago, Самурай said:

Скорость звука со скоростью света не попутали часом?:)))

А да, точно. Спасибо. Но всё равно ошибка будет значительная... В некоторых диапазонах)

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


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

-- 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: пример (здесь еще есть нюансы - поддержка платы этого варианта)

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


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

Решение зависит от количества бит, выдаваемых датчиком, один или много.

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


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

11 часов назад, Flip-fl0p сказал:

 

5. Точность измерения плюс-минус 1..2 такта частоты тактирования счётчика. 

Два откуда? Плюс-минус один :unknw:

 

13 часов назад, vitzap сказал:

 

reg [15:0] count;

wire rise_imp, fall_imp;

...

always @(posedge clk)

Просили на vhdl

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


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

5 часов назад, MrGalaxy сказал:

Два откуда? Плюс-минус один :unknw:

 

Просили на vhdl

Если у строба сигнал с пологими фронтами - то может и поболее :biggrin:

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


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

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

Если у строба сигнал с пологими фронтами - то может и поболее :biggrin:

Так и думал, что Вы это скажете)) :smile:

Я имел в виду методическую погрешность самой цифровой части уже внутри ПЛИС. А так да, пологие фронты, зашумлённый сигнал дадут свой вклад в точность измерения.

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


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

11 часов назад, MrGalaxy сказал:

Так и думал, что Вы это скажете)) :smile:

Я имел в виду методическую погрешность самой цифровой части уже внутри ПЛИС. А так да, пологие фронты, зашумлённый сигнал дадут свой вклад в точность измерения.

Внутри плис - плюс минус один такт. От этого не уйти никуда)

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


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

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

Внутри плис - плюс минус один такт. От этого не уйти никуда)

Так я это и сказал))

А вообще говоря,  ИМХО, можно извратиться и считать двумя счётчиками, тактируемыми одним сигналом по положительному и отрицательному перепадам и суммировать результаты. Будет точнее, чем плюс-минус один такт.

Пишу ИМХО, потому что в железе пока не опробовал, только отсимулировал.

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


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

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

3 hours ago, MrGalaxy said:

А вообще говоря,  ИМХО, можно извратиться и считать двумя счётчиками, тактируемыми одним сигналом по положительному и отрицательному перепадам

Можно и так. И даже будет достаточно один счетчик на одном фронте и пара триггеров на другом.  Но это просто  эквивалентно увеличению тактовой в 2 раза. 
 

Удачи! Rob.

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


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

6 часов назад, RobFPGA сказал:

эквивалентно увеличению тактовой в 2 раза. 

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

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


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

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

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

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

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

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

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

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

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

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