VHDL中的多维数组问题?

时间:2011-02-26 05:24:39

标签: vhdl

我正在尝试在VHDL中使用多维数组,但我在使其正常工作方面遇到了很多麻烦。我的问题是我有一个17个,16个向量,给定大小的数组。我想要做的是创建17个寄存器,这些寄存器是16位的32 * std_logic_vector数组(其中= b,512)。所以,我试图在寄存器实例化中传递一些东西来输入和输出,告诉编译器/合成器我想要传递512位的东西...类似于C,如果我有:

int var[COLS][ROWS][ELEMENTS];
memcpy(&var[3].. // I'm talking about 3rd COL here, passing in memory that is ROWS*ELEMENTS long

(我的实际声明在这里:)

type partial_pipeline_registers_type是std_logic_vector的数组(0到16,0到15)(iw - 1 downto 0);    signal h_blk_pipelined_input:partial_pipeline_registers_type;

我尝试使用h_blk_pipelined_input(0)..最多(16)但这不起作用。我得到以下错误,这让我发现我需要双重索引到数组:

ERROR:HDLParsers:821 - (at the register) Wrong index type for h_blk_pipelined_input.

然后我尝试了下面的内容,我收到了这个错误:

ERROR:HDLParsers:164 - (at the register code). parse error, unexpected TO, expecting COMMA or CLOSEPAR


  instantiate_h_pipelined_reg : regn
   generic map ( N=> b, init => bzeros )
   port map ( clk => clk , rst => '0', en => '1',
      input => h_blk_pipelined_input((i - 1), 0 to 15),
      output=> h_blk_pipelined_input((i),     0 to 15));
-- Changing 0 to 15 to (0 to 15) has no effect...

我正在使用XST,并且从他们的文档(http://www.xilinx.com/itp/xilinx6/books/data/docs/xst/xst0067_9.html)中,上面应该有用:

...declaration:

subtype MATRIX15 is array(4 downto 0, 2 downto 0)
   of STD_LOGIC_VECTOR (7 downto 0);

 A multi-dimensional array signal or variable can be completely used:

Just a slice of one row can be specified:

MATRIX15 (4,4 downto 1) <= TAB_B (3 downto 0);

另一种选择是我可以创建更多16倍小的寄存器,而不是一次尝试所有“0到15”,我只会再做15次。但是,我认为这可能会导致合成效率低下,我觉得这不是正确的解决方案。

修改

试过Ben说的,

instantiate_h_m_qa_pipeline_registers: for i in 1 to 16 generate

instantiate_h_pipelined_reg : regn
    generic map ( N=> b, init => bzeros )
    port map ( clk => clk , rst => '0', en => '1',
       input => h_blk_pipelined_input(i - 1),                                            
       output=> h_blk_pipelined_input(i));                                          
end generate instantiate_h_m_qa_pipeline_registers;                                                 

信号现在定义为:

type std_logic_block is array (0 to 15) of std_logic_vector(iw - 1 downto 0) ;
type partial_pipeline_registers_type is array (0 to 16) of std_logic_block;
signal h_blk_pipelined_input : partial_pipeline_registers_type;

我从XST得到的错误是:

错误:HDLParsers:800 - ((寄存器部分所在的位置))输入类型与h_blk_pipelined_input的类型不兼容。

我能够做我之前能够做的所有事情,使用()()语法而不是(,)所以我没有丢失任何东西这样做,但它仍然无法解决我的问题。 / p>

修改

更进一步,在input =&gt;上使用了转换函数。和输出=&gt;寄存器实例化的参数,使用函数在数组类型和std_logic_vector之间转换我需要的大小。它修复了'input =&gt; '部分,但是......

与正式OUT模式相关的实际信号'输出'可能不是类型转换或函数调用。 (LRM 4.3.2.2)

2 个答案:

答案 0 :(得分:3)

怎么样:

TYPE reg512_type IS ARRAY(0 TO 15) OF STD_LOGIC_VECTOR (31 DOWNTO 0);
TYPE partial_pipeline_registers_type IS ARRAY(0 TO 16) OF reg512_type;

Xilinx网站上的代码显然未经过测试。由于ARRAY OF ...是类型,而不是子类型,因此它们的代码不应该编译。

编辑:这些自定义类型不能很好地与现有的IP组件配合使用,但没关系,编译器可以很容易地推断出寄存器。尝试:

instantiate_h_m_qa_pipeline_registers: FOR i IN 1 TO 16 GENERATE

instantiate_h_pipelined_reg : PROCESS (clk)
BEGIN
    IF RISING_EDGE(clk) THEN
        h_blk_pipelined_input(i) <= h_blk_pipelined_input(i - 1);
    END IF;
END GENERATE instantiate_h_m_qa_pipeline_registers;   

答案 1 :(得分:1)

为了让事情正常发挥,我不得不使用一个函数来展平和取消与寄存器实例化交互的数据。

真正的问题归结为我有一个std_logic_vector()数组导致一个大的向量,寄存器实例化需要...然后寄存器给我回到矢量,我需要放入一组向量。

创建一个函数然后执行以下操作非常有用。

      input => blk2vec(h_blk_pipelined_input(i - 1)),                        
      vec2blk(output) => h_blk_pipelined_input(i));