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


von GAST (Gast)


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????

von Falk B. (falk)


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

von GAST (Gast)


Lesenswert?

Und wie würde so etas in VHDL aussehen???

von Falk B. (falk)


Lesenswert?

1
-- Entity Signale
2
   data : inout std_logic_vector(7 downt0 0);
3
   oe : std_logic;
4
5
-- interne Signale
6
7
signal oe_int;
8
signal data_int : std_logic_vector(7 downt0 0);
9
10
-- Nutzung
11
12
oe <= oe_int;
13
data <= data_int when oe_int = '1' else "ZZZZZZZZ";

von GAST (Gast)


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:
1
 entity ZBT_SRAM_TOP is
2
 Port   ( 
3
        Addr       : out    STD_LOGIC_VECTOR (17 downto 0);
4
           Dinout     : inout  STD_LOGIC_VECTOR (15 downto 0);
5
           Mode       : out    STD_LOGIC;
6
           Clk_SRAM    : out    STD_LOGIC;
7
           CE_n       : out    STD_LOGIC;
8
           OE_n       : out    STD_LOGIC;
9
           AdvLd_n     : out    STD_LOGIC;
10
           BwA_n       : out    STD_LOGIC;
11
           BwB_n       : out    STD_LOGIC;
12
           BwC_n       : out    STD_LOGIC;
13
           BwD_n       : out    STD_LOGIC;
14
           WE_n       : out    STD_LOGIC;
15
           Zz         : out    STD_LOGIC;
16
           Clk_feedback : in     STD_LOGIC;
17
           Clk_in       : in     STD_LOGIC;
18
        LED        : out   STD_LOGIC
19
         );
20
end ZBT_SRAM_TOP;
21
22
architecture Behavioral of ZBT_SRAM_TOP is
23
24
    component DCM_manager
25
    PORT  (
26
        U1_CLKFB_IN      : in  STD_LOGIC;
27
        U1_CLKIN_IN      : in  STD_LOGIC;
28
        U1_CLKIN_IBUFG_OUT: out STD_LOGIC;
29
        U1_CLK0_OUT      : out STD_LOGIC;
30
        U2_CLK0_OUT      : out STD_LOGIC
31
      );
32
    end component DCM_manager;
33
  
34
    component ZBT_controller
35
    PORT ( 
36
        Addr       : out    STD_LOGIC_VECTOR (17 downto 0);
37
           Din         : in     STD_LOGIC_VECTOR (15 downto 0);
38
        Dout       : out    STD_LOGIC_VECTOR (15 downto 0);
39
        Mode       : out    STD_LOGIC;
40
           CE_n       : out    STD_LOGIC;
41
           OE_n       : out    STD_LOGIC;
42
           AdvLd_n     : out    STD_LOGIC;
43
           BwA_n       : out    STD_LOGIC;
44
           BwB_n       : out    STD_LOGIC;
45
           BwC_n       : out    STD_LOGIC;
46
           BwD_n       : out    STD_LOGIC;
47
           WE_n       : out    STD_LOGIC;
48
           Zz         : out    STD_LOGIC;
49
           Clk_global  : in     STD_LOGIC;
50
        LED        : out    STD_LOGIC
51
        );  
52
    end component ZBT_controller;
53
  
54
signal Clk_global_s   :       STD_LOGIC;
55
signal Din_s      :        STD_LOGIC_VECTOR (15 downto 0);
56
signal Dout_s      :        STD_LOGIC_VECTOR (15 downto 0);
57
signal OE_s        :      STD_LOGIC;     
58
59
60
61
begin
62
63
    inst_DCM_manager : DCM_manager
64
    port map(
65
        U1_CLKFB_IN        => Clk_feedback,  
66
        U1_CLKIN_IN        => Clk_in,
67
        U1_CLKIN_IBUFG_OUT  => open,
68
        U1_CLK0_OUT        => Clk_global_s,
69
        U2_CLK0_OUT        => Clk_SRAM
70
        );
71
    
72
    inst_ZBT_controller : ZBT_controller
73
    port map(
74
        Addr      => Addr,
75
        Mode      => Mode,
76
        Din      => Din_s,
77
        Dout      => Dout_s,
78
        CE_n       => CE_n,
79
        OE_n      => OE_s,
80
        AdvLd_n    => AdvLd_n,
81
        BwA_n      => BwA_n,
82
        BwB_n      => BwB_n,
83
        BwC_n      => BwC_n,
84
        BwD_n      => BwD_n,
85
        WE_n      => WE_n,
86
        Zz        => Zz,
87
        Clk_global => Clk_global_s,
88
        LED      => LED
89
        );
90
    (
91
    OE_s => OE_n; 
92
    ;)
93
    
94
    Dinout <= Din_s when OE_s = '0' else "ZZZZZZZZZZZZZZZZ";
95
      Dout_s <= Dinout;    
96
        
97
end Behavioral;

von Falk B. (falk)


Lesenswert?

Da ist einiges verkorkst.

1
    OE_n <= OE_s; 
2
    Dinout <= Dout_s when OE_s = '0' else "ZZZZZZZZZZZZZZZZ";
3
    Din_s <= Dinout;    
4
        
5
end Behavioral;

MFG
Falk

von GAST (Gast)


Lesenswert?

Oh ja! Danke für die Hilfe. Werde es gleich ausprobieren!

DANKE!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.