www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Wie erstelle ich in VHDL Bidirektionalen Datenbus?


Autor: GAST (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe unter Simulink ein SRAM Controller zusammengesetzt und habe 
dieses Model dann in ein VHDL ISE Project eingebunden, weil ich die DCM 
verwende.
Da der datenbus des SRAm bidirektional ist, muss ich nun dem FPGA 
irgednwie mitteilen wann er IN und wann out ist.
Die wollte ich mit Tristate machen.
Allerdings gibt mir die ISE beim synthetisieren folgende Fehlermeldung 
aus:

ERROR:HDLParsers:1401 - "C:/Dokumente und 
Einstellungen/menzlo1/Desktop/ZBT_SRAM_CY/ZBT_SRAM_TOP.vhd" Line 122. 
Object OE_n of mode OUT can not be read.

Ich habe in meinem SRAM Controller Model Einen Datenbus für in und out 
festgelegt. Wann der Datenbus IN oder OUT ist wird von dem OE_n (Output 
enable) bestimmt. Allerdings ist bei mir das OE_n kein signal sondern 
ein PIN , der direkt mit dem SRAM verbunden ist. Also ein ":out 
std_logic".
ICh denek mal, dass hier auch genau das Problem liegt. aber wie löse ich 
das nun?
Muss ich mir Parallel zum PIN OE_N, wo das Steuersignal für den SRAM 
gesendet wird, nun noch ein Signal OE_n erzeugen???
Oder wie????

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@GAST (Gast)

>festgelegt. Wann der Datenbus IN oder OUT ist wird von dem OE_n (Output
>enable) bestimmt. Allerdings ist bei mir das OE_n kein signal sondern
>ein PIN , der direkt mit dem SRAM verbunden ist. Also ein ":out
>std_logic".
>ICh denek mal, dass hier auch genau das Problem liegt. aber wie löse ich
>das nun?

Du musst ein internes Signal als "Zwischenpuffer" definieren. Das kann 
man dann zur Datenbussteuerung nehmen und gleichzeitig auf ein 
Ausgnagspin legen.

MFG
Falk

Autor: GAST (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie würde so etas in VHDL aussehen???

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-- Entity Signale
   data : inout std_logic_vector(7 downt0 0);
   oe : std_logic;

-- interne Signale

signal oe_int;
signal data_int : std_logic_vector(7 downt0 0);

-- Nutzung

oe <= oe_int;
data <= data_int when oe_int = '1' else "ZZZZZZZZ";


Autor: GAST (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dass was du da geschrieben hast verstehe ich auch. Nur gibts da ein 
Problem, weil das...
Schau dir einfach mal eben den Code dazu an:
 entity ZBT_SRAM_TOP is
 Port   ( 
        Addr       : out    STD_LOGIC_VECTOR (17 downto 0);
           Dinout     : inout  STD_LOGIC_VECTOR (15 downto 0);
           Mode       : out    STD_LOGIC;
           Clk_SRAM    : out    STD_LOGIC;
           CE_n       : out    STD_LOGIC;
           OE_n       : out    STD_LOGIC;
           AdvLd_n     : out    STD_LOGIC;
           BwA_n       : out    STD_LOGIC;
           BwB_n       : out    STD_LOGIC;
           BwC_n       : out    STD_LOGIC;
           BwD_n       : out    STD_LOGIC;
           WE_n       : out    STD_LOGIC;
           Zz         : out    STD_LOGIC;
           Clk_feedback : in     STD_LOGIC;
           Clk_in       : in     STD_LOGIC;
        LED        : out   STD_LOGIC
         );
end ZBT_SRAM_TOP;

architecture Behavioral of ZBT_SRAM_TOP is

    component DCM_manager
    PORT  (
        U1_CLKFB_IN      : in  STD_LOGIC;
        U1_CLKIN_IN      : in  STD_LOGIC;
        U1_CLKIN_IBUFG_OUT: out STD_LOGIC;
        U1_CLK0_OUT      : out STD_LOGIC;
        U2_CLK0_OUT      : out STD_LOGIC
      );
    end component DCM_manager;
  
    component ZBT_controller
    PORT ( 
        Addr       : out    STD_LOGIC_VECTOR (17 downto 0);
           Din         : in     STD_LOGIC_VECTOR (15 downto 0);
        Dout       : out    STD_LOGIC_VECTOR (15 downto 0);
        Mode       : out    STD_LOGIC;
           CE_n       : out    STD_LOGIC;
           OE_n       : out    STD_LOGIC;
           AdvLd_n     : out    STD_LOGIC;
           BwA_n       : out    STD_LOGIC;
           BwB_n       : out    STD_LOGIC;
           BwC_n       : out    STD_LOGIC;
           BwD_n       : out    STD_LOGIC;
           WE_n       : out    STD_LOGIC;
           Zz         : out    STD_LOGIC;
           Clk_global  : in     STD_LOGIC;
        LED        : out    STD_LOGIC
        );  
    end component ZBT_controller;
  
signal Clk_global_s   :       STD_LOGIC;
signal Din_s      :        STD_LOGIC_VECTOR (15 downto 0);
signal Dout_s      :        STD_LOGIC_VECTOR (15 downto 0);
signal OE_s        :      STD_LOGIC;     



begin

    inst_DCM_manager : DCM_manager
    port map(
        U1_CLKFB_IN        => Clk_feedback,  
        U1_CLKIN_IN        => Clk_in,
        U1_CLKIN_IBUFG_OUT  => open,
        U1_CLK0_OUT        => Clk_global_s,
        U2_CLK0_OUT        => Clk_SRAM
        );
    
    inst_ZBT_controller : ZBT_controller
    port map(
        Addr      => Addr,
        Mode      => Mode,
        Din      => Din_s,
        Dout      => Dout_s,
        CE_n       => CE_n,
        OE_n      => OE_s,
        AdvLd_n    => AdvLd_n,
        BwA_n      => BwA_n,
        BwB_n      => BwB_n,
        BwC_n      => BwC_n,
        BwD_n      => BwD_n,
        WE_n      => WE_n,
        Zz        => Zz,
        Clk_global => Clk_global_s,
        LED      => LED
        );
    (
    OE_s => OE_n; 
    ;)
    
    Dinout <= Din_s when OE_s = '0' else "ZZZZZZZZZZZZZZZZ";
      Dout_s <= Dinout;    
        
end Behavioral;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist einiges verkorkst.


    OE_n <= OE_s; 
    Dinout <= Dout_s when OE_s = '0' else "ZZZZZZZZZZZZZZZZ";
    Din_s <= Dinout;    
        
end Behavioral;

MFG
Falk

Autor: GAST (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh ja! Danke für die Hilfe. Werde es gleich ausprobieren!

DANKE!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.