以下是我的代码,虽然它不能编译,但这只是伪代码。
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还比较新(刚刚毕业),非常感谢您的帮助。谢谢 :)
if
很可能会转换为与选项1中带有and
的单个if
相同的实现。但是,不要只听我的话...请自己在工具中尝试,并检查原理图中创建的设计...这是学习工具如何工作以及实现基于高级RTL的方法的非常好的方式 :-D - Morten Zilmer