问题描述
我正在使用 VHDL 处理项目的 TOP 文件。我有一个关于端口映射的问题。 下面是我试图实现的代码的一部分,然后是上下文的描述。
generate_microfib:
for i in 0 to 5 generate
fib: microfib
Port Map (
InL => SignalNumber(num(i)*2 + i),--Input Left
OutR => SignalNumber(num(i)*2 + i+1) --Output Right
);
end generate generate_microfib;
上面的代码创建了 microfib 的多个组件。微纤维具有输入和输出端口。我想要做的是将当前创建的组件的左侧输入与前一个创建的组件的右侧输出连接起来。 我最初的想法是在端口映射中进行,但 VHDL 在 for..generate 语句中没有提供很多计算选项。所以,我决定分两步做。这意味着,我首先创建所需的组件,然后进行连接(通过将所需的信号设置为相等)。
所以,我的问题是:是否可以在函数中进行连接,例如,通过设置: SignalNumber(i)=SignalNumber(i-1)? 我知道接受 '
解决方法
当我做这样的事情时,我使用了一个数组类型的信号来充当中间占位符。然后,在生成循环内,您可以将端口连接到阵列信号上的索引位置。
所以你可以尝试这样的事情,使用 std_ulogic
作为示例端口类型:
architecture rtl of entity is:
constant N_DEVICES : integer := 5;
signal port_connector : std_ulogic vector(N_DEVICES downto 0);
begin
-- Concurrent statements
generate_microfib : for i in N_DEVICES-1 downto 0 generate
fib : microfib
port map (
InL => port_connector(i+1)
OutR => port_connector(i)
)
end generate generate_microfib;
-- Other stuff
end architecture rtl;
然后,port_connector(N_DEVICES)
作为链的输入,port_connector(0)
作为链的输出。
这不是一个函数,但它(相对)干净并且避免了 generate
语句的太多麻烦。不过,VHDL 中的函数旨在生成计算值,而不是电路连接,因此我建议无论如何不要尝试这样做。