多个 VHDL 组件实例化

Multiple VHDL component instantiation

以下一般问题:

如何使用三个子模块(SubX、SubY、SubZ)设置以下系统(主):

Main
  |______ SubX
  |         |_______SubZ
  |
  |______ SubZ

这里是代码:

entity System is
    port (
        clk_clk                                : in  std_logic;     
        pwm    : OUT std_logic 
    );
end entity System_Misc;

architecture rtl of System is
    component SubX
        port(clk       : IN  STD_LOGIC;
             pwmSubX   : OUT STD_LOGIC;
    end component SubX;

    component SubZ
        port(clk       : IN  STD_LOGIC;
             pwmSubZ   : OUT STD_LOGIC;
    end component SubZ;


begin
    component SubX
        port map(
            clk      => clk_clk,
            pwmSubX  => pwm
        );

    component SubZ
        port map(
            clk      => clk_clk,
            pwmSubZ  => pwm
        );


end architecture rtl;

这种方法是否正确,因为 SubZMain 以及 SubX 中实例化(此处未显示)。如果我这样做,我会得到一个错误,我无法将 pwmSubXpwmSubZ 连接到相同的输出 pwm(主要)。 解决这个问题的正确方法是什么and/or你会如何实施它?

谢谢!

端口 pwm 有多个驱动程序。

您需要为每个组件使用不同的信号,并指定 SubXSubZ 的输出将如何生成 pwm 输出。

没有区别 where/if SubXSubZ 在其他地方实例化了。

architecture rtl of System is
    component SubX
        port(clk       : IN  STD_LOGIC;
             pwmSubX   : OUT STD_LOGIC;
    end component SubX;

    component SubZ
        port(clk       : IN  STD_LOGIC;
             pwmSubZ   : OUT STD_LOGIC;
    end component SubZ;


    signal pwmSubX : std_logic;
    signal pwmSubZ : std_logic;


begin
    component SubX
        port map(
            clk      => clk_clk,
            pwmSubX  => pwmSubX
        );

    component SubZ
        port map(
            clk      => clk_clk,
            pwmSubZ  => pwmSubZ
        );

    -- Do what you need with both pwmSubX and pwmSubZ in order to assign
    -- the pwm port
    pwm <= pwmSubX or pwmSubZ;


end architecture rtl;

每个组件实例化都被细化为两个嵌套块语句和零个或多个进程语句以及更多块语句。

每个进程都为该进程内分配的每个信号分配一个驱动程序;

类型 std_logic 是已解析的 std_ulogic。分辨率是指将一个或多个驱动器值解析为信号的有效值。

充实(并纠正)您的示例:

library ieee;                           -- added subx entity/architecture
use ieee.std_logic_1164.all;

entity subx is
    port (
        clk:        in  std_logic;
        pwmsubx:    out std_logic
    );
end entity;

architecture foo of subx is
    signal pwm:     std_logic;
    component subz is
        port (
            clk:        in  std_logic;
            pwmsubz:    out std_logic
        );
    end component;
    signal pwmsubz: std_logic;

begin
SUB_Z:
    subz 
        port map (
            clk => clk,
            pwmsubz => pwmsubz
        );
    pwm <= pwmsubz after 2 us; 
    pwmsubx <= pwm;   
end architecture;

library ieee;                             -- added subz entity/architecture
use ieee.std_logic_1164.all;

entity subz is
    port (
        clk:        in  std_logic;
        pwmsubz:    out std_logic
    );
end entity;

architecture foo of subz is
    signal pwm:     std_logic;
begin
    pwm <= clk after 1 us;
    pwmsubz <= pwm;
end architecture;

library ieee;                -- added context clause
use ieee.std_logic_1164.all;

entity system is
    port (
        clk_clk:         in  std_logic;     
        pwm:             out std_logic 
    );
end entity; --  system_misc;

architecture rtl of system is
    component subx
        port(clk:        in  std_logic;
             pwmsubx:    out std_logic -- ;
        );             -- added
    end component subx;

    component subz
        port(clk:        in  std_logic;
             pwmsubz:    out std_logic -- ;
        );              -- added
    end component subz;

begin

U0:  -- added label
    component subx
        port map (
            clk      => clk_clk,
            pwmsubx  => pwm
        );
U1:   -- added label
    component subz
        port map (
            clk      => clk_clk,
            pwmsubz  => pwm
        );

end architecture rtl;

library ieee;
use ieee.std_logic_1164.all;

entity system_tb is
end entity;

architecture foo of system_tb is
    signal clk:     std_logic := '0';
    signal pwm:     std_logic;
begin
DUT:
    entity work.system
    port map (
        clk_clk => clk,
        pwm => pwm
    );
STIMULUS:
    process
    begin
        wait for 3 us;
        clk <= not clk;
        if now > 15 us then
            wait;
        end if;
    end process;
end architecture;

请注意,subx 和 subz 这两个组件在分配给与系统中的 pwm 关联的输出之前具有内部信号。

这给了我们一些可以在波形上看到的东西来演示分辨率的影响:

在两个驱动程序发生冲突的地方,我们得到 'X'(红色)。

综合软件通常对将两个驱动器短接在一起持模糊看法,通常不允许在内部使用“或”线或“与”线。您得到的任何错误都可能来自您的综合工具,而不是 VHDL 投诉(您可以看到它模拟得很好)。

如何解决同一信号的两个驱动程序的问题取决于信号的含义,这在您的示例中并不明显。正如 André Souto 指出的那样,您可以使用逻辑设备将两个输出门控在一起。