【问题标题】:does a inout port work as both in and out in same appplication输入端口是否在同一应用程序中既可以输入也可以输出
【发布时间】:2020-06-02 18:24:19
【问题描述】:

我正在尝试编写一个包含 inout 端口的 vhdl 代码,并且怀疑 inout 端口是否在同一程序中充当输入和输出。就像我知道使用 inout 引脚的原因是它可以双向工作,但是我的疑问是,如果您考虑像在微控制器中这样的实际示例,我看到引脚充当一个程序或应用程序的输入,并作为另一个程序或应用程序的输出。引脚工作可以在同一个程序中同时询问输入和输出吗?这可能吗?(如 1时钟周期它的输入和另一个它的输出) 实际上它似乎不可能发生。但是有人可以帮忙回答一下

【问题讨论】:

  • 我建议您主要将其设计为单独的输入和输出,并在 I/O 焊盘或边缘附近的某个地方将输入、输出、输出启用等组合在一起。并且是否可以同时是由那个I/O pad或类似的决定的。这样您就可以灵活地使用相同的代码来支持这两种情况。
  • 它们不能真正同时作为输出在做某事时会以某种方式干扰您将其用作输入。如果它那么弱,那么它的输出就不多。但如果回答有人实施了一个,只需要一个案例就可以肯定它已经发生了。
  • VHDL 没有引脚,并且端口可以与设计层次结构中的网络相关联。 VHDL 还提供行为设计描述,可以模拟 或使用符合合成条件的子集生成硬件。该子集包括使用可以模拟双向引脚的模式 inout 的顶级端口。请注意现有答案和前面的 cmets 做出了不同的假设。你能澄清你的问题吗?

标签: vhdl microcontroller avr digital


【解决方案1】:

在您的顶级实体中,以下代码将允许您驱动和采样名为 bidir_port 的(双向)端口:

...

    bidir_port : inout std_logic;

...

signal bidir_port_output_level : std_logic;
signal bidir_port_output_enable : std_logic;
signal bidir_port_input_level : std_logic;

...

    -- output buffer with enable
    bidir_port <= bidir_port_output_level when bidir_port_output_enable = '1' else 'Z';
    -- input buffer
    bidir_port_input_level <= bidir_port;

输出:为了驱动引脚,bidir_port_output_enable 必须为 '1',此时输出驱动器将打开并驱动值为 bidir_port_output_level(@ 987654326@ 或 '1' 在物理数字系统中)。如果bidir_port_output_enable'0',则驱动程序被禁用(关闭),此时bidir_port_output_level 的值无关紧要。

输入:您始终可以感应到引脚(即使您正在驱动它),如分配给信号bidir_port_input_level 所示。

【讨论】:

    【解决方案2】:

    由于您已用“avr”标记您的问题,因此请在“不是同时”中回答。

    你已经想到了:

    在 1 个时钟周期内它输入,在另一个时钟周期内输出

    如果 AVR 中的程序在运行时改变了引脚的方向,则可能有一次引脚是输出,而另一次是输入。


    为了完整性:

    在示例中,从物理角度来看,8051 系列微控制器实际上同时在两个方向上使用它们的引脚。引脚没有方向控制。相反,它们的“高”电平有点像上拉电阻。如果你愿意,你可以把它开得“低”。为了加速上升沿,在从低电平变为高电平时,微控制器会激活一个不太弱的晶体管,持续 2 个时钟周期。

    【讨论】:

    • 在 AVR 上,读写内存(例如端口)需要 2 个时钟周期。写入改变端口方向的寄存器也需要 2 个时钟周期。因此,在读取和写入引脚之间至少有 4 个 AVR 时钟周期。
    【解决方案3】:

    嗯,是的,有点。不过有几点需要记住: - 编写可综合代码时,最好只在顶层使用它 - 你需要推断或实例化一个双向缓冲区(它处理从输入到输出的切换) - 为什么需要双向端口?如果只是为了能够读取输出值,您应该使用不同的方法 微控制器是一个很好的高级模型。但请记住,微控制器是通用硬件,软件是特定于应用程序的东西,端口通常是输入或输出*。 在 FPGA 中,这也是类似的,但这里的配置是特定于应用程序的东西,并且适用相同的原则。

    这里的例外是需要双向端口的 I2C 或 MIIM 等协议。在这些情况下,这是唯一的出路。 我确信在其他情况下双向引脚是一个很好/唯一的选择,但我现在想不出一个。

    *除非用于协议,但见下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-25
      • 2022-12-07
      • 1970-01-01
      • 2017-05-21
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多