VHDL多维数组

时间:2013-01-16 16:42:15

标签: vhdl

我试图得到18 * 18乘法的部分和。我想将它们保存在一个多维数组(18 * 36)中,其中数组的每个索引都包含一个部分和。 我尝试使用std_logic_vector数组。但我没有结果。我甚至尝试了bit_vector和bit的数组。 这是我的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。 请帮帮我。

3 个答案:

答案 0 :(得分:2)

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

这里最好的方法可能就是在过程之外移动D的分配。

答案 1 :(得分:0)

警告:Xilinx ISE包括verison 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位中,所有'U'在上18位。

编辑:但是,位是解析逻辑,所以你只会看到'0'或'1'。 IMO你应该使用std_logic。

答案 2 :(得分:0)

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

你只是没有再次唤醒过程以在D上收集结果。 将“sums”添加到流程“partial”的灵敏度列表中。

或者更好,让它成为一个时钟进程(因为你需要,当你进行综合时得到任何明智的结果)。

请参阅此Q / A,了解信号分配的工作原理。 Is process in VHDL reentrant?