您对“位计数”的操作与对数(以 2 为底)非常相似。
这通常在 VHDL 中用于计算需要多少位来表示一个信号。例如,如果您想在 RAM 中存储最多 N 个元素,则寻址该 RAM 所需的位数为 ceil(log2(N))。为此,我使用:
function log2ceil(m:natural) return natural is
begin -- note: for log(0) we return 0
for n in 0 to integer'high loop
if 2**n >= m then
return n;
end if;
end loop;
end function log2ceil;
通常,您希望在综合时使用常数执行此操作,而速度无关紧要。但您也可以生成 FPGA 逻辑,如果这确实是您想要的。
正如其他人所提到的,VHDL 中的“for”循环仅用于生成查找表,由于信号路径长,这可能会很慢,但仍然只需要一个时钟。可能发生的是您的最大时钟频率下降。通常,如果您对大于 64 位(您提到 1024 位)的向量进行操作并且时钟速度超过 100MHz,这只会成为问题。也许合成器已经告诉你这是你的问题,否则我建议你先尝试。
然后你必须在多个时钟上拆分操作,并将一些中间结果存储到 FF 中。(我会预先忘记通过重新排列代码来超越合成器。查找表是一个表。为什么在这个表中生成值很重要?但请确保告诉合成器“不在乎" 值,如果你有的话。)
如果您关心速度,请使用第一个时钟并行检查所有 16 位块(彼此独立),然后使用第二个时钟周期将所有 16 位块的结果合并为一个结果。如果您关心 FPGA 逻辑的数量,请实现一个在每个时钟周期检查单个 16 位块的状态机。
但请注意不要在这样做时重新发明 CPU。