我有一个程序,我按照以下方式使用inout端口:
port : inout unsigned(9 downto 0);
...
if port > 10 then
port <= port + 1
end if;
我正在使用inout端口,所以我可以读取输出(以实现反馈)。
要么我和老师之间存在误解,要么我的老师强烈反对使用inout ports 。
我习惯于高级编程,所以写这样的代码对我来说并不奇怪。我知道在FPGA上没有太多具有inout端口的电路,但是我并没有经常使用它,而且只是为了获得我想要的功能而将端口分成输入和输出是我的意思。不同的方式。
我很高兴您对使用inout ports 的第二意见。
答案 0 :(得分:16)
如果您正在实施双向端口,那么当然inout是正确的使用方法!
BUt用于读取您输出到端口的值,您的老师是对的;这是非常糟糕的做法。 (如果其他东西也在驱动该端口,您将看到已解析的值而不是您想要的值)。
这就是“缓冲”端口的用途。
不幸的是,对缓冲区端口存在很多奇怪的偏见,并且一些工具在使用它们时会发出不必要的警告(尽管它们通常很好地实现它们!)并且有一些不必要的奇怪规则将缓冲区端口连接到外部模块中的端口
我记不清确切的细节,但我相信缓冲端口无法直接连接到下一级别的输出端口 - 尽管VHDL-2002和更新版本已删除此规则。即使“缓冲”端口现在更容易使用,但仍然有些人不愿意使用它们。
由于这一切,最常见的解决方案是使用内部信号,例如您可以阅读port_int
,以及将其复制到实际端口的简单赋值语句。
因此,VHDL-2008已经取消了禁止将驱动值读取到“out”端口的限制,使“out”端口与“缓冲”端口无法区分。
我的偏好:使用缓冲端口。
如果有某种原因阻止这种情况(比如代码风格指南,或当地流行的意见),那么 (a)如果您的工具支持VHDL-2008或,则使用“out”端口 (b)使用内部信号。