2016-01-04 4 views
0

Я не знаю, как это точно описать, но может быть, что-то вроде этого?Как реализовать монитор данных в VHDL?

void monitor_thread(void) 
{ 
    for(;;){ 
     if (data==10){ 
      data=0; 
      data2++; 
     } 
    } 
} 

Для меня, я понимаю, что этот путь в VHDL:

signal data,data2:std_logic_vector(3 downto 0); 
... 
process(data) 
begin 
    case data is: 
     when "0101" => data2<=data2+1; 
     when others => 
    end case; 
end process; 

Но это вызовет предупреждений при компиляции в Quartus II. Я думаю, что это не правильный способ сделать это. Какие-либо предложения?

Предупреждения:

Warning (10492): VHDL Process Statement warning at xxx: signal "data2" is read inside the Process Statement but isn't in the Process Statement's sensitivity list 
Warning (10631): VHDL Process Statement warning at xxx: inferring latch(es) for signal or variable "data", which holds its previous value in one or more paths through the process 
+0

Я боюсь, что совершенно неясно, чего вы пытаетесь достичь, –

+1

Без 'data2' в списке чувствительности вы создаете защелки на' data2', с помощью которых производятся значения из 'data'. В зависимости от места размещения и маршрутизации, которые могут быть небезопасными, даже если «данные» зарегистрированы, вы можете увеличивать «данные2», когда между другими значениями «данные». Казалось бы, вы должны использовать синхронизированный процесс. И как Евгений Ш. отмечает, что вы не предоставляете [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), что делает все возможное для создания решения, которое вы можете использовать. – user1155120

+0

@EugeneSh. Я пытаюсь создать монитор для данных, когда сигнал становится определенным значением, он заставит сигнал получить новое значение. Что-то вроде асинхронного прозрачного сигнала для счетчика, когда оно достигает 10. – Ben

ответ

2

Давайте предположим сначала, что data представляет собой регистр, который обновляется по нарастающему-фронту тактового сигнала clock. Затем data будет меняться только один раз за такт, так что нам нужно, чтобы оно сравнивалось с целевым значением только один раз за такт. Это достигается за счет другого синхронизированного процесса, который получает приращение data2 синхронно с clock:

process (clock) 
begin 
    if rising_edge (clock) then 
    if data = x"0101" then 
     data2 <= data2 + 1; -- data2 of type unsigned, signed, or integer 
    end if; 
    end if; 
end process; 

Если data является выходом некоторой комбинационной логики, где входы этой комбинационной логики регистры тактируемого clock, то data может меняться несколько раз в течение периода времени. Но на самом деле вы можете полагаться только на установленное значение, потому что промежуточные значения зависят от реальной задержки в аппаратном обеспечении и, следовательно, не являются детерминированными. Для мониторинга вы можете использовать тот же процесс, что и выше.

Если data зависит от некоторых асинхронных входов, вам необходимо сначала синхронизировать эти входы с использованием обычных часов. Тогда можно применить решение сверху.

+0

Спасибо. Поэтому у меня не может быть асинхронный монитор. Я тебя достал? – Ben

+0

Правильно это или нет: процесс означает синхронные действия, асинхронные части должны быть реализованы вне процесса. – Ben

+2

@Ben только синхронизированный процесс означает синхронное поведение, но даже этот может иметь асинхронный сброс. Вам всегда придется подождать, пока не изменится сигнал, поэтому сложно сказать, как работает асинхронный монитор. –