реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Задержка, VHDL
Maverick
сообщение Oct 27 2008, 07:13
Сообщение #1


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



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

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


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Victor®
сообщение Oct 27 2008, 10:00
Сообщение #2


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Maverick @ Oct 27 2008, 10:13) *
Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача:
Приходит из вне команда, но это команда на схему поступает через определенную задержку(изначально известную) во времени. Другими словами счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды.

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


Привет!
Берем счетчик с разрешением счета + компаратор.
Выход компаратора на вход разрешения счета.
Сигнал "команда" подавать на синхронный сброс счетчика.
Но предварительно сигнал "команда" синхронизировать с частотой счетчика.

Работает так (например, компаратор на "5").
По приходу "команда" счетчик сбрасывается в "0" - компаратор дает "0",
"0" поступает на вход разрешения счета (активно-низкий). Счетчик считает...
как только на выходах счетчика появляется "5" - на выходе компаратора появляется "1" - счет запрещается до поступления нового сигнала "команда".

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


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Oct 27 2008, 12:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Если нужна задержка на заранее известное число тактов, то можно вот так сделать
Код
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;
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 27 2008, 13:11
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Mad_max @ Oct 27 2008, 16:34) *
Если нужна задержка на заранее известное число тактов, то можно вот так сделать
А какой цимис описывать сдвиговый регистр на библиотечных примитивах? RTL-коде гораздо нагляднее.
Go to the top of the page
 
+Quote Post
kost_
сообщение Oct 27 2008, 23:18
Сообщение #5





Группа: Новичок
Сообщений: 11
Регистрация: 31-08-05
Пользователь №: 8 117



Цитата(Maverick @ Oct 27 2008, 11:13) *
счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды.

Я обычно делаю так:
задаю счетчик на один разряд больше чем нужно для пересчета тактов задержки;
в исходном состоянии старший разряд счетчика = 1;
старший разряд с инверсией соединяется с входом count_enable;
счетчик считает с декрементом;
по приходу команды в счетчик загружается (число тактов задержки - 1) и старший разряд падает в "0" > count_enable = "1";
счетчик отсчитывает в обратном порядке N тактов задержки, после чего старший разряд переходит в "1" и счетчик останавливается.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Oct 28 2008, 10:58
Сообщение #6


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Victor® @ Oct 27 2008, 14:00) *
Привет!
Берем счетчик с разрешением счета + компаратор.
Выход компаратора на вход разрешения счета.
Сигнал "команда" подавать на синхронный сброс счетчика.
Но предварительно сигнал "команда" синхронизировать с частотой счетчика.

Работает так (например, компаратор на "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;


Цитата(kost_ @ Oct 28 2008, 03:18) *
Я обычно делаю так:
задаю счетчик на один разряд больше чем нужно для пересчета тактов задержки;
в исходном состоянии старший разряд счетчика = 1;
старший разряд с инверсией соединяется с входом count_enable;
счетчик считает с декрементом;
по приходу команды в счетчик загружается (число тактов задержки - 1) и старший разряд падает в "0" > count_enable = "1";
счетчик отсчитывает в обратном порядке N тактов задержки, после чего старший разряд переходит в "1" и счетчик останавливается.


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


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


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
koltz
сообщение Nov 6 2008, 14:37
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 19-11-06
Пользователь №: 22 494



Цитата(Maverick @ Oct 27 2008, 11:13) *
Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача:
Приходит из вне команда, но это команда на схему поступает через определенную задержку(изначально известную) во времени. Другими словами счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды.

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


я бы делал с помощью автомата, просто и наглядно
и видны состояния во время тестов,
Go to the top of the page
 
+Quote Post
Maverick
сообщение Nov 7 2008, 06:05
Сообщение #8


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(koltz @ Nov 6 2008, 18:37) *
я бы делал с помощью автомата, просто и наглядно
и видны состояния во время тестов,


А примерчик привести слабо smile.gif wink.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
skilful
сообщение Nov 13 2008, 18:32
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



Цитата(Maverick @ Nov 7 2008, 09:05) *
А примерчик привести слабо smile.gif wink.gif



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;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th May 2024 - 15:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016