Как я могу установить биты вектора из разных процессов или модулей? - PullRequest
0 голосов
/ 01 июня 2018

Я добавляю вектор ошибки в свой дизайн.Это набор битов ошибок со всего большого проекта.

Теперь я могу направить каждый бит ошибки от модуля, который его генерирует, до самого верха и подключить его к его месту в векторе ошибок в верхней части.Однако, когда я добавляю, удаляю или изменяю биты ошибок, это приведет ко многим местам, которые мне понадобятся для обновления объявлений портов, и будет неудобно поддерживать.

Я бы предпочел передать весь вектор ошибок по всему моему проекту, и в каждом месте, где возникла ошибка, просто обновите свое место в векторе ошибок.Есть ли способ сделать это в 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 голосов
/ 01 июня 2018

Вы можете отобразить биты на части вектора:

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;

Никаких проблем с несколькими источниками не будет создано.

...