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

Синхронизация процессов на vhdl

Всем привет, начал изучать плис и появился вопрос о синхронизации процессов, как это правильно сделать.

Есть процесс который должен ловить изменения(быстрые) на пине и выставить флаг для процесса что висит на клоке о том что есть данные для обработки.

Вкратце что-то вроде этого:

signal  DATA_PIN1 : std_logic;
signal  data_ready : std_logic;

    event_process : process(DATA_PIN1)
    begin
        if DATA_PIN1 = '0' then
            data_ready <= 1;			<= тут ставим 1
        end if;
    end process;
	
    clk_process : process(clk_100)
    begin
        if data_ready = '1' then
            data_ready <= '0';			<= а здесь 0
            .. data processing
        end if;
    end process;

Вопрос которые меня мучает, не будет ли здесь коллизий в месте где "data_ready" изменяется в двух процессах, в случае если два процесса стартанут одновременно и будет гонка сигналов. Или возможно есть лучше способ как это организовать. Сигнал на DATA_PIN1 очень быстро изменяется, а обработку данных после изменения на том пине нужно привязать к клоку.

 

Спасибо)

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


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

не разбираюсь в vhdl и потому такой вопрос - вы свою конструкцию синтезировали?

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


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

29 minutes ago, Andy78 said:

Всем привет, начал изучать плис и появился вопрос о синхронизации процессов, как это правильно сделать.

Есть процесс который должен ловить изменения(быстрые) на пине и выставить флаг для процесса что висит на клоке о том что есть данные для обработки.

Вкратце что-то вроде этого:


signal  DATA_PIN1 : std_logic;
signal  data_ready : std_logic;

    event_process : process(DATA_PIN1)
    begin
        if DATA_PIN1 = '0' then
            data_ready <= 1;			<= тут ставим 1
        end if;
    end process;
	
    clk_process : process(clk_100)
    begin
        if data_ready = '1' then
            data_ready <= '0';			<= а здесь 0
            .. data processing
        end if;
    end process;

Вопрос которые меня мучает, не будет ли здесь коллизий в месте где "data_ready" изменяется в двух процессах, в случае если два процесса стартанут одновременно и будет гонка сигналов. Или возможно есть лучше способ как это организовать. Сигнал на DATA_PIN1 очень быстро изменяется, а обработку данных после изменения на том пине нужно привязать к клоку.

 

Спасибо)

Первый процесс вырождается в data_ready <= not DATA_PIN1;

А второй процесс вырождается в data_ready <= not data_ready;

В итоге имеем: data_ready <= not (not DATA_PIN1);

По мне, так какой то бред... Прошу прощения.

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


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

1 hour ago, Anton1990 said:

Первый процесс вырождается в data_ready <= not DATA_PIN1;

А второй процесс вырождается в data_ready <= not data_ready;

В итоге имеем: data_ready <= not (not DATA_PIN1);

По мне, так какой то бред... Прошу прощения.

Суть в том чтобы (пере)запускать обработку данных даже в случае если предыдущие данные еще не были обработанные до конца, триггером этого есть изменении DATA_PIN1 в 0.

Ловить их в процессе на клоке нет возможности, длительность изменении 0-1\1-0 меньше клока. Обработка занимает пару десятков тактов, потому и нужна привязка к клоку для обработки всего.

 

1 hour ago, Lmx2315 said:

не разбираюсь в vhdl и потому такой вопрос - вы свою конструкцию синтезировали?

еще нет, жду девайс для тестов. Пока теория.

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


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

2 часа назад, Andy78 сказал:

Вопрос которые меня мучает, не будет ли здесь коллизий в месте где "data_ready" изменяется в двух процессах

Синтезатор вам не даст этого сделать, потому что это физически нереализуемо. В FPGA нет триггеров, работающих по двум тактовым сигналам.

В симуляторе вы можете сделать всё что угодно.

Как только вы пишете '<=', вы создаёте драйвер сигнала. Основное правило: сингал может иметь только один драйвер. Либо таких драйверов может быть несколько при условии, что для типа определена функция разрешения. Тогда результат будет определяться ею.

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


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

Для начала опишите задачу (по каким правилам какие сигналы сбрасываются/устанавливаются) простым русским языком. Поскольку гадать, чего Вы хотели добиться, по некорректному коду желающих мало.

 

30 minutes ago, Andy78 said:

еще нет, жду девайс для тестов. Пока теория.

Вообще говоря, тестировать надо в симуляторах, реальное железо -- последний этап. Если намерены заниматься ПЛИСами серьёзно, осваивайте ModelSim/QuestaSim.

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


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

1 час назад, Andy78 сказал:

еще нет, жду девайс для тестов. Пока теория.

зачем ждать девайс чтобы синтезировать ваш проект?

Смысл в том что ваш ждёт много открытий при синтезе , не ленитесь его делать даже если некуда прошить.

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


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

19 minutes ago, SII said:

Для начала опишите задачу (по каким правилам какие сигналы сбрасываются/устанавливаются) простым русским языком. Поскольку гадать, чего Вы хотели добиться, по некорректному коду желающих мало.

Задача такая, есть шина входящих данных DATA и сигнал DATA_PIN1. В нормальном режиме оно работает так, DATA_PIN1 = 1(признак что не готовы для работы), дальше на DATA выставляются данные и DATA_PIN1 идет 0, как сигнал того что данные готовые для обработки. Но иногда очередные данные(внешние) приходят быстрее чем предыдущих были обработанные: потому DATA_PIN1 становится в 1, а DATA изменяются из вне, после чего DATA_PIN1 идет в 0. В результате бывает ситуация когда переход с 1 в 0 на DATA_PIN1 очень короткий(но его нужно словить и обработать), а новые данные могут относительно долго выставляются на DATA и до момента когда DATA_PIN1 станет в 0, мы уже успеваем обработать предыдущие.

1. DATA_PIN1 = 1

2. DATA  = 123

3. DATA_PIN1 = 0

4. через 5-10нс

5. DATA_PIN1 = 1

6. задержка 100-300нс пока в DATA будут новые данные

7. DATA_PIN1 = 0

Нужно чтобы плис словила переход DATA_PIN1 с 1 в 0 на шаге 3\5 и начала обработку этих данных, если успеет обработать - супер, а если в процессе обработки DATA_PIN1 стает в 0, то процесс обработки просто перезапускается в новыми данными.

 

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


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

Насколько я понял, реально этот самый DATA_PIN1 не нужен как таковой -- ведь обрабатывать надо не его, а данные. Соответственно, надо фиксировать именно данные, а DATA_PIN1 должен управлять сим процессом -- по сути, служить синхосигналом. Если будем ловить его спад, то будет нечто вроде такого:

 

process (DATA_PIN1) is
begin
    if  falling_edge(DATA_PIN1)  then
        REG_DATA <= DATA;
    end if;
end process;

Тогда по каждому спаду DATA_PIN1 данные с внешней шины DATA будут заноситься в регистр REG_DATA -- а дальше делайте с ними, что хочется. Естественно, синтезатор вполне справедливо распознает в DATA_PIN1 сигнал синхронизации, но в ПЛИС их может быть несколько, и ничто не мешает всё остальное тактировать другим сигналом. Более того, если реально DATA_PIN1 ни для чего другого не используется и как синхросигнал, собственно говоря, не нужен, кроме как в этом регистре, можно синтезатору объяснить, чтобы он не заморачивался и реализовал разводку этого сигнала обычными "проводами", а не специально выделенными для синхронизации (последних мало и они накладывают ограничения на возможные источники сигналов). Но это уже технические детали, о них думать пока рано.

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


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

signal  DATA_PIN1 : std_logic;
signal DATA_PIN1_Z : std_logic := '0';
signal DATA_PIN1_Z2 : std_logic := '0';

signal  data_ready : std_logic := '0';

process(clk_100)
  begin
  	if rising_edge(clk_100) then
  
  		-- синхронизация сигнала по клоку
  		DATA_PIN1_Z <= DATA_PIN1;
		DATA_PIN1_Z2 <= DATA_PIN1_Z;
		
		if (DATA_PIN1_Z = '0' and DATA_PIN1_Z2 = '1') then -- ловим спад
			data_ready <= '1'; -- устанавливаем сигнал готовности
		else
          	data_ready <= '0'; -- сбрасываем сигнал готовности во всех остальных случаях
		end if;

		if (data_ready = '1') then
          	-- ваша логики
          	...
        end if;
  
  	end if;
  end process;

В вашем случае будет конфликт, поскольку сигнал data_ready имеет более одного драйвера в двух процессах.

В начале нужно синхронизировать сигнал пина по клоку через два регистра, а потом уже смотреть перепад.

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


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

18 hours ago, quato_a said:

signal  DATA_PIN1 : std_logic;
signal DATA_PIN1_Z : std_logic := '0';
signal DATA_PIN1_Z2 : std_logic := '0';

signal  data_ready : std_logic := '0';

process(clk_100)
  begin
  	if rising_edge(clk_100) then
  
  		-- синхронизация сигнала по клоку
  		DATA_PIN1_Z <= DATA_PIN1;
		DATA_PIN1_Z2 <= DATA_PIN1_Z;
		
		if (DATA_PIN1_Z = '0' and DATA_PIN1_Z2 = '1') then -- ловим спад
			data_ready <= '1'; -- устанавливаем сигнал готовности
		else
          	data_ready <= '0'; -- сбрасываем сигнал готовности во всех остальных случаях
		end if;

		if (data_ready = '1') then
          	-- ваша логики
          	...
        end if;
  
  	end if;
  end process;

В вашем случае будет конфликт, поскольку сигнал data_ready имеет более одного драйвера в двух процессах.

В начале нужно синхронизировать сигнал пина по клоку через два регистра, а потом уже смотреть перепад. 

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

19 hours ago, SII said:

Насколько я понял, реально этот самый DATA_PIN1 не нужен как таковой -- ведь обрабатывать надо не его, а данные. Соответственно, надо фиксировать именно данные, а DATA_PIN1 должен управлять сим процессом -- по сути, служить синхосигналом. Если будем ловить его спад, то будет нечто вроде такого: 

 


process (DATA_PIN1) is
begin
    if  falling_edge(DATA_PIN1)  then
        REG_DATA <= DATA;
    end if;
end process;

Тогда по каждому спаду DATA_PIN1 данные с внешней шины DATA будут заноситься в регистр REG_DATA -- а дальше делайте с ними, что хочется. Естественно, синтезатор вполне справедливо распознает в DATA_PIN1 сигнал синхронизации, но в ПЛИС их может быть несколько, и ничто не мешает всё остальное тактировать другим сигналом. Более того, если реально DATA_PIN1 ни для чего другого не используется и как синхросигнал, собственно говоря, не нужен, кроме как в этом регистре, можно синтезатору объяснить, чтобы он не заморачивался и реализовал разводку этого сигнала обычными "проводами", а не специально выделенными для синхронизации (последних мало и они накладывают ограничения на возможные источники сигналов). Но это уже технические детали, о них думать пока рано.

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

Задача как раз передать флаг готовности в процесс обработчик по клоку. И чтобы они обработались только 1 раз.

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


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

23 часа назад, Andy78 сказал:

Всем привет, начал изучать плис и появился вопрос о синхронизации процессов, как это правильно сделать.

Если затруднение не с VHDL, а именно со способами синхронизации, то посмотрите здесь, если правильно понял, ваш случай похож как на 10:53

Цифровая схемотехника Лекция № 28 Часть 2/2 Синхронизация и сброс

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


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

5 hours ago, Andy78 said:

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

Гарантирует, что смена сигнала будет поймана синхронно по клоку, поскольку обрабатывать эту смену вам нужно по клоку.

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


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

52 minutes ago, quato_a said:

Гарантирует, что смена сигнала будет поймана синхронно по клоку, поскольку обрабатывать эту смену вам нужно по клоку.

Даже если сигнал успеет изменится с 1 в 0 и обратно в 1, между клоком  ?

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


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

18 минут назад, Andy78 сказал:

Даже если сигнал успеет изменится с 1 в 0 и обратно в 1, между клоком  ?

Есть синхронизаторы по уровню, а есть по фронту. Дело житейское, все это известно...

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


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

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

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

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

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

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

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

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

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

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