2012-06-05 2 views
1

У меня есть объект, который имеет общий целочисленный параметр fs_in_khz, который может быть 5, 10 или 2:Могу ли я иметь условные константы в VHDL?

entity test_control_source is 
    generic(
     -- This should only be 5, 10 or 20 
     fs_in_khz : integer := 20 
    ); 

Было бы хорошо, если бы я мог воспользоваться функциями VHDL и просто ограничивают тип до тех значений, возможно, используя что-то вроде:

type control_source_freq is (F5_KHZ, F10_KHZ, F20_KHZ); 
... 
entity test_control_source is 
generic(
    -- This should only be 5, 10 or 20 
    fs_in_khz : control_source_freq := F20_KHZ 
); 

Однако, позже в архитектуре этого объекта, у меня есть

architecture source_behaviour of test_control_source is 
    constant cs_period : integer := 5000 * clock_rate/fs_in_khz; 
begin 
    ... 

Я предпочитаю, чтобы этот параметр вычислялся вне процессов, которые его используют, вместо того, чтобы повторять вычисления везде, где это необходимо. Могу ли я ограничить допустимые значения моего общего параметра fs_in_khzи сохранить постоянную константу cs_period из тех процессов, в которых она используется?

ответ

4

Создать свой перечисляемого типа в пакете, как вы предлагаете

создать также функцию под названием calculate_period, который принимает в clock_rate и ваш fs типа и возвращает соответствующее число.

В качестве альтернативы, добавьте некоторые assert операторы к компоненту с использованием этого общего и убедитесь, что он имеет правильные значения. Протестируйте это с помощью своего инструмента синтеза, чтобы узнать, что произойдет, если утверждения будут срабатывать, хотя часто, даже если вы используете severity failure, он просто даст предупреждение!

+0

Создал небольшой пакет с 'enum' и функцией, отлично работает и закладывает основу для факторизации других аппаратных настроек для тестирования! – detly

1

Одним из возможных решений было бы объявить константу F_KHZ в пакете и вычислим в том же пакете постоянной cs_period после объявления F_KHZ. Однако это не ограничивало бы значения F_KHZ, но вам нужно было бы только изменить его в одном месте, сделав ошибку очень маловероятной. Это, конечно, предполагает, что вам нужна постоянная постоянная F_KHZ во всей архитектуре.

Смежные вопросы