进程内部的实体实例化
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" 附近的语法错误。
- “;”附近的语法错误。
标题为 first
、middle
和 last
的行出现 "entity" 错误
"port" 问题出现在实体之后的行上。
“;”包含以 );
结尾的端口映射的行出现问题
进程不应出现在 if 语句中。它应该只在架构体内部自行运行。
您不能(也不需要)使用流程进行实体实例化。在 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;
我正在尝试制作一个全加器的二维数组,这些加器具有特定的输入和输出逻辑。我目前有两个 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" 附近的语法错误。 - “;”附近的语法错误。
标题为 first
、middle
和 last
"port" 问题出现在实体之后的行上。
“;”包含以 );
进程不应出现在 if 语句中。它应该只在架构体内部自行运行。
您不能(也不需要)使用流程进行实体实例化。在 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;