我想写一个包含inout端口的vhdl代码,但我有一个疑问,就是inout端口在同一个程序中是否可以同时作为输入和输出,就像我知道使用inout引脚的原因是为了让它可以同时工作,但我的疑问是,如果你考虑到实际的例子,比如在微控制器中,我看到该引脚在一个程序或应用程序中作为输入,在另一个程序中作为输出。 在同一个程序中,该引脚可以同时输入和输出吗?(比如在一个时钟周期内输入,在另一个时钟周期内输出)实际上,这似乎是不可能的,但有人可以帮助回答吗?
在你的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
.
既然你把你的问题用 "avr "做了标签,那么答案在 "不在同一时间"。
你已经想到了:
就像在一个时钟周期内,它是进来的,而在另一个时钟周期内,它是出去的。
如果AVR中的程序在运行过程中改变了引脚的方向,就有可能某一次引脚是输出,而另一次是输入。
为了更完整一些。
例如,8051系列的微控制器 实际上,从物理角度来看,它们的引脚同时在两个方向上使用。这些引脚没有方向控制。而是它们的 "高 "电平有点像上拉电阻一样弱。如果你想的话,可以把它开到 "低"。为了加速上升沿,在从低到高的变化中,微控制器会激活一个不那么弱的晶体管,持续2个时钟周期。
嗯,是的,算是吧。不过有几点需要注意:-在编写可综合代码时,最好只在顶层使用-你需要推断或实例化一个双向缓冲区(它处理从输入到输出的切换)-为什么需要一个双向端口?如果只是为了能够读取一个输出值,你应该使用不同的方法微控制器是一个很好的高层模型。但是请记住,微控制器是通用的硬件,软件是特定于应用的东西,那里的端口通常是in-或output*.在FPGA中这是类似的,但这里的配置是特定于应用的东西,同样的原理适用。
这里的例外是像I2C或MIIM这样需要双向端口的协议。在这些情况下,这是唯一的方法。我相信还有其他情况下,双向引脚是一个很好的唯一选择,但我现在想不出一个。
*除非用于协议,但请看后面的文字。