Код
entity moddata is
generic
(
DATA_WIDTH : natural;
ADDR_WIDTH : natural
);
port
(
rclk : in std_logic;
raddr : in std_logic_vector ((ADDR_WIDTH - 1) downto 0);
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);
end moddata;
architecture behavioural of moddata is
subtype word_model is std_logic_vector((DATA_WIDTH-1) downto 0);
type memory_mod is array(2**ADDR_WIDTH-1 downto 0) of word_model;
signal rom_mod : memory_mod;
attribute ram_init_file : string;
attribute ramstyle of rom_mod : signal is "M9K, no_rw_check";
attribute ram_init_file of rom_mod : signal is "modcossin256.mif";
begin
process(rclk)
begin
if(rising_edge(rclk)) then
q <= rom_mod(conv_integer(raddr));
end if;
end process;
end behavioural;
generic
(
DATA_WIDTH : natural;
ADDR_WIDTH : natural
);
port
(
rclk : in std_logic;
raddr : in std_logic_vector ((ADDR_WIDTH - 1) downto 0);
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);
end moddata;
architecture behavioural of moddata is
subtype word_model is std_logic_vector((DATA_WIDTH-1) downto 0);
type memory_mod is array(2**ADDR_WIDTH-1 downto 0) of word_model;
signal rom_mod : memory_mod;
attribute ram_init_file : string;
attribute ramstyle of rom_mod : signal is "M9K, no_rw_check";
attribute ram_init_file of rom_mod : signal is "modcossin256.mif";
begin
process(rclk)
begin
if(rising_edge(rclk)) then
q <= rom_mod(conv_integer(raddr));
end if;
end process;
end behavioural;
В данной ROM в качестве инициализатора используется файл modcossin256.mif
Но в основном проекте, в одном из режимов работы, требуется смена файла инициализации на другой (с другим содержимым).
Скажите пожалуйста как это можно сделать динамически - подменить файл в процессе работы, например в зависимости от состояния какого-то однобитного флага?
Или придется сделать два разных компонента ROM с разными .mif и в top-level по флагу включать в работу нужный компонент?