Функция Перегрузка для «высокого / низкого» - PullRequest
0 голосов
/ 24 октября 2019

Многие из моих VHDL-конструкций основаны на циклах for for ___ generate, где я использую generate для создания экземпляра компонента с обобщениями. Чаще всего ширина портов этих компонентов зависит от универсальных элементов, передаваемых им в цикле генерации.

В этих блоках компонентов мне часто приходится использовать атрибуты в назначениях сигналов и логике (например,my_sig'high и my_sig'low). Это означает, что, если мое имя сигнала очень длинное, эта техника становится очень громоздкой.

Кто-нибудь выполнял какую-либо функцию, перегружающую оператор '? (NB я знаю, что это не оператор, я просто не могу вспомнить, что это за технический термин)

Допустим, у меня есть следующий код для регистра сдвига ...

signal my_shift_reg : std_logic_vector(my_generic_high_number downto my_generic_low_number);

...

my_shift_reg(my_shift_reg'high downto my_shift_reg'low + 1) <= my_shift_reg(my_shift_reg'hig -1 downto my_shift_reg'low);

Как вы можете надеяться, вы можете написать, что это довольно громоздко, и было бы еще сложнее, если бы мне пришлось иметь некоторую логику, чтобы вычислить, какие биты из my_shift_reg нужно извлечь.

Это можно упростить, еслиимея функцию перегрузки для 'high и 'low (я знаю, что они не являются функциями, просто оставайтесь со мной ...), чтобы знать, что они эквивалентны my_shift_reg'high и my_shift_reg'low. Таким образом, операция присваивания может быть переписана как ...

my_shift_reg('high downto 'low + 1) <= my_shift_reg('high -1 downto 'low);

Если бы это можно было сделать, это было бы удивительно! И потенциально хорошая вещь QOL для будущих обновлений VHDL.

1 Ответ

1 голос
/ 24 октября 2019

Может помочь оператор alias, например,

alias m is my_shift_reg;

my_shift_reg(m'high downto m'low + 1) <= my_shift_reg(m'high -1 downto m'low);

Это менее набирает текст, но, возможно, труднее для понимания. Это немного больше, но, возможно, легче понять:

alias index is my_shift_reg;

my_shift_reg(index'high downto index'low + 1) <= my_shift_reg(index'high -1 downto index'low);

Вот вариант, который может быть проще для понимания:

alias high is my_generic_high_number;
alias low is my_generic_low_number;

my_shift_reg(high downto low + 1) <= my_shift_reg(high -1 downto low);

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

  process (clock) is
    alias index is my_shift_reg;
  begin
    if rising_edge(clock) then
      my_shift_reg(index'high downto index'low + 1) <= my_shift_reg(index'high -1 downto index'low);
    end if;
  end process;

или

  process (clock) is
    alias high is my_generic_high_number;
    alias low is my_generic_low_number;
  begin
    if rising_edge(clock) then
      my_shift_reg(high downto low + 1) <= my_shift_reg(high -1 downto low);
    end if;
  end process;

MCVE : https://www.edaplayground.com/x/5p4s.

library IEEE;
use IEEE.std_logic_1164.all;

entity E is
  generic (
    my_generic_high_number : integer := 7;
    my_generic_low_number  : integer := 0
  );
end entity ;

architecture A of E is
  signal my_shift_reg : std_logic_vector(my_generic_high_number downto my_generic_low_number);
  signal clock : std_logic;
begin
  process (clock) is
    alias m is my_shift_reg;
  begin
    if rising_edge(clock) then
      my_shift_reg(m'high downto m'low + 1) <= my_shift_reg(m'high -1 downto m'low);
    end if;
  end process;

  process (clock) is
    alias index is my_shift_reg;
  begin
    if rising_edge(clock) then
      my_shift_reg(index'high downto index'low + 1) <= my_shift_reg(index'high -1 downto index'low);
    end if;
  end process;

  process (clock) is
    alias high is my_generic_high_number;
    alias low is my_generic_low_number;
  begin
    if rising_edge(clock) then
      my_shift_reg(high downto low + 1) <= my_shift_reg(high -1 downto low);
    end if;
  end process;
end architecture A;
...