在VHDL中驱动与SRAM共享的GPIO引脚

在VHDL中驱动与SRAM共享的GPIO引脚,vhdl,bus,spartan,Vhdl,Bus,Spartan,我从Micronova()买了一块Spartan 3A开发板,在与SRAM接口时遇到了一些问题 该板有30个GPIO引脚与Cypress SRAM共享,两个引脚在它们之间切换 显然,将两个VHDL模块(一个用于控制SRAM,另一个用于驱动GPIO)连接到同一管脚会在合成时导致“多个驱动程序错误” 因此,为了解决这个问题,我创建了第三个模块作为中间控制器,将两个模块与另一个变量连接起来,以选择要操作的模块 这对于输出效果很好,但当涉及到读取输入时,我总是得到1,与实际值无关 我不知道哪些管脚将用作

我从Micronova()买了一块Spartan 3A开发板,在与SRAM接口时遇到了一些问题

该板有30个GPIO引脚与Cypress SRAM共享,两个引脚在它们之间切换

显然,将两个VHDL模块(一个用于控制SRAM,另一个用于驱动GPIO)连接到同一管脚会在合成时导致“多个驱动程序错误”

因此,为了解决这个问题,我创建了第三个模块作为中间控制器,将两个模块与另一个变量连接起来,以选择要操作的模块

这对于输出效果很好,但当涉及到读取输入时,我总是得到1,与实际值无关

我不知道哪些管脚将用作输入,哪些管脚用于输出,因为我想要一个独立的模块,我可以用于其他项目

到目前为止,我得到的是:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity DMA2 is
    Port (
        IOphys      : inout STD_LOGIC_VECTOR (29 downto 0);
        IOin1       : out STD_LOGIC_VECTOR (29 downto 0);
        IOin2       : out STD_LOGIC_VECTOR (29 downto 0);
        IOout1      : in STD_LOGIC_VECTOR (29 downto 0);
        IOout2      : in STD_LOGIC_VECTOR (29 downto 0);
        SwitchEn2   : in STD_LOGIC
    );
end DMA2;

architecture Behavioral of DMA2 is

begin

IOin2 <= IOphys;
IOin1 <= IOphys;
IOphys <= IOout2 when SwitchEn2 = '1' else IOout1;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体DMA2是
港口(
IOphys:inout标准逻辑向量(29到0);
IOin1:out标准逻辑向量(29到0);
IOin2:out标准逻辑向量(29到0);
IOout1:STD_逻辑_向量中(29向下至0);
IOout2:STD_逻辑_向量中(29到0);
开关2:标准逻辑中
);
DMA2末端;
DMA2的体系结构是
开始

IOin2您为应该作为输入的管脚分配了什么值

如果将IOout1和IOout2信号指定为“Z”,当该引脚应为输入时,您可能能够推断出正确的操作,但我建议您实际实例化三态I/O引脚。除了复用输出状态外,还应在两个模块之间复用输出启用,然后输入代码应正常工作


因此,每个模块生成输出信号,并启用一组输出。这些信号被多路复用并连接到一组物理管脚上,通过输出可以确定哪些管脚是输入,哪些是输出。这样,FPGA中的所有内容都是二进制逻辑,您不需要依靠合成器来推断三态总线。

您似乎不需要驱动输出。作为初学者,如何定义这样的三态驱动程序

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tristate is
port (
   signal data_in         : out   std_logic;
   signal data_out        : in    std_logic;
   signal data_tristate   : inout std_logic;
   signal tristate_select : in    std_logic
);

architecture rtl of tristate is
begin

   data_in <= data_tristate;
   data_tristate <= 'z' when tristate_select = '1' else data_out;

end architecture;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体三态是
港口(
信号数据输入:输出标准逻辑;
信号数据输出:标准逻辑中;
信号数据三态:输入输出标准逻辑;
信号三态选择:在标准逻辑中
);
三态rtl的体系结构是
开始
数据输入
entity arbitrate_bus
port(
   -- the pins
   IOphys        : inout STD_LOGIC_VECTOR (29 downto 0);
   IOin1         : out STD_LOGIC_VECTOR (29 downto 0);
   IOout1        : in STD_LOGIC_VECTOR (29 downto 0);
   IO_direction1 : in STD_LOGIC_VECTOR (29 downto 0);
   IOin2         : out STD_LOGIC_VECTOR (29 downto 0);
   IOout2        : in STD_LOGIC_VECTOR (29 downto 0);
   IO_direction2 : in STD_LOGIC_VECTOR (29 downto 0);
   SwitchEn2     : in STD_LOGIC
);

architecture like_this of arbitrate_bus is
  signal input : STD_LOGIC_VECTOR (29 downto 0);
  signal output_selected : STD_LOGIC_VECTOR (29 downto 0);
  signal direction_selected  : STD_LOGIC_VECTOR (29 downto 0);
begin

    output_selected    <= IOout1 when SwitchEn2 = '0' else IOout2;
    direction_selected <= IO_direction1 when SwitchEn2 = '0' else IO_direction2;

    g_ts: for g in output_selected'range generate
    begin
       u_ts: entity tristate
       port map(
          data_in         => input(g),
          data_out        => output_selected(g),
          data_tristate   => IOphys(g),
          tristate_select => direction_selected(g)
      );
    end generate;

    IOin1 <= input;
    IOin2 <= input;

end architecture;