Вы не можете сделать это:
process (clk, rst)
begin
if rst = '1' then
for a in 0 to 2047 loop
memory0(a) <= INIT(a*2);
end loop;
... так как это требует сбрасываемой памяти, а не инициализированной единицы.
Для инициализации вам необходимо изменить объявление сигнала в форме
signal memory0 : memory_t(0 to 2047) := ( some list of integers or something that returns an array of integers);
То, как вы в настоящее время делаете это (с чередованием вашего init), означает, что вам придется использоватьфункция:
function init_mem(init_values: memory_t) returns memory_t is
variable retval : memory_t(init_values'high/2)+1 downto 0);
begin
for i in retval'range loop
retval(i) := init_values(2*i);
end for;
end function;
(обратите внимание, что это было напечатано на моей голове, и я даже не пытался скомпилировать его, так что извиняюсь за любые опечатки и синтаксические ошибки ... но я надеюсь, что вы получитеидея:)
Затем вы можете использовать это, чтобы инициировать сигнал:
signal memory0 : memory_t(0 to 2047) := init_mem(INIT);
Это все будет работать для моделирования.Вы можете или не можете иметь успех с синтезатором XST, выводящим значения INIT - я не пробовал.Проверьте файл журнала синтеза, чтобы увидеть, что он сообщает, и, пожалуйста, сообщите нам, работает ли он и на какой версии XST вы его пробовали.