Использование Generate в Vhdl

У меня есть следующий фрагмент кода в Vhdl, теперь я хочу условно перенаправить этот сигнал S1 на выходной порт, я буду благодарен, если кто-то может помочь мне через это.

Gen: for index in 0 to 4 generate

 signal s1 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);
 begin  
  process(CLK)
  begin
    if (rising_edge (CLK)) then
        S1(counter_index) <= S_in((index*8+7) downto (index*8));
      end if;  
    end  if;
  end process;
end generate Gen;

Я знаю, что мы можем использовать процесс внутри цикла генерации, но возможно и другое! Если я объявляю S1 глобальным сигналом, он жалуется на подключение к мульти-управляемой сети? Чем это отличается?

Я буду очень признателен, если кто-то может помочь мне через это

2 ответа

Решение

Ваш цикл for-generate (от 0 до 4) будет развернут при разработке, так что в итоге вы получите результат (оставив код процесса для краткости):

для индекса = 0:

signal s1_0 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);

s1_0(counter_index) <= S_in(7 downto 0);

для индекса = 1:

signal s1_1 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);

s1_1(counter_index) <= S_in(15 downto 8);

и т.п.

Вы получаете "копии", потому что вы объявили сигнал внутри цикла генерации, каждый из которых является локальным только для этого блока генерации. Когда вы пытаетесь сделать s1 "глобальный" (не совсем глобальный, имеющий другое значение; только что объявленный для всей архитектуры), вы получите:

для индекса = 0:

s1(counter_index) <= S_in(7 downto 0);

для индекса = 1:

s1(counter_index) <= S_in(15 downto 8);

Видишь, что там произошло? Эти операторы являются параллельными и присваивают одинаковые биты. Вот почему у вас проблемы с несколькими драйверами.

Проблема, кажется, counter_index, Либо вам нужно индексировать s1 с некоторой комбинацией вашего индекса цикла с вашим другим индексом, как предложил QuantumRipple, или вам нужно создать какой-то промежуточный сигнал или что-то в этом роде.

Обратите внимание, что если вы обрабатываете 32-битные данные по байтам, вы, вероятно, имели в виду 0 to 3не 0 to 4,

Хотя fru1tbat описывает решение вашей проблемы, я хотел бы затронуть другой вопрос:

Я знаю, что мы можем использовать процесс внутри цикла генерации, но возможно и другое!

Вы можете использовать for ... loop также внутри оператора процесса. Он работает и разворачивается аналогично for... generate утверждение, но внутри процесса. Его также можно использовать для реализации более сложной логики с помощью переменных или перезаписывающих назначений. Вот синтаксическая ссылка для этого: http://www.ics.uci.edu/~jmoorkan/vhdlref/for_loop.html

Другие вопросы по тегам