2013-09-01 40 views
0

我已經從Micronova購買了一塊Spartan 3A開發板(http://micro-nova.com/mercury),並且我的接口與SRAM有一些問題。在VHDL中驅動與SRAM共享的GPIO引腳

該電路板有30個GPIO引腳與Cypress SRAM共享,兩個引腳在它們之間切換。

明顯地,將兩個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是選擇驅動模塊和其它的是輸入和模塊的輸出。

回答

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; 
三態驅動器
0

您將什麼值分配給應該是輸入的引腳?

如果您將該引腳假設爲輸入時向IOout1和IOout2信號分配'Z',則可能可以推斷出正確的操作,但我建議您實例化三態I/O引腳。除了複用輸出狀態之外,還應該複用兩個模塊之間的輸出使能,然後您的輸入代碼應該正常工作。

因此,每個模塊生成輸出信號和一組輸出使能。這些信號被複用並連接到一組物理引腳,通過輸出可以確定哪些引腳是輸入,哪些是輸出。這樣,FPGA中的所有內容都是二進制邏輯,而且您不依賴合成器來推斷三態總線。