【问题标题】:Comparing a long std_logic_vector to zeros将长 std_logic_vector 与零进行比较
【发布时间】:2013-10-01 06:26:54
【问题描述】:

在模拟中,这很完美。这是最好的检查方法吗 可综合代码的零。会产生什么资源?

signal vector_slv : std_logic_vector(2048 downto 0);
...
if (vector_slv = (vector_slv'range => '0')) then
  -- do something...

考虑到硬件映射(具有最佳资源利用率),是否有任何其他最佳方式来实施此解决方案。

我会更有兴趣了解所使用的资源。

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    没有办法或多或少地对合成有意义。编写最能表达您意图的代码。

    如果您要比较一个全为零的向量,则以下结果都应该产生相同的结果,或者您应该针对该工具提交一个严重的错误!

    signal vector_slv : std_logic_vector(2048 downto 0);
    constant zeros : std_logic_vector(vector_slv'range) := (others => '0');
    ...
    if vector_slv = (vector_slv'range => '0') then
      -- do something...
    if vector_slv = zeros then
      -- do something...
    if unsigned(vector_slv) = to_unsigned(0, vector_slv'length) then
      -- do something...
    

    实际上对于适合整数的较短向量:

    if intvar = 0 then
    

    将与任何 32 位向量比较完全相同。

    (顺便说一句,注意if 条件周围不需要括号 - VHDL 不是 C :)

    【讨论】:

      【解决方案2】:

      如果范围可用,如您的示例代码中所示,则建议 解决方案看起来不错,我希望合成工具可以处理 像这样的结构。

      如果范围不可用,则与零比较可以如下:

      library ieee;
      use ieee.numeric_std.all;
      ...
        if unsigned( {std_logic_vector expression of any length} ) = 0 then
          -- do something...
      

      我希望综合工具可以像比较一样处理这个问题 (vector_slv'range => '0')

      【讨论】:

        【解决方案3】:

        就综合而言,是的,这种简单的构造通常会被工具很好地优化。确切的硬件布局当然取决于您的目标是什么(FPGA、ASIC...)。

        我的建议是查看综合结果(例如 Altera FPGA 的 Technology Map Viewer)。如果综合破坏了它,您可以手动将其转换为与零比较的二叉树,同时考虑到您可用的技术原语。不过,这可能比听起来要复杂得多,尤其是对于 FPGA(那里不仅有 LUT 可以玩),而且对于一个像样的工具来说,这不是必需的。

        【讨论】:

          【解决方案4】:

          您也可以通过这样做来分离谓词和赋值:

          signal is_zero : boolean;
          signal vector_slv : std_logic_vector(2048 downto 0);
          ...
          process(clk)
          begin
            if rising_edge(clk) then
              is_zero <= vector_slv = (vector_slv'range => '0');
              if is_zero then
                ...
              end if;
            end if;
          end process;
          

          这应该会大大改善您的计时。考虑到谓词“is_zero”现在是原始比较的延迟版本!

          【讨论】:

          • 请解释为什么这会大大改善您的时间安排。
          • 当然,如果你不拆分这个谓词,那么由于谓词本身加上'if'块内的赋值延迟,你会有很大的延迟。如果内部有乘法或加法运算,这很容易超过您的时钟周期,尤其是当您必须使用快速时钟时。
          • ... 尤其是当您使用非常长的向量时。如果我必须为您的非常长的向量优化代码,我会将所有操作(谓词和数学操作)过度拆分成小块,并使用一种树结构来启用并行性而不是长链。我不知道英特尔、赛灵思和公司是否同时开始在他们的最新版本中使用这个。我必须使用的版本没有像那样优化。
          • if or vector_slv = '0' then 有什么问题,这也表明您在寻找零?您还可以注意到信号is_zeroclk 的下一个上升沿之前不会被评估为零。 (这里有一个is_zero 触发器,其输出在时钟边沿进行评估。
          • @user1155120 :如果您的时钟非常慢,如果您的向量很小并且您的分配要求不高,则与零进行比较并在同一时钟周期内进行分配是没有问题的。如果您在边缘实现事物,有时您必须拆分事物以在所需的时钟周期时间内完成它。一种方法是拆分谓词和赋值,正如我在上面进一步展示的那样。你是对的,这需要两个时钟周期而不是一个。
          【解决方案5】:

          您可以使用一元运算符,例如:

          • 也不
          signal vector_slv: std_logic_vector(2048 downto 0);
          ...
          if and vector_slv then
              -- Do something for all 1...
          elsif nand vector_slv then
              -- Do something for at least one 0...
          elsif or vector_slv then
              -- Do something for at least one 1...
          elsif nor vector_slv then
              -- Do something for all 0...
          end if;
          

          或者你可以使用std_logic_1164中定义的函数,例如:

          function "and"  (l : STD_ULOGIC_VECTOR) return STD_ULOGIC;
          function "nand" (l : STD_ULOGIC_VECTOR) return STD_ULOGIC;
          function "or"   (l : STD_ULOGIC_VECTOR) return STD_ULOGIC;
          function "nor"  (l : STD_ULOGIC_VECTOR) return STD_ULOGIC;
          
          use ieee.std_logic_1164.all;
          ...
          signal vector_slv: std_logic_vector(2048 downto 0);
          ...
          if and(vector_slv) then
              -- Do something for all 1...
          elsif nand(vector_slv) then
              -- Do something for at least one 0...
          elsif or(vector_slv) then
              -- Do something for at least one 1...
          elsif nor(vector_slv) then
              -- Do something for all 0...
          end if;
          

          【讨论】:

            猜你喜欢
            • 2013-11-19
            • 1970-01-01
            • 1970-01-01
            • 2021-10-13
            • 1970-01-01
            • 1970-01-01
            • 2012-11-21
            • 1970-01-01
            相关资源
            最近更新 更多