If-операторы в VHDL: вложенные против нескольких условий - PullRequest
0 голосов
/ 11 декабря 2018

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

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 в последнем состоянии 'OUTPUT', но только если они находятся в заданных пределах интервала.Итак, теперь у меня есть 6 условий, которые мне нужно проверить.Если все верно, я вывожу результаты 1-3;если хотя бы один из них ложный, я хочу установить флаг ошибки.

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

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

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

1 Ответ

0 голосов
/ 11 декабря 2018

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

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

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

...