如何在case语句[VHDL]中使用迭代变量

时间:2019-02-19 09:07:34

标签: vhdl

我想生成我的寄存器接口,因为我有多个相同外围设备的实例(通道)。

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

它说:错误:案例选择必须是局部静态表达式。

如何生成此寄存器接口?我应该使用描述性较低的if / elseif语句吗?

the error message

3 个答案:

答案 0 :(得分:1)

Matthew提到了两个重要的改进,您的case目标必须是静态表达式(其类型是局部静态类型),并且如果要进行综合,则需要使用for循环。

接下来,您无法切片多维数组,因此q_ctrl_reg(I,31 downto 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;

答案 1 :(得分:0)

是的。或使用Verilog。

案例选择是VHDL必须是局部静态-也就是说,它们必须是 literals constant 泛型。 Verilog并非如此。

您还将发现您需要一个when others分支,该分支将否决使用case语句获得的任何改进的可读性。 (鉴于这种编码风格还是很不寻常的,我想问一下它是否更具可读性。)

答案 2 :(得分:-1)

尝试使“ 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;

希望这应该可行