在同一个应用程序中,inout端口可以作为in和out工作吗?

问题描述 投票:0回答:1

我想写一个包含inout端口的vhdl代码,但我有一个疑问,就是inout端口在同一个程序中是否可以同时作为输入和输出,就像我知道使用inout引脚的原因是为了让它可以同时工作,但我的疑问是,如果你考虑到实际的例子,比如在微控制器中,我看到该引脚在一个程序或应用程序中作为输入,在另一个程序中作为输出。 在同一个程序中,该引脚可以同时输入和输出吗?(比如在一个时钟周期内输入,在另一个时钟周期内输出)实际上,这似乎是不可能的,但有人可以帮助回答吗?

vhdl microcontroller avr digital
1个回答
3
投票

在你的toplevel实体中,下面的代码将允许你同时驱动和采样一个名为 "双向 "的端口。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 ('0''1' 在物理数字系统中)。) 如果 bidir_port_output_enable'0'驱动器被禁用(关闭),这时的 bidir_port_output_level 是不相关的。

输入: 如图所示,你可以随时感应到引脚(即使你正在驱动它),并分配到信号。bidir_port_input_level.


1
投票

既然你把你的问题用 "avr "做了标签,那么答案在 "不在同一时间"。

你已经想到了:

就像在一个时钟周期内,它是进来的,而在另一个时钟周期内,它是出去的。

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


为了更完整一些。

例如,8051系列的微控制器 实际上,从物理角度来看,它们的引脚同时在两个方向上使用。这些引脚没有方向控制。而是它们的 "高 "电平有点像上拉电阻一样弱。如果你想的话,可以把它开到 "低"。为了加速上升沿,在从低到高的变化中,微控制器会激活一个不那么弱的晶体管,持续2个时钟周期。


0
投票

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

这里的例外是像I2C或MIIM这样需要双向端口的协议。在这些情况下,这是唯一的方法。我相信还有其他情况下,双向引脚是一个很好的唯一选择,但我现在想不出一个。

*除非用于协议,但请看后面的文字。

© www.soinside.com 2019 - 2024. All rights reserved.