如何设置来自不同进程或模块的向量位?

时间:2018-05-31 22:58:57

标签: vhdl

我在设计中添加了错误向量。它是来自整个大型设计的错误位集合。

现在,我可以将每个错误位从发起它的模块一直路由到顶部,并将其连接到顶部错误向量中的位置。但是,当我添加或删除或更改错误位时,这将导致我需要更新端口声明的许多地方,并且需要维护。

我宁愿在我的设计周围传递整个误差向量,并且每个错误源自的地方只是在错误向量中更新它的位置。在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;

1 个答案:

答案 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;

不会创建多个来源问题。