我想生成我的寄存器接口,因为我有多个相同外围设备的实例(通道)。
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语句吗?
答案 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;
希望这应该可行