2016-04-26 5 views
0

В настоящее время я выполняю проект в VHDL, в котором у меня есть счетчик, который необходимо обновить в 100 мс или 1000 мс, если нажата клавиша.Временное разделение (период) Выбор в vhdl

Пример:

If Key3=0 then 
c=c+1 (100ms) 
elsif key3=1 then 
c=c+1 (1000ms) 

Я хотел бы знать, как сделать это в VHDL.

Я верю, что должен использовать процесс (часы, Key3), но я не уверен, как увеличить счетчик в зависимости от периода.

благодарит заранее!

ответ

1

Я думаю, что вы часть пути туда:

Верую я должен использовать процесс (часы, ключ3), но я не уверен, как сделать увеличение счетчика на основе периода.

Подумайте о проблеме как о проблеме цифрового дизайна, а не о проблеме с кодированием. Что бы вы использовали для измерения времени в реальной цифровой системе? Оттуда используйте это как ссылку, чтобы определить, прошли ли 100 мс или 1000 мс.

И как только вы можете измерить время, как вы определяете, как долго проходит определенное событие?

0

Если c переменная (в процессе) времени типа, то

if some_condition then 
    c := c + 100 ms; 
else 
    c := c + 1000 ms; 
end if; 

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

Самое легкое решение для C для подсчета во временных шагах - например, кратных тактов и добавления 1 или 10 из них.

Например, если у вас есть 10MHz часы:

constant Clock_Period : time := 100 ns; 

constant ms_100 : natural := 100 ms/Clock_Period; 
constant ms_1000 : natural := 1000 ms/Clock_Period; 
signal c : natural; 
... 

    if some_condition then 
     c <= c + ms_100; 
    else 
     c := c + ms_1000; 
    end if; 

И если изменить тактовую частоту, настроить декларацию clock_period, чтобы соответствовать.

+0

Недавно мы столкнулись с проблемой Vivado относительно генерации констант и диапазонов, основанных на типах времени. Как вы описали выше, это полностью оптимизируется ни к чему. И Xilinx признает, что объекты типа 'time' не поддерживаются. См. AR57964 (http://www.xilinx.com/support/answers/57964.html) – PlayDough

+0

@PlayДля того, что вы связали AR, указывает, что тип Time IS поддерживается в Vivado, но плохо. Таким образом, этот метод «не рекомендуется» пользователями Xilinx для Vivado (возможно, они используют 32-битную арифметику, когда другие используют 64-разрядный бит), а Synplicity - другие проблемы. Но наиболее явное выражение кода на самом высоком уровне должно быть обычной практикой; отклоняясь от него, где поддержка инструмента неадекватна. –

+0

Достаточно честный. Время поддерживается - плохо. Но мы ограничены инструментами, которые мы используем, как вы указываете. Вместо этого мы делаем что-то вроде: 'constant Clock_Period: real: = 100.0e-9;' Реальные значения поддерживаются просто отлично. – PlayDough