Jump to content

    
Sign in to follow this  
Andy78

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

Recommended Posts

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

Edited by Strob

Share this post


Link to post
Share on other sites

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

 

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;

 

Share this post


Link to post
Share on other sites
10 hours ago, Andy78 said:

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

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

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

Share this post


Link to post
Share on other sites
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 такта.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this