查询包

时间:2015-05-29 19:00:49

标签: vhdl

我编写了一个简单的VHDL代码来添加两个包含32位浮点数的矩阵。矩阵尺寸已在包中定义。目前,我在vhdl代码中指定矩阵维度,并使用包中的相应类型。但是,我想在设计中使用泛型来处理不同维度的矩阵。为此我必须以某种方式使用包中定义的正确类型。我该怎么做呢? 我目前的VHDL代码如下。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.mat_pak.all;

entity newproj is
    Port ( clk : in  STD_LOGIC;
           clr : in  STD_LOGIC;
           start : in  STD_LOGIC;
           A_in : in  t2;
           B_in : in  t2;
           AplusB : out  t2;
           parallel_add_done : out  STD_LOGIC);
end newproj;

architecture Behavioral of newproj is
COMPONENT add
  PORT (
    a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    clk : IN STD_LOGIC;
    sclr : IN STD_LOGIC;
    ce : IN STD_LOGIC;
    result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
    rdy: OUT STD_LOGIC
  );
END COMPONENT;


signal temp_out: t2 := (others=>(others=>(others=>'0')));
signal add_over: t2bit:=(others=>(others=>'0'));
signal check_all_done,init_val: std_logic:='0';
begin
    init_val <= '1';
    g0: for k in 0 to 1 generate
                g1: for m in 0 to 1 generate
                            add_instx: add port map(A_in(k)(m), B_in(k)(m),     clk, clr, start, temp_out(k)(m), add_over(k)(m));
                end generate;   
        end generate;

        g2: for k in 0 to 1 generate
                g3: for m in 0 to 1 generate
                        check_all_done <= add_over(k)(m) and init_val;
                end generate;   
        end generate;

        p1_add:process(check_all_done,temp_out)
        begin
            AplusB <= temp_out;
            parallel_add_done <= check_all_done;            
        end process;

end Behavioral;

我的包裹如下

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.ALL;

    package mat_pak is


    subtype small_int is integer range 0 to 2;

    type t22 is array (0 to 1) of std_logic_vector(31 downto 0);
    type t2 is array (0 to 1) of t22; --2*2 matrix

    type t22bit is array (0 to 1) of std_logic;
    type t2bit is array (0 to 1) of t22bit; --2*2 matrix bit

    type t33 is array (0 to 2) of std_logic_vector(31 downto 0);
    type t3 is array (0 to 2) of t33; --3*3 matrix

end mat_pak;

欢迎任何建议。谢谢。

2 个答案:

答案 0 :(得分:1)

我不太确定完全理解,但无论如何我都会尝试回答;)

你可以像这样使用无约束数组:

package mat_pak is
  type matrix is array(natural range <>, natural range <>) of std_logic_vector(31 downto 0);
end package mat_pack;

entity newproj is
Generic ( size : natural );
Port ( clk : in  STD_LOGIC;
       clr : in  STD_LOGIC;
       start : in  STD_LOGIC;
       A_in : in  matrix(0 to size-1, 0 to size-1);
       B_in : in  matrix(0 to size-1, 0 to size-1);
       AplusB : out  matrix(0 to size-1, 0 to size-1);
       parallel_add_done : out  STD_LOGIC);
end newproj;

答案 1 :(得分:1)

您的设计存在一些逻辑问题。

首先,设计可以容忍的子层次结构有一些最大数量的端口,你有192位的矩阵输入和输出。你真的相信这个号码应该是可配置的吗?

在某些时候,它只适用于非常大的FPGA器件,此后不久也不适合。

想象一下在addparallel_add_done中采用可变数量的时钟的一些操作表示何时可用的aplusb数据包含由所有实例化的{{1}贡献的矩阵数组的元素组件,各个add信号被AND在一起。如果rdy所有花费相同的时间,你可以从其中任何一个人那里获取add(如果硅不是确定性的那么它将无法使用,rdy中有寄存器})。

嵌套的generate语句都在add_over(k,m)和add之间分配AND的结果(这是init_val的合成常量)。效果或线路将add_over(k.m)位加在一起(在VHDL中不起作用,在合成中也可能无法实现)。

注意我还展示了二维数组的正确索引方法。

使用Jonathan的矩阵大小调整方法:

1

我们发现我们真的想要将各种library ieee; use ieee.std_logic_1164.all; package mat_pak is type matrix is array (natural range <>, natural range <>) of std_logic_vector(31 downto 0); type bmatrix is array (natural range <>, natural range <>) of std_logic; end package mat_pak; library ieee; use ieee.std_logic_1164.all; use work.mat_pak.all; entity newproj is generic ( size: natural := 2 ); port ( clk: in std_logic; clr: in std_logic; start: in std_logic; a_in: in matrix (0 to size - 1, 0 to size - 1); b_in: in matrix (0 to size - 1, 0 to size - 1); aplusb: out matrix (0 to size - 1, 0 to size - 1); parallel_add_done: out std_logic ); end entity newproj; architecture behavioral of newproj is component add port ( a: in std_logic_vector(31 downto 0); b: in std_logic_vector(31 downto 0); clk: in std_logic; sclr: in std_logic; ce: in std_logic; result: out std_logic_vector(31 downto 0); rdy: out std_logic ); end component; signal temp_out: matrix (0 to size - 1, 0 to size - 1) := (others => (others => (others => '0'))); signal add_over: bmatrix (0 to size - 1, 0 to size - 1) := (others => (others => '0')); begin g0: for k in 0 to size - 1 generate g0x: for m in 0 to size - 1 generate add_instx: add port map ( a => a_in(k,m), b => b_in(k,m), clk => clk, sclr => clr, ce => start, result => temp_out(k,m), rdy => add_over(k,m) ); end generate; end generate; aplusb <= temp_out; p1_add: process (add_over) variable check_all_done: std_logic; begin check_all_done := '1'; for k in 0 to size - 1 loop for m in 0 to size -1 loop check_all_done := check_all_done and add_over(k,m); end loop; end loop; parallel_add_done <= check_all_done; end process; end architecture behavioral; 输出(rdy数组)放在一起。在VHDL -2008中,这可以用一元AND来完成,否则你会指望一个合成工具来平整AND(它们通常会这样做)。

我将add_over分配给并发作业。

所以我愚弄了一个空架构的aplusb实体,然后进行分析,详细说明和模拟,这表明没有任何连接在任何地方都存在长度不匹配。