【问题标题】:Driving GPIO pins shared with SRAM in VHDL在 VHDL 中驱动与 SRAM 共享的 GPIO 引脚
【发布时间】:2013-09-01 15:11:37
【问题描述】:

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

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

显然,将两个 VHDL 模块(一个用于控制 SRAM,另一个用于驱动 GPIO)连接到同一个引脚会导致合成时出现“Multiple driver error”。

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

这对输出很有效,但在读取输入时,我总是得到 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用于选择驱动模块,其余为模块的输入和输出。

【问题讨论】:

    标签: vhdl bus spartan


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多