我的许多VHDL设计都依靠“用于___生成”循环,在该循环中,我使用generate
来实例化泛型组件。这些组件的端口宽度是否经常取决于在generate循环中传递给它们的泛型。
在这些组件块中,我经常不得不在信号分配和逻辑中使用属性(例如my_sig'high
和my_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'high
和my_shift_reg'low
。因此,赋值操作可以重写为...
my_shift_reg('high downto 'low + 1) <= my_shift_reg('high -1 downto 'low);
如果可以做到,那就太好了!对于将来的VHDL更新,这可能是一个不错的QOL。
答案 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;
一个MCVE:https://www.edaplayground.com/x/5p4s。
{{1}}