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

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

В исходном коде процессы вообще не синхронные. Так что работать как ожидается не будет. Если второй процесс сделать синхронным, то может и синтезируется(хотя сомнительно) правильно, т.к. это  не два драйвера, а драйвер и асинхронный сброс. Но лучше такие вещи нормально в одном процессе написать. Весь требуемый функционал это триггер с асинхронным сбросом(ну, точнее установкой в 1).

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

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


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

Можно ловить по уровню, а сбрасывать отдельным сигналом по клоку, поступающим изнутри ПЛИСины, когда она закончит обработку очередных данных:

 

process (DATA_PIN1, CLK) is
begin
    if  DATA_PIN1 = '0'  then
        FLAG <= '1';
    elsif  rising_edge(CLK)  then
        if  CLEAR_FLAG = '1'  then
            FLAG <= '0';
        end if;
    end if;
end process;

 

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


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

10 hours ago, Andy78 said:

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

Изменение 1->0 по клоку вы задетектируете, если длительность 0 на линии (активного уровня в вашем случае) будет длиннее периода клока.

Если длительность будет короче периода клака, то есть большая доля вероятности, что не заметите. Если уровень 0 попадет на передний фронт клока, то заметите, иначе нет (начнется метастабильность).

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


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

1 hour ago, SII said:

Можно ловить по уровню, а сбрасывать отдельным сигналом по клоку, поступающим изнутри ПЛИСины, когда она закончит обработку очередных данных:

 


process (DATA_PIN1, CLK) is
begin
    if  DATA_PIN1 = '0'  then
        FLAG <= '1';
    elsif  rising_edge(CLK)  then
        if  CLEAR_FLAG = '1'  then
            FLAG <= '0';
        end if;
    end if;
end process;

 

Насколько я понял приоритет у новых данных, а тут если данные обрабатываться будут долго, то новые потеряются. Записывать '0' в триггер надо сразу без CLEAR_FLAG, а FLAG в соседнем процессе использовать как сигнал разрешения перезаписи буферного регистра (так же по переднему фронту). На входе данных поставить пару триггеров для устранения метастабильности и следовательно сделать задержку сигнала разрешения чтения тоже на 2 такта.

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


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

По фронту PIN1 записать DATA в регистр, из дополнительного бита этого регистра сделать флаг в виде делителя на 2. Передать весь регистр в основной домен, где ждать изменения флага, после чего бросать прежнюю обработку и начинать новую.

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


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

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

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

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

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

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

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

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

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

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