Andy78 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба Всем привет, начал изучать плис и появился вопрос о синхронизации процессов, как это правильно сделать. Есть процесс который должен ловить изменения(быстрые) на пине и выставить флаг для процесса что висит на клоке о том что есть данные для обработки. Вкратце что-то вроде этого: 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 очень быстро изменяется, а обработку данных после изменения на том пине нужно привязать к клоку. Спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба не разбираюсь в vhdl и потому такой вопрос - вы свою конструкцию синтезировали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anton1990 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 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); По мне, так какой то бред... Прошу прощения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy78 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 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 и потому такой вопрос - вы свою конструкцию синтезировали? еще нет, жду девайс для тестов. Пока теория. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 2 часа назад, Andy78 сказал: Вопрос которые меня мучает, не будет ли здесь коллизий в месте где "data_ready" изменяется в двух процессах Синтезатор вам не даст этого сделать, потому что это физически нереализуемо. В FPGA нет триггеров, работающих по двум тактовым сигналам. В симуляторе вы можете сделать всё что угодно. Как только вы пишете '<=', вы создаёте драйвер сигнала. Основное правило: сингал может иметь только один драйвер. Либо таких драйверов может быть несколько при условии, что для типа определена функция разрешения. Тогда результат будет определяться ею. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба Для начала опишите задачу (по каким правилам какие сигналы сбрасываются/устанавливаются) простым русским языком. Поскольку гадать, чего Вы хотели добиться, по некорректному коду желающих мало. 30 minutes ago, Andy78 said: еще нет, жду девайс для тестов. Пока теория. Вообще говоря, тестировать надо в симуляторах, реальное железо -- последний этап. Если намерены заниматься ПЛИСами серьёзно, осваивайте ModelSim/QuestaSim. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 1 час назад, Andy78 сказал: еще нет, жду девайс для тестов. Пока теория. зачем ждать девайс чтобы синтезировать ваш проект? Смысл в том что ваш ждёт много открытий при синтезе , не ленитесь его делать даже если некуда прошить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy78 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 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, то процесс обработки просто перезапускается в новыми данными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба Насколько я понял, реально этот самый 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 ни для чего другого не используется и как синхросигнал, собственно говоря, не нужен, кроме как в этом регистре, можно синтезатору объяснить, чтобы он не заморачивался и реализовал разводку этого сигнала обычными "проводами", а не специально выделенными для синхронизации (последних мало и они накладывают ограничения на возможные источники сигналов). Но это уже технические детали, о них думать пока рано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 3 августа, 2019 Опубликовано 3 августа, 2019 · Жалоба 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 имеет более одного драйвера в двух процессах. В начале нужно синхронизировать сигнал пина по клоку через два регистра, а потом уже смотреть перепад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy78 0 4 августа, 2019 Опубликовано 4 августа, 2019 · Жалоба 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 раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 4 августа, 2019 Опубликовано 4 августа, 2019 · Жалоба 23 часа назад, Andy78 сказал: Всем привет, начал изучать плис и появился вопрос о синхронизации процессов, как это правильно сделать. Если затруднение не с VHDL, а именно со способами синхронизации, то посмотрите здесь, если правильно понял, ваш случай похож как на 10:53 Цифровая схемотехника Лекция № 28 Часть 2/2 Синхронизация и сброс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 4 августа, 2019 Опубликовано 4 августа, 2019 · Жалоба 5 hours ago, Andy78 said: Если я правильно понимаю, то ваш код не гарантирует что будет поймана быстрая смена сигнала на DATA_PIN1. Гарантирует, что смена сигнала будет поймана синхронно по клоку, поскольку обрабатывать эту смену вам нужно по клоку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy78 0 4 августа, 2019 Опубликовано 4 августа, 2019 · Жалоба 52 minutes ago, quato_a said: Гарантирует, что смена сигнала будет поймана синхронно по клоку, поскольку обрабатывать эту смену вам нужно по клоку. Даже если сигнал успеет изменится с 1 в 0 и обратно в 1, между клоком ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 4 августа, 2019 Опубликовано 4 августа, 2019 · Жалоба 18 минут назад, Andy78 сказал: Даже если сигнал успеет изменится с 1 в 0 и обратно в 1, между клоком ? Есть синхронизаторы по уровню, а есть по фронту. Дело житейское, все это известно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться