VHDL-相同的位流,两块板->;未发行

VHDL-相同的位流,两块板->;未发行,vhdl,fpga,Vhdl,Fpga,我想问一下,是否可以将inout引脚用作inout和normal out?这两种行为应通过多路复用器进行切换。这种奇怪的实现的原因是我有两块板,我想使用相同的比特流。在一块板上,相同的引脚通过GPIO连接到LED,在另一块板上,它连接到我的I2C总线连接。软件尝试检测I2C,如果成功,则设置寄存器。如果没有,它会清除它 LED_or_SDA : inout std_logic; -- port definition process (register) begin if ( r

我想问一下,是否可以将inout引脚用作inout和normal out?这两种行为应通过多路复用器进行切换。这种奇怪的实现的原因是我有两块板,我想使用相同的比特流。在一块板上,相同的引脚通过GPIO连接到LED,在另一块板上,它连接到我的I2C总线连接。软件尝试检测I2C,如果成功,则设置寄存器。如果没有,它会清除它

LED_or_SDA      : inout std_logic; -- port definition

process (register)
begin
   if ( register = '1') then -- software sets this register
       LED_or_SDA <= I2C_SDA; -- here I want to use it as inout
   else
       LED_or_SDA <= gpio_reg; -- here I want to use it as normal out
   end if;
end process;
LED_或_SDA:inout std_逻辑;——端口定义
进程(寄存器)
开始
如果(寄存器='1'),则--软件设置此寄存器

LED或SDA不,你不能。多路复用器不是开关,而是逻辑功能。线路

LED_or_SDA <= I2C_SDA;
大多数I2C逻辑块都有单独的数据输入和输出信号,直到外部接口,在那里你会发现一个三态缓冲区,它的表达方式与我给你的代码基本相同。您只需在I2C块上使输入和输出数据端口分开即可

不幸的是,内部逻辑可能无法访问内部信号的弱驱动状态,因此这些将无法工作

LED_or_SDA <= gpio_reg WHEN (register = '1') ELSE
              I2C_SDA_out;

LED_or_SDA <= gpio_reg WHEN (register = '1') ELSE
              'Z' WHEN (I2C_SDA_out = 'Z') ELSE
              I2C_SDA_out;

LED_或_SDA根据您的错误消息猜测,我假设我们谈论的是Xilinx系统,例如围绕微博客的系统-如果不是这样,请更新您的问题,并指定您使用的确切GPIO内核


默认情况下,这些GPIO块通常已经包含IO缓冲区宏。该IOBUF位于物理引脚旁边,不能驱动FPGA上的任何其他信号。因此,GPIO块拟用于芯片的顶层,并直接连接到引脚。但是,通常也有一种方法可以在IOBUF之前访问信号:例如,在Xilinx Platform Studio中的“端口”选项卡上,您还可以选择使用
GPIO\u IO
(缓冲后)、
GPIO\u I
(纯输入)、
GPIO\u O
(纯输出)、
GPIO\u T
(三态)或类似选项。

是,诀窍是始终将其视为三态缓冲区,并根据寄存器的状态控制输出

-- define a tristate pin the usual way.

LED_or_SDA <= LED_or_SDA_out when LED_or_SDA_tristate = '0' else 'Z';
LED_or_SDA_in <= LED_or_SDA

-- then control the data onto it, and the tristate control line

LED_or_SDA_tristate <= '0' when register = '0' else ICD_SDA;
LED_or_SDA_out <= gpio_reg when register = '0' else '0';
——以通常的方式定义三态管脚。
LED_或_SDA
-- define a tristate pin the usual way.

LED_or_SDA <= LED_or_SDA_out when LED_or_SDA_tristate = '0' else 'Z';
LED_or_SDA_in <= LED_or_SDA

-- then control the data onto it, and the tristate control line

LED_or_SDA_tristate <= '0' when register = '0' else ICD_SDA;
LED_or_SDA_out <= gpio_reg when register = '0' else '0';