假设您有以下代码,
signal a : std_logic_vector( N - 1 downto 0 );
或者,
for i in 0 to N - 1
...
N-1
部分是否被合成为实际逻辑,或者FPGA软件(例如Quartus)是否在创建逻辑之前进行了数学运算?
示例用例,通用N
表示所需位数。有一个通用Nm1
来保存减法是否更好,或者我可以通过使用N-1
如上所述而不创建额外的逻辑?
答案 0 :(得分:2)
由于N
是通用参数,因此在合成时将其视为常量。正如我所知道的所有逻辑合成器一样,你的逻辑合成器会在推断任何硬件之前传播常量。合成器将在合成之前计算N-1
表达式,此操作不会花费任何单个晶体管。对常量执行更复杂的操作也是一样的,比如调用函数。例如:
function log2_up(x: positive) return natural is
begin
if x = 1 then
return 0;
else
return log2_up((x+1)/2) + 1;
end if;
end function log2_up;
...
constant word_width: positive := 64;
constant write_byte_enable_width: positive := log2_up(64 / 8);
可由我所知的所有逻辑合成器合成,并且计算write_byte_enable_width
不需要单个晶体管;它是在恒定传播阶段由合成器预先计算的。
答案 1 :(得分:1)
在这两种情况下,N的值必须在编译时计算。它不是 - 也不可能! - 在逻辑中生成。
请记住,任何HDL代码最终都必须能够合成到物理硬件。改变信号中的位数或改变某些逻辑被实例化的次数,不是可以用电子方式完成的。