Генерация условного типа VHDL (аромат FW) - PullRequest
0 голосов
/ 10 февраля 2020

Я делаю проект DIY с роботами с разными датчиками. Поэтому я пытаюсь получить максимальный общий код для всех них, и здесь я перехожу к вопросу:

можно сделать что-то вроде if..generate в пакетах? следующий код неверен, но он для иллюстрации того, что было бы лучшим способом сделать это:

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;

Я нашел это: https://electronics.stackexchange.com/questions/237770/vhdl-if-generate-in-the-preamble-is-it-possible но это не то, что я ищу.

Итак, я смотрю, возможно ли это сделать условий внутри пакетов, я ничего не нашел в Справочном руководстве по языку VHDL стандарта IEEE (IEEE Std 1076 ™ -2008)

Спасибо

1 Ответ

0 голосов
/ 11 февраля 2020

VHDL-2008 позволяет композитам иметь неограниченные элементы. Следовательно, вы можете определить следующее. Не обещайте, если ваш инструмент синтеза понравится вам. Лучше всего использовать тип «leg_sens».

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