进程内部的实体实例化

Entity Instantiation Inside of a Process

我正在尝试制作一个全加器的二维数组,这些加器具有特定的输入和输出逻辑。我目前有两个 for-generate 行和列语句,然后是一个 if-elsif-else 语句来决定如何连接那个全加器。我的代码如下所示:

   rows : for row in 0 to n-1 generate
    columns : for col in 0 to n-1 generate
            if row = 0 then 
                null;
            elsif row = 1 then
                first: entity work.fa
                port map (  A => Ain(row)(col),
                                B => Bin(row)(col),
                                sum => sum(row+1)(col),
                                cin => cin,
                                cout => cout(row)(col+1)
                             );
            else
                process begin
                if (row = n/2) then
                    last: entity work.fa
                    port map ( A => Ain(row)(col),
                                B => Bin(row)(col-offset),
                                sum => sum(row)(col-offset),
                                cin => cin,
                                cout => cout(row)(col)
                             );
                else
                    middle: entity work.fa
                    port map (  A => mandq(row)(col-offset), 
                                B => sout(row)(col-offset),
                                sum => sout(row)(col-offset),
                                cin => cout(row)(col),
                                cout => cout(row)(col+1)
                             );
                end if;
                end process;
            end if;
            end process;
    end generate;
 end generate;

每个实体都收到以下错误: - "entity" 附近的语法错误。 - "port" 附近的语法错误。 - “;”附近的语法错误。

标题为 firstmiddlelast

的行出现 "entity" 错误

"port" 问题出现在实体之后的行上。

“;”包含以 );

结尾的端口映射的行出现问题
  1. 进程不应出现在 if 语句中。它应该只在架构体内部自行运行。

  2. 您不能(也不需要)使用流程进行实体实例化。在 process 中,您编写了一些顺序的东西,或者例如一些对时钟边沿敏感的并行语句。但绝对不是实体实例化。

您可能想使用流程,因为它有 if...else 个语句。它的并行等价物是 when...else 语句。但我不确定在这里应该如何使用它。正如 user1155120 已经在评论中提到的那样,您应该 post 一个最小的、完整的和可验证的示例。您错过了所有声明,包括实体。

编辑: 当然还有if...generate,正如J.H.Bonarius所写。

您不应使用 if .. then,而应使用 if .. generate。 在 VHDL-2008 中,这变得非常容易,因为支持 elsif .. generate 等。甚至 case ... generate

你可以这样写:

rows : for row in 1 to n-1 generate -- shouldn't this only go to (n/2) ?
    columns : for col in 0 to n-1 generate
        element: case row generate
            -- when 0 no longer occurs with modified range
            when 1 =>
                first: entity work.fa
                port map (
                    A => Ain(row)(col),
                    B => Bin(row)(col),
                    sum => sum(row+1)(col),
                    cin => cin,
                    cout => cout(row)(col+1)
                    );
            when n/2 =>
                last: entity work.fa
                port map (
                    A => Ain(row)(col),
                    B => Bin(row)(col-offset),
                    sum => sum(row)(col-offset),
                    cin => cin,
                    cout => cout(row)(col)
                    );
            when others =>
                middle: entity work.fa
                port map (
                    A => mandq(row)(col-offset), 
                    B => sout(row)(col-offset),
                    sum => sout(row)(col-offset),
                    cin => cout(row)(col),
                    cout => cout(row)(col+1)
                    );
        end generate;
    end generate;
end generate;