6

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

    E : std_logic_vector(7 downto 0);  

然后

    E <= "00011010";

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

我知道我可以通过从左到右检查“0”位并在出现“1”位时停止来使用for循环。但这效率不高,因为我有 1024 位或更多位,这会减慢我的电路速度。那么是否有任何方法或算法可以有效地计算长度?例如使用 log(n) 级门的组合门,(其中 n = 位数)。

4

4 回答 4

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;

通常,您希望在综合时使用常数执行此操作,而速度无关紧要。但您也可以生成 FPGA 逻辑,如果这确实是您想要的。

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

然后你必须在多个时钟上拆分操作,并将一些中间结果存储到 FF 中。(我会预先忘记通过重新排列代码来超越合成器。查找表是一个表。为什么在这个表中生成值很重要?但请确保告诉合成器“不在乎" 值,如果你有的话。)

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

但请注意不要在这样做时重新发明 CPU。

于 2013-05-14T06:32:49.983 回答
3

使用循环的问题在于,当您进行综合时,您可能会得到很长的逻辑链。

查看问题的另一种方法是找到最高有效位的索引。为此,您可以使用优先级编码器。这样做的好处是您可以通过在树结构中使用较小优先级编码器来制作大优先级编码器,因此延迟是 O(log N) 而不是 O(N)。

这是一个 4 位优先级编码器: http ://en.wikibooks.org/wiki/VHDL_for_FPGA_Design/Priority_Encoder 您可以使用其中的 5 个块制作一个 16 位优先级编码器,然后使用五个 16 位编码器制作一个 256 位编码器,等等。

但由于你有这么多位,它会相当大。

于 2013-05-14T15:21:02.460 回答
2

好吧,VHDL 不是软件,它不需要时间来执行这样的操作,它只是从你的 FPGA 中占用资源。

您可以将 1024 位数据划分为 32 位部分,并在所有位之间执行 OR,这样,您一次检查 32 位。这并不是真正必要的,因为 for 循环对于您想要做的事情来说非常好,只需编写代码,在数组中查找第一个 1 并停止循环并使用循环索引号作为指向第一个的指针1 在您的阵列中。我没有编译这段代码,但这样的东西应该适合你:

FirstOne <= 1023;
for i in E'reverse_range loop
  if (E(i) == '1') then
    FirstOne <= i;
    exit;
  end if;
end loop;

毕竟FPGA内部不会有这么大的块。

于 2013-05-14T05:46:27.073 回答
1

如今,大多数合成器都支持递归函数。实际上,这会给您带来与log(N)N 是位数相当的复杂性:

  • 把你的向量切成两半
  • 如果上半部分全为零
    • 你的答案的前导位是'1',低位取决于下半部分向量
  • 除此以外
    • 你的答案的前导位是'0',低位取决于上半部分向量
  • 递归上面选择的一半感兴趣的向量
于 2013-05-14T15:37:42.150 回答