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

Задержка

Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача:

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

 

ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите

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


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

Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача:

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

 

ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите

 

Привет!

Берем счетчик с разрешением счета + компаратор.

Выход компаратора на вход разрешения счета.

Сигнал "команда" подавать на синхронный сброс счетчика.

Но предварительно сигнал "команда" синхронизировать с частотой счетчика.

 

Работает так (например, компаратор на "5").

По приходу "команда" счетчик сбрасывается в "0" - компаратор дает "0",

"0" поступает на вход разрешения счета (активно-низкий). Счетчик считает...

как только на выходах счетчика появляется "5" - на выходе компаратора появляется "1" - счет запрещается до поступления нового сигнала "команда".

 

Надеюсь идея проста.

Успехов.

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


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

Если нужна задержка на заранее известное число тактов, то можно вот так сделать

library IEEE;
use IEEE.std_logic_1164.all;

-- synopsys translate_off 
library VIRTEX2;
-- synopsys translate_on 

entity fddelay2 is
    generic (LONG: natural := 2);
    port (
        CLR: in STD_LOGIC;
        C: in STD_LOGIC;
        CE: in STD_LOGIC;
        INP: in STD_LOGIC;
        OUTP: out STD_LOGIC
    );
end fddelay2;


architecture fddelay2_arch of fddelay2 is

    component FDCE
        port (D, CE, C, CLR: in std_logic;
                Q: out std_logic);
    end component;    
    
-- synopsys translate_off
for FDCE:  FDCE use entity VIRTEX2.FDCE;
-- synopsys translate_on    
    
signal tmp : STD_LOGIC_VECTOR (LONG downto 0);
    
begin
    tmp(0) <= INP;
l1:    for i in 1 to LONG generate
    l2:    FDCE port map (D => tmp(i-1), CE => CE, C => C, CLR => CLR, Q => tmp(i));
    end generate;
    OUTP <= tmp(LONG);

end fddelay2_arch;

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


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

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

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


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

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

Я обычно делаю так:

задаю счетчик на один разряд больше чем нужно для пересчета тактов задержки;

в исходном состоянии старший разряд счетчика = 1;

старший разряд с инверсией соединяется с входом count_enable;

счетчик считает с декрементом;

по приходу команды в счетчик загружается (число тактов задержки - 1) и старший разряд падает в "0" > count_enable = "1";

счетчик отсчитывает в обратном порядке N тактов задержки, после чего старший разряд переходит в "1" и счетчик останавливается.

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


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

Привет!

Берем счетчик с разрешением счета + компаратор.

Выход компаратора на вход разрешения счета.

Сигнал "команда" подавать на синхронный сброс счетчика.

Но предварительно сигнал "команда" синхронизировать с частотой счетчика.

 

Работает так (например, компаратор на "5").

По приходу "команда" счетчик сбрасывается в "0" - компаратор дает "0",

"0" поступает на вход разрешения счета (активно-низкий). Счетчик считает...

как только на выходах счетчика появляется "5" - на выходе компаратора появляется "1" - счет запрещается до поступления нового сигнала "команда".

 

Надеюсь идея проста.

Успехов.

 

Выкладываю рабочий пример на основе подсказки Victor® (может кому-то пригодиться):

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity dalay is
    Port ( clk : in  STD_LOGIC;
           com_in : in  STD_LOGIC;
              count : out std_logic_vector (7  downto 0);  
           com_out : out  STD_LOGIC);
end dalay;

architecture Behavioral of dalay is
signal cnt : std_logic_vector (7  downto 0):= "00000000";
signal en : std_logic;
signal rst : std_logic;
signal reg : std_logic;

begin 

process (clk, com_in)
begin
if (clk'event and clk = '1') then
rst <= com_in;
end if;
end process;

process (clk, en, cnt, rst)
begin
if (rst = '1') then
cnt <= (others => '0');
elsif (clk'event and clk = '1') then
if (en = '1') then
cnt <= cnt + "00000001";
end if;
end if;
count <= cnt;
end process;

process (clk, cnt, en, reg)
begin
if (clk'event and clk = '1') then
if cnt < "10010011" then
en <= '1';
reg <= '0';
else
en <= '0';
reg <= '1';
end if; end if;
com_out <= reg;
end process;

end Behavioral;

 

Я обычно делаю так:

задаю счетчик на один разряд больше чем нужно для пересчета тактов задержки;

в исходном состоянии старший разряд счетчика = 1;

старший разряд с инверсией соединяется с входом count_enable;

счетчик считает с декрементом;

по приходу команды в счетчик загружается (число тактов задержки - 1) и старший разряд падает в "0" > count_enable = "1";

счетчик отсчитывает в обратном порядке N тактов задержки, после чего старший разряд переходит в "1" и счетчик останавливается.

 

Идея красивая. Тоже обязательно реализую и сравню их!

 

 

Всем спасибо, кто откликнулся!!!

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


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

Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача:

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

 

ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите

 

я бы делал с помощью автомата, просто и наглядно

и видны состояния во время тестов,

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


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

я бы делал с помощью автомата, просто и наглядно

и видны состояния во время тестов,

 

А примерчик привести слабо :) ;)

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


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

А примерчик привести слабо :) ;)

 

 

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;

 

 

 

entity cnt_mav is

 

generic

 

(

width_command: integer := 8; --разрядность шины, выделяемой под команду

val_command: integer := 75; --значение команды, при которой запускается счетчик

 

 

width_cnt: integer := 8; --разрядность счетчика

val_cnt: integer := 35 --кол-во тактов, отсчитываемых счетчиком

 

);

 

--активный уровень входных сигналов управления – лог. "1"

 

port

(

reset: in std_logic;

clk: in std_logic;

 

 

command: in std_logic_vector(width_command-1 downto 0); --входная команда

is_command: in std_logic; --"защелкивание" команды

 

--если command = val_command и is_command = '1' запускается счетчик

 

val_counter: out std_logic_vector(width_cnt-1 downto 0 ); --значение счетчика на порт

end_counter: out std_logic --конец работы счетчика. Устанавливается на 1 такт clk

);

 

end cnt_mav;

 

 

 

 

architecture behav of cnt_mav is

 

signal st: integer range 0 to 1;

signal sig_val_counter: std_logic_vector(width_cnt-1 downto 0 );

begin

 

process(reset,clk)

begin

 

if (reset = '1') then

 

sig_val_counter <= (others => '0');

end_counter <= '0';

st <= 0;

 

 

elsif (clk'event and clk = '1') then

 

case st is

 

when 0 =>

end_counter <= '0';

 

if (command = val_command) then

if (is_command = '1') then

st <= st + 1;

end if;

end if;

 

when 1 => sig_val_counter <= sig_val_counter + '1';

 

if (sig_val_counter = (val_cnt-1)) then

 

sig_val_counter <= (others => '0');

end_counter <= '1';

st <= st - 1;

end if;

end case;

 

end if;

end process;

 

 

 

 

val_counter <= sig_val_counter;

 

 

end behav;

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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