用VHDL将泛型传递给包

用VHDL将泛型传递给包,vhdl,Vhdl,我正在尝试实现一个通用(可参数化)矩阵加法器 到目前为止,我只有两个3x3矩阵的矩阵加法器。下面是matrix_的补充: LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.std_logic_UNSIGNED.all; USE ieee.numeric_std.all; LIBRARY work; USE work.matrix_pack.all; ENTITY matrix_a

我正在尝试实现一个通用(可参数化)矩阵加法器

到目前为止,我只有两个3x3矩阵的矩阵加法器。下面是matrix_的补充:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.std_logic_UNSIGNED.all;
USE ieee.numeric_std.all;

LIBRARY work;
USE work.matrix_pack.all;

ENTITY matrix_add  is
  PORT (
    t_clk_i          : IN    STD_LOGIC;  -- System Clock (66.6667 MHz) (
    s_rst_l_i        : IN    STD_LOGIC;  -- Reset input
    d_mat1_i         : IN    matrix_t; -- Matrix 1 
    d_mat2_i         : IN    matrix_t; -- Matrix 2 
    d_result_o       : OUT   matrix_t  -- Addition Result  
  );
END matrix_add;

ARCHITECTURE rtl_matrix_add OF matrix_add IS

BEGIN
  p_add : PROCESS(t_clk_i, s_rst_l_i)
  BEGIN
    IF s_rst_l_i = '0' THEN
      d_result_o <= (OTHERS => (OTHERS => (OTHERS => '1')));
    ELSIF RISING_EDGE(t_clk_i) THEN
      FOR i IN 0 TO (d_mat1_i'LENGTH(1)-1) LOOP
        FOR j IN 0 TO (d_mat1_i'LENGTH(2)-1) LOOP
          d_result_o(i, j) <= d_mat1_i(i, j) + d_mat2_i(i, j);
        END LOOP;
      END LOOP;
    END IF;
  END PROCESS p_add;

END rtl_matrix_add;
如何使矩阵的大小通用?不幸的是,我不得不使用一个软件包,因为Quartus不接受STD_逻辑_向量(7到0)的数组(0到2,0到2)作为信号输入类型,否则我就不需要软件包,我的问题就解决了

我听说这可以在VHDL 2008中实现,但如何实现,Quartus或Modelsim会接受吗


谢谢你的回答。成功了。代码如下所示:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.std_logic_UNSIGNED.all;
USE ieee.numeric_std.all;

LIBRARY work;
USE work.matrix_pack.all;

ENTITY matrix_add is
  GENERIC (
    M : INTEGER := 3;
    N : INTEGER := 2
    );
  PORT (
    t_clk_i          : IN    STD_LOGIC;                    -- System Clock (66.6667 MHz) (
    s_rst_l_i        : IN    STD_LOGIC;                    -- Reset input
    d_mat1_i         : IN    matrix_t(0 TO M-1, 0 TO N-1); -- Matrix 1 
    d_mat2_i         : IN    matrix_t(0 TO M-1, 0 TO N-1); -- Matrix 2 
    d_result_o       : OUT   matrix_t(0 TO M-1, 0 TO N-1)  -- Addition Result  
  );
END matrix_add;

ARCHITECTURE rtl_matrix_add OF matrix_add IS

BEGIN
  p_add : PROCESS(t_clk_i, s_rst_l_i)
  BEGIN
    IF s_rst_l_i = '0' THEN
      d_result_o <= (OTHERS => (OTHERS => (OTHERS => '1')));
    ELSIF RISING_EDGE(t_clk_i) THEN
      FOR i IN 0 TO (d_mat1_i'LENGTH(1)-1) LOOP
        FOR j IN 0 TO (d_mat1_i'LENGTH(2)-1) LOOP
          d_result_o(i, j) <= d_mat1_i(i, j) + d_mat2_i(i, j);
        END LOOP;
      END LOOP;
    END IF;
  END PROCESS p_add;

END rtl_matrix_add;
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.std_logic_UNSIGNED.all;
USE ieee.numeric_std.all;

PACKAGE matrix_pack IS
  TYPE matrix_t is ARRAY (natural range <>, natural range <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
END matrix_pack;
IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.std_logic_UNSIGNED.all;
使用ieee.numeric_std.all;
图书馆工作;
使用work.matrix_pack.all;
实体矩阵_add is
一般的(
M:整数:=3;
N:整数:=2
);
港口(
时钟i:标准逻辑中——系统时钟(66.6667 MHz)(
s_rst_l_i:在标准逻辑中;--复位输入
d_mat1_i:在矩阵_t(0到M-1,0到N-1);--矩阵1
d_mat2_i:在矩阵_t(0到M-1,0到N-1);--矩阵2
d_result_o:OUT矩阵_t(0到M-1,0到N-1)——加法结果
);
结束矩阵_添加;
矩阵的体系结构rtl\U矩阵添加
开始
p_添加:过程(t_clk_i,s_rst_l_i)
开始
如果s_rst_l_i='0',则
d_result_o(其他=>(其他=>'1'));
如果上升沿(t_clk_i)那么
对于0到(d_mat1_i'LENGTH(1)-1)循环中的i
对于0到(d_mat1_i'LENGTH(2)-1)循环中的j

d_result_o(i,j)为什么不使用
矩阵包
中声明的常量或包含所有常量的另一个包的一部分,并在数组声明中使用这些常量。有趣的答案,唯一的缺点是如果我需要在同一个设计中实例化两个不同维数的矩阵加法器<代码>类型typename是类型的数组(自然范围)
。。。试试看,让我们知道。有一个很好的例子。如果可以使用类型作为输入,那么就可以使用泛型来绑定数组。如果它不受支持,我不希望您的工具支持包泛型。有关包泛型的示例,请参阅ScoreboardGenericPkg和ScoreboardPkg_int,网址:Yes,great。谢谢你,魔术师!请查看带有修改代码的答案!!:)
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.std_logic_UNSIGNED.all;
USE ieee.numeric_std.all;

PACKAGE matrix_pack IS
  TYPE matrix_t is ARRAY (natural range <>, natural range <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
END matrix_pack;