【问题标题】:2D Array assign problem VHDL having different size具有不同大小的二维数组分配问题 VHDL
【发布时间】:2021-11-17 10:13:10
【问题描述】:

我有两个定义如下的二维数组

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?

有什么解决方法吗?

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

【问题讨论】:

  • 这些不是二维数组。它们是一维数组类型的一维数组
  • 请注意,在单个赋值语句中实际上将整个 RAM 分配给另一个 RAM 在模拟中会很好,但会合成到糟糕的硬件(超过 10,000 FF)

标签: arrays 2d vhdl assignment-operator


【解决方案1】:

这是因为 VHDL 是一种强类型语言。这里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。

【讨论】:

  • 使用自然工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2021-01-02
  • 2014-07-28
  • 2014-09-19
  • 2020-07-10
  • 2021-06-06
相关资源
最近更新 更多