If statement VHDL条件类型生成(FW风格)

If statement VHDL条件类型生成(FW风格),if-statement,package,vhdl,generate,If Statement,Package,Vhdl,Generate,我在做一个DIY项目,机器人有不同的传感器。 因此,我试图为所有这些代码提供最大的通用代码,现在我要问的问题是: 可以在包中执行类似if..生成的操作吗? 下一个代码是错误的,但它是为了说明最好的方法: constant robo_type : integer := 1; -- 6 legs, motors with encoders 6_legs_2_parts : if robo_type = 0 generate type leg_sens is record a

我在做一个DIY项目,机器人有不同的传感器。 因此,我试图为所有这些代码提供最大的通用代码,现在我要问的问题是:

可以在包中执行类似if..生成的操作吗? 下一个代码是错误的,但它是为了说明最好的方法:

constant robo_type : integer := 1;

-- 6 legs, motors with encoders
6_legs_2_parts : if robo_type = 0 generate
    type leg_sens is record
        angle1 is array (5 downto 0) of integer range 0 to 1000;
        angle2 is array (5 downto 0) of integer range 0 to 1000;
    end record;
end generate;

-- 6 legs, motors with encoders
6_legs_3_parts : if robo_type = 1 generate
    type leg_sens is record
        angle1 is array (5 downto 0) of integer range 0 to 1000;
        angle2 is array (5 downto 0) of integer range 0 to 1000;
        angle3 is array (5 downto 0) of integer range 0 to 1000;
    end record;
end generate;

-- 4 legs motors, encoders & current
4_legs_2_parts : if robo_type = 2 generate
    type leg_sens is record
        angle1 is array (3 downto 0) of integer range 0 to 1000;
        angle2 is array (3 downto 0) of integer range 0 to 1000;
        amp1 is array (3 downto 0) of integer range 0 to 100;
        amp2 is array (3 downto 0) of integer range 0 to 1000;
    end record;
end generate;
现在,我使用类似的东西,并中继编译器将优化我没有使用的东西

-- generic leg_sens for all robots
constant numAngles : integer := 4;

type leg_sens is record
    angle1 is array (numAngles -1 downto 0) of integer range 0 to 1000;
    angle2 is array (numAngles -1 downto 0) of integer range 0 to 1000;
    angle3 is array (numAngles -1 downto 0) of integer range 0 to 1000;
    amp1 is array (numAngles -1 downto 0) of integer range 0 to 100;
    amp2 is array (numAngles -1 downto 0) of integer range 0 to 100;
    amp3 is array (numAngles -1 downto 0) of integer range 0 to 100;
end record;
我找到了这个:但这不是我要找的

所以,我想看看是否有可能在包中使用条件句, 我在IEEE标准VHDL语言参考手册(IEEE Std 1076)中没有找到任何内容™-2008年)


感谢您,VHDL-2008允许复合材料具有不受约束的元素。因此,您可以定义以下内容。如果你的合成工具会喜欢你,那就没有承诺了。你最好的选择是使用你的“leg_sens”类型

type AngleType是范围为0到1000的数组(整数范围)正则VHDL
类型AngleArrayType是AngleType的数组(整数范围);--VHDL-2008
AmplitudeType类型是范围为0到100的数组(整数范围);
类型AmplitudeArrayType是AmplitudeType的数组(整数范围);
类型RobotLegType是记录
角度:AngleArrayType;
Amp:AmplicateArrayType;
结束记录机器人类型;
--6支腿,带编码器的电机
子类型Legs6Parts2Type为
机器人式(
角度(1到2)(5到0),
Amp(1到0)(5到0)--Amp故意为空数组(因此为空)
) ; 
--6支腿,带编码器的电机
子类型Legs6Parts3Type为
机器人式(
角度(1到3)(5到0),
Amp(1到0)(5到0)--Amp故意为空数组(因此为空)
) ; 
--4支腿电机、编码器和电流传感器
子类型Legs4Parts2AmpType为
机器人式(
角度(1到2)(3到0),
安培(1至2)(3至0)
) ; 

VHDL-2008允许复合材料具有不受约束的元素。因此,您可以定义以下内容。如果你的合成工具会喜欢你,那就没有承诺了。你最好的选择是使用你的“leg_sens”类型

type AngleType是范围为0到1000的数组(整数范围)正则VHDL
类型AngleArrayType是AngleType的数组(整数范围);--VHDL-2008
AmplitudeType类型是范围为0到100的数组(整数范围);
类型AmplitudeArrayType是AmplitudeType的数组(整数范围);
类型RobotLegType是记录
角度:AngleArrayType;
Amp:AmplicateArrayType;
结束记录机器人类型;
--6支腿,带编码器的电机
子类型Legs6Parts2Type为
机器人式(
角度(1到2)(5到0),
Amp(1到0)(5到0)--Amp故意为空数组(因此为空)
) ; 
--6支腿,带编码器的电机
子类型Legs6Parts3Type为
机器人式(
角度(1到3)(5到0),
Amp(1到0)(5到0)--Amp故意为空数组(因此为空)
) ; 
--4支腿电机、编码器和电流传感器
子类型Legs4Parts2AmpType为
机器人式(
角度(1到2)(3到0),
安培(1至2)(3至0)
) ; 

Generate不能在包中使用。最后一种方法是正常方法(使用常量定义记录中字段的大小)。在VHDL 2008中,您可以为包提供泛型,因此您可以使用具有不同大小类型的多个实例化的相同包。在类型声明中使用无界数组定义,其中数组约束在对象声明中提供。5.3.2数组类型,5.3.2.1概述,6.2类型声明,6.3子类型声明,BNF-子类型指示->约束->数组约束。FPGA合成通常不支持包含无约束元素的无界数组定义,包泛型(4.7包声明)也不支持。如果使用一致方向(5.2标量类型,5.2.1),数组复合对象的值可以通过预定义的数组属性(16.2.3)轻松提供边界。不能在包中使用Generate。最后一种方法是正常方法(使用常量定义记录中字段的大小)。在VHDL 2008中,您可以为包提供泛型,因此您可以使用具有不同大小类型的多个实例化的相同包。在类型声明中使用无界数组定义,其中数组约束在对象声明中提供。5.3.2数组类型,5.3.2.1概述,6.2类型声明,6.3子类型声明,BNF-子类型指示->约束->数组约束。FPGA合成通常不支持包含无约束元素的无界数组定义,包泛型(4.7包声明)也不支持。如果使用一致方向(5.2标量类型,5.2.1),数组复合对象的值可以通过预定义的数组属性(16.2.3)轻松提供边界。
type AngleType is array (integer range <>) of range 0 to 1000; -- regular VHDL
type AngleArrayType is array (integer range <>) of AngleType;  -- VHDL-2008

type AmplitudeType is array (integer range <>) of range 0 to 100 ;
type AmplitudeArrayType is array (integer range <>) of AmplitudeType ;

type RobotLegType is record
  Angle : AngleArrayType ;
  Amp   : AmplitudeArrayType ; 
end record RobotLegType ; 

-- 6 legs, motors with encoders
subtype Legs6Parts2Type is 
  RobotLegType( 
     Angle(1 to 2)(5 downto 0), 
     Amp(1 to 0)(5 downto 0)   -- Amp is intentionally a null array (hence empty)
  ) ; 

-- 6 legs, motors with encoders
subtype Legs6Parts3Type is 
  RobotLegType( 
     Angle(1 to 3)(5 downto 0), 
     Amp(1 to 0)(5 downto 0)   -- Amp is intentionally a null array (hence empty)
  ) ; 

-- 4 legs motors, encoders & current
subtype Legs4Parts2AmpType is 
  RobotLegType( 
     Angle(1 to 2)(3 downto 0), 
     Amp  (1 to 2)(3 downto 0)   
  ) ;