在VHDL中.....如何计算向量的前导零?

Moh*_*ana 5 fpga vhdl

我在VHDL项目中工作,我面临着计算向量长度的问题.我知道有一个矢量的长度属性,但这不是我正在寻找的长度.例如,我有std_logic_vector

    E : std_logic_vector(7 downto 0);  
Run Code Online (Sandbox Code Playgroud)

然后

    E <= "00011010";
Run Code Online (Sandbox Code Playgroud)

所以,len = E'length = 8但我不是在寻找这个.我想len在丢弃最左边的零后计算,所以len = 5;

我知道我可以通过从左到右检查"0"位来使用for循环,如果出现"1"位则停止.但这并不高效,因为我有1024或更多位,这将减慢我的电路.那么有没有任何方法或算法以有效的方式计算长度?例如使用log(n)级门的组合门,(其中n =比特数).

max*_*axy 5

你用"比特计数"做什么与对数非常相似(基数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;
Run Code Online (Sandbox Code Playgroud)

通常,您希望在合成时使用常量执行此操作,并且速度无关紧要.但是你也可以生成FPGA逻辑,如果这真的是你想要的.

正如其他人所提到的,VHDL中的"for"循环仅用于生成查找表,由于信号路径较长,查找表可能很慢,但仍然只需要一个时钟.可能发生的是您的最大时钟频率下降.通常这只是一个问题,如果你操作大于64位的矢量(你提到1024位)和时钟快于100MHz.也许合成器已经告诉过你这是你的问题,否则我建议你先试试.

然后你必须在多个时钟上分割操作,并将一些中间结果存储到FF中.(我会提前忘记尝试通过重新安排你的代码来超越合成器.查找表就是一个表.为什么你在这个表中生成值怎么重要?但是请确保你告诉合成器"不关心"如果你拥有它们的价值观."

如果您关心速度,请使用第一个时钟并行检查所有16位块(彼此独立),然后使用第二个时钟周期将所有16位块的结果合并为一个结果.如果您需要考虑FPGA逻辑的数量,请实现一个状态机,在每个时钟周期检查一个16位块.

但要小心,在执行此操作时不要重新发明CPU.