0

我有一个 VHDL 设计问题。我有 N 个类似的实体,它们接受一些输入,每个实体都生成一个 STD_LOGIC 输出。

例子:

entity example1 is
begin
    ...
    result_1 : out std_logic;
end example1;

entity example2 is
begin
    ...
    result_2 : out std_logic;
end example2;

...

我正在寻找一种方法将所有这些单比特结果聚合到一个 UNSIGNED(N - 1 downto 0) 结果信号 V 中,使得 V(i) = result_i 成立。

目前,我的方法如下所示:

entity ResultAggregation is
   port (
      result_1 : in std_logic;
      result_2 : in std_logic;
      aggregate_results : out unsigned(1 downto 0)
   );
end ResultAggregation;

architecture Behavioral of ResultAggregation is
begin
   aggregate_results <= result_2 & result_1;
end Behavioral;

我觉得这种方法相当笨拙。我正在寻找的是一个更自动化的解决方案,例如,我可以提供数字 N 以便生成适当的引脚。

我知道这是一个相当笼统的问题,但如果有人知道一个聪明的解决方案,请告诉我。

在此先感谢,
斯文

4

2 回答 2

0

我的建议是省略ResultAggregation实体,只定义与您的,等实体aggregate_results相同级别的信号。然后,您可以将这些实体实例化为example1example2

i_example1 : entity work.example1
port map (
    ...
    result_1 => aggregate_results(0));

i_example2 : entity work.example2
port map (
    ...
    result_2 => aggregate_results(1));

您可以在实例化等实体aggregate_results的级别上将向量的宽度设为通用。example1

您可以获得通用数量的引脚的唯一方法是将您的ResultsAggregation实体定义为

entity ResultAggregation is
   generic (
       N_RESULTS : integer
   );
   port (
      results : in std_logic_vector(N_RESULTS-1 downto 0);
      aggregate_results : out std_logic_vector(N_RESULTS-1 downto 0)
   );
end ResultAggregation;

但是,该实体将仅包含aggregate_results <= results使该实体毫无意义的语句。

于 2013-04-02T09:27:49.573 回答
0

如果块相同,则使用 for/generate 语句:

n_examples: for i in 0 to (N-1) generate
   inst_example: example_entity
      port map(
          ...
          result => V(i);
      );
end generate n_examples;

如果块具有相似的实体但不同的功能,您仍然可以使用这种方法:

...  
inst_ex1: example1 
port map(
    ...,
    result_1 => V(1)
);

inst_ex2: example2 
port map(
    ...,
    result_2 => V(2)
);
....
于 2013-04-02T12:01:48.327 回答