VHDL 中的实体语法

Mar*_*lin 3 syntax fpga vhdl ebnf

我对 VHDL 中实体的语法感到困惑。以下是EBN 表格中应如何声明实体的规则:

在此处输入图片说明

资料来源:Peter J. Ashenden,“VHDL 设计师指南”,第 3 版,Morgan Kaufmann,2008 年。

我感到困惑的是声明的结尾。据此,我不需要在最后包含实体标识符,一切都会一样。例如,下面的两个声明是一样的吗?

声明 1

entity identifier is
    ...
begin
    ...
end ;
Run Code Online (Sandbox Code Playgroud)

声明2

entity identifier is
    ...
begin
    ...
end entity identifier ;
Run Code Online (Sandbox Code Playgroud)

如果是,为什么有人会选择后一种声明?有没有建议我应该使用这两种变体中的哪一种?我问这个是因为我通常在示例中看到后一个声明,我无法解释为什么有人更喜欢第二个声明而不是第一个声明。

Mat*_*lor 5

我几乎总是使用后一个声明,因为它会产生更好的文档化代码。对于前者,如果读者遇到一个简单的end;,则不太清楚正在结束的内容。

当使用比 VHDL 更少冗长的语言时,程序员(通常)通常会在关闭某些内容的构造中添加注释,以便向读者展示正在关闭的内容,例如在 C++ 中:

} // if (enable) 
Run Code Online (Sandbox Code Playgroud)

或在 Verilog 中

end // if (enable) 
Run Code Online (Sandbox Code Playgroud)

SystemVerilog 增加了一种用适当的语言做同样事情的工具:

if (enable)
    begin : enable_block
    ...
    end : enable_block
Run Code Online (Sandbox Code Playgroud)

你可以在 VHDL 中说出所有这些的原因

end ;
end entity ;
end identifier ;
end entity identifier ;
Run Code Online (Sandbox Code Playgroud)

是使 VHDL-93 向后兼容 VHDL-87,其中只有这些是合法的:

end ;
end identifier ;
Run Code Online (Sandbox Code Playgroud)

“差不多总是”?是的。如果我编写可执行代码,我总是会编写后者。然而,我这周制作了一些关于 VHDL 的 PowerPoint 幻灯片,我故意写了这些幻灯片,只是end;因为我认为整个过程end entity identifier ;分散了读者的注意力。你可以随心所欲。

  • 它还使损坏的代码更容易识别:如果工具报告“语法错误:预期结束进程,找到最终实体”,您会更快地发现错误。 (2认同)