这是我的代码有点像..。(我知道它不编译,它只是伪代码。)
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个条件,我需要检查。如果全部为true,则输出结果1-3;如果至少有一个为false,则设置一个错误标志。
我正在与Xilinx板在25兆赫,但希望有一个强大的设计,可以处理更高的频率,以及。
所以现在我的问题..。检查结果1-3是否在给定的范围内的最佳方法是什么? 1.我知道有多个选项,但哪种选项最好,特别是考虑到时间? 2.我的代码中的选项1和2是否转换为相同的硬件,还是有不同的硬件? 3.如果我处理16位向量,那么在状态机之外检查这些条件更好吗?(我想有6个嵌套的16位比较会导致计时问题!)
我对VHDL (刚毕业)相当陌生,非常感谢您的帮助。谢谢:)
发布于 2018-12-11 10:37:57
在大多数设计中,困难在于编写功能正确的代码,因此满足计时目标是微不足道的。对于25 MHz的设计,上面的系数为6-10,使用这样的代码,无论您如何编写,设计通常都会满足时间要求,而不需要任何特别的努力。
因此,编写代码使其易于阅读和检查,并让工具将实现处理到所需的频率。从工程角度来说,这是不关键代码的一种很好的方法,因为它为设计的关键部分腾出了时间。
对于你是否在程序之外设定条件的问题,从时间上讲,这并不重要。如果工具不为相同的结果重用比较结果,而是为每个结果实现单独的比较,那么它可能会稍微缩小一些大小。但是,在现代FPGA中,与>进行16位比较(这实际上是有效的减法)在上述频率上还远远不够关键。还要注意的是,所有的比较都可以并行进行,因为比较是独立的。
https://stackoverflow.com/questions/53722020
复制相似问题