VHDL中的if语句:嵌套与多个条件

时间:2018-12-11 10:21:59

标签: if-statement vhdl fpga timing synthesis

这是我的代码的样子……(我知道它不会编译,只是伪代码。)

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;

如您所见,我有一个状态机,并且只想在最后的状态“ OUTPUT”中输出结果1-3,但前提是它们在给定的间隔范围内。所以现在我有6个条件需要检查。如果全部正确,则输出结果1-3;否则,输出结果1-3。如果至少有一个错误,我想设置一个错误标志。

我正在使用25MHz的Xilinx电路板,但希望有一个坚固的设计也可以处理更高的频率。

那么现在我的问题...检查结果1-3是否在给定范围内的最佳方法是什么? 1.我知道有多种选择,但是哪一种是最好的,尤其是在考虑时间的时候? 2.我的代码中的选项1和2是否转换为相同的硬件,还是存在差异? 3.因为我要处理16位向量,所以在单独的(并行)进程中在状态机外部检查这些条件是否对我更好? (我想象有6个嵌套的16位比较migth会导致时序问题!?)

我对VHDL刚起步(刚刚毕业),非常感谢您的帮助。谢谢:)

1 个答案:

答案 0 :(得分:1)

在大多数设计中,挑战在于编写功能正确的代码,因此满足时序目标是微不足道的。对于25 MHz且上面的6-10倍的设计,并使用如上所示的代码,无论您如何编写,该设计通常都可以满足时序要求而无需付出任何特殊努力。

因此,编写代码以便于阅读和查看,并使该工具按要求的频率处理实施。在工程方面,这是非关键代码的好方法,因为它可以腾出时间处理设计的关键部分。

对于您是否要在流程之外建立条件的问题,那么在时机上无所谓。如果该工具不为相同的结果重用比较结果,而是为每个结果实施单独的比较,则可能会稍微减小大小。但是同样,在现代FPGA中,用>(实际上是减法)进行16位比较远不是在上述频率下对时序至关重要的。还请注意,由于比较是独立的,因此所有比较都可以并行进行。