我在设计中添加了错误向量。它是来自整个大型设计的错误位集合。
现在,我可以将每个错误位从发起它的模块一直路由到顶部,并将其连接到顶部错误向量中的位置。但是,当我添加或删除或更改错误位时,这将导致我需要更新端口声明的许多地方,并且需要维护。
我宁愿在我的设计周围传递整个误差向量,并且每个错误源自的地方只是在错误向量中更新它的位置。在VHDL中有没有办法做到这一点?
从硬件的角度来看,这没有任何问题 - 向量的每个位只在一个地方被驱动。
为了说明这个问题,下面是第一种方法的例子:
entity moduleB is
port (
moduleB_error : out std_logic
)
end moduleB;
architecture rtl of moduleB is
moduleB_error <= '1';
begin
end rtl;
entity moduleC is
port (
moduleC_error : out std_logic
)
end moduleC;
architecture rtl of moduleC is
moduleC_error <= '1';
begin
end rtl;
entity moduleA is
port (
moduleB_error : out std_logic
)
end moduleA;
architecture rtl of moduleA is
signal moduleB_error : std_logic;
begin
inst_moduleB : entity work.moduleB
port map(
moduleB_error => moduleB_error
);
end rtl;
entity top is
port (
error_vector : out std_logic_vector(255 downto 0)
);
end top;
architecture rtl of top is
signal moduleB_error : std_logic;
signal moduleC_error : std_logic;
error_vector(0) <= moduleB_error;
error_vector(1) <= moduleC_error;
begin
inst_moduleA : entity work.moduleA
port map(
moduleB_error => moduleB_error
);
inst_moduleC : entity work.moduleC
port map(
moduleC_error => moduleC_error
);
end rtl;
我宁愿做这样的事情:
entity moduleB is
port (
error_vector : out std_logic_vector(1 downto 0)
)
end moduleB;
architecture rtl of moduleB is
error_vector(0) <= '1';
begin
end rtl;
entity moduleC is
port (
error_vector : out std_logic_vector(1 downto 0)
)
end moduleC;
architecture rtl of moduleC is
error_vector(1) <= '1';
begin
end rtl;
entity moduleA is
port (
error_vector : out std_logic_vector(1 downto 0);
)
end moduleA;
architecture rtl of moduleA is
begin
inst_moduleB : entity work.moduleB
port map(
error_vector => error_vector
);
end rtl;
entity top is
port (
error_vector : out std_logic_vector(255 downto 0)
);
end top;
architecture rtl of top is
begin
inst_moduleA : entity work.moduleA
port map(
error_vector => error_vector -- PROBLEM - multiple drivers for error_vector
);
inst_moduleC : entity work.moduleC
port map(
error_vector => error_vector -- PROBLEM - multiple drivers for error_vector
);
end rtl;
答案 0 :(得分:0)
您可以将位映射到矢量的某些部分:
entity moduleA is
port (
error_vector : out std_logic
);
end entity;
entity moduleB is
port (
error_vector : out std_logic
);
end entity;
entity top is
port (
error_vector : out std_logic_vector(1 downto 0)
);
end entity;
architecture rtl of top is
begin
A : entity work.moduleA
port map(
error_vector => error_vector(0)
);
B : entity work.moduleB
port map(
error_vector => error_vector(1)
);
end architecture rtl;
不会创建多个来源问题。