函数重载为“高/低”

时间:2019-10-24 13:44:54

标签: vhdl

我的许多VHDL设计都依靠“用于___生成”循环,在该循环中,我使用generate来实例化泛型组件。这些组件的端口宽度是否经常取决于在generate循环中传递给它们的泛型。

在这些组件块中,我经常不得不在信号分配和逻辑中使用属性(例如my_sig'highmy_sig'low)。这意味着如果我的信号名称很长,此技术将变得非常麻烦。

有人在'“运算符”上执行过任何功能重载吗? (注意,我知道这不是操作员,我只是不记得它的技术术语是什么)

假设我有以下用于移位寄存器的代码...

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'highmy_shift_reg'low。因此,赋值操作可以重写为...

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

如果可以做到,那就太好了!对于将来的VHDL更新,这可能是一个不错的QOL。

1 个答案:

答案 0 :(得分:1)

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;

您可以将别名声明放入流程中,以使其仅在该流程的作用域内,这样(a)别名可以重复使用,并且(b)别名声明更接近使用它们的位置,这可能会有所帮助可读性。例如:

  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;

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;

一个MCVEhttps://www.edaplayground.com/x/5p4s

{{1}}