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