2013-09-01 2 views
0

Я купил плагин для разработки Spartan 3A от Micronova (http://micro-nova.com/mercury), и у меня есть некоторые проблемы, связанные с его SRAM.Вождение контактов GPIO, совместно используемых с SRAM в VHDL

Эта плата имеет 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; 

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

Какое значение вы назначаете контактам, которые должны быть входами?

Возможно, вы сможете определить правильную работу, если вы назначаете «Z» сигналам IOout1 и IOout2, когда этот вывод должен быть входом, но я рекомендую вам фактически создавать три-состояния контактов ввода-вывода. Помимо мультиплексирования состояния вывода, вы также должны мультиплексировать выходное разрешение между двумя модулями, а затем ваш код ввода должен работать правильно.

Таким образом, каждый модуль генерирует выходные сигналы и дает возможность выбора выходного сигнала. Эти сигналы мультиплексируются и привязаны к одному набору физических контактов, причем выход позволяет определить, какие выводы являются входами и какие выходы. Таким образом, все в FPGA является двоичной логикой, и вы не полагаетесь на синтезатор, чтобы вывести шину с тремя состояниями.