2D массив назначает проблемный VHDL, имеющий разный размер

#arrays #2d #vhdl #assignment-operator

Вопрос:

У меня есть два 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?
 

Есть какие-нибудь обходные пути?

Я не хочу увеличивать размер небольшого массива из-за ограничения ресурсов.

Комментарии:

1. Это не 2d массивы. Это 1d массивы 1d типа массива

2. Обратите внимание, что назначение практически всей оперативной памяти другому в одном операторе присваивания будет хорошо при моделировании, но будет синтезироваться на паршивом оборудовании (более 10 000 FFS).

Ответ №1:

Это связано с тем, что VHDL является строго типизированным языком. Здесь rx_ram и Q1_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: Названия сигналов и типов, скорее всего, плохие, так как я не знаю ни одного инструмента, который выводил бы оперативную память с такими большими назначениями.

Комментарии:

1. Использование натуральных продуктов сработало. Большое спасибо.