gpt4 book ai didi

vhdl - 在VHDL中……如何计算向量的前导零?

转载 作者:行者123 更新时间:2023-12-04 17:36:44 24 4
gpt4 key购买 nike

我正在VHDL项目中工作,但遇到计算向量长度的问题。我知道向量的length属性,但是这不是我要寻找的长度。例如,我有std_logic_vector

    E : std_logic_vector(7 downto 0);  

然后
    E <= "00011010";

所以, len = E'length = 8,但我不是在寻找这个。我想在丢弃最左边的零后计算 len,所以 len = 5;
我知道可以通过从左到右检查“0”位来进行循环,并在出现“1”位时停止。但这效率不高,因为我有1024位或更多位,这会减慢电路速度。那么,有什么方法或算法可以有效地计算长度吗?例如使用log(n)级门的组合门(其中n =位数)。

最佳答案

您对“位计数”的处理与对数(以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。

关于vhdl - 在VHDL中……如何计算向量的前导零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16521943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com