7

我有一个程序,我按照以下方式使用 inout 端口:

port : inout unsigned(9 downto 0);
...
if port > 10 then
   port <= port + 1
end if;

我正在使用 inout 端口,所以我可以读取输出以实现反馈)。

要么是我和老师有误会,要么老师强烈反对使用 inout 端口

我习惯了高级编程,所以写这样的代码对我来说并不奇怪。我知道在 FPGA 上没有太多带有 inout 端口的电路,但我不经常使用它,而且为了获得我想要的功能,将 inout 端口拆分为输入和输出只是违反我的感觉,不同的方式。

我会很高兴您对使用 inout 端口的第二个意见

4

1 回答 1

18

如果您正在实现双向端口,那么当然 inout 是正确的选择!

但是要读取您输出到端口的值,您的老师是对的;这是非常糟糕的做法。(如果其他东西也在驱动该端口,您将看到解析的值而不是您想要的值)。

这就是“缓冲”端口的用途。

不幸的是,对于缓冲端口存在很多奇怪的偏见,并且一些工具在您使用它们时会发出不必要的警告(尽管它们通常可以很好地实现它们!)并且有一些不必要的奇怪规则将缓冲端口连接到外部模块中的端口。

我不记得确切的细节,但我相信缓冲端口不能直接连接到下一级的输出端口——尽管 VHDL-2002 和更新版本删除了这个规则。尽管“缓冲”端口现在更容易使用,但仍有一些人不愿意使用它们。

由于这一切,最常见的解决方案是使用一个内部信号,例如port_int,您可以读取它,并使用一个简单的赋值语句将其复制到实际端口。

因此,VHDL-2008 取消了禁止读取被驱动到“输出”端口的值的限制,使得“输出”端口与“缓冲”端口无法区分。

我的偏好:使用缓冲端口。

如果有某种原因阻止了这一点(比如代码风格指南或当地主流意见),那么 (a) 如果您的工具支持 VHDL-2008,则使用“输出”端口或 (b) 使用内部信号。

于 2012-12-12T22:42:49.830 回答