Jump to content

    

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

Recommended Posts

lbvf336

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

Share this post


Link to post
Share on other sites

vitzap

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

Как-то так:

 

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

Edited by vitzap

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Nick_K

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

 

reg [15:0] count;

wire rise_imp, fall_imp;

...

always @(posedge clk)

Просили на vhdl

Share this post


Link to post
Share on other sites

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

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

 

Просили на vhdl

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

RobFPGA

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

3 hours ago, MrGalaxy said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.