Цикл VHDL учитывает только один бит - PullRequest
0 голосов
/ 25 апреля 2018

Я довольно новичок в VHDL, поэтому, пожалуйста, не обращайте на меня внимания, если вопрос кажется глупым, и, пожалуйста, скажите мне, если я не соблюдаю правила этого форума.Я не нашел такой же проблемы в интернете.

Здесь у меня огромный регистр (1600 бит), в который я хочу записать 64-битный блок.Адрес блока определяется битами theta_io_ctrl.theta_reg_bus_out является 64-битным std_logic_vector.

    i1               <= 64*to_integer(unsigned(theta_io_ctrl(10 downto 6)));
    for i in 63 downto 0 loop
          i12            <= i1+i;
          next_mem2(i12) <= theta_reg_bus_out(i);
        end loop;  -- i

Проблема с этим кодом состоит в том, что он учитывает только бит 0, а не другие.Здесь Modelsim сообщает мне, что theta_reg_bus_out = 00000000000000D3.Однако, когда я проверяю, что находится в next_mem2 по соответствующему адресу, я получаю 0000000000000001.

Я также попытался написать «от 0 до 63».Тогда учитывается только бит 63.

Где я не прав?Заранее спасибо!

1 Ответ

0 голосов
/ 25 апреля 2018

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
...