Инициализация массива записей в VHDL
у меня есть запись определяется следующим образом
type ifx_t is
record
data : std_logic_vector(127 downto 0);
address : std_logic_vector (19 downto 0);
WrReq : std_logic;--
RdReq : std_logic; --
end record;
type Array_ifx_t is array (0 to 2) of ifx_t;
и я должен инициализировать экземпляр этого массива записей, и я попробовал следующий способ, и он не работает
signal pair_in : Array_ifx_t:= (others =>((others =>'0'),(others=>'0'),'0','0'));
просьба помочь.
2 ответов
Как сказано в комментарии, ModelSim работает при компиляции кода из вопроса с ModelSim. Однако другие инструменты могут быть более строгими в использовании типизированного значения для элементов в Array_ifx_t
.
для типизированного назначения и использования именованных элементов записи, которые, я думаю, дают обзор геттера и избегают ошибок по ссылкам на позиции, вы можете сделать инициализацию с:
constant IFX_T_0S : ifx_t := (data => (others =>'0'),
address => (others=>'0'),
WrReq => '0',
RdReq => '0');
signal pair_in : Array_ifx_t:= (others => IFX_T_0S);
моя первоначальная реакция на то, чтобы увидеть агрегат в вашем значении по умолчанию для pair_in, заключалась в том, что было слишком много "других", поэтому я независимо написал один, используя само объявление типа записи:
library ieee;
use ieee.std_logic_1164.all;
package some_record is
type ifx_t is
record
data : std_logic_vector(127 downto 0);
address : std_logic_vector (19 downto 0);
WrReq : std_logic;--
RdReq : std_logic; --
end record;
type Array_ifx_t is array (0 to 2) of ifx_t;
-- positional association in an aggregate used for initialization:
signal pair_in: ifx_t := ((others => '0'), (others => '0'),'0','0');
end package;
и это успешно проанализированы. Агрегат имеет два типа ассоциаций: позиционные или именованные. Приведенное выше выражение значения по умолчанию-positional. С именованной ассоциацией:
signal pair_in: ifx_t := -- named association of record elements:
(
data => (others => '0'),
address => (others =>'0'),
WrReq => '0',
RdReq => '0'
);
вы заметите, что это имеет жуткое сходство с выражением value найден в постоянном объявлении принятого ответа Мортена и фактически рассказывает историю совместимости для агрегированного выражения.
агрегат, совместимый с типом записи, содержит выражение значения, совместимое с каждым элементом типа записи. Это делается для данных и адреса элементов массива, предоставляя агрегаты для их значений по умолчанию, в то время как WrReq и RdReq предоставляются с их значениями по умолчанию напрямую.
дополнительные другие заявления найденное в первоначальной попытке было бы уместно, если бы pair_in
был составным типом, состоящим из массива, состоящего из ifx_t
элементы типа записи.
LRM (например, IEEE Std 1076-1993) имеет раздел по выражениям, подраздел по агрегатам с дополнительным подразделом по агрегатам записей.
есть также раздел о типах, подраздел о составных типах, с дополнительным подразделом о типах записей.