VHDL,使用 for generate 语句中的函数
我有一个应该实例化大约 8000 次的组件,我在一些常量值的帮助下使用了 for-generate 语句来减少代码量,但是我必须声明一个函数来对组件连接进行参数化。
我的功能如下所示:
function dim1_calc (
cmp_index : integer;
prt_index : integer
) return integer is
variable updw : integer := 0;
variable shft_v : integer := 0;
variable result : integer := 0;
begin
if (cmp_index < max_up) then
updw := 1;
else
updw := 2;
end if;
case prt_index is
when 1 =>
shft_v := cnst_rom(updw)(1) + (i-1);
when 2 =>
shft_v := cnst_rom(updw)(2) + (i);
--
--
--
when 32 =>
shft_v := cnst_rom(updw)(32) + (i);
when others =>
shft_v := 0;
end case;
if (updw = 1) then
if (shft_v = min_up & ((prt_index mod 2) = 0)) then
result <= max_up;
elsif (shft_v = max_up & ((prt_index mod 2) = 1)) then
result <= min_up;
elsif (shft_v < max_up) then
result <= shft_v;
else
result <= shft_v - max_up;
end if;
else
--something like first condition statements...
--
--
end if;
return result;
end function;
我使用此函数的部分代码加上一些相关部分如下所示:
--these type definitions are in my package
type nx_bits_at is array (natural range <>) of std_logic_vector (bits-1 downto 0);
type mxn_bits_at is array (natural range <>) of nx_bits_at;
--
--
--
component pn_cmpn is
port(
clk : in std_logic;
bn_to_pn : in nx_bits_at(1 to row_wght);
pn_to_bn : out nx_bits_at(1 to row_wght)
);
end component;
--
--
--
signal v2c : mxn_bits_at(1 to bn_num)(1 to col_wght);
signal c2v : mxn_bits_at(1 to pn_num)(1 to row_wght);
--
--
--
gen_pn : for i in (1 to pn_num) generate
ins_pn : pn_cmpn port map (
clk => clk,
bn_to_pn(1) => b2p (dim1_calc(i, 1)) (dim2_calc(i, 1)),
bn_to_pn(2) => b2p (dim1_calc(i, 2)) (dim2_calc(i, 2)),
.
.
.
bn_to_pn(32) => b2p (dim1_calc(i, 32)) (dim2_calc(i, 32)),
pn_to_bn => p2b (i)
);
end generate;
我知道一起使用太多的顺序语句通常是不合适的,我尽可能避免使用它们,但是在这种情况下,我假设这个函数不会合成到一些真实的硬件中,而合成器只是计算输出值并将其放入该组件的相应实例中。我对吗?或者与仅 8000 个实例相比,这种编码方式会导致额外的硬件。
PS1:最初我使用“0 to...”来定义我的数组的第 2 维和第 3 维的范围,但是由于在基于 for-generate 语句参数的维计算函数中产生了混淆,我将它们替换为“1至...”。这样好吗!编码风格还是我应该避免它?
PS2:有没有办法将上面代码中的端口映射部分组合成这样的东西:(我知道这是非常错误的,这只是对我想要的东西的澄清)
gen_pn : for i in (1 to pn_num) generate
ins_pn : pn_cmpn port map (
clk => clk,
gen_bn_to_pn : for j in (1 to 32) generate
bn_to_pn(j) => b2p (dim1_calc(i, j)) (dim2_calc(i, j)),
end generate;
pn_to_bn => p2b (i)
);
end generate;
让我再举一个例子假设我有一个这样的组件实例化:
ins_test : test_comp port map (
clk => clk,
test_port(1) => test_sig(2)
test_port(2) => test_sig(3)
test_port(3) => test_sig(4)
);
有没有办法可以在这里生成?就像是:
ins_test : test_comp port map (
clk => clk,
gen_pn : for i in (1 to 3) generate
test_port(i) => test_sig(i+1)
end generate;
);
PS3:是否可以在 VHDL 中调用另一个函数中的函数?