VHDL中的多维数组问题?

VHDL中的多维数组问题?,vhdl,Vhdl,我试图在VHDL中使用多维数组,但在使其正常工作时遇到了很多困难。我的问题是,我有一个17个,16个向量的给定大小的数组。我要做的是创建17个寄存器,它们是32位的16*std_逻辑_向量的数组(它=我的b,512)。所以,我尝试在寄存器实例化上传入一些东西到输入和输出,它告诉编译器/合成器我想要传入一些值512位的东西。。。与C中类似,如果我有: int var[COLS][ROWS][ELEMENTS]; memcpy(&var[3].. // I'm talking about 3

我试图在VHDL中使用多维数组,但在使其正常工作时遇到了很多困难。我的问题是,我有一个17个,16个向量的给定大小的数组。我要做的是创建17个寄存器,它们是32位的16*std_逻辑_向量的数组(它=我的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
(我的实际声明如下:)

类型部分_管道_寄存器_类型是标准_逻辑_向量(iw-1向下到0)的数组(0到16,0到15); 信号h_blk_流水线输入:部分流水线寄存器类型

我试着简单地使用h_blk_流水线输入(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);
这些信号现在定义为:

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_流水线输入类型不兼容。

我能做我以前能做的一切,使用()()语法而不是(,),所以这样做我没有损失任何东西,但它仍然不能解决我的问题

编辑:

更进一步,在寄存器实例化的input=>和output=>参数上使用了一个转换函数,使用一个函数在数组类型和我需要的std_逻辑_向量之间进行转换。它修复了“input=>”部分,但是

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

如何:

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站点上的代码显然没有经过测试。因为…的数组是类型,而不是子类型,所以它们的代码不应该编译

编辑:这些自定义类型不能很好地与现有的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;   
实例化_h_m_qa_管道_寄存器:为1到16中的i生成
实例化\u h\u管道化\u reg:进程(clk)
开始
如果上升沿(clk),则
h_blk_流水线输入(i)如何:

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站点上的代码显然没有经过测试。因为…
的数组是类型,而不是子类型,所以它们的代码不应该编译

编辑:这些自定义类型不能很好地与现有的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;   
实例化_h_m_qa_管道_寄存器:为1到16中的i生成
实例化\u h\u管道化\u reg:进程(clk)
开始
如果上升沿(clk),则

h_blk_pipelined_input(i)为了让事情顺利进行,我必须使用一个函数来展平和取消展平与寄存器实例化交互的数据

真正的问题归结为我有一个std_logic_vector()数组,它产生了寄存器实例化需要的一个大向量。。然后寄存器给了我向量,我需要把它放入向量数组中

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

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

为了让事情顺利进行,我必须使用一个函数来展平和取消展平与寄存器实例化交互的数据

真正的问题归结为我有一个std_logic_vector()数组,它产生了寄存器实例化需要的一个大向量。。然后寄存器给了我向量,我需要把它放入向量数组中

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

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

我想我们离这里越来越近了。。查看问题底部的“我的问题编辑”,了解我遇到的错误now@Nektarios:VHDL对类型非常挑剔。即使是兼容的类型,如
无符号
标准逻辑向量
,也不能互换使用。但可以在它们之间进行转换(VHDL中的铸件看起来像C++构造函数风格的铸件)。或者,您可以将组件参数的数据类型更改为
reg512\u type
。为此,您必须将类型声明移动到库模块,以便它们对多个组件可见。因此,我的寄存器定义为“input:in std_logic_vector(N-1到0);”。。你是说,当我实例化其中一个寄存器并设置“input=>h_blk…”时,我可能会以某种方式将我的h_blk_流水线输入重新设置为std_逻辑向量(大小),而不是更小的std_逻辑向量数组?我该怎么做呢?谢谢我想我们快到了。。查看问题底部的“我的问题编辑”,了解我遇到的错误now@Nektarios:VHDL对类型非常挑剔。即使是兼容的类型,如
无符号
标准逻辑向量
,也不能互换使用。但可以在它们之间进行转换(VHDL中的铸件看起来像C++构造函数风格的铸件)。或者,您可以将组件参数的数据类型更改为
reg512\u type
。为此,您必须将类型声明移动到库模块,以便它们对多个组件可见。因此,我的寄存器定义为“input:in std_logic_vector(N-1到0);”。。你是说,当我实例化其中一个寄存器并设置“input=>h_blk…”时,我可能会以某种方式将我的h_blk_流水线输入重新设置为std_逻辑向量(大小),而不是更小的std_逻辑向量数组?我该怎么做呢?幸运的是,我发现这不能合成。但是,使用另一个中间信号,然后在那里使用vec2blk类型的函数,不幸的是,确实有效,