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

Формирование короткого импульса по фронту

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

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


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

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

Самое банальное счетчик и RS тригер

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


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

Может это сложное и не правильное решение. Но мне кажется, что можно так:

 

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));

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


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

To alex_k:

в принципе работать будет, но только для первого фронта. На последующие приходящие фронты реакции уже не будет.

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


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

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

Используй стейт-машину, например вот так :

 

-- ********** Выделение переднего фронта сигнала **********

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;

 

В этом примере выходной сигнал получается длительностью в один такт.

Растащить его на четыре такта и сделать по аналогии для заднего фронта - думаю справитесь сами :)

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


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

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

тут возникает еще дополнительный вопрос синхронизации входного сигнала под клок схемы, если вам нужно точно отбить именно фронт сигнала и то я бы предложил следующую схему

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

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


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

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));

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


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

тут возникает еще дополнительный вопрос синхронизации входного сигнала под клок схемы  ...

В стейт-машине синхронизация получается автоматически. Для пущей надежности можно входной сигнал пропустить через два D-триггера, тактируемых системным тактовым сигналом.

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


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

В стейт-машине синхронизация получается автоматически.

Не знаю, пока еще не сталкивался <_<

 

Для пущей надежности можно входной сигнал пропустить через два D-триггера, тактируемых системным тактовым сигналом.

у меня так и сделанно в исходнике, стандартная схема выделения фронта ;)

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


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

Оцените что придумал:

 

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.

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


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

Во, смотрите что еще придумал. Реагирует на фронт импульса любой длительности.

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;

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


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

Вот простой вариант:

 

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.

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


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

Вот ещё один модуль. Пихаю его повсюду. Длительность импульса на выходе

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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