Операторы if в VHDL: вложенные и множественные условия

вот как выглядит мой код... (я знаю, что он не компилируется, это просто псевдокод.)

signal  lowBound        :   std_logic_vector(15 downto 0);
signal  highBound       :   std_logic_vector(15 downto 0);
signal  result_01       :   std_logic_vector(15 downto 0);
signal  result_02       :   std_logic_vector(15 downto 0);
signal  result_03       :   std_logic_vector(15 downto 0);

...
p_state_machine: process(RESET, CLK)
    if (RESET = '1') then
        ...
    elsif (rising_edge(CLK_I)) then
        case currentState is
            when ...
            ...
            when OUTPUT =>
                -- check if results are within interval bounds
                -- option 1
                if ((result_01 > lowBound) AND (result_02 > lowBound) AND (result_03 > lowBound) AND ...) then
                    ...
                end if;

                -- option 2
                if ((result_01 > lowBound) then
                    if ((result_02 > lowBound) then
                        if ((result_03 > lowBound) then
                            ...
                        end if;
                    end if;
                end if;
        end case;
    end if;
end process;

Как видите, у меня есть конечный автомат, и я хотел бы выводить результаты 1-3 в последнем состоянии «ВЫВОД», но только если они находятся в пределах заданного интервала. Итак, теперь у меня есть 6 условий, которые мне нужно проверить. Если все верно, я вывожу результаты 1-3; если хотя бы одно неверно, я хочу установить флаг ошибки.

Я работаю с платой Xilinx на частоте 25 МГц, но хотел бы иметь надежную конструкцию, способную работать и на более высоких частотах.

Итак, теперь мой вопрос (вопросы)... Как лучше всего проверить, находятся ли результаты 1-3 в заданных пределах? 1. Я знаю, что есть несколько вариантов, но какой из них лучше, особенно с учетом времени? 2. Варианты 1 и 2 из моего кода переводятся на одно и то же оборудование или есть разница? 3. Не лучше ли мне проверять эти условия вне конечного автомата в отдельных (параллельных) процессах, так как я имею дело с 16-битными векторами? (Я полагаю, что 6 вложенных 16-битных сравнений могут привести к проблемам с синхронизацией!?)

Я новичок в VHDL (только что закончил обучение) и был бы очень признателен за вашу помощь. Спасибо :)


person matzeBurger    schedule 11.12.2018    source источник


Ответы (1)


В большинстве проектов задача заключается в написании функционально корректного кода, поэтому достижение цели по времени тривиально. Для проекта на частоте 25 МГц и в 6-10 раз выше, и с кодом, подобным тому, что вы показываете, проект, как правило, уложится в сроки без каких-либо особых усилий, независимо от того, как вы его пишете.

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

Что касается вашего вопроса о том, следует ли создавать условия вне процесса, то это не имеет значения по времени. Это может немного уменьшить размер, если инструмент не будет повторно использовать результат сравнения для идентичных результатов, а реализует отдельное сравнение для каждого. Но опять же, в современных ПЛИС выполнение 16-битных сравнений с > (которые фактически являются вычитаниями) далеко не критично по времени на указанной частоте. Обратите также внимание, что все сравнения можно выполнять параллельно, поскольку сравнения независимы.

person Morten Zilmer    schedule 11.12.2018
comment
Спасибо за быстрый ответ! ... В конце вы упомянули, что все сравнения можно делать параллельно. Я это тоже понял, но могу ли я повлиять на это? Действительно ли инструмент делает это с вариантом 1 из моего кода или он выполняет сравнения последовательно, как в варианте 2? - person matzeBurger; 11.12.2018
comment
Вложенный if в варианте 2 будет (скорее всего) переведен в ту же реализацию, что и одиночный if с and в варианте 1. Однако не верьте мне на слово... попробуйте сами в инструменте, и изучите созданный дизайн на схеме... это очень хороший способ узнать, как работает инструмент и какая реализация основана на высокоуровневом RTL :-D - person Morten Zilmer; 11.12.2018