Инициализировать элементы массива VHDL

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

type reg is array (0 to 15) of STD_LOGIC_VECTOR (15 downto 0);
signal reg_file : reg;

В моем коде VHDL у меня есть сброс, который выполняет следующие действия. (не весь корпус, а только часть сброса.

begin    
    process(Clock,Reset)
    begin
        if (Reset = '1') then -- Reset register values to default values
            reg_file(0) <= x"0000";
            -- reg_file(1) <= x"0001";
            reg_file(2) <= x"0000";
            reg_file(3) <= x"0000";
            reg_file(4) <= x"0000";
            reg_file(5) <= x"0000";
            reg_file(6) <= x"0000";
            reg_file(7) <= x"0000";
            reg_file(8) <= x"0000";
            reg_file(9) <= x"0000";
            reg_file(10) <= x"0000";
            reg_file(11) <= x"0000";
            -- reg_file(12) <= x"0000";
            reg_file(13) <= x"0000";
            reg_file(14) <= x"0000";
            reg_file(15) <= x"0000";

Я закомментировал reg_file (12), потому что хочу инициализировать его определенным значением. Я также хочу инициализировать reg_file (1) равным единице (а затем оставшиеся элементы массива равными нулю). Приведенный выше код работает, когда есть сигнал сброса, но я не уверен, как инициализировать только определенные элементы массива.

Есть ли способ инициализировать определенные элементы массива VHDL? Все примеры, которые я видел, относятся к инициализации всего массива.


person RPiNoob_16    schedule 17.04.2021    source источник
comment
reg_file ‹= (12 =› определенное значение, другие = ›0000); Элементы совокупного значения могут быть связаны именованной ассоциацией, здесь индекс. Этот метод действителен только для значений составного типа массива (как здесь). Рассмотрите возможность предоставления минимального воспроизводимого примера, чтобы можно было продемонстрировать решение будущим читателям.   -  person    schedule 17.04.2021


Ответы (2)


Вы можете группировать задания следующим образом:

if (reset = '1') then
  reg_file(0) <= (others => '0');
  -- skip 1
  reg_file(11 downto 2) <= (others => (others => '0'));
  -- skip 12
  reg_file(15 downto 13) <= (others => (others => '0'));
end if;

Лучшим решением было бы описать свойства вашего регистрового файла в массиве или массиве записи:

constant resetable : boolean_vector := (
  0 =>        true,
  1 =>        false,
  2 to 11 =>  true,
  12 =>       false,
  12 to 15 => true
);
if (reset = '1') then
  for i in reg_file'range loop
    if (resetable(i) = true) then
      reg_file <= (others => '0');
    end if;
  end loop;
end if;

Так почему я упомянул массив записей для конфигурации? Возможно, вы захотите определить значение сброса, которое не всегда может быть 000 ... 000. Кроме того, вы можете определить, должен ли регистр автоматически очищаться при чтении или записи, если регистр может генерировать прерывание и т. Д.

person Paebbels    schedule 18.04.2021

В дополнение к тому, что говорит Пеббельс, вы должны понимать, что значения определяются последним назначением в последовательности

a <= '0';
a <= '1'; -- no error to overwrite, a = '1';

Таким образом, вы можете просто установить все на '0', а затем изменить нужные индексы по-другому.

if (Reset = '1') then
  reg_file <= (others => (others => '0'));
  reg_file(1) <= x"DEAD";
  reg_file(12) <= x"BEEF";
else ...
person JHBonarius    schedule 21.04.2021