i1
и i12
должны быть сигналами, потому что вы назначаете их с назначением сигнала.(В следующий раз, когда вы зададите вопрос, было бы лучше создать MCVE ).Сигналы не являются переменными:
i) они не обновляются до тех пор, пока все процессы не приостановятся (либо не выполнит команду wait
, либо не опустится вниз)
ii) если вы переназначите значение насигнал, прежде чем все процессы приостанавливаются, он просто перезаписывает предыдущее назначенное значение.
Итак, в вашем коде, когда эта строка (i12 <= i1+i;
) выполняется, сигнал i1
еще не обновлен.Затем в вашем цикле все предыдущие назначения для сигнала i12
перезаписываются назначением на последней итерации вашего цикла.Вот почему «он учитывает только бит 0» или бит 63, если вы используете 0 to 63
.
Итак, либо сделайте i1
и i12
переменными .Переменные в VHDL ведут себя как переменные в любом другом языке и обновляются немедленно.(Вам придется выполнить поиск в Google, чтобы узнать о переменных, вы не можете буквально просто заменить одну на другую, потому что оператор присваивания отличается, и переменные могут быть объявлены только в процессе.)
Или просто упроститекод что-то вроде:
for i in 63 downto 0 loop
next_mem2(i+64*to_integer(unsigned(theta_io_ctrl(10 downto 6)))) <= theta_reg_bus_out(i);
end loop; -- i