0

我试图获得 18*18 乘法的部分总和。我想将它们保存在一个多维数组(18*36)中,其中数组的每个索引都包含一个部分和。我尝试使用 std_logic_vector 数组。但我没有得到任何结果。我什至尝试了 bit_vector 数组和位数组。这是我的 VHDL 代码。

entity partial is
port(
   A : in bit_vector(17 downto 0);
   B : in bit_vector(17 downto 0);
   C : out bit_vector(35 downto 0);
   D : out bit
);
end partial;

architecture Behavioral of partial is
   type partial_sums is array (17 downto 0, 35 downto 0) of bit;
   signal sums : partial_sums;

begin

   process (A,B)
   begin

    --sums <= (others=> (others=>'0'));

    --for j in 0 to 17 loop
    --   sums(j)<="000000000000000000000000000000000000";
    --end loop;

      for i in B'low to B'high loop
         if ( B(i)='1') then
            for p in A'low to A'high loop
               sums(i,p) <= A(p);   
            end loop;
         end if;
      end loop;

      D <= sums(0,0);

   end process;
end Behavioral;

无论 sums 数组中使用什么索引,我总是在 D 中得到 0。请帮我。

4

3 回答 3

2

您在组合过程中将总和分配给 D,但总和不在过程敏感度列表中。

可能最好的方法是将 D 的分配移到流程之外。

于 2013-01-16T17:37:42.700 回答
0

一句警告:Xilinx ISE(包括版本 14)在多维数组和向量分配方面存在问题。您不能使用三维数组,也不能使用不受约束的数组数组。此外,使用多维数组,分配充其量是有点不稳定。当我最后一次使用 ISE 时,它经常会抱怨合法分配没有所需的宽度,即使 ModelSim 可以很好地编译和模拟。

您的实际问题可能是您只分配了每个条目的低 18 位总和,其中条目实际上是 36 位宽。

为了更好的可读性,您可能应该定义

type partial_sums is array (natural range <>) of bit_vector(35 downto 0);

然后使用没有循环的直接 bit_vector 分配。您在 D 中的固定值可能是由于 B 没有设置为 '1' 的位(您应该得到 U,因为您缺少默认值)或者因为 A 的位始终为 '0',您应该得到所有的 '0'在低 18 位和高 18 bis 中的所有“U”。

编辑:但是,位是已解析的逻辑,因此您只会在其中看到“0”或“1”。IMO 你应该使用std_logic。

于 2013-01-16T17:37:16.473 回答
0

实际上,它工作正常,将适当的测试数据加载到部分产品数组中。

您只是没有再次唤醒进程以收集 D 上的结果。将“sums”添加到进程“partial”的敏感度列表中即可。

或者更好的是,让它成为一个定时过程(你必须这样做,以便在你进行综合时获得任何合理的结果)。

请参阅此 Q/A,了解信号分配的工作原理。 VHDL中的过程是可重入的吗?

于 2013-01-16T17:39:17.753 回答