VHDL 中的 If 语句:嵌套与多个条件
If-statements in VHDL: nested vs. multiple conditions
这是我的代码的样子...(我知道它不能编译,它只是伪代码。)
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;如果至少有一个为假,我想设置一个错误标志。
我正在使用 25MHz 的 Xilinx 电路板,但我希望有一个能够处理更高频率的稳健设计。
现在我的问题是...检查结果 1-3 是否在给定范围内的最佳方法是什么?
1. 我知道有多种选择,但哪个是最好的,尤其是在考虑时机的时候?
2. 我的代码中的选项 1 和 2 转换为相同的硬件还是有区别?
3. 因为我正在处理 16 位向量,所以在单独(并行)进程中检查状态机之外的这些条件对我来说是否更好? (我想有 6 个嵌套的 16 位比较可能会导致时序问题!?)
我是 VHDL 的新手(刚毕业),非常感谢您的帮助。谢谢:)
在大多数设计中,挑战在于编写功能正确的代码,因此满足时序目标是微不足道的。对于频率为 25 MHz 且倍率为 6-10 以上的设计,使用您展示的代码,无论您如何编写,设计通常无需任何特殊努力即可满足时序要求。
因此,请编写易于阅读和审查的代码,并让工具处理实现所需的频率。在工程方面,这对于非关键代码来说是一种很好的方法,因为它可以让您腾出时间用于设计的关键部分。
对于你提出的是否在流程外提出条件的问题,那么时间上是没有关系的。如果该工具不对相同结果重复使用比较结果,而是对每个结果进行单独比较,则可能会稍微减小大小。但同样,在现代 FPGA 中,用 > 进行 16 位比较(实际上是减法)在上述频率下远非时序关键。另请注意,所有比较都可以并行进行,因为比较是独立的。
这是我的代码的样子...(我知道它不能编译,它只是伪代码。)
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;如果至少有一个为假,我想设置一个错误标志。
我正在使用 25MHz 的 Xilinx 电路板,但我希望有一个能够处理更高频率的稳健设计。
现在我的问题是...检查结果 1-3 是否在给定范围内的最佳方法是什么? 1. 我知道有多种选择,但哪个是最好的,尤其是在考虑时机的时候? 2. 我的代码中的选项 1 和 2 转换为相同的硬件还是有区别? 3. 因为我正在处理 16 位向量,所以在单独(并行)进程中检查状态机之外的这些条件对我来说是否更好? (我想有 6 个嵌套的 16 位比较可能会导致时序问题!?)
我是 VHDL 的新手(刚毕业),非常感谢您的帮助。谢谢:)
在大多数设计中,挑战在于编写功能正确的代码,因此满足时序目标是微不足道的。对于频率为 25 MHz 且倍率为 6-10 以上的设计,使用您展示的代码,无论您如何编写,设计通常无需任何特殊努力即可满足时序要求。
因此,请编写易于阅读和审查的代码,并让工具处理实现所需的频率。在工程方面,这对于非关键代码来说是一种很好的方法,因为它可以让您腾出时间用于设计的关键部分。
对于你提出的是否在流程外提出条件的问题,那么时间上是没有关系的。如果该工具不对相同结果重复使用比较结果,而是对每个结果进行单独比较,则可能会稍微减小大小。但同样,在现代 FPGA 中,用 > 进行 16 位比较(实际上是减法)在上述频率下远非时序关键。另请注意,所有比较都可以并行进行,因为比较是独立的。