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

Защёлкнуть значение счётчика.

Я хочу взять значение счётчика по событию.

L_FIX_TRIG   : in Std_logic; 
R_FIX_TRIG   : in Std_logic; 

CHARGE_MS  : in std_logic_vector(7 downto 0);




signal r_fix_trig1 : std_logic := '0';
signal r_fix_trig2 : std_logic := '0';
signal r_fix_trig3 : std_logic := '0';
signal r_fix_trig4 : std_logic := '0';

signal l_fix_trig1 : std_logic := '0';
signal l_fix_trig2 : std_logic := '0';
signal l_fix_trig3 : std_logic := '0';
signal l_fix_trig4 : std_logic := '0';

signal fix_trig_flag : std_logic_vector(1 downto 0) := "00";

l_fix_trig4 <= not l_fix_trig3 and l_fix_trig2; 
r_fix_trig4 <= not r_fix_trig3 and r_fix_trig2; 

fix_trig_flag <= r_fix_trig4 & l_fix_trig4;

process(REG_CLK)
begin

   if (rising_edge(REG_CLK)) then
	 
        l_fix_trig1 <= L_FIX_TRIG;
        l_fix_trig2 <= l_fix_trig1;
        l_fix_trig3 <= l_fix_trig2;
		  
        r_fix_trig1 <= R_FIX_TRIG;
        r_fix_trig2 <= r_fix_trig1;
        r_fix_trig3 <= r_fix_trig2;

        if (fix_trig_flag = "11") then 
          charge_status <= X"02" & CHARGE_MS;
        end if;

    end if;

end process;

я правильно понимаю что fix_trig_flag = "11" только если L_FIX_TRIG = '1' и R_FIX_TRIG = '1' в одном такте? если между ними несколько тактов fix_trig_flag = "11" не произойдёт?

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


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

1 hour ago, jenya7 said:

я правильно понимаю что fix_trig_flag = "11" только если L_FIX_TRIG = '1' и R_FIX_TRIG = '1' в одном такте? если между ними несколько тактов fix_trig_flag = "11" не произойдёт?

Симуляторы по вам плачут xDDD

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


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

2 minutes ago, nice_vladi said:

Симуляторы по вам плачут xDDD

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

 

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


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

1 minute ago, jenya7 said:

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

Учите булеву алгебру - мать вашу (с). Таблицы истинности булевых функций вам в помощь. 

ЗЫ. И прочитайте любой приличный учебник по цифровой схемотехнике. Их вагон и маленькая тележка на русском. 

 

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


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

Какие симуляторы? Моделирование тут делает карандашиком на листочке бумаги)

Цитата

я правильно понимаю что fix_trig_flag = "11" только если L_FIX_TRIG = '1' и R_FIX_TRIG = '1' в одном такте? если между ними несколько тактов fix_trig_flag = "11" не произойдёт?

Только если передние фронты входных сигналов будут "в одном такте". Так как trig4 есть суть выделение фронта и этот сигнал в 1 устанавливается только на один такт.

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


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

22 hours ago, Longiel said:

Только если передние фронты входных сигналов будут "в одном такте". Так как trig4 есть суть выделение фронта и этот сигнал в 1 устанавливается только на один такт.

спасибо. а как защелкнуть значение счётчика при условии L_FIX_TRIG = '1' и R_FIX_TRIG = '1'? это условие может продолжатся какое то время а мне нужно первый момент.

Изменено пользователем jenya7

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


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

On 2/17/2022 at 8:16 AM, jenya7 said:

спасибо. а как защелкнуть значение счётчика при условии L_FIX_TRIG = '1' и R_FIX_TRIG = '1'? это условие может продолжатся какое то время а мне нужно первый момент.

тогда можно выделить передний фронт импульса (imp ), когда L_FIX_TRIG = '1' и R_FIX_TRIG = '1' (поставить схему типа детектора фронтов импульса, но там будет задержка в 2 такта) или надо сделать схемотехнику которая будет формировать именно импульс в один такт

imp <= L_FIX_TRIG or R_FIX_TRIG;

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


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

On 2/18/2022 at 1:42 PM, Maverick_ said:

тогда можно выделить передний фронт импульса (imp ), когда L_FIX_TRIG = '1' и R_FIX_TRIG = '1' (поставить схему типа детектора фронтов импульса, но там будет задержка в 2 такта) или надо сделать схемотехнику которая будет формировать именно импульс в один такт

imp <= L_FIX_TRIG or R_FIX_TRIG;

пришлось городить такой огород

l_fix_trig4 <= not l_fix_trig3 and l_fix_trig2; 
r_fix_trig4 <= not r_fix_trig3 and r_fix_trig2; 

fix_trig_flag <= r_fix_latch & l_fix_latch;

process(REG_CLK)
begin

    if (rising_edge(REG_CLK)) then
	 
        l_fix_trig1 <= L_FIX_TRIG;
        l_fix_trig2 <= l_fix_trig1;
        l_fix_trig3 <= l_fix_trig2;
		  
        r_fix_trig1 <= R_FIX_TRIG;
        r_fix_trig2 <= r_fix_trig1;
        r_fix_trig3 <= r_fix_trig2;

        if (l_fix_trig4 = '1') then
           l_fix_latch <= '1';
		end if;
		  
        if (r_fix_trig4 = '1') then
            r_fix_latch <= '1';
        end if;

        if (l_fix_latch = '1' and r_fix_latch = '1') then
            l_fix_latch <= '0';
            r_fix_latch <= '0';  	 
            charge_status <= X"03" & R_CHARGE_MS;	  
        end if; 

    end if;
	 
end process;

 

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


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

5 часов назад, jenya7 сказал:

пришлось городить такой огород


l_fix_trig4 <= not l_fix_trig3 and l_fix_trig2; 
r_fix_trig4 <= not r_fix_trig3 and r_fix_trig2; 

fix_trig_flag <= r_fix_latch & l_fix_latch;

process(REG_CLK)
begin

    if (rising_edge(REG_CLK)) then
	 
        l_fix_trig1 <= L_FIX_TRIG;
        l_fix_trig2 <= l_fix_trig1;
        l_fix_trig3 <= l_fix_trig2;
		  
        r_fix_trig1 <= R_FIX_TRIG;
        r_fix_trig2 <= r_fix_trig1;
        r_fix_trig3 <= r_fix_trig2;

        if (l_fix_trig4 = '1') then
           l_fix_latch <= '1';
		end if;
		  
        if (r_fix_trig4 = '1') then
            r_fix_latch <= '1';
        end if;

        if (l_fix_latch = '1' and r_fix_latch = '1') then
            l_fix_latch <= '0';
            r_fix_latch <= '0';  	 
            charge_status <= X"03" & R_CHARGE_MS;	  
        end if; 

    end if;
	 
end process;

 

Каноничный подход - детекторы фронта, сдвиговые регистры, цепочки синхронизаторов оформлять в виде отдельных компонентов. 

flag <= L_FIX_TRIG and R_FIX_TRIG

edge_dtct_L : entity work.edge_dtct_L
port map 
(
    clk_i  => REG_CLK    ,
    data_i => flag       ,
    edge_o => flag_edge 
)

charge_status <= X"03" & R_CHARGE_MS when (rising_edge(REG_CLK) and flag_edge = '1')

Детектируете фронт события когда ваши флаги выставлены. И по этому фронту сохраняете данные. Задача на 3 минуты работы.

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


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

1 hour ago, Flip-fl0p said:

Каноничный подход - детекторы фронта, сдвиговые регистры, цепочки синхронизаторов оформлять в виде отдельных компонентов. 


flag <= L_FIX_TRIG and R_FIX_TRIG

edge_dtct_L : entity work.edge_dtct_L
port map 
(
    clk_i  => REG_CLK    ,
    data_i => flag       ,
    edge_o => flag_edge 
)

charge_status <= X"03" & R_CHARGE_MS when (rising_edge(REG_CLK) and flag_edge = '1')

Детектируете фронт события когда ваши флаги выставлены. И по этому фронту сохраняете данные. Задача на 3 минуты работы.

а когда flag_edge = '1' ?

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


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

12 минут назад, jenya7 сказал:

а когда flag_edge = '1' ?

Он формируется детектором фронта. У меня это отдельный самописный модуль с кучей параметров.

Вот мой старый пример: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=80167&page=14#comments

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


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

23 minutes ago, Flip-fl0p said:

Он формируется детектором фронта. У меня это отдельный самописный модуль с кучей параметров.

Вот мой старый пример: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=80167&page=14#comments

спасибо.

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


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

On 2/20/2022 at 9:23 AM, jenya7 said:

пришлось городить такой огород

У вас получился злопамятный 'огород'. Ваши l/r_fix_latch взводятся по фронту и остаются в таком состоянии до срабатывания (даже если исходный сигнал вернулся в 0). Т.е. схема сработает даже если сначала на L_FIX_TRIG будет импульс длинной 1, а потом (где то в отдалённом будущем) на R_FIX_TRIG тоже придёт что нибудь единичное :)

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


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

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

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

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

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

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

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

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

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

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