我正在尝试在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)
答案 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 ...
是类型,而不是子类型,因此它们的代码不应该编译。
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));