多个 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;
这种方法是否正确,因为 SubZ 在 Main 以及 SubX 中实例化(此处未显示)。如果我这样做,我会得到一个错误,我无法将 pwmSubX 和 pwmSubZ 连接到相同的输出 pwm(主要)。
解决这个问题的正确方法是什么and/or你会如何实施它?
谢谢!
端口 pwm
有多个驱动程序。
您需要为每个组件使用不同的信号,并指定 SubX
和 SubZ
的输出将如何生成 pwm
输出。
没有区别 where/if SubX
或 SubZ
在其他地方实例化了。
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 指出的那样,您可以使用逻辑设备将两个输出门控在一起。
以下一般问题:
如何使用三个子模块(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;
这种方法是否正确,因为 SubZ 在 Main 以及 SubX 中实例化(此处未显示)。如果我这样做,我会得到一个错误,我无法将 pwmSubX 和 pwmSubZ 连接到相同的输出 pwm(主要)。 解决这个问题的正确方法是什么and/or你会如何实施它?
谢谢!
端口 pwm
有多个驱动程序。
您需要为每个组件使用不同的信号,并指定 SubX
和 SubZ
的输出将如何生成 pwm
输出。
没有区别 where/if SubX
或 SubZ
在其他地方实例化了。
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 指出的那样,您可以使用逻辑设备将两个输出门控在一起。