Итак, у меня проблема с функцией инициализации ПЗУ. Прежде чем я перейду к проблеме, позвольте мне немного объяснить природу моей проблемы и моего кода.
Что я хочу сделать, так это сгенерировать N ПЗУ, которые я должен использовать в качестве входных данных для модуля, выполняющего алгоритм сопоставления. Моя проблема в том, что у меня есть файл с моими подписями (скажем, всего 64), который я хочу загрузить в свои разные ПЗУ в зависимости от того, сколько я сгенерировал (степени 2 в моем случае, например, 8 ромов по 8 подписей каждый ).
Я решил, что лучший способ сделать это - загрузить весь текстовый файл в массив (используя функцию вне тела архитектуры), которую я затем буду использовать (снова в функции) для загрузки данных в меньший массив, который затем будет мой ПЗУ.
Мне казалось, что тогда синтезатор просто проигнорирует большой массив, так как я фактически не использую его в своей архитектуре.
Теперь проблема в том, что, поскольку входные аргументы второго массива зависят от сигнала, синтезатор просто игнорирует их и привязывает мой массив к нулю (строка 57).
Кто-нибудь знает, как еще, если есть способ сделать эту архитектуру синтезируемой?
library ieee;
use ieee.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use std.textio.all;
entity signatures_rom_partial is
generic(
data_width : integer := 160;
cycle_int : integer :=32;
rom_size : integer := 4
);
port ( clk : in std_logic;
reset : in std_logic;
readlne: in integer range 0 to cycle_int-1; -- user input for array data initialization
address: in integer range 0 to rom_size-1; -- address for data read
data: out std_logic_vector(data_width-1 downto 0) -- data output
);
end signatures_rom_partial;
architecture rom_arch of signatures_rom_partial is
type rom_type is array (0 to cycle_int-1) of bit_vector (data_width-1 downto 0); -- big array for all signatures, not used in arch
type test_type is array (0 to rom_size-1) of std_logic_vector (data_width-1 downto 0); -- smaller ROMs used in arch
--Read from file function--
----------------------------------------------------------------------------------------------------------
impure function InitRomFromFile (RomFileName : in string) return rom_type is --
file RomFile : text is in RomFileName; --
variable RomFileLine : line; --
variable rom : rom_type; --
--
begin --
for i in rom_type'range loop --
readline (RomFile, RomFileLine); --
read (RomFileLine, rom(i)); --
end loop; --
return rom; --
end function; --
----------------------------------------------------------------------------------------------------------
--Function for smaller ROM initialization--
----------------------------------------------------------------------------------------------------------
impure function initPartRom (rom : rom_type; readlne : integer) return test_type is --
variable test_array : test_type; --
--
begin --
for j in test_type'range loop --
test_array(j) := to_stdlogicvector(rom(j+readlne)); --
end loop; --
return test_array; --
end function; --
----------------------------------------------------------------------------------------------------------
constant rom : rom_type := InitRomFromFile("signatures_input.txt");
signal test_array : test_type := initPartRom(rom , readlne); --(LINE 57) SYNTHESIZER IGNORES THESE INPUT ARGUMENTS
begin
process(clk,reset)
begin
if reset='1' then
data<=(others=>'0');
elsif (clk'event and clk='1') then
data <= (test_array(address));
end if;
end process;
end rom_arch;
Синтез выполняется с помощью Xilinx ISE, симуляция выполняется с помощью Modelsim, в котором мое творение работает нормально :)
Спасибо за любую помощь!