因此,当在"顶层文件"上端口映射组件时,是否可以在端口映射时反转复位输入,如下例所示?
假设顶级文件代码为:
entity topfile is
port(
clk : in std_logic;
reset : in std_logic
--Other input and outputs
);
architecture arch of topfile is
begin
c1: entity work.component1(behavioral)
port map(
clk => clk,
reset => not reset,
.
.
.
);
c2: entity work.component2(behavioral)
port map(
clk => clk,
reset => not reset,
.
.
.
);
end arch;
答案 0 :(得分:2)
是的,您可以,但您必须使用VHDL 2008.在VHDL 2008之前,不允许在端口映射中使用所谓的表达式。
不要轻易决定使用VHDL 2008。并非所有工具都支持VHDL 2008,即使您发现当前使用的所有工具都支持它,您是否可以确定将来可能希望切换到的任何工具都支持它?
鉴于使用VHDL 2008解决这个特定问题的优势很小,我建议使用这样的虚拟信号:
entity topfile is
port(
clk : in std_logic;
reset : in std_logic
--Other input and outputs
);
architecture arch of topfile is
signal resetn : std_logic
begin
resetn <= not reset;
c1: entity work.component1(behavioral)
port map(
clk => clk,
reset => resetn,
.
.
.
);
c2: entity work.component2(behavioral)
port map(
clk => clk,
reset => resetn,
.
.
.
);
端口映射中的表达式添加了额外的delta延迟,因此上面将模拟与原始代码完全相同。
答案 1 :(得分:1)
正如Matthew所指出的那样,2008年之前的端口映射中不允许使用表达式,但在2008年之前支持转换函数,至少是Vivado,ISE和的ModelSim。您可以编写一个简单的invert
函数并将其放在一个在其他源文件中获得use
d的包中。像这样:
function invert (input : std_logic) return std_logic is
begin
return not input;
end function;
然后,您可以在端口映射中使用reset => invert(reset),
,而无需在工具中支持VHDL2008。这仍然非常易读,不使用任何额外的&#39;信号。
在相关的说明中,我建议不要在FPGA中使用有源低内部信号。器件中的时钟使能和复位通常不是低电平有效,因此将它们写为低电平有效会导致额外的反转逻辑。
答案 2 :(得分:0)
是的,你可以。只要“被操纵”信号的类型和长度与端口匹配。