具有不同大小的 2D 阵列分配问题 VHDL

2D Array assign problem VHDL having different size

提问人:Sre M 提问时间:9/24/2021 最后编辑:Renaud PacaletSre M 更新时间:9/24/2021 访问量:290

问:

我有两个 2D 数组,定义如下

type ram_1300_block is array (1300 downto 0) of std_logic_vector(7 downto 0);

type ram_2700_block is array (2700 downto 0) of std_logic_vector(7 downto 0);

rx_ram : ram_1300_block;
Q1_ram : ram_2700_block;

然后,我在代码中使用了以下赋值语句:

Q1_ram(1300 downto 1) <= rx_ram(1341 downto 42);

在合成时,我在 vivado 2015.3 中出现以下错误

Synth 8-2234 indexed name is not a ram_3700 block?

有什么解决方法吗?

由于资源限制,我不想增加小数组大小。

阵列 2D VHDL 赋值运算符

评论

0赞 Tricky 9/24/2021
这些不是 2d 数组。它们是 1d 数组类型的 1d 数组
0赞 9/28/2021
请注意,在单个赋值语句中将几乎整个 RAM 分配给另一个 RAM 在仿真中是可以的,但会合成到糟糕的硬件(超过 10,000 个 FF)

答:

1赞 Tricky 9/24/2021 #1

这是因为 VHDL 是一种 stronly 类型语言。这里和是不同的类型,因此不能直接分配给彼此。更困难的是,由于您已为类型指定了大小,因此无法进行类型转换,因为切片没有可命名用于密切相关类型转换的不同类型。rx_ramQ1_ram

我建议您创建一个不受约束的类型,该类型在创建信号时受到约束,因此可以相互分配。如果您愿意,您甚至可以创建命名子类型:

type ram_block_t is array(natural range <>) of std_logic_vector(7 downto 0);
subtype ram_1300_block is ram_block_t(1300 downto 0);
subtype ram_2700_block is ram_block_t(2700 downto 0);

signal rx_ram : ram_2700_block ;
signal Q1_ram : ram_1300_block;

Q1_ram(1300 downto 1) <= rx_ram(1341 downto 42);

注意1:我假设您在原始帖子中的类型有误,因为使用的索引超出了该类型的范围。rx_ram(1341 downto 42)

注意2:信号和类型的名称可能很糟糕,因为我不知道有任何工具可以推断出具有如此大分配的RAM。

评论

0赞 Sre M 9/29/2021
使用自然工作。多谢。