0

我从 Micronova ( http://micro-nova.com/mercury ) 购买了一块 Spartan 3A 开发板,但在连接 SRAM 时遇到了一些问题。

该板有 30 个与赛普拉斯 SRAM 共享的 GPIO 引脚和两个用于在它们之间切换的引脚。

显然,将两个 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;

IOphys是板上的物理管脚,SwitchEn2用于选择驱动模块,其他是模块的输入和输出。

4

2 回答 2

0

您为应该作为输入的引脚分配什么值?

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

所以每个模块都会产生输出信号和一组输出使能。这些信号被多路复用并绑定到一组物理引脚,输出可以确定哪些引脚是输入,哪些是输出。这样,FPGA 中的所有内容都是二进制逻辑,您无需依赖合成器来推断三态总线。

于 2013-09-01T19:08:23.547 回答
0

你似乎没有推动你的产出。作为初学者,如何定义这样的三态驱动程序

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;

然后像这样选择它的使用

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;
于 2013-09-02T16:56:09.297 回答