Как использовать итеративную переменную в кейсе [VHDL]

Класс должен существовать под WEB-INF / classes или находиться внутри файла .jar в разделе WEB-INF / lib. Убедитесь, что он делает.

-1
задан betontalpfa 19 February 2019 в 09:07
поделиться

3 ответа

Мэтью упомянул два важных улучшения: ваша цель case должна быть статическим выражением (тип которого является локально статическим типом), и если вы делаете синтез, вам нужно использовать цикл for.

Далее, вы не можете нарезать многомерный массив, следовательно, q_ctrl_reg (I, 31 до 0) также недопустим. Давайте исправим это, используя массив массива (показанный ниже):

type q_ctrl_reg_type is array (0 to MAX_REG -1) of std_logic_vector(31 downto 0) ; 
signal q_ctrl_reg : q_ctrl_reg_type ; 

Теперь давайте соберем все это вместе, позволим нам использовать цикл for вместо цикла while и оператор if вместо вашего оператора case. :

for i in 0 to generic_num_of_instances - 1 loop
  if loc_addr = 0 + I*256 then
      q_ctrl_reg(I) <= s_axi_wdata;
  end if;
end loop;
0
ответ дан Jim Lewis 19 February 2019 в 09:07
поделиться

Да. Или используйте Verilog.

Варианты выбора VHDL должны быть локально статическими - то есть они должны быть литералами , константами или генериками ]. Это не так с Verilog.

Вы также обнаружите, что вам нужна ветка when others, которая сведет на нет все улучшения читаемости, полученные с помощью оператора case. (И учитывая, что такой стиль кодирования в любом случае довольно необычен, я бы усомнился, был ли он когда-либо более читабельным.)

0
ответ дан Matthew Taylor 19 February 2019 в 09:07
поделиться

попробуйте сделать это значение "0 + I * 256" равным переменной, которую вы называете в цикле, т.е.

while (I < generic_num_of_instances) loop
    variable A : integer;
begin
A := 0 + I*256;
  case loc_addr is
    when A =>
      q_ctrl_reg(I, 31 downto 0) <= s_axi_wdata;
  end case;
  I := I + 1;
end loop;

Надеюсь, это должно сработать

0
ответ дан dyslexicgruffalo 19 February 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: