Matrix vhdl中矩阵乘法的警告

Matrix vhdl中矩阵乘法的警告,matrix,vhdl,multiplication,Matrix,Vhdl,Multiplication,因此,我开始为一个简单的4x4矩阵乘法编写代码。代码在这一点上是非常粗糙的,我将尝试在最后修改它,但我只是想看看它是否有效。 它使用8位输入对矩阵的2位元素进行直接赋值。类似地,4个输出是通过连接结果矩阵每行的4个元素创建的。下面您可以看到代码 我遇到的问题是,在我运行代码之后,我得到大约100个这种类型的警告 算术操作数中有一个“U”|“X”|“W”|“Z”|“-”,结果将是“X”(es) 我做错了什么?变量a、B、temp或其他变量的初始化是否有问题 LIBRARY IEEE; USE IE

因此,我开始为一个简单的4x4矩阵乘法编写代码。代码在这一点上是非常粗糙的,我将尝试在最后修改它,但我只是想看看它是否有效。 它使用8位输入对矩阵的2位元素进行直接赋值。类似地,4个输出是通过连接结果矩阵每行的4个元素创建的。下面您可以看到代码

我遇到的问题是,在我运行代码之后,我得到大约100个这种类型的警告 算术操作数中有一个“U”|“X”|“W”|“Z”|“-”,结果将是“X”(es) 我做错了什么?变量a、B、temp或其他变量的初始化是否有问题

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.std_logic_unsigned.all;

ENTITY matrix_mul IS
    PORT( 
    a1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    a2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    a3: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    a4: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    b1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    b2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    b3: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    b4: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    x1: OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    x2: OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    x3: OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    x4: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
    );
END matrix_mul;

ARCHITECTURE arch OF matrix_mul IS

TYPE array_2b_1x4 IS ARRAY (3 DOWNTO 0) of STD_LOGIC_VECTOR(1 DOWNTO 0);
TYPE matrix_2b_4x4 IS ARRAY (3 DOWNTO 0) of array_2b_1x4;
TYPE array_4b_1x4 IS ARRAY (3 DOWNTO 0) of STD_LOGIC_VECTOR(3 DOWNTO 0);
TYPE matrix_4b_4x4 IS ARRAY (3 DOWNTO 0) of array_4b_1x4;


BEGIN
    PROCESS (a1,a2,a3,a4,b1,b2,b3,b4)
    VARIABLE A : matrix_2b_4x4 := (others => (others => (others => '0')));
    VARIABLE B : matrix_2b_4x4 := (others => (others => (others => '0')));
    VARIABLE temp : matrix_4b_4x4 := (others => (others => (others => '0')));

    BEGIN
        A(0)(0) := a1(7 DOWNTO 6);
        A(0)(1) := a1(5 DOWNTO 4);
        A(0)(2) := a1(3 DOWNTO 2);
        A(0)(3) := a1(1 DOWNTO 0);
        A(1)(0) := a2(7 DOWNTO 6);
        A(1)(1) := a2(5 DOWNTO 4);
        A(1)(2) := a2(3 DOWNTO 2);
        A(1)(3) := a2(1 DOWNTO 0);
        A(2)(0) := a3(7 DOWNTO 6);
        A(2)(1) := a3(5 DOWNTO 4);
        A(2)(2) := a3(3 DOWNTO 2);
        A(2)(3) := a3(1 DOWNTO 0);
        A(3)(0) := a4(7 DOWNTO 6);
        A(3)(1) := a4(5 DOWNTO 4);
        A(3)(2) := a4(3 DOWNTO 2);
        A(3)(3) := a4(1 DOWNTO 0);
        B(0)(0) := b1(7 DOWNTO 6);
        B(0)(1) := b1(5 DOWNTO 4);
        B(0)(2) := b1(3 DOWNTO 2);
        B(0)(3) := b1(1 DOWNTO 0);
        B(1)(0) := b2(7 DOWNTO 6);
        B(1)(1) := b2(5 DOWNTO 4);
        B(1)(2) := b2(3 DOWNTO 2);
        B(1)(3) := b2(1 DOWNTO 0);
        B(2)(0) := b3(7 DOWNTO 6);
        B(2)(1) := b3(5 DOWNTO 4);
        B(2)(2) := b3(3 DOWNTO 2);
        B(2)(3) := b3(1 DOWNTO 0);
        B(3)(0) := b4(7 DOWNTO 6);
        B(3)(1) := b4(5 DOWNTO 4);
        B(3)(2) := b4(3 DOWNTO 2);
        B(3)(3) := b4(1 DOWNTO 0);


        FOR i IN 0 TO 3 LOOP
            FOR j IN 0 TO 3 LOOP
                FOR k IN 0 TO 3 LOOP
                    temp(i)(j) := temp(i)(j) + ( A(i)(k) * B(k)(j) );
                END LOOP;
            END LOOP;
        END LOOP;

        x1 <= temp(0)(0) & temp(0)(1) & temp(0)(2) & temp(0)(3);
        x2 <= temp(1)(0) & temp(1)(1) & temp(1)(2) & temp(1)(3);
        x3 <= temp(2)(0) & temp(2)(1) & temp(2)(2) & temp(2)(3);
        x4 <= temp(3)(0) & temp(3)(1) & temp(3)(2) & temp(3)(3);

    END PROCESS;
END arch;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.std_logic_unsigned.all;
实体矩阵是
港口(
a1:标准逻辑向量(7到0);
a2:标准逻辑向量(7到0);
a3:标准逻辑向量(7到0);
a4:标准逻辑向量(7到0);
b1:标准逻辑向量(7到0);
b2:标准逻辑向量(7到0);
b3:标准逻辑向量(7到0);
b4:标准逻辑向量(7到0);
x1:输出标准逻辑向量(15到0);
x2:输出标准逻辑向量(15到0);
x3:输出标准逻辑向量(15到0);
x4:输出标准逻辑向量(15到0)
);
末端矩阵;
matrix_mul的体系结构
类型数组_2b_1x4是标准逻辑_向量(1向下到0)的数组(3向下到0);
类型矩阵_2b_4x4是数组_2b_1x4的数组(3到0);
类型数组_4b_1x4是标准逻辑向量(3向下到0)的数组(3向下到0);
类型矩阵_4b_4x4是数组_4b_1x4的数组(3到0);
开始
工艺(a1、a2、a3、a4、b1、b2、b3、b4)
变量A:矩阵_2b_4x4:=(其他=>(其他=>(其他=>“0”);
变量B:矩阵_2b_4x4:=(其他=>(其他=>(其他=>“0”);
变量温度:矩阵_4b_4x4:=(其他=>(其他=>(其他=>“0”);
开始
A(0)(0):=a1(7至6);
A(0)(1):=a1(5到4);
A(0)(2):=a1(3到2);
A(0)(3):=a1(1到0);
A(1)(0):=a2(7至6);
A(1)(1):=a2(5至4);
A(1)(2):=a2(3至2);
A(1)(3):=a2(1到0);
A(2)(0):=a3(7至6);;
A(2)(1):=a3(5至4);;
A(2):=a3(3至2);;
A(2)(3):=a3(1至0);;
A(3)(0):=a4(7至6);
A(3)(1):=a4(5至4);
A(3)(2):=a4(3至2);
A(3)(3):=a4(1至0);
B(0):=b1(7至6);;
B(0)(1):=b1(5到4);
B(0)(2):=b1(3到2);
B(0)(3):=b1(1到0);
B(1)(0):=b2(7至6);
B(1)(1):=b2(5至4);
B(1)(2):=b2(3至2);
B(1)(3):=b2(1到0);
B(2)(0):=b3(7到6);
B(2)(1):=b3(5到4);
B(2)(2):=b3(3到2);
B(2)(3):=b3(1到0);
B(3)(0):=b4(7至6);
B(3)(1):=b4(5至4);
B(3)(2):=b4(3至2);
B(3)(3):=b4(1到0);
对于0到3循环中的i
对于0到3循环中的j
对于0到3循环中的k
温度(i)(j):=温度(i)(j)+(A(i)(k)*B(k)(j));
端环;
端环;
端环;

x1问题在于这些初始化在进程内的变量声明中进行

VARIABLE A : matrix_2b_4x4 := (others => (others => (others => '0')));
VARIABLE B : matrix_2b_4x4 := (others => (others => (others => '0')));
VARIABLE temp : matrix_4b_4x4 := (others => (others => (others => '0')));
当流程ia第一次执行时,仅发生一次

您还没有发布您的测试台,但我怀疑
a
b
没有在那里的声明中初始化。因此,当流程第一次执行时,它们都是
'U'
。因此,
temp
被分配一些/所有
'X'
es。在您为测试台中的
a
b
分配了一些有效值后,该过程将再次执行,但
temp
仍然分配了从开始时的最后一次运行开始的值,并且包含
'X'
es,并将它们保留在加法中

这不是你想要的矩阵乘法。您已经描述了一个组合过程,因此,您必须为每次运行初始化过程中的所有变量。通过这种方式,它不依赖于上一次运行,因此,累加从
temp
=零开始。在此过程中,您已经正确分配了
a
B
,但缺少
temp
。只需在
for
循环之前初始化它:

...
temp := (others => (others => (others => '0')));
FOR i IN 0 TO 3 LOOP
...

进行此更改后,您可以在变量声明中删除变量初始化。

问题在于这些初始化在流程中的变量声明中进行

VARIABLE A : matrix_2b_4x4 := (others => (others => (others => '0')));
VARIABLE B : matrix_2b_4x4 := (others => (others => (others => '0')));
VARIABLE temp : matrix_4b_4x4 := (others => (others => (others => '0')));
当流程ia第一次执行时,仅发生一次

您还没有发布您的测试台,但我怀疑
a
b
没有在那里的声明中初始化。因此,当流程第一次执行时,它们都是
'U'
。因此,
temp
被分配一些/所有
'X'
es。在您为测试台中的
a
b
分配了一些有效值后,该过程将再次执行,但
temp
仍然分配了从开始时的最后一次运行开始的值,并且包含
'X'
es,并将它们保留在加法中

这不是你想要的矩阵乘法。您已经描述了一个组合过程,因此,您必须为每次运行初始化过程中的所有变量。通过这种方式,它不依赖于上一次运行,因此,累加从
temp
=零开始。在此过程中,您已经正确分配了
a
B
,但缺少
temp
。只需在
for
循环之前初始化它:

...
temp := (others => (others => (others => '0')));
FOR i IN 0 TO 3 LOOP
...
做了这个改变之后,y