У меня есть переменное количество модулей, связанных с другим модулем через signal bus : std_logic_vector(NUM-1 downto 0)
, причем каждый компонент использует 8 бит, так что:
bus(7 downto 0) = first module
bus(15 downto 8) = second module
Что касается создания экземпляров и сопоставления портов, это легко сделать с помощью
INST: for i in 0 to NUM-1 generate
Inst_module port map ( bus => bus(i*8+7 downto i*8) );
end generate INST;
Мой вопрос: я хотел бы иметь возможность взаимодействовать с каждым модулем через FSM (поскольку ему также нужно делать некоторые другие вещи), поэтому я хотел бы иметь возможность «сгенерировать» следующий код, вместо того, чтобы записывать каждое состояние вручную (где signal empty : std_logic_vector(NUM-1 downto 0)
— это флаг состояния для каждого модуля)
type state_type is (st0_idle, st1_work0, st1_work1 --,etc.)
signal state : state_type;
begin
process(empty)
begin
if RESET = '1' then
--reset FSM
state <= st0_idle;
else
if CLK'event and CLK='1' then
case state is
when st0_idle =>
if empty(0) = '0' then
state <= st1_work0;
elsif empty(1) = '1' then
state <= st1_work1;
--etc.
end if;
when st1_work0 =>
bus(7 downto 0) <= SOMETHING;
state <= st0_idle;
when st1_work1 =>
bus(15 downto 8) <= SOMETHINGELSE;
state <= st0_idle;
--etc..
end if;
end if;
end process;
Как видите, повторов много. Но я не могу просто положить for-generate
в корпус, так что мне делать?