Maverick_ 15 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача: Приходит из вне команда, но это команда на схему поступает через определенную задержку(изначально известную) во времени. Другими словами счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды. ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача: Приходит из вне команда, но это команда на схему поступает через определенную задержку(изначально известную) во времени. Другими словами счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды. ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите Привет! Берем счетчик с разрешением счета + компаратор. Выход компаратора на вход разрешения счета. Сигнал "команда" подавать на синхронный сброс счетчика. Но предварительно сигнал "команда" синхронизировать с частотой счетчика. Работает так (например, компаратор на "5"). По приходу "команда" счетчик сбрасывается в "0" - компаратор дает "0", "0" поступает на вход разрешения счета (активно-низкий). Счетчик считает... как только на выходах счетчика появляется "5" - на выходе компаратора появляется "1" - счет запрещается до поступления нового сигнала "команда". Надеюсь идея проста. Успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба Если нужна задержка на заранее известное число тактов, то можно вот так сделать 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба Если нужна задержка на заранее известное число тактов, то можно вот так сделать А какой цимис описывать сдвиговый регистр на библиотечных примитивах? RTL-коде гораздо нагляднее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kost_ 0 27 октября, 2008 Опубликовано 27 октября, 2008 · Жалоба счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды. Я обычно делаю так: задаю счетчик на один разряд больше чем нужно для пересчета тактов задержки; в исходном состоянии старший разряд счетчика = 1; старший разряд с инверсией соединяется с входом count_enable; счетчик считает с декрементом; по приходу команды в счетчик загружается (число тактов задержки - 1) и старший разряд падает в "0" > count_enable = "1"; счетчик отсчитывает в обратном порядке N тактов задержки, после чего старший разряд переходит в "1" и счетчик останавливается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 октября, 2008 Опубликовано 28 октября, 2008 · Жалоба Привет! Берем счетчик с разрешением счета + компаратор. Выход компаратора на вход разрешения счета. Сигнал "команда" подавать на синхронный сброс счетчика. Но предварительно сигнал "команда" синхронизировать с частотой счетчика. Работает так (например, компаратор на "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" и счетчик останавливается. Идея красивая. Тоже обязательно реализую и сравню их! Всем спасибо, кто откликнулся!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koltz 0 6 ноября, 2008 Опубликовано 6 ноября, 2008 · Жалоба Приветствую! Не могу сообразить как на основе счетчика сделать задержку на VHDL. Собственно задача: Приходит из вне команда, но это команда на схему поступает через определенную задержку(изначально известную) во времени. Другими словами счетчик по приходу команды должен отсчитать определенное число импульсов (выдав флаг о выполнении) и остановиться и сброситься в исходное состояние до прихода новой команды. ЗЫ Схемка на первый взгляд элементарная, но чего-то у меня не получается. Пожайлуста помогите или подскажите я бы делал с помощью автомата, просто и наглядно и видны состояния во время тестов, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 ноября, 2008 Опубликовано 7 ноября, 2008 · Жалоба я бы делал с помощью автомата, просто и наглядно и видны состояния во время тестов, А примерчик привести слабо :) ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 13 ноября, 2008 Опубликовано 13 ноября, 2008 · Жалоба А примерчик привести слабо :) ;) 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться