VHDL多维数组

VHDL多维数组,vhdl,Vhdl,我想得到18*18乘法的部分和。我想将它们保存在一个多维数组(18*36)中,其中数组的每个索引都包含一个部分和。 我尝试使用std_逻辑_向量数组。但我没有结果。我甚至尝试了位向量数组,也尝试了位向量数组。 这是我的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

我想得到18*18乘法的部分和。我想将它们保存在一个多维数组(18*36)中,其中数组的每个索引都包含一个部分和。 我尝试使用std_逻辑_向量数组。但我没有结果。我甚至尝试了位向量数组,也尝试了位向量数组。 这是我的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;
实体是部分的
港口(
A:在位_向量中(从17向下到0);
B:在位_向量中(从17向下到0);
C:输出位_向量(35到0);
D:出位了
);
末端部分;
部分is的体系结构
类型部分和是位的数组(17到0,35到0);
信号和:部分和;
开始
过程(A、B)
开始
--总和(其他=>'0');
--对于0到17循环中的j

--sums(j)警告一句:包括verison 14在内的Xilinx ISE在多维数组和向量分配方面存在问题。不能使用三维数组,也不能使用无约束数组。此外,使用多维数组,赋值充其量也有点不稳定。当我上一次使用ISE时,它经常会抱怨法律分配没有所需的宽度,即使ModelSim会编译并模拟fine

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

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

type partial_sums is array (natural range <>) of bit_vector(35 downto 0);
类型部分和是位向量(35到0)的数组(自然范围);
然后使用不带循环的直接位向量赋值。 D中的固定值可能是因为B没有设置为“1”的位(因为缺少默认值,所以应该得到U),或者是因为a的位总是“0”,在低18位中应该得到所有“0”,在高18位中应该得到所有“U”


编辑:但是,位是解析逻辑,所以您在其中只能看到“0”或“1”。在我看来,您应该使用标准逻辑。

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


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

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

您只是没有再次唤醒进程来收集D上的结果。 将“总和”添加到过程“部分”的敏感度列表中

或者更好的办法是,让它成为一个有规律的过程(正如你必须做的那样,当你进入合成阶段时,为了得到任何合理的结果)

有关信号分配的工作原理,请参见本Q/A。

您如何测试它?可能值得发布一个简单的测试平台。我正在使用Xilinx。这是我创建的vhdl文件的测试台。接得好。想知道为什么用户使用bit而不是std_逻辑,虽然。bit更简单,但应该更快地进行模拟。当我们不需要对未知和解析类型进行建模时,最好想一想为什么不经常使用它。@FRob:可能是因为一些教授不想解释“X”、“Z”等。早些时候,我尝试了所有这些方法,但得到了意想不到的结果。不在灵敏度列表中的求和解决方案解决了我的问题。谢谢