Alexandr 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Необходимо: на вход элемента приходит фронт (передний или задний) сигнала. На выходе должен появиться импульс, длительностью ну пусть хотя бы в 4 такта синхросигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Необходимо: на вход элемента приходит фронт (передний или задний) сигнала. На выходе должен появиться импульс, длительностью ну пусть хотя бы в 4 такта синхросигнала. <{POST_SNAPBACK}> Самое банальное счетчик и RS тригер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex_k 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Может это сложное и не правильное решение. Но мне кажется, что можно так: signal clk : std_logic := '0'; signal start : std_logic := '0'; signal out_imp_tick0 : std_logic := '0'; signal out_imp_tick1 : std_logic := '0'; signal out_imp_tick2 : std_logic := '0'; signal out_imp_tick3 : std_logic := '0'; signal out_imp : std_logic; -- определяем начало по необходимому фронту process(start) begin if start'event and start='1' then out_imp_tick0<='1'; end if; end process; -- делаем линию задержки на необходимое число clk process(clk) begin if clk'event and clk='1' then out_imp_tick3 <= out_imp_tick2; out_imp_tick2 <= out_imp_tick1; out_imp_tick1 <= out_imp_tick0; end if; end process; -- формируем выходной импульс out_imp <= (out_imp_tick0 and (not out_imp_tick3)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба To alex_k: в принципе работать будет, но только для первого фронта. На последующие приходящие фронты реакции уже не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Необходимо: на вход элемента приходит фронт (передний или задний) сигнала. На выходе должен появиться импульс, длительностью ну пусть хотя бы в 4 такта синхросигнала. <{POST_SNAPBACK}> Используй стейт-машину, например вот так : -- ********** Выделение переднего фронта сигнала ********** library ieee; use ieee.STD_logic_1164.ALL; entity rize_fsm is port(clk : in std_logic; rst : in std_logic; inp : in std_logic; outp : out std_logic ); end rize_fsm; architecture behavior of rize_fsm is type state_type is (S0, S1, S2, S3); signal curr_state : state_type := S0; signal next_state : state_type := S0; begin comb: process(curr_state, inp) begin case curr_state is when S0 => outp <= '0'; if(inp = '0') then next_state <= S1; else next_state <= S0; end if; when S1 => outp <= '0'; if(inp = '0') then next_state <= S1; else next_state <= S2; end if; when S2 => outp <= '1'; next_state <= S3; when S3 => outp <= '0'; if(inp = '0') then next_state <= S1; else next_state <= S3; end if; end case; end process comb; sync: process(clk, rst) begin if(clk'event and clk = '1') then if(rst = '0') then curr_state <= S0; else curr_state <= next_state; end if; end if; end process sync; end behavior; В этом примере выходной сигнал получается длительностью в один такт. Растащить его на четыре такта и сделать по аналогии для заднего фронта - думаю справитесь сами :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Необходимо: на вход элемента приходит фронт (передний или задний) сигнала. На выходе должен появиться импульс, длительностью ну пусть хотя бы в 4 такта синхросигнала. <{POST_SNAPBACK}> тут возникает еще дополнительный вопрос синхронизации входного сигнала под клок схемы, если вам нужно точно отбить именно фронт сигнала и то я бы предложил следующую схему module one_shot(q, clk, rst, d); output reg q; input clk; input rst; input d; reg A, B; reg [1:0] counter; always @(posedge clk or negedge rst) begin if (!rst) begin A <= 1'b0; B <= 1'b0; q <= 1'b0; counter <= 2'b00; end A <= d; B <= A; if (A && !B) q <= 1'b1; if (q) counter = counter + 1; if (counter == 2'b11) begin q <= 1'b0; counter <= 2'b00; end end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex_k 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба to Alexandr : Если выходной импульс может быть синхронным по clk, то небольшая переделка сделает схему чуствительной к следующим фронтам : signal clk : std_logic := '0'; signal start : std_logic := '0'; signal out_imp_tick0 : std_logic := '0'; signal out_imp_tick1 : std_logic := '0'; signal out_imp_tick2 : std_logic := '0'; signal out_imp_tick3 : std_logic := '0'; signal out_imp : std_logic; process(clk) begin if clk'event and clk='1' then out_imp_tick0<=start; end if; end process; process(clk) begin if clk'event and clk='1' then out_imp_tick3 <= out_imp_tick2; out_imp_tick2 <= out_imp_tick1; out_imp_tick1 <= out_imp_tick0; end if; end process; out_imp <= (out_imp_tick0 and (not out_imp_tick3)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба тут возникает еще дополнительный вопрос синхронизации входного сигнала под клок схемы ... В стейт-машине синхронизация получается автоматически. Для пущей надежности можно входной сигнал пропустить через два D-триггера, тактируемых системным тактовым сигналом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба В стейт-машине синхронизация получается автоматически. Не знаю, пока еще не сталкивался <_< Для пущей надежности можно входной сигнал пропустить через два D-триггера, тактируемых системным тактовым сигналом. у меня так и сделанно в исходнике, стандартная схема выделения фронта ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Оцените что придумал: vid_frnt: process (clk) variable temp_bit : Std_Logic :='1'; begin if Rising_Edge(CLK)then if inp=temp_bit then outp <='1'; else temp_bit:= not(temp_bit); outp <='0'; end if; end if; end process; inp - вход по которому приходят фронты. Известно, что он изначально стоит в 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuriypro 0 18 марта, 2005 Опубликовано 18 марта, 2005 · Жалоба Все хорошо, только есть одно 'но': http://www.asic-world.com/tidbits/metastablity.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr 0 21 марта, 2005 Опубликовано 21 марта, 2005 · Жалоба Во, смотрите что еще придумал. Реагирует на фронт импульса любой длительности. entity impyls is Port ( frnt : in std_logic; clk : in std_logic; imp : out std_logic:='0'); end impyls; architecture Behavioral of impyls is signal q: std_logic:='0'; signal rst: std_logic:='0'; begin process (frnt,rst) begin if rst = '1' then q <= '0'; elsif rising_edge(frnt) then q <= '1'; end if; end process; process (clk) begin if rising_edge(clk) then imp <= q; rst <= q; end if; end process; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 21 марта, 2005 Опубликовано 21 марта, 2005 · Жалоба Alexandr Посмотрите entity с название synchroniser в файле в utils в проекте miniuart на opencores.org. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pahuchy 0 31 марта, 2005 Опубликовано 31 марта, 2005 · Жалоба Вот простой вариант: module SClock(In, Clk, Out, Pos, Neg); input In, Clk; output reg Out, Pos, Neg; always @(posedge Clk) begin Out <= In; Pos <= ~Out & In; Neg <= Out & ~In; end endmodule Желатьно на входе поставить ещё пару регистров для подавления metastablity. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yra 4 13 апреля, 2005 Опубликовано 13 апреля, 2005 · Жалоба Вот ещё один модуль. Пихаю его повсюду. Длительность импульса на выходе 1 период CLK, причём передний фронт CLK приходится на средину этого импульса /************************************************************************** ****** Модуль, выделяющий положительные фронты из медленной импульной ***** ****** последовательности. ***** **************************************************************************/ module Fronts (input wire CLK,Reset,DIN, output wire PositiveFront, output wire NegativeFront ); reg [1:0] Mem; always @(negedge CLK, posedge Reset)// Сдвиговый регистр if (Reset) Mem = 2'b00; else Mem = {Mem[0], DIN}; assign PositiveFront = ~ Mem[1] & Mem[0]; assign NegativeFront = ~ Mem[0] & Mem[1]; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться